Changeset: bf7a109e8c4f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bf7a109e8c4f
Modified Files:
        gdk/gdk_analytic.c
        sql/test/analytics/Tests/analytics02.stable.out
Branch: analytics
Log Message:

Fixed count row overlap implementation for strings and other types.


diffs (161 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -1152,7 +1152,6 @@ ANALYTICAL_LIMIT(max, MAX, <)
 
 #define ANALYTICAL_COUNT_IGNORE_NILS_NO_OVERLAP \
        do {                                        \
-               rp += curval;                           \
                for (;rb < rp; rb++)                    \
                        *rb = curval;                       \
        } while(0);
@@ -1160,7 +1159,6 @@ ANALYTICAL_LIMIT(max, MAX, <)
 #define ANALYTICAL_COUNT_IGNORE_NILS_OVERLAP        \
        do {                                            \
                lng *rs = rb, *fs, *fe;                     \
-               rp += curval;                               \
                for(; rb<rp;rb++) {                         \
                        fs = (rb-start > rs) ? rb - start : rs; \
                        fe = (rb+end < rp) ? rb + end + 1 : rp; \
@@ -1178,14 +1176,17 @@ ANALYTICAL_LIMIT(max, MAX, <)
                        for(; np < nend; np++) {          \
                                if (*np) {                    \
                                        curval = np - pnp;        \
+                                       rp += curval;             \
                                        IMP                       \
                                        pnp = np;                 \
                                }                             \
                        }                                 \
                        curval = np - pnp;                \
+                       rp += curval;                     \
                        IMP                               \
                } else {                              \
                        curval = cnt;                     \
+                       rp += curval;                     \
                        IMP                               \
                }                                     \
        } while(0);
@@ -1250,12 +1251,14 @@ ANALYTICAL_LIMIT(max, MAX, <)
                        curval += base[(var_t) ((TPE_CAST) bp) OFFSET] != 
'\200'; \
                for (;rb < rp; rb++)                                          \
                        *rb = curval;                                           
  \
+               curval = 0;                                                   \
        } while(0);
 
 #define ANALYTICAL_COUNT_NO_NIL_STR_IMP_OVERLAP(TPE_CAST, OFFSET)         \
        do {                                                                  \
+               m = k;                                                          
  \
                for(;k<i;k++) {                                                 
  \
-                       j = (k-start > 0) ? k - start : 0;                      
      \
+                       j = (k > m+start) ? k - start : m;                      
      \
                        l = (k+end < i) ? k + end + 1 : i;                      
      \
                        for(; j<l; j++)                                         
      \
                                curval += base[(var_t) ((TPE_CAST) bp) OFFSET] 
!= '\200'; \
@@ -1279,7 +1282,6 @@ ANALYTICAL_LIMIT(max, MAX, <)
                                        rp += ncnt;                             
   \
                                        i += ncnt;                              
   \
                                        IMP(TPE_CAST, OFFSET)                   
   \
-                                       curval = 0;                             
   \
                                        pnp = np;                               
   \
                                }                                              \
                        }                                                  \
@@ -1314,8 +1316,9 @@ ANALYTICAL_LIMIT(max, MAX, <)
 
 #define ANALYTICAL_COUNT_NO_NIL_VARSIZED_TYPES_OVERLAP                      \
        do {                                                                    
\
+               m = k;                                                          
    \
                for(;k<i;k++) {                                                 
    \
-                       j = (k-start > 0) ? k - start : 0;                      
        \
+                       j = (k > m+start) ? k - start : m;                      
        \
                        l = (k+end < i) ? k + end + 1 : i;                      
        \
                        for(; j<l; j++)                                         
        \
                                curval += (*cmp)(nil, base + ((const var_t *) 
bp)[j]) != 0; \
@@ -1327,8 +1330,9 @@ ANALYTICAL_LIMIT(max, MAX, <)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXEDSIZE_TYPES_OVERLAP \
        do {                                                \
+               m = k;                                          \
                for(;k<i;k++) {                                 \
-                       j = (k-start > 0) ? k - start : 0;          \
+                       j = (k > m+start) ? k - start : m;          \
                        l = (k+end < i) ? k + end + 1 : i;          \
                        for(; j<l; j++)                             \
                                curval += (*cmp)(Tloc(b, j), nil) != 0; \
@@ -1396,7 +1400,7 @@ ANALYTICAL_LIMIT(max, MAX, <)
 gdk_return
 GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int 
tpe, BUN start, BUN end)
 {
-       BUN i = 0, j = 0, k = 0, l = 0, ncnt, cnt = BATcount(b);
+       BUN i = 0, j = 0, k = 0, l = 0, m = 0, ncnt, cnt = BATcount(b);
        bit *np, *pnp, *nend;
        gdk_return gdk_res = GDK_SUCCEED;
 
diff --git a/sql/test/analytics/Tests/analytics02.stable.out 
b/sql/test/analytics/Tests/analytics02.stable.out
--- a/sql/test/analytics/Tests/analytics02.stable.out
+++ b/sql/test/analytics/Tests/analytics02.stable.out
@@ -334,6 +334,65 @@ Ready.
 % bigint # type
 % 1 # length
 [ 1    ]
+#create table stressme (aa varchar(64), bb int);
+#insert into stressme values ('one', 1), ('another', 1), ('stress', 1), (NULL, 
2), ('ok', 2), ('check', 3), ('me', 3), ('please', 3), (NULL, 4);
+[ 9    ]
+#select count(aa) over (rows between 5 preceding and 0 following) from 
stressme;
+% sys.L4 # table_name
+% L4 # name
+% bigint # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ 3    ]
+[ 4    ]
+[ 5    ]
+[ 5    ]
+[ 5    ]
+[ 4    ]
+#select count(aa) over (rows between 5 preceding and 2 following) from 
stressme;
+% sys.L4 # table_name
+% L4 # name
+% bigint # type
+% 1 # length
+[ 3    ]
+[ 3    ]
+[ 4    ]
+[ 5    ]
+[ 6    ]
+[ 7    ]
+[ 6    ]
+[ 5    ]
+[ 4    ]
+#select count(aa) over (partition by bb order by bb rows between 5 preceding 
and 0 following) from stressme;
+% sys.L4 # table_name
+% L4 # name
+% bigint # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ 0    ]
+[ 1    ]
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ 0    ]
+#select count(aa) over (partition by bb order by bb rows between 5 preceding 
and 2 following) from stressme;
+% sys.L4 # table_name
+% L4 # name
+% bigint # type
+% 1 # length
+[ 3    ]
+[ 3    ]
+[ 3    ]
+[ 1    ]
+[ 1    ]
+[ 3    ]
+[ 3    ]
+[ 3    ]
+[ 0    ]
 #create table debugme (aa real, bb int);
 #insert into debugme values (15, 3), (3, 1), (2, 1), (5, 3), (NULL, 2), (3, 
2), (4, 1), (6, 3), (8, 2), (NULL, 4);
 [ 10   ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to