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
