Changeset: 006f6023d430 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=006f6023d430 Modified Files: gdk/gdk_analytic.c gdk/gdk_analytic.h sql/backends/monet5/sql_rank.c sql/test/analytics/Tests/analytics02.sql sql/test/analytics/Tests/analytics02.stable.out Branch: analytics Log Message:
Overlapped min and max functions on a window.
diffs (truncated from 958 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
@@ -961,186 +961,246 @@ finish:
#undef ANALYTICAL_LEAD_IMP
-#define ANALYTICAL_LIMIT_IMP(TPE, OP) \
- do { \
- TPE *rp, *rb, *pbp, *bp, *rend, curval, v; \
- rb = rp = (TPE*)Tloc(r, 0); \
- pbp = bp = (TPE*)Tloc(b, 0); \
- curval = *bp; \
- rend = rp + cnt; \
- if (p) { \
- pnp = np = (bit*)Tloc(p, 0); \
- end = np + cnt; \
- for(; np<end; np++) { \
- if (*np) { \
- ncnt = (np - pnp);
\
- rp += ncnt;
\
- bp += ncnt;
\
- for(; pbp<bp; pbp++) {
\
- v = *pbp;
\
- if(!is_##TPE##_nil(v)) {
\
-
if(is_##TPE##_nil(curval)) \
- curval = v;
\
- else
\
- curval = OP(v,
curval); \
- }
\
- }
\
- if(is_##TPE##_nil(curval))
\
- has_nils = true;
\
- for (;rb < rp; rb++)
\
- *rb = curval;
\
- curval = *bp;
\
- pnp = np;
\
- pbp = bp;
\
- } \
- } \
- ncnt = (np - pnp); \
- rp += ncnt; \
- bp += ncnt; \
- for(; pbp<bp; pbp++) { \
- v = *pbp; \
- if(!is_##TPE##_nil(v)) { \
- if(is_##TPE##_nil(curval))
\
- curval = v;
\
- else
\
- curval = OP(v, curval);
\
- } \
- } \
- if(is_##TPE##_nil(curval)) \
- has_nils = true; \
- for (;rb < rp; rb++) \
- *rb = curval; \
- } else if (o || force_order) { \
- TPE *bend = bp + cnt; \
- for(; bp<bend; bp++) { \
- v = *bp; \
- if(!is_##TPE##_nil(v)) { \
- if(is_##TPE##_nil(curval))
\
- curval = v;
\
- else
\
- curval = OP(v, curval);
\
- } \
- } \
- if(is_##TPE##_nil(curval)) \
- has_nils = true; \
- for(;rb<rend; rb++) \
- *rb = curval; \
- } else { /* single value, ie no ordering */ \
- for(; rp<rend; rp++, bp++) { \
- v = *bp; \
- if(is_##TPE##_nil(v)) \
- has_nils = true;
\
- *rp = v; \
- } \
- } \
+#define ANALYTICAL_LIMIT_IMP_NO_OVERLAP(TPE, IMP) \
+ do { \
+ curval = *pbp; \
+ pbp++; \
+ for(; pbp<bp; pbp++) { \
+ v = *pbp; \
+ if(!is_##TPE##_nil(v)) { \
+ if(is_##TPE##_nil(curval)) \
+ curval = v; \
+ else \
+ curval = IMP(v, curval); \
+ } \
+ } \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ if(is_##TPE##_nil(curval)) \
+ has_nils = true; \
+ } while(0);
+
+#define ANALYTICAL_LIMIT_IMP_OVERLAP(TPE, IMP) \
+ do { \
+ TPE *bs, *bl, *be; \
+ bl = pbp; \
+ for(; pbp<bp;pbp++) { \
+ bs = (pbp > bl+start) ? pbp - start : bl; \
+ be = (pbp+end < bp) ? pbp + end + 1 : bp; \
+ curval = *bs; \
+ bs++; \
+ for(; bs<be; bs++) { \
+ v = *bs; \
+ if(!is_##TPE##_nil(v)) { \
+ if(is_##TPE##_nil(curval)) \
+ curval = v; \
+ else \
+ curval = IMP(v, curval); \
+ } \
+ } \
+ *rb = curval; \
+ rb++; \
+ if(is_##TPE##_nil(curval)) \
+ has_nils = true; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_LIMIT_IMP(TPE, IMP, REAL) \
+ do { \
+ TPE *rp, *rb, *pbp, *bp, *rend, curval, v; \
+ rb = rp = (TPE*)Tloc(r, 0); \
+ pbp = bp = (TPE*)Tloc(b, 0); \
+ rend = rp + cnt; \
+ if (p) { \
+ pnp = np = (bit*)Tloc(p, 0); \
+ nend = np + cnt; \
+ for(; np<nend; np++) { \
+ if (*np) { \
+ ncnt = (np - pnp); \
+ rp += ncnt; \
+ bp += ncnt; \
+ REAL(TPE, IMP) \
+ pnp = np; \
+ pbp = bp; \
+ } \
+ } \
+ ncnt = (np - pnp); \
+ rp += ncnt; \
+ bp += ncnt; \
+ REAL(TPE, IMP) \
+ } else if (o || force_order) { \
+ rp += cnt; \
+ bp += cnt; \
+ REAL(TPE, IMP) \
+ } else { \
+ for(; rp<rend; rp++, bp++) { \
+ v = *bp; \
+ if(is_##TPE##_nil(v)) \
+ has_nils = true; \
+ *rp = v; \
+ } \
+ } \
} while(0);
#ifdef HAVE_HUGE
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP) \
- case TYPE_hge: \
- ANALYTICAL_LIMIT_IMP(hge, IMP) \
+#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL) \
+ case TYPE_hge: \
+ ANALYTICAL_LIMIT_IMP(hge, IMP, REAL) \
break;
#else
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP)
+#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL)
#endif
-#define ANALYTICAL_LIMIT(OP, IMP, SIGN_OP)
\
-gdk_return
\
-GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe)
\
-{
\
- int (*atomcmp)(const void *, const void *);
\
- const void* restrict nil;
\
- bool has_nils = false;
\
- BUN i, j, ncnt, cnt = BATcount(b);
\
- bit *np, *pnp, *end;
\
- gdk_return gdk_res = GDK_SUCCEED;
\
-
\
- switch(ATOMstorage(tpe)) {
\
- case TYPE_bit:
\
- ANALYTICAL_LIMIT_IMP(bit, IMP)
\
- break;
\
- case TYPE_bte:
\
- ANALYTICAL_LIMIT_IMP(bte, IMP)
\
- break;
\
- case TYPE_sht:
\
- ANALYTICAL_LIMIT_IMP(sht, IMP)
\
- break;
\
- case TYPE_int:
\
- ANALYTICAL_LIMIT_IMP(int, IMP)
\
- break;
\
- case TYPE_lng:
\
- ANALYTICAL_LIMIT_IMP(lng, IMP)
\
- break;
\
- ANALYTICAL_LIMIT_IMP_HUGE(IMP)
\
- case TYPE_flt:
\
- ANALYTICAL_LIMIT_IMP(flt, IMP)
\
- break;
\
- case TYPE_dbl:
\
- ANALYTICAL_LIMIT_IMP(dbl, IMP)
\
- break;
\
- default: {
\
- BATiter bpi = bat_iterator(b);
\
- void *restrict curval = BUNtail(bpi, 0);
\
- nil = ATOMnilptr(tpe);
\
- atomcmp = ATOMcompare(tpe);
\
- if (p) {
\
- np = (bit*)Tloc(p, 0);
\
- for(i=0,j=0; i<cnt; i++, np++) {
\
- if (*np) {
\
- if((*atomcmp)(curval, nil) ==
0) \
- has_nils = true;
\
- for (;j < i; j++) {
\
- if ((gdk_res =
BUNappend(r, curval, false)) != GDK_SUCCEED) \
- goto finish;
\
- }
\
- curval = BUNtail(bpi, i);
\
- }
\
- void *next = BUNtail(bpi, i);
\
- if((*atomcmp)(next, nil) != 0) {
\
- if((*atomcmp)(curval, nil) ==
0) \
- curval = next;
\
- else
\
- curval = atomcmp(next,
curval) SIGN_OP 0 ? curval : next; \
- }
\
- }
\
- if((*atomcmp)(curval, nil) == 0)
\
- has_nils = true;
\
- for (;j < i; j++) {
\
- if ((gdk_res = BUNappend(r, curval,
false)) != GDK_SUCCEED) \
- goto finish;
\
- }
\
- } else if (o || force_order) {
\
- for(i=0; i<cnt; i++) {
\
- void *next = BUNtail(bpi, i);
\
- if((*atomcmp)(next, nil) != 0)
{ \
- if((*atomcmp)(curval,
nil) == 0) \
- curval = next;
\
- else
\
- curval =
atomcmp(next, curval) SIGN_OP 0 ? curval : next; \
- }
\
- }
\
- if((*atomcmp)(curval, nil) == 0)
\
- has_nils = true;
\
- for (j=0; j < i; j++) {
\
- if ((gdk_res = BUNappend(r, curval,
false)) != GDK_SUCCEED) \
- goto finish;
\
- }
\
- } else { /* single value, ie no ordering */
\
- for(i=0; i<cnt; i++) {
\
- void *next = BUNtail(bpi, i);
\
- if((*atomcmp)(next, nil) == 0)
\
- has_nils = true;
\
- if ((gdk_res = BUNappend(r, next,
false)) != GDK_SUCCEED) \
- goto finish;
\
- }
\
- }
\
- }
\
- }
\
-finish:
\
- BATsetcount(r, cnt);
\
- r->tnonil = !has_nils;
\
- r->tnil = has_nils;
\
- return gdk_res;
\
+#define ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP(SIGN_OP) \
+ do {
\
+ l = j;
\
+ curval = BUNtail(bpi, j);
\
+ j++;
\
+ for (;j < i; j++) {
\
+ void *next = BUNtail(bpi, j);
\
+ if((*atomcmp)(next, nil) != 0) {
\
+ if((*atomcmp)(curval, nil) == 0)
\
+ curval = next;
\
+ else
\
+ curval = atomcmp(next, curval) SIGN_OP
0 ? curval : next; \
+ }
\
+ }
\
+ j = l;
\
+ for (;j < i; j++) {
\
+ if ((gdk_res = BUNappend(r, curval, false)) !=
GDK_SUCCEED) \
+ goto finish;
\
+ }
\
+ if((*atomcmp)(curval, nil) == 0)
\
+ has_nils = true;
\
+ } while(0);
+
+#define ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP(SIGN_OP)
\
+ do {
\
+ m = k;
\
+ for(;k<i;k++) {
\
+ j = (k > m+start) ? k - start : m;
\
+ l = (k+end < i) ? k + end + 1 : i;
\
+ curval = BUNtail(bpi, j);
\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
