Changeset: eb6ac1a71b82 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eb6ac1a71b82
Added Files:
        sql/test/analytics/Tests/analytics04.sql
        sql/test/analytics/Tests/analytics04.stable.err
        sql/test/analytics/Tests/analytics04.stable.out
Modified Files:
        gdk/gdk_analytic.c
        gdk/gdk_analytic.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
        sql/backends/monet5/sql_rank.mal
        sql/backends/monet5/sql_rank.mal.sh
        sql/backends/monet5/sql_rank_hge.mal
        sql/backends/monet5/sql_rank_hge.mal.sh
        sql/common/sql_types.c
        sql/server/rel_select.c
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/test/analytics/Tests/All
        sql/test/analytics/Tests/analytics03.stable.err
Branch: analytics
Log Message:

Supporting non-centered window bounds for rows bounds at least. Cleaned macros 
according to the change.

I have to test range and groups yet.


diffs (truncated from 1759 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
@@ -102,44 +102,44 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 
 #undef ANALYTICAL_DIFF_IMP
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_START(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_PRECEDING(TPE, BOUNDF) \
        do {                                             \
                TPE *bl = pbp;                               \
                for(; pbp<bp; pbp++, rb++) {                 \
                        lng rlimit = BOUNDF;                     \
-                       *rb = MIN(pbp - bl, rlimit);             \
+                       *rb = -MIN(pbp - bl, rlimit - inc_last); \
                }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_END(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FOLLOWING(TPE, BOUNDF) \
        do {                                             \
                for(; pbp<bp; pbp++, rb++) {                 \
                        lng rlimit = BOUNDF;                     \
-                       *rb = MIN(bp - pbp-1, rlimit) + 1;       \
+                       *rb = MIN(bp - pbp - inc_last, rlimit) + inc_last; \
                }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_START(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_PRECEDING(TPE, BOUNDF) \
        do {                                                  \
                TPE *bl = pbp;                                    \
                for(; pbp<bp; pbp++, rb++)                        \
-                       *rb = (lng)(pbp - bl);                        \
+                       *rb = -(lng)(pbp - bl);                       \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_END(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_FOLLOWING(TPE, BOUNDF) \
        do {                                                  \
                for(; pbp<bp; pbp++, rb++)                        \
                        *rb = (lng)(bp - pbp);                        \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_START(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_PRECEDING(TPE, BOUNDF) \
        do {                                                \
                TPE *bl = pbp-1, *bs, v, rlimit;                \
                for(; pbp<bp; pbp++, rb++) {                    \
-                       lng curval = 0;                             \
+                       lng curval = -inc_last;                     \
                        rlimit = (TPE) BOUNDF;                      \
                        v = *pbp;                                   \
-                       for(bs=pbp-1; bs>bl; bs--, curval++) {      \
+                       for(bs=pbp-1; bs>bl; bs--, curval--) {      \
                                TPE calc;                               \
                                SUB_WITH_CHECK(TPE, v, TPE, *bs, TPE, calc, 
GDK_##TPE##_max, goto calc_overflow); \
                                if (ABSOLUTE(calc) > rlimit)            \
@@ -149,11 +149,11 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                               \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_END(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_FOLLOWING(TPE, BOUNDF) \
        do {                                              \
                TPE *bs, v, rlimit;                           \
                for(; pbp<bp; pbp++, rb++) {                  \
-                       lng curval = 1;                           \
+                       lng curval = inc_last;                    \
                        rlimit = (TPE) BOUNDF;                    \
                        v = *pbp;                                 \
                        for(bs=pbp+1; bs<bp; bs++, curval++) {    \
@@ -166,14 +166,14 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                             \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_START(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_PRECEDING(TPE, BOUNDF) \
        do {                                                 \
                TPE *bl = pbp-1, *bs, v;                         \
                for(; pbp<bp; pbp++, rb++) {                     \
-                       lng curval = 0;                              \
+                       lng curval = -inc_last;                      \
                        BUN rlimit = (BUN) BOUNDF;                   \
                        v = *pbp;                                    \
-                       for(bs=pbp-1; bs>bl; bs--, curval++) {       \
+                       for(bs=pbp-1; bs>bl; bs--, curval--) {       \
                                if(v != *bs) {                           \
                                        if(rlimit == 0)                      \
                                                break;                          
 \
@@ -185,11 +185,11 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                                \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_END(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_FOLLOWING(TPE, BOUNDF) \
        do {                                               \
                TPE *bs, v;                                    \
                for(; pbp<bp; pbp++, rb++) {                   \
-                       lng curval = 1;                            \
+                       lng curval = inc_last;                     \
                        BUN rlimit = (BUN) BOUNDF;                 \
                        v = *pbp;                                  \
                        for(bs=pbp+1; bs<bp; bs++, curval++) {     \
@@ -204,14 +204,14 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                              \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_START(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_PRECEDING(TPE, BOUNDF) \
        do {                                              \
                lng curval = 0;                               \
                for(; pbp<bp; pbp++, rb++)                    \
-                       *rb = curval++;                           \
+                       *rb = curval--;                           \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_END(TPE, BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_FOLLOWING(TPE, BOUNDF) \
        do {                                            \
                lng curval = ncnt + 1;                      \
                for(; pbp<bp; pbp++, rb++)                  \
@@ -222,25 +222,25 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
        do {                                   \
                TPE *pbp, *bp;                     \
                pbp = bp = (TPE*)Tloc(b, 0);       \
-               if(start) {                        \
+               if(preceding) {                    \
                        if(np) {                       \
                                nend += cnt;               \
                                for(; np<nend; np++) {     \
                                        if (*np) {             \
                                                ncnt = (np - pnp); \
                                                bp += ncnt;        \
-                                               IMP##_START(TPE, BOUNDF) \
+                                               IMP##_PRECEDING(TPE, BOUNDF) \
                                                pnp = np;          \
                                                pbp = bp;          \
                                        }                      \
                                }                          \
                                ncnt = (np - pnp);         \
                                bp += ncnt;                \
-                               IMP##_START(TPE, BOUNDF)   \
+                               IMP##_PRECEDING(TPE, BOUNDF) \
                        } else {                       \
                                ncnt = cnt;                \
                                bp += ncnt;                \
-                               IMP##_START(TPE, BOUNDF)   \
+                               IMP##_PRECEDING(TPE, BOUNDF) \
                        }                              \
                } else if(np) {                    \
                        nend += cnt;                   \
@@ -248,31 +248,31 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                                if (*np) {                 \
                                ncnt = (np - pnp);         \
                                        bp += ncnt;            \
-                                       IMP##_END(TPE, BOUNDF) \
+                                       IMP##_FOLLOWING(TPE, BOUNDF) \
                                        pnp = np;              \
                                        pbp = bp;              \
                                }                          \
                        }                              \
                        ncnt = (np - pnp);             \
                        bp += ncnt;                    \
-                       IMP##_END(TPE, BOUNDF)         \
+                       IMP##_FOLLOWING(TPE, BOUNDF)   \
                } else {                           \
                        ncnt = cnt;                    \
                        bp += ncnt;                    \
-                       IMP##_END(TPE, BOUNDF)         \
+                       IMP##_FOLLOWING(TPE, BOUNDF)   \
                }                                  \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_START(BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_PRECEDING(BOUNDF) \
        do {                                             \
                BUN m = k;                                   \
                for(; k<i; k++, rb++) {                      \
                        lng rlimit = BOUNDF;                     \
-                       *rb = MIN((lng)(k - m), rlimit);         \
+                       *rb = -MIN((lng)(k - m), rlimit);        \
                }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_END(BOUNDF) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FOLLOWING(BOUNDF) \
        do {                                             \
                for(; k<i; k++, rb++) {                      \
                        lng rlimit = BOUNDF;                     \
@@ -280,20 +280,20 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_START(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_PRECEDING(BOUNDV) \
        do {                                                  \
                BUN j = k;                                        \
                for(; k<i; k++, rb++)                             \
-                       *rb = (k - j);                                \
+                       *rb = -(lng)(k - j);                          \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_END(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_FOLLOWING(BOUNDV) \
        do {                                                \
                for(; k<i; k++, rb++)                           \
                        *rb = (i - k);                              \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_START(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_PRECEDING(BOUNDV) \
        do {                                              \
                BUN j;                                        \
                *rb = 0; /* the first element's window size is hardcoded to 
avoid overflow in BUN */ \
@@ -301,9 +301,9 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                k++;                                          \
                j = k - 1;                                    \
                for(; k<i; k++, rb++) {                       \
-                       lng curval = 1;                           \
+                       lng curval = -inc_last;                   \
                        void *v = BUNtail(bpi, k);                \
-                       for(BUN l=k-1; l>j; l--, curval++) {      \
+                       for(BUN l=k-1; l>j; l--, curval--) {      \
                                if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
BOUNDV) \
                                        break;                            \
                        }                                         \
@@ -311,10 +311,10 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                             \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_END(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_FOLLOWING(BOUNDV) \
        do {                                            \
                for(; k<i; k++, rb++) {                     \
-                       lng curval = 1;                         \
+                       lng curval = inc_last;                  \
                        void *v = BUNtail(bpi, k);              \
                        for(BUN l=k+1; l<i; l++, curval++) {    \
                                if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
BOUNDV) \
@@ -324,7 +324,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                           \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_START(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_PRECEDING(BOUNDV) \
        do {                                               \
                BUN j;                                         \
                *rb = 0; /* the first element's window size is hardcoded to 
avoid overflow in BUN */ \
@@ -332,10 +332,10 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                k++;                                           \
                j = k - 1;                                     \
                for(; k<i; k++, rb++) {                        \
-                       lng curval = 1;                            \
+                       lng curval = -inc_last;                    \
                        BUN rlimit = (BUN) BOUNDV;                 \
                        void *v = BUNtail(bpi, k);                 \
-                       for(BUN l=k-1; l>j; l--, curval++) {       \
+                       for(BUN l=k-1; l>j; l--, curval--) {       \
                                void *next = BUNtail(bpi, l);          \
                                if(atomcmp(v, next)) {                 \
                                        if(rlimit == 0)                    \
@@ -348,10 +348,10 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                              \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_END(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_FOLLOWING(BOUNDV) \
        do {                                             \
                for(; k<i; k++, rb++) {                      \
-                       lng curval = 1;                          \
+                       lng curval = inc_last;                   \
                        BUN rlimit = (BUN) BOUNDV;               \
                        void *v = BUNtail(bpi, k);               \
                        for(BUN l=k+1; l<i; l++, curval++) {     \
@@ -367,14 +367,14 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_START(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_PRECEDING(BOUNDV) \
        do {                                            \
                lng curval = 0;                             \
                for(; k<i; k++, rb++)                       \
-                       *rb = curval++;                         \
+                       *rb = curval--;                         \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_END(BOUNDV) \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_FOLLOWING(BOUNDV) \
        do {                                          \
                lng curval = ncnt + 1;                    \
                for(; k<i; k++, rb++)                     \
@@ -416,7 +416,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                                ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(dbl, 
ANALYTICAL_WINDOW_BOUNDS_FIXED##FRAME, BOUNDF) \
                                break; \
                        default: { \
-                               if(start) { \
+                               if(preceding) { \
                                        if (p) { \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to