Changeset: 40c89baa3bd7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=40c89baa3bd7 Modified Files: gdk/gdk_analytic.c sql/test/analytics/Tests/analytics03.sql Branch: analytics Log Message:
Implemented count in a window range.
diffs (truncated from 914 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
@@ -1113,12 +1113,6 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
#undef ANALYTICAL_MIN_MAX_BRANCHES
#undef ANALYTICAL_MIN_MAX_LIMIT
-#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_NO_OVERLAP \
- do { \
- for (;rb < rp; rb++) \
- *rb = curval; \
- } while(0);
-
#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
do { \
lng *rs = rb, *fs, *fe; \
@@ -1129,38 +1123,92 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
} \
} while(0);
-#define ANALYTICAL_COUNT_IGNORE_NILS_CALC(FRAME) \
- do { \
- lng *rp, *rb, curval = 0; \
- rb = rp = (lng*)Tloc(r, 0); \
- if (p) { \
- np = pnp = (bit*)Tloc(p, 0); \
- nend = np + cnt; \
- for(; np < nend; np++) { \
- if (*np) { \
- curval = np - pnp;
\
- rp += curval;
\
- ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME
\
- pnp = np;
\
- } \
- } \
- curval = np - pnp; \
- rp += curval; \
- ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME \
- } else { \
- curval = cnt; \
- rp += curval; \
- ANALYTICAL_COUNT_IGNORE_NILS_IMP##FRAME \
- } \
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC_ROWS \
+ do { \
+ lng *rp, *rb, curval = 0; \
+ rb = rp = (lng*)Tloc(r, 0); \
+ if (p) { \
+ np = pnp = (bit*)Tloc(p, 0); \
+ nend = np + cnt; \
+ for(; np < nend; np++) { \
+ if (*np) { \
+ curval = np - pnp; \
+ rp += curval; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
+ pnp = np; \
+ } \
+ } \
+ curval = np - pnp; \
+ rp += curval; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
+ } else { \
+ curval = cnt; \
+ rp += curval; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_ROWS \
+ } \
+ } while(0);
+
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_ALL \
+ do { \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
} while(0);
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_NO_OVERLAP(TPE) \
- do { \
- for (;pbp < bp; pbp++) \
- curval += !is_##TPE##_nil(*pbp); \
- for (;rb < rp; rb++) \
- *rb = curval; \
- curval = 0; \
+#define ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+ do { \
+ bit *nl = lp, *ns, *ne; \
+ BUN rstart, rend; \
+ 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--; \
+ } \
+ } \
+ curval = (lng)(ne - ns); \
+ *rb = curval; \
+ rb++; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_COUNT_IGNORE_NILS_CALC_RANGE \
+ do { \
+ lng *rb, *rp, curval = 0; \
+ rp = rb = (lng*)Tloc(r, 0); \
+ if (p) { \
+ pnp = np = (bit*)Tloc(p, 0); \
+ lend = lp = o ? (bit*)Tloc(o, 0) : np; \
+ nend = np + cnt; \
+ for(; np<nend; np++) { \
+ if (*np) { \
+ ncnt = (np - pnp); \
+ lend += ncnt; \
+
ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+ pnp = np; \
+ } \
+ } \
+ ncnt = (np - pnp); \
+ lend += ncnt; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+ } else if (o) { \
+ lend = lp = (bit*)Tloc(o, 0); \
+ lend += cnt; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_PART \
+ } else { \
+ curval = cnt; \
+ rp += curval; \
+ ANALYTICAL_COUNT_IGNORE_NILS_IMP_RANGE_ALL \
+ } \
} while(0);
#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_ROWS(TPE)\
@@ -1177,7 +1225,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
} \
} while(0);
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC(TPE, IMP)\
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC_ROWS(TPE, IMP) \
do { \
TPE *pbp, *bp = (TPE*)Tloc(b, 0); \
lng *rp, *rb, curval = 0; \
@@ -1207,13 +1255,79 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
} \
} while(0);
-#define ANALYTICAL_COUNT_NO_NIL_STR_IMP_NO_OVERLAP(TPE_CAST, OFFSET) \
- do { \
- for(;j<i;j++) \
- curval += base[(var_t) ((TPE_CAST) bp) OFFSET] !=
'\200'; \
- for (;rb < rp; rb++) \
- *rb = curval;
\
- curval = 0; \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_RANGE_ALL(TPE) \
+ do { \
+ for (;pbp < bp; pbp++) \
+ curval += !is_##TPE##_nil(*pbp); \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ curval = 0; \
+ } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_RANGE_PART(TPE) \
+ do { \
+ bit *nl = lp, *ns, *ne; \
+ TPE *bs, *be; \
+ 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++) \
+ curval += !is_##TPE##_nil(*bs); \
+ *rb = curval; \
+ curval = 0; \
+ rb++; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_CALC_RANGE(TPE, IMP) \
+ do { \
+ TPE *bp = (TPE*)Tloc(b, 0); \
+ lng *rb, *rp, curval = 0; \
+ rp = rb = (lng*)Tloc(r, 0); \
+ if (p) { \
+ pnp = np = (bit*)Tloc(p, 0); \
+ lend = lp = o ? (bit*)Tloc(o, 0) : np; \
+ nend = np + cnt; \
+ for(; np<nend; np++) { \
+ if (*np) { \
+ ncnt = (np - pnp); \
+ lend += ncnt; \
+ IMP##_PART(TPE) \
+ bp += ncnt; \
+ pnp = np; \
+ } \
+ } \
+ ncnt = (np - pnp); \
+ lend += ncnt; \
+ IMP##_PART(TPE) \
+ } else if (o) { \
+ lend = lp = (bit*)Tloc(o, 0); \
+ lend += cnt; \
+ IMP##_PART(TPE) \
+ } else { \
+ TPE *pbp = bp; \
+ rp += cnt; \
+ bp += cnt; \
+ IMP##_ALL(TPE) \
+ } \
} while(0);
#define ANALYTICAL_COUNT_NO_NIL_STR_IMP_ROWS(TPE_CAST, OFFSET) \
@@ -1230,50 +1344,104 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
}
\
} while(0);
-#define ANALYTICAL_COUNT_NO_NIL_STR_CALC(TPE_CAST, OFFSET, IMP)\
- do { \
- const void *restrict bp = Tloc(b, 0); \
- lng *rp, *rb, curval = 0; \
- rb = rp = (lng*)Tloc(r, 0); \
- if (p) { \
- pnp = np = (bit*)Tloc(p, 0); \
- nend = np + cnt; \
- for(; np<nend; np++) { \
- if (*np) { \
- ncnt = (np - pnp); \
- rp += ncnt;
\
- i += ncnt;
\
- IMP(TPE_CAST, OFFSET)
\
- pnp = np;
\
- } \
- } \
- ncnt = (np - pnp); \
- rp += ncnt; \
- i += ncnt; \
- IMP(TPE_CAST, OFFSET) \
- } else { \
- rp += cnt; \
- i += cnt; \
- IMP(TPE_CAST, OFFSET) \
- } \
+#define ANALYTICAL_COUNT_NO_NIL_STR_CALC_ROWS(TPE_CAST, OFFSET, IMP) \
+ do { \
+ const void *restrict bp = Tloc(b, 0); \
+ lng *rp, *rb, curval = 0; \
+ rb = rp = (lng*)Tloc(r, 0); \
+ if (p) { \
+ pnp = np = (bit*)Tloc(p, 0); \
+ nend = np + cnt; \
+ for(; np<nend; np++) { \
+ if (*np) { \
+ ncnt = (np - pnp); \
+ rp += ncnt; \
+ i += ncnt; \
+ IMP(TPE_CAST, OFFSET) \
+ pnp = np; \
+ } \
+ } \
+ ncnt = (np - pnp); \
+ rp += ncnt; \
+ i += ncnt; \
+ IMP(TPE_CAST, OFFSET) \
+ } else { \
+ rp += cnt; \
+ i += cnt; \
+ IMP(TPE_CAST, OFFSET) \
+ } \
+ } while(0);
+
+#define ANALYTICAL_COUNT_NO_NIL_STR_IMP_RANGE_ALL(TPE_CAST, OFFSET) \
+ do { \
+ for(;j<i;j++) \
+ curval += base[(var_t) ((TPE_CAST) bp) OFFSET] !=
'\200'; \
+ for (;rb < rp; rb++) \
+ *rb = curval;
\
} while(0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
