Changeset: 0a121f5ad014 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a121f5ad014
Added Files:
        sql/test/analytics/Tests/analytics03.sql
Modified Files:
        gdk/gdk_analytic.c
        gdk/gdk_analytic.h
        sql/backends/monet5/sql_rank.c
        sql/server/rel_select.c
Branch: analytics
Log Message:

Implemented sum and product in a window range.

Some more refactoring will be needed.


diffs (truncated from 1428 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
@@ -898,8 +898,7 @@ finish:
 
 #define ANALYTICAL_MIN_MAX_IMP_ROWS(TPE, IMP)         \
        do {                                              \
-               TPE *bs, *bl, *be;                            \
-               bl = pbp;                                     \
+               TPE *bl = pbp, *bs, *be;                      \
                for(; pbp<bp;pbp++) {                         \
                        bs = (pbp > bl+start) ? pbp - start : bl; \
                        be = (pbp+end < bp) ? pbp + end + 1 : bp; \
@@ -1076,7 +1075,7 @@ finish:
 
 #define ANALYTICAL_MIN_MAX(OP, IMP, SIGN_OP) \
 gdk_return \
-GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe, 
BUN start, BUN end) \
+GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe, 
int unit, BUN start, BUN end) \
 { \
        int (*atomcmp)(const void *, const void *); \
        const void* restrict nil; \
@@ -1085,10 +1084,14 @@ GDKanalytical##OP(BAT *r, BAT *b, BAT *p
        bit *np, *pnp, *nend; \
        gdk_return gdk_res = GDK_SUCCEED; \
  \
-       if(start == 0 && end == 0) { \
+       assert(unit >= 0 && unit <= 2); \
+ \
+       if(unit == 0 && start == 0 && end == 0) { \
                ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _NO_OVERLAP) \
+       } else if(unit == 0) { \
+               ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
        } else { \
-               ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
+           \
        } \
 finish: \
        BATsetcount(r, cnt); \
@@ -1162,8 +1165,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_ROWS(TPE)\
        do {                                                \
-               TPE *bs, *bl, *be;                              \
-               bl = pbp;                                       \
+               TPE *bl = pbp, *bs, *be;                        \
                for(; pbp<bp;pbp++) {                           \
                        bs = (pbp > bl+start) ? pbp - start : bl;   \
                        be = (pbp+end < bp) ? pbp + end + 1 : bp;   \
@@ -1420,24 +1422,30 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
        }
 
 gdk_return
-GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int 
tpe, BUN start, BUN end)
+GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int 
tpe, int unit, BUN start, BUN end)
 {
        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;
 
        assert(ignore_nils);
+       assert(unit >= 0 && unit <= 2);
        (void) o;
+
        if(!*ignore_nils || b->T.nonil) {
-               if(start == 0 && end == 0) {
+               if(unit == 0 && start == 0 && end == 0) {
                        ANALYTICAL_COUNT_IGNORE_NILS_CALC(_NO_OVERLAP)
-               } else {
+               } else if(unit == 0) {
                        ANALYTICAL_COUNT_IGNORE_NILS_CALC(_ROWS)
+               } else {
+
                }
-       } else if(start == 0 && end == 0) {
+       } else if(unit == 0 && start == 0 && end == 0) {
                ANALYTICAL_COUNT_BRANCHES(_NO_OVERLAP)
+       } else if(unit == 0) {
+               ANALYTICAL_COUNT_BRANCHES(_ROWS)
        } else {
-               ANALYTICAL_COUNT_BRANCHES(_ROWS)
+
        }
        BATsetcount(r, cnt);
        r->tnonil = true;
@@ -1463,29 +1471,9 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
 #undef ANALYTICAL_COUNT_STR_LIMIT
 #undef ANALYTICAL_COUNT_BRANCHES
 
-#define ANALYTICAL_SUM_IMP_NO_OVERLAP(TPE1, TPE2) \
-       do {                                      \
-               for(; pbp<bp; pbp++) {                \
-                       v = *pbp;                         \
-                       if (!is_##TPE1##_nil(v)) {        \
-                               if(is_##TPE2##_nil(curval))   \
-                                       curval = (TPE2) v;        \
-                               else                          \
-                                       ADD_WITH_CHECK(TPE1, v, TPE2, curval, 
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
-                       }                                 \
-               }                                     \
-               for (;rb < rp; rb++)                  \
-                       *rb = curval;                     \
-               if(is_##TPE2##_nil(curval))           \
-                       has_nils = true;                  \
-               else                                  \
-                       curval = TPE2##_nil;              \
-       } while(0);                               \
-
 #define ANALYTICAL_SUM_IMP_ROWS(TPE1, TPE2)           \
        do {                                              \
-               TPE1 *bs, *bl, *be;                           \
-               bl = pbp;                                     \
+               TPE1 *bl = pbp, *bs, *be, v;                  \
                for(; pbp<bp;pbp++) {                         \
                        bs = (pbp > bl+start) ? pbp - start : bl; \
                        be = (pbp+end < bp) ? pbp + end + 1 : bp; \
@@ -1507,13 +1495,29 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                }                                             \
        } while(0);
 
-#define ANALYTICAL_SUM_CALC(TPE1, TPE2, IMP)       \
+#define ANALYTICAL_SUM_FP_IMP_ROWS(TPE1, TPE2)           \
+       do {                                                 \
+               TPE1 *bl = pbp, *bs, *be;                        \
+               (void) curval;                                   \
+               for(; pbp<bp; pbp++) {                           \
+                       bs = (pbp > bl+start) ? pbp - start : bl;    \
+                       be = (pbp+end < bp) ? pbp + end + 1 : bp;    \
+                       if(dofsum(bs, 0, 0, (be - bs), rb, 1, TYPE_##TPE1, 
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, true, \
+                                         "GDKanalyticalsum") == BUN_NONE) { \
+                               goto bailout;                            \
+                       }                                            \
+                       if(is_##TPE2##_nil(*rb))                     \
+                               has_nils = true;                         \
+                       rb++;                                        \
+               }                                                \
+       } while(0);
+
+#define ANALYTICAL_SUM_CALC_ROWS(TPE1, TPE2, IMP)  \
        do {                                           \
-               TPE1 *pbp, *bp, v;                         \
-               TPE2 *rp, *rb, *rend, curval = TPE2##_nil; \
+               TPE1 *pbp, *bp;                            \
+               TPE2 *rp, *rb, curval = TPE2##_nil;        \
                pbp = bp = (TPE1*)Tloc(b, 0);              \
                rb = rp = (TPE2*)Tloc(r, 0);               \
-               rend = rp + cnt;                           \
                if (p) {                                   \
                        pnp = np = (bit*)Tloc(p, 0);           \
                        nend = np + cnt;                       \
@@ -1531,54 +1535,157 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                        bp += ncnt;                            \
                        rp += ncnt;                            \
                        IMP(TPE1, TPE2)                        \
-               } else if (o || force_order) {             \
+               } else {                                   \
                        ncnt = cnt;                            \
                        bp += ncnt;                            \
                        rp += ncnt;                            \
                        IMP(TPE1, TPE2)                        \
-               } else {                                   \
-                       for(; rb<rend; rb++, bp++) {           \
-                               v = *bp;                           \
-                               if(is_##TPE1##_nil(v)) {           \
-                                       *rb = TPE2##_nil;              \
-                                       has_nils = true;               \
-                               } else {                           \
-                                       *rb = (TPE2) v;                \
-                               }                                  \
-                       }                                      \
                }                                          \
                goto finish;                               \
        } while(0);
 
-#define ANALYTICAL_SUM_FP_IMP_NO_OVERLAP(TPE1, TPE2) \
+#define ANALYTICAL_SUM_IMP_RANGE_PART(TPE1, TPE2) \
+       do {                                        \
+               bit *nl = lp, *ns, *ne;                 \
+               TPE1 *bs, *be, v;                       \
+               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++) {                \
+                               v = *bs;                        \
+                               if (!is_##TPE1##_nil(v)) {      \
+                                       if(is_##TPE2##_nil(curval)) \
+                                               curval = (TPE2) v;      \
+                                       else                        \
+                                               ADD_WITH_CHECK(TPE1, v, TPE2, 
curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
+                               }                               \
+                       }                                   \
+                       *rb = curval;                       \
+                       rb++;                               \
+                       if(is_##TPE2##_nil(curval))         \
+                               has_nils = true;                \
+                       else                                \
+                               curval = TPE2##_nil;            \
+               }                                       \
+       } while(0);
+
+#define ANALYTICAL_SUM_IMP_RANGE_ALL(TPE1, TPE2) \
+       do {                                      \
+               TPE1 v;                               \
+               for(; pbp<bp; pbp++) {                \
+                       v = *pbp;                         \
+                       if (!is_##TPE1##_nil(v)) {        \
+                               if(is_##TPE2##_nil(curval))   \
+                                       curval = (TPE2) v;        \
+                               else                          \
+                                       ADD_WITH_CHECK(TPE1, v, TPE2, curval, 
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
+                       }                                 \
+               }                                     \
+               for (;rb < rp; rb++)                  \
+                       *rb = curval;                     \
+               if(is_##TPE2##_nil(curval))           \
+                       has_nils = true;                  \
+       } while(0);                               \
+
+#define ANALYTICAL_SUM_FP_IMP_RANGE_PART(TPE1, TPE2) \
+       do {                                        \
+               bit *nl = lp, *ns, *ne;                 \
+               TPE1 *bs;                               \
+               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);                \
+                       if(dofsum(bs, 0, 0, parcel, &curval, 1, TYPE_##TPE1, 
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, \
+                                         true, "GDKanalyticalsum") == 
BUN_NONE) { \
+                               goto bailout;                   \
+                       }                                   \
+                       *rb = curval;                       \
+                       rb++;                               \
+                       if(is_##TPE2##_nil(curval))         \
+                               has_nils = true;                \
+                       else                                \
+                               curval = TPE2##_nil;            \
+               }                                       \
+       } while(0);
+
+#define ANALYTICAL_SUM_FP_IMP_RANGE_ALL(TPE1, TPE2)  \
        do {                                             \
-               if(dofsum(pbp, 0, 0, ncnt, rb, 1, TYPE_##TPE1, TYPE_##TPE2, 
NULL, NULL, NULL, 0, 0, true, false, true, \
+               if(dofsum(pbp, 0, 0, cnt, &curval, 1, TYPE_##TPE1, TYPE_##TPE2, 
NULL, NULL, NULL, 0, 0, true, false, true, \
                                  "GDKanalyticalsum") == BUN_NONE) { \
                        goto bailout;                            \
                }                                            \
-               curval = *rb;                                \
                for (;rb < rp; rb++)                         \
                        *rb = curval;                            \
                if(is_##TPE2##_nil(curval))                  \
                        has_nils = true;                         \
        } while(0);
 
-#define ANALYTICAL_SUM_FP_IMP_ROWS(TPE1, TPE2)           \
-       do {                                                 \
-               TPE1 *bs, *bl, *be;                              \
-               bl = pbp;                                        \
-               (void) curval;                                   \
-               for(; pbp<bp; pbp++) {                           \
-                       bs = (pbp > bl+start) ? pbp - start : bl;    \
-                       be = (pbp+end < bp) ? pbp + end + 1 : bp;    \
-                       if(dofsum(bs, 0, 0, (be - bs), rb, 1, TYPE_##TPE1, 
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, true, \
-                                         "GDKanalyticalsum") == BUN_NONE) { \
-                               goto bailout;                            \
-                       }                                            \
-                       if(is_##TPE2##_nil(*rb))                     \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to