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

Overlapping rows for count aggregate on a window.

Still needs fixes.


diffs (truncated from 981 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -1150,207 +1150,365 @@ ANALYTICAL_LIMIT(max, MAX, <)
 #undef ANALYTICAL_LIMIT_IMP_HUGE
 #undef ANALYTICAL_LIMIT_IMP
 
-#define ANALYTICAL_COUNT_WITH_NIL_FIXED_SIZE_IMP(TPE)    \
+#define ANALYTICAL_COUNT_IGNORE_NILS_NO_OVERLAP \
+       do {                                        \
+               rp += curval;                           \
+               for (;rb < rp; rb++)                    \
+                       *rb = curval;                       \
+       } while(0);
+
+#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; \
+                       *rb = (fe - fs);                        \
+               }                                           \
+       } while(0);
+
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP(IMP) \
+       do {                                      \
+               lng *rp, *rb, curval = 0;             \
+               rb = rp = (lng*)Tloc(r, 0);           \
+               if (p) {                              \
+                       np = pnp = (bit*)Tloc(p, 0);      \
+                       nend = np + cnt;                  \
+                       for(; np < nend; np++) {          \
+                               if (*np) {                    \
+                                       curval = np - pnp;        \
+                                       IMP                       \
+                                       pnp = np;                 \
+                               }                             \
+                       }                                 \
+                       curval = np - pnp;                \
+                       IMP                               \
+               } else {                              \
+                       curval = cnt;                     \
+                       IMP                               \
+               }                                     \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_NO_OVERLAP(TPE) \
+       do {                                                   \
+               for (;pbp < bp; pbp++)                             \
+                       curval += !is_##TPE##_nil(*pbp);               \
+               for (;rb < rp; rb++)                               \
+                       *rb = curval;                                  \
+               curval = 0;                                        \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_OVERLAP(TPE) \
+       do {                                                \
+               TPE *bs, *bl, *be;                              \
+               bl = pbp;                                       \
+               for(; pbp<bp;pbp++) {                           \
+                       bs = (pbp-start > bl) ? pbp - start : bl;   \
+                       be = (pbp+end < bp) ? pbp + end + 1 : bp;   \
+                       for(; bs<be; bs++)                          \
+                               curval += !is_##TPE##_nil(*bs);         \
+                       *rb = curval;                               \
+                       rb++;                                       \
+                       curval = 0;                                 \
+               }                                               \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(TPE, IMP) \
        do {                                                 \
-               TPE *pnb, *bp = (TPE*)Tloc(b, 0);                \
-               lng *rp, *rb, *rend, curval = 0;                 \
+               TPE *pbp, *bp = (TPE*)Tloc(b, 0);                \
+               lng *rp, *rb, curval = 0;                        \
                rb = rp = (lng*)Tloc(r, 0);                      \
-               rend = rp + cnt;                                 \
-               pnb = bp;                                        \
+               pbp = bp;                                        \
                if (p) {                                         \
                        pnp = np = (bit*)Tloc(p, 0);                 \
-                       end = np + cnt;                              \
-                       for(; np<end; np++) {                        \
+                       nend = np + cnt;                             \
+                       for(; np<nend; np++) {                       \
                                if (*np) {                               \
-                                       BUN ncnt = np - pnp;                 \
+                                       ncnt = np - pnp;                     \
                                        bp += ncnt;                          \
-                                       for (;pnb < bp; pnb++)               \
-                                               curval += 
!is_##TPE##_nil(*pnb); \
                                        rp += ncnt;                          \
-                                       for (;rb < rp; rb++)                 \
-                                               *rb = curval;                   
 \
-                                       curval = 0;                          \
+                                       IMP(TPE)                             \
                                        pnp = np;                            \
-                                       pnb = bp;                            \
+                                       pbp = bp;                            \
                                }                                        \
                        }                                            \
-                       bp += (np - pnp);                            \
-                       for (;pnb < bp; pnb++)                       \
-                               curval += !is_##TPE##_nil(*pnb);         \
-                       for (;rb < rend; rb++)                       \
-                               *rb = curval;                            \
-               } else { /* single value, ie no partitions */    \
-                       for(; rp<rend; rp++, bp++)                   \
-                               curval += !is_##TPE##_nil(*bp);          \
-                       for(;rb < rp; rb++)                          \
-                               *rb = curval;                            \
+                       ncnt = np - pnp;                             \
+                       bp += ncnt;                                  \
+                       rp += ncnt;                                  \
+                       IMP(TPE)                                     \
+               } else {                                         \
+                       bp += cnt;                                   \
+                       rp += cnt;                                   \
+                       IMP(TPE)                                     \
                }                                                \
        } while(0);
 
-#define ANALYTICAL_COUNT_WITH_NIL_STR_IMP(TPE_CAST, OFFSET)               \
+#define ANALYTICAL_COUNT_NO_NIL_STR_IMP_NO_OVERLAP(TPE_CAST, OFFSET)  \
+       do {                                                              \
+               for(;j<i;j++)                                                 \
+                       curval += base[(var_t) ((TPE_CAST) bp) OFFSET] != 
'\200'; \
+               for (;rb < rp; rb++)                                          \
+                       *rb = curval;                                           
  \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_STR_IMP_OVERLAP(TPE_CAST, OFFSET)         \
        do {                                                                  \
-               const void *restrict bp = Tloc(b, 0);                           
  \
-               lng *rp, *rb, curval = 0;                                       
  \
-               rb = rp = (lng*)Tloc(r, 0);                                     
  \
-               if (p) {                                                        
  \
-                       pnp = np = (bit*)Tloc(p, 0);                            
      \
-                       end = np + cnt;                                         
      \
-                       for(i = 0; i < cnt; i++, np++) {                        
      \
-                               if (*np) {                                      
          \
-                                       rp += (np - pnp);                       
              \
-                                       for (;rb < rp; rb++)                    
              \
-                                               *rb = curval;                   
                  \
-                                       curval = 0;                             
              \
-                                       pnp = np;                               
              \
-                               }                                               
          \
+               for(;k<i;k++) {                                                 
  \
+                       j = (k-start > 0) ? k - start : 0;                      
      \
+                       l = (k+end < i) ? k + end + 1 : i;                      
      \
+                       for(; j<l; j++)                                         
      \
                                curval += base[(var_t) ((TPE_CAST) bp) OFFSET] 
!= '\200'; \
-                       }                                                       
      \
-                       rp += (np - pnp);                                       
      \
-                       for (;rb < rp; rb++)                                    
      \
-                               *rb = curval;                                   
          \
-               } else { /* single value, ie no partitions */                   
  \
-                       for(i = 0; i < cnt; i++)                                
      \
-                               curval += base[(var_t) ((TPE_CAST) bp) OFFSET] 
!= '\200'; \
-                       rp += cnt;                                              
      \
-                       for(;rb < rp; rb++)                                     
      \
-                               *rb = curval;                                   
          \
+                       *rb = curval;                                           
      \
+                       rb++;                                                   
      \
+                       curval = 0;                                             
      \
                }                                                               
  \
        } while(0);
 
+#define ANALYTICAL_COUNT_NO_NIL_STR_IMP(TPE_CAST, OFFSET, IMP) \
+       do {                                                       \
+               const void *restrict bp = Tloc(b, 0);                  \
+               lng *rp, *rb, curval = 0;                              \
+               rb = rp = (lng*)Tloc(r, 0);                            \
+               if (p) {                                               \
+                       pnp = np = (bit*)Tloc(p, 0);                       \
+                       nend = np + cnt;                                   \
+                       for(; np<nend; np++) {                             \
+                               if (*np) {                                     \
+                                   ncnt = (np - pnp);                         \
+                                       rp += ncnt;                             
   \
+                                       i += ncnt;                              
   \
+                                       IMP(TPE_CAST, OFFSET)                   
   \
+                                       curval = 0;                             
   \
+                                       pnp = np;                               
   \
+                               }                                              \
+                       }                                                  \
+                       ncnt = (np - pnp);                                 \
+                       rp += ncnt;                                        \
+                       i += ncnt;                                         \
+                       IMP(TPE_CAST, OFFSET)                              \
+               } else {                                               \
+                       rp += cnt;                                         \
+                       i += cnt;                                          \
+                       IMP(TPE_CAST, OFFSET)                              \
+               }                                                      \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_VARSIZED_TYPES_NO_OVERLAP               \
+       do {                                                                \
+               for(; j<i; j++)                                                 
\
+                       curval += (*cmp)(nil, base + ((const var_t *) bp)[j]) 
!= 0; \
+               for (;rb < rp; rb++)                                            
\
+                       *rb = curval;                                           
    \
+               curval = 0;                                                     
\
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXEDSIZE_TYPES_NO_OVERLAP \
+       do {                                                   \
+               for(; j<i; j++)                                    \
+                       curval += (*cmp)(Tloc(b, j), nil) != 0;        \
+               for (;rb < rp; rb++)                               \
+                       *rb = curval;                                  \
+               curval = 0;                                        \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_VARSIZED_TYPES_OVERLAP                      \
+       do {                                                                    
\
+               for(;k<i;k++) {                                                 
    \
+                       j = (k-start > 0) ? k - start : 0;                      
        \
+                       l = (k+end < i) ? k + end + 1 : i;                      
        \
+                       for(; j<l; j++)                                         
        \
+                               curval += (*cmp)(nil, base + ((const var_t *) 
bp)[j]) != 0; \
+                       *rb = curval;                                           
        \
+                       rb++;                                                   
        \
+                       curval = 0;                                             
        \
+               }                                                               
    \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXEDSIZE_TYPES_OVERLAP \
+       do {                                                \
+               for(;k<i;k++) {                                 \
+                       j = (k-start > 0) ? k - start : 0;          \
+                       l = (k+end < i) ? k + end + 1 : i;          \
+                       for(; j<l; j++)                             \
+                               curval += (*cmp)(Tloc(b, j), nil) != 0; \
+                       *rb = curval;                               \
+                       rb++;                                       \
+                       curval = 0;                                 \
+               }                                               \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_OTHER_TYPES(IMP_VARSIZED, IMP_FIXEDSIZE) \
+       do {                                                                 \
+               const void *restrict nil = ATOMnilptr(tpe);                     
 \
+               int (*cmp)(const void *, const void *) = ATOMcompare(tpe);      
 \
+               lng *rp, *rb, curval = 0;                                       
 \
+               rb = rp = (lng*)Tloc(r, 0);                                     
 \
+               if (b->tvarsized) {                                             
 \
+                       const char *restrict base = b->tvheap->base;            
     \
+                       const void *restrict bp = Tloc(b, 0);                   
     \
+                       if (p) {                                                
     \
+                               pnp = np = (bit*)Tloc(p, 0);                    
         \
+                               nend = np + cnt;                                
         \
+                               for(; np < nend; np++) {                        
         \
+                                       if (*np) {                              
             \
+                                               ncnt = (np - pnp);              
                 \
+                                               rp += ncnt;                     
                 \
+                                               i += ncnt;                      
                 \
+                                               IMP_VARSIZED                    
                 \
+                                               pnp = np;                       
                 \
+                                       }                                       
             \
+                               }                                               
         \
+                               ncnt = (np - pnp);                              
         \
+                               rp += ncnt;                                     
         \
+                               i += ncnt;                                      
         \
+                               IMP_VARSIZED                                    
         \
+                       } else {                                                
     \
+                               rp += cnt;                                      
         \
+                               i += cnt;                                       
         \
+                               IMP_VARSIZED                                    
         \
+                       }                                                       
     \
+               } else {                                                        
 \
+                       if (p) {                                                
     \
+                               pnp = np = (bit*)Tloc(p, 0);                    
         \
+                               nend = np + cnt;                                
         \
+                               for(; np < nend; np++) {                        
         \
+                                       if (*np) {                              
             \
+                                               ncnt = (np - pnp);              
                 \
+                                               rp += ncnt;                     
                 \
+                                               i += ncnt;                      
                 \
+                                               IMP_FIXEDSIZE                   
                 \
+                                               pnp = np;                       
                 \
+                                       }                                       
             \
+                               }                                               
         \
+                               ncnt = (np - pnp);                              
         \
+                               rp += ncnt;                                     
         \
+                               i += ncnt;                                      
         \
+                               IMP_FIXEDSIZE                                   
         \
+                       } else {                                                
     \
+                               rp += cnt;                                      
         \
+                               i += cnt;                                       
         \
+                               IMP_FIXEDSIZE                                   
         \
+                       }                                                       
     \
+               }                                                               
 \
+       } while(0);
+
 gdk_return
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to