Changeset: a97cab36e747 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a97cab36e747
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.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
Branch: analytics
Log Message:

Pass expressions for window boundaries, thus allowing different boundaries for 
different rows. Also changed the window boundaries atom from int to lng to 
accomodate larger result sets.

Now I need to add more tests.


diffs (truncated from 1640 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,78 +102,72 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 
 #undef ANALYTICAL_DIFF_IMP
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_START(TPE) \
-       do {                                               \
-               TPE *bs = MIN(pbp + limit, bp);                \
-               int curval = 0;                                \
-               for(; pbp<bs; pbp++, rb++)                     \
-                       *rb = curval++;                            \
-               for(; pbp<bp; pbp++, rb++)                     \
-                       *rb = curval;                              \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_START(TPE, BOUNDF) \
+       do {                                             \
+               TPE *bl = pbp;                               \
+               for(; pbp<bp; pbp++, rb++) {                 \
+                       lng rlimit = BOUNDF;                     \
+                       *rb = MIN(pbp - bl, rlimit);             \
+               }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_END(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_END(TPE, BOUNDF) \
        do {                                             \
-               int curval = MIN(ncnt, limit);               \
-               TPE *bs = bp - curval;                       \
-               curval++;                                    \
-               for(; pbp<bs; pbp++, rb++)                   \
-                       *rb = curval;                            \
-               for(; pbp<bp; pbp++, rb++)                   \
-                       *rb = --curval;                          \
+               for(; pbp<bp; pbp++, rb++) {                 \
+                       lng rlimit = BOUNDF;                     \
+                       *rb = MIN(bp - pbp-1, rlimit) + 1;       \
+               }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_START(TPE) \
-       do {                                                    \
-               TPE *bl = pbp;                                      \
-               for(; pbp<bp; pbp++, rb++)                          \
-                       *rb = (int)(pbp - bl);                          \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_START(TPE, BOUNDF) \
+       do {                                                  \
+               TPE *bl = pbp;                                    \
+               for(; pbp<bp; pbp++, rb++)                        \
+                       *rb = (lng)(pbp - bl);                        \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_END(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_END(TPE, BOUNDF) \
        do {                                                  \
                for(; pbp<bp; pbp++, rb++)                        \
-                       *rb = (int)(bp - pbp);                        \
+                       *rb = (lng)(bp - pbp);                        \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_START(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_START(TPE, BOUNDF) \
        do {                                                \
-               TPE *bl = pbp-1, *bs, v, blimit = (TPE) limit;  \
-               int curval;                                     \
+               TPE *bl = pbp-1, *bs, v, rlimit;                \
                for(; pbp<bp; pbp++, rb++) {                    \
-                       curval = 0;                                 \
+                       lng curval = 0;                             \
+                       rlimit = (TPE) BOUNDF;                      \
                        v = *pbp;                                   \
                        for(bs=pbp-1; bs>bl; bs--, curval++) {      \
-                               if (ABSOLUTE(v - *bs) > blimit)         \
+                               if (ABSOLUTE(v - *bs) > rlimit)         \
                                        break;                              \
                        }                                           \
                        *rb = curval;                               \
                }                                               \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_END(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_END(TPE, BOUNDF) \
        do {                                              \
-               TPE *bs, v, blimit = (TPE) limit;             \
-               int curval;                                   \
+               TPE *bs, v, rlimit;                           \
                for(; pbp<bp; pbp++, rb++) {                  \
-                       curval = 1;                               \
+                       lng curval = 1;                           \
+                       rlimit = (TPE) BOUNDF;                    \
                        v = *pbp;                                 \
                        for(bs=pbp+1; bs<bp; bs++, curval++) {    \
-                               if (ABSOLUTE(v - *bs) > blimit)       \
+                               if (ABSOLUTE(v - *bs) > rlimit)       \
                                        break;                            \
                        }                                         \
                        *rb = curval;                             \
                }                                             \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_START(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_START(TPE, BOUNDF) \
        do {                                                 \
                TPE *bl = pbp-1, *bs, v;                         \
-               int curval;                                      \
-               BUN rlimit;                                      \
                for(; pbp<bp; pbp++, rb++) {                     \
-                       curval = 0;                                  \
-                       rlimit = limit;                              \
+                       lng curval = 0;                              \
+                       BUN rlimit = (BUN) BOUNDF;                   \
                        v = *pbp;                                    \
                        for(bs=pbp-1; bs>bl; bs--, curval++) {       \
                                if(v != *bs) {                           \
@@ -187,14 +181,12 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                                \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_END(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_END(TPE, BOUNDF) \
        do {                                               \
                TPE *bs, v;                                    \
-               int curval;                                    \
-               BUN rlimit;                                    \
                for(; pbp<bp; pbp++, rb++) {                   \
-                       curval = 1;                                \
-                       rlimit = limit;                            \
+                       lng curval = 1;                            \
+                       BUN rlimit = (BUN) BOUNDF;                 \
                        v = *pbp;                                  \
                        for(bs=pbp+1; bs<bp; bs++, curval++) {     \
                                if(v != *bs) {                         \
@@ -208,21 +200,21 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                              \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_START(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_START(TPE, BOUNDF) \
        do {                                              \
-               int curval = 0;                               \
+               lng curval = 0;                               \
                for(; pbp<bp; pbp++, rb++)                    \
                        *rb = curval++;                           \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_END(TPE) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_END(TPE, BOUNDF) \
        do {                                            \
-               int curval = ncnt + 1;                      \
+               lng curval = ncnt + 1;                      \
                for(; pbp<bp; pbp++, rb++)                  \
                        *rb = --curval;                         \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(TPE, IMP) \
+#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(TPE, IMP, BOUNDF) \
        do {                                   \
                TPE *pbp, *bp;                     \
                pbp = bp = (TPE*)Tloc(b, 0);       \
@@ -233,18 +225,18 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                                        if (*np) {             \
                                                ncnt = (np - pnp); \
                                                bp += ncnt;        \
-                                               IMP##_START(TPE)   \
+                                               IMP##_START(TPE, BOUNDF) \
                                                pnp = np;          \
                                                pbp = bp;          \
                                        }                      \
                                }                          \
                                ncnt = (np - pnp);         \
                                bp += ncnt;                \
-                               IMP##_START(TPE)           \
+                               IMP##_START(TPE, BOUNDF)   \
                        } else {                       \
                                ncnt = cnt;                \
                                bp += ncnt;                \
-                               IMP##_START(TPE)           \
+                               IMP##_START(TPE, BOUNDF)   \
                        }                              \
                } else if(np) {                    \
                        nend += cnt;                   \
@@ -252,105 +244,95 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                                if (*np) {                 \
                                ncnt = (np - pnp);         \
                                        bp += ncnt;            \
-                                       IMP##_END(TPE)         \
+                                       IMP##_END(TPE, BOUNDF) \
                                        pnp = np;              \
                                        pbp = bp;              \
                                }                          \
                        }                              \
                        ncnt = (np - pnp);             \
                        bp += ncnt;                    \
-                       IMP##_END(TPE)                 \
+                       IMP##_END(TPE, BOUNDF)         \
                } else {                           \
                        ncnt = cnt;                    \
                        bp += ncnt;                    \
-                       IMP##_END(TPE)                 \
+                       IMP##_END(TPE, BOUNDF)         \
                }                                  \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_START \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_START(BOUNDF) \
        do {                                             \
-               int curval = 0;                              \
-               BUN l = MIN(k + limit, i);                   \
-               for(; k<l; k++, rb++)                        \
-                       *rb = curval++;                          \
-               for(; k<i; k++, rb++)                        \
-                       *rb = curval;                            \
+               BUN m = k;                                   \
+               for(; k<i; k++, rb++) {                      \
+                       lng rlimit = BOUNDF;                     \
+                       *rb = MIN((lng)(k - m), rlimit);         \
+               }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_END \
-       do {                                           \
-               int curval = MIN(ncnt, limit);             \
-               BUN l = i - curval;                        \
-               curval++;                                  \
-               for(; k<l; k++, rb++)                      \
-                       *rb = curval;                          \
-               for(; k<i; k++, rb++)                      \
-                       *rb = --curval;                        \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_END(BOUNDF) \
+       do {                                             \
+               for(; k<i; k++, rb++) {                      \
+                       lng rlimit = BOUNDF;                     \
+                       *rb = MIN((lng)(i - k - 1), rlimit) + 1; \
+               }                                            \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_START \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_START(BOUNDV) \
        do {                                                  \
                BUN j = k;                                        \
                for(; k<i; k++, rb++)                             \
                        *rb = (k - j);                                \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_END \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_END(BOUNDV) \
        do {                                                \
                for(; k<i; k++, rb++)                           \
                        *rb = (i - k);                              \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_START \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_START(BOUNDV) \
        do {                                              \
-               void *v;                                      \
-               int curval, llimit = (int)limit;              \
                BUN j;                                        \
                *rb = 0; /* the first element's window size is hardcoded to 
avoid overflow in BUN */ \
                rb++;                                         \
                k++;                                          \
                j = k - 1;                                    \
                for(; k<i; k++, rb++) {                       \
-                       curval = 1;                               \
-                       v = BUNtail(bpi, k);                      \
+                       lng curval = 1;                           \
+                       void *v = BUNtail(bpi, k);                \
                        for(BUN l=k-1; l>j; l--, curval++) {      \
-                               if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
llimit) \
+                               if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
BOUNDV) \
                                        break;                            \
                        }                                         \
                        *rb = curval;                             \
                }                                             \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_END \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_END(BOUNDV) \
        do {                                            \
-               void *v;                                    \
-               int curval, llimit = (int)limit;            \
                for(; k<i; k++, rb++) {                     \
-                       curval = 1;                             \
-                       v = BUNtail(bpi, k);                    \
+                       lng curval = 1;                         \
+                       void *v = BUNtail(bpi, k);              \
                        for(BUN l=k+1; l<i; l++, curval++) {    \
-                               if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
llimit) \
+                               if (ABSOLUTE(atomcmp(v, BUNtail(bpi, l))) > 
BOUNDV) \
                                        break;                          \
                        }                                       \
                        *rb = curval;                           \
                }                                           \
        } while(0);
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_START \
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_START(BOUNDV) \
        do {                                               \
-               void *v, *next;                                \
-               int curval;                                    \
-               BUN j, rlimit;                                 \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to