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

Implemented count in a window range.


diffs (truncated from 914 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
@@ -1113,12 +1113,6 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
 #undef ANALYTICAL_MIN_MAX_BRANCHES
 #undef ANALYTICAL_MIN_MAX_LIMIT
 
-#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_NO_OVERLAP \
-       do {                                            \
-               for (;rb < rp; rb++)                        \
-                       *rb = curval;                           \
-       } while(0);
-
 #define ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS       \
        do {                                            \
                lng *rs = rb, *fs, *fe;                     \
@@ -1129,38 +1123,92 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                }                                           \
        } while(0);
 
-#define ANALYTICAL_COUNT_IGNORE_NILS_CALC(FRAME)            \
-       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;                      
\
-                                       rp += curval;                           
\
-                                       ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME 
\
-                                       pnp = np;                               
\
-                               }                                           \
-                       }                                               \
-                       curval = np - pnp;                              \
-                       rp += curval;                                   \
-                       ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME         \
-               } else {                                            \
-                       curval = cnt;                                   \
-                       rp += curval;                                   \
-                       ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME         \
-               }                                                   \
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC_ROWS            \
+       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;                    \
+                                       rp += curval;                         \
+                                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
+                                       pnp = np;                             \
+                               }                                         \
+                       }                                             \
+                       curval = np - pnp;                            \
+                       rp += curval;                                 \
+                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS         \
+               } else {                                          \
+                       curval = cnt;                                 \
+                       rp += curval;                                 \
+                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS         \
+               }                                                 \
+       } while(0);
+
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_ALL \
+       do {                                           \
+               for (;rb < rp; rb++)                       \
+                       *rb = curval;                          \
        } while(0);
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_NO_OVERLAP(TPE) \
-       do {                                                   \
-               for (;pbp < bp; pbp++)                             \
-                       curval += !is_##TPE##_nil(*pbp);               \
-               for (;rb < rp; rb++)                               \
-                       *rb = curval;                                  \
-               curval = 0;                                        \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+       do {                                  \
+               bit *nl = lp, *ns, *ne;           \
+               BUN rstart, rend;                 \
+               for(; lp<lend;lp++) {             \
+                       rstart = start;               \
+                       for(ns=lp; ns>nl; ns--) {     \
+                               if(*ns) {                 \
+                                       if(rstart == 0)       \
+                                               break;            \
+                                       rstart--;             \
+                               }                         \
+                       }                             \
+                       rend = end;                   \
+                       for(ne=lp+1; ne<lend; ne++) { \
+                               if(*ne) {                 \
+                                       if(rend == 0)         \
+                                               break;            \
+                                       rend--;               \
+                               }                         \
+                       }                             \
+                       curval = (lng)(ne - ns);      \
+                       *rb = curval;                 \
+                       rb++;                         \
+               }                                 \
+       } while(0);
+
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC_RANGE    \
+       do {                                           \
+               lng *rb, *rp, curval = 0;                  \
+               rp = rb = (lng*)Tloc(r, 0);                \
+               if (p) {                                   \
+                       pnp = np = (bit*)Tloc(p, 0);           \
+                       lend = lp = o ? (bit*)Tloc(o, 0) : np; \
+                       nend = np + cnt;                       \
+                       for(; np<nend; np++) {                 \
+                               if (*np) {                         \
+                                       ncnt = (np - pnp);             \
+                                       lend += ncnt;                  \
+                                       
ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+                                       pnp = np;                      \
+                               }                                  \
+                       }                                      \
+                       ncnt = (np - pnp);                     \
+                       lend += ncnt;                          \
+                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+               } else if (o) {                            \
+                       lend = lp = (bit*)Tloc(o, 0);          \
+                       lend += cnt;                           \
+                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+               } else {                                   \
+                       curval = cnt;                          \
+                       rp += curval;                          \
+                       ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_ALL \
+               }                                          \
        } while(0);
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_ROWS(TPE)\
@@ -1177,7 +1225,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                }                                               \
        } while(0);
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC(TPE, IMP)\
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC_ROWS(TPE, IMP) \
        do {                                                 \
                TPE *pbp, *bp = (TPE*)Tloc(b, 0);                \
                lng *rp, *rb, curval = 0;                        \
@@ -1207,13 +1255,79 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                }                                                \
        } while(0);
 
-#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;                                           
  \
-               curval = 0;                                                   \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_RANGE_ALL(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_IMP_RANGE_PART(TPE) \
+       do {                                        \
+               bit *nl = lp, *ns, *ne;                 \
+               TPE *bs, *be;                           \
+               BUN rstart, rend, parcel;               \
+               for(; lp<lend;lp++) {                   \
+                       rstart = start;                     \
+                       for(ns=lp; ns>nl; ns--) {           \
+                               if(*ns) {                       \
+                                       if(rstart == 0)             \
+                                               break;                  \
+                                       rstart--;                   \
+                               }                               \
+                       }                                   \
+                       rend = end;                         \
+                       for(ne=lp+1; ne<lend; ne++) {       \
+                               if(*ne) {                       \
+                                       if(rend == 0)               \
+                                               break;                  \
+                                       rend--;                     \
+                               }                               \
+                       }                                   \
+                       parcel = (ne - ns);                 \
+                       bs = bp + (ns - nl);                \
+                       be = bs + parcel;                   \
+                       for(; bs<be; bs++)                  \
+                               curval += !is_##TPE##_nil(*bs); \
+                       *rb = curval;                       \
+                       curval = 0;                         \
+                       rb++;                               \
+               }                                       \
+       } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC_RANGE(TPE, IMP) \
+       do {                                           \
+               TPE *bp = (TPE*)Tloc(b, 0);                \
+               lng *rb, *rp, curval = 0;                  \
+               rp = rb = (lng*)Tloc(r, 0);                \
+               if (p) {                                   \
+                       pnp = np = (bit*)Tloc(p, 0);           \
+                       lend = lp = o ? (bit*)Tloc(o, 0) : np; \
+                       nend = np + cnt;                       \
+                       for(; np<nend; np++) {                 \
+                               if (*np) {                         \
+                                       ncnt = (np - pnp);             \
+                                       lend += ncnt;                  \
+                                       IMP##_PART(TPE)                \
+                                       bp += ncnt;                    \
+                                       pnp = np;                      \
+                               }                                  \
+                       }                                      \
+                       ncnt = (np - pnp);                     \
+                       lend += ncnt;                          \
+                       IMP##_PART(TPE)                        \
+               } else if (o) {                            \
+                       lend = lp = (bit*)Tloc(o, 0);          \
+                       lend += cnt;                           \
+                       IMP##_PART(TPE)                        \
+               } else {                                   \
+                       TPE *pbp = bp;                         \
+                       rp += cnt;                             \
+                       bp += cnt;                             \
+                       IMP##_ALL(TPE)                         \
+               }                                          \
        } while(0);
 
 #define ANALYTICAL_COUNT_NO_NIL_STR_IMP_ROWS(TPE_CAST, OFFSET)            \
@@ -1230,50 +1344,104 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                }                                                               
  \
        } while(0);
 
-#define ANALYTICAL_COUNT_NO_NIL_STR_CALC(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)                   
   \
-                                       pnp = np;                               
   \
-                               }                                              \
-                       }                                                  \
-                       ncnt = (np - pnp);                                 \
-                       rp += ncnt;                                        \
-                       i += ncnt;                                         \
-                       IMP(TPE_CAST, OFFSET)                              \
-               } else {                                               \
-                       rp += cnt;                                         \
-                       i += cnt;                                          \
-                       IMP(TPE_CAST, OFFSET)                              \
-               }                                                      \
+#define ANALYTICAL_COUNT_NO_NIL_STR_CALC_ROWS(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)     \
+                                       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_STR_IMP_RANGE_ALL(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);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to