Changeset: 0a121f5ad014 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a121f5ad014 Added Files: sql/test/analytics/Tests/analytics03.sql Modified Files: gdk/gdk_analytic.c gdk/gdk_analytic.h sql/backends/monet5/sql_rank.c sql/server/rel_select.c Branch: analytics Log Message:
Implemented sum and product in a window range.
Some more refactoring will be needed.
diffs (truncated from 1428 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
@@ -898,8 +898,7 @@ finish:
#define ANALYTICAL_MIN_MAX_IMP_ROWS(TPE, IMP) \
do { \
- TPE *bs, *bl, *be; \
- bl = pbp; \
+ TPE *bl = pbp, *bs, *be; \
for(; pbp<bp;pbp++) { \
bs = (pbp > bl+start) ? pbp - start : bl; \
be = (pbp+end < bp) ? pbp + end + 1 : bp; \
@@ -1076,7 +1075,7 @@ finish:
#define ANALYTICAL_MIN_MAX(OP, IMP, SIGN_OP) \
gdk_return \
-GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe,
BUN start, BUN end) \
+GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe,
int unit, BUN start, BUN end) \
{ \
int (*atomcmp)(const void *, const void *); \
const void* restrict nil; \
@@ -1085,10 +1084,14 @@ GDKanalytical##OP(BAT *r, BAT *b, BAT *p
bit *np, *pnp, *nend; \
gdk_return gdk_res = GDK_SUCCEED; \
\
- if(start == 0 && end == 0) { \
+ assert(unit >= 0 && unit <= 2); \
+ \
+ if(unit == 0 && start == 0 && end == 0) { \
ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _NO_OVERLAP) \
+ } else if(unit == 0) { \
+ ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
} else { \
- ANALYTICAL_MIN_MAX_BRANCHES(OP, IMP, SIGN_OP, _ROWS) \
+ \
} \
finish: \
BATsetcount(r, cnt); \
@@ -1162,8 +1165,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP_ROWS(TPE)\
do { \
- TPE *bs, *bl, *be; \
- bl = pbp; \
+ TPE *bl = pbp, *bs, *be; \
for(; pbp<bp;pbp++) { \
bs = (pbp > bl+start) ? pbp - start : bl; \
be = (pbp+end < bp) ? pbp + end + 1 : bp; \
@@ -1420,24 +1422,30 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
}
gdk_return
-GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int
tpe, BUN start, BUN end)
+GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const bit *ignore_nils, int
tpe, int unit, BUN start, BUN end)
{
BUN i = 0, j = 0, k = 0, l = 0, m = 0, ncnt, cnt = BATcount(b);
bit *np, *pnp, *nend;
gdk_return gdk_res = GDK_SUCCEED;
assert(ignore_nils);
+ assert(unit >= 0 && unit <= 2);
(void) o;
+
if(!*ignore_nils || b->T.nonil) {
- if(start == 0 && end == 0) {
+ if(unit == 0 && start == 0 && end == 0) {
ANALYTICAL_COUNT_IGNORE_NILS_CALC(_NO_OVERLAP)
- } else {
+ } else if(unit == 0) {
ANALYTICAL_COUNT_IGNORE_NILS_CALC(_ROWS)
+ } else {
+
}
- } else if(start == 0 && end == 0) {
+ } else if(unit == 0 && start == 0 && end == 0) {
ANALYTICAL_COUNT_BRANCHES(_NO_OVERLAP)
+ } else if(unit == 0) {
+ ANALYTICAL_COUNT_BRANCHES(_ROWS)
} else {
- ANALYTICAL_COUNT_BRANCHES(_ROWS)
+
}
BATsetcount(r, cnt);
r->tnonil = true;
@@ -1463,29 +1471,9 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
#undef ANALYTICAL_COUNT_STR_LIMIT
#undef ANALYTICAL_COUNT_BRANCHES
-#define ANALYTICAL_SUM_IMP_NO_OVERLAP(TPE1, TPE2) \
- do { \
- for(; pbp<bp; pbp++) { \
- v = *pbp; \
- if (!is_##TPE1##_nil(v)) { \
- if(is_##TPE2##_nil(curval)) \
- curval = (TPE2) v; \
- else \
- ADD_WITH_CHECK(TPE1, v, TPE2, curval,
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
- } \
- } \
- for (;rb < rp; rb++) \
- *rb = curval; \
- if(is_##TPE2##_nil(curval)) \
- has_nils = true; \
- else \
- curval = TPE2##_nil; \
- } while(0); \
-
#define ANALYTICAL_SUM_IMP_ROWS(TPE1, TPE2) \
do { \
- TPE1 *bs, *bl, *be; \
- bl = pbp; \
+ TPE1 *bl = pbp, *bs, *be, v; \
for(; pbp<bp;pbp++) { \
bs = (pbp > bl+start) ? pbp - start : bl; \
be = (pbp+end < bp) ? pbp + end + 1 : bp; \
@@ -1507,13 +1495,29 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
} \
} while(0);
-#define ANALYTICAL_SUM_CALC(TPE1, TPE2, IMP) \
+#define ANALYTICAL_SUM_FP_IMP_ROWS(TPE1, TPE2) \
+ do { \
+ TPE1 *bl = pbp, *bs, *be; \
+ (void) curval; \
+ for(; pbp<bp; pbp++) { \
+ bs = (pbp > bl+start) ? pbp - start : bl; \
+ be = (pbp+end < bp) ? pbp + end + 1 : bp; \
+ if(dofsum(bs, 0, 0, (be - bs), rb, 1, TYPE_##TPE1,
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, true, \
+ "GDKanalyticalsum") == BUN_NONE) { \
+ goto bailout; \
+ } \
+ if(is_##TPE2##_nil(*rb)) \
+ has_nils = true; \
+ rb++; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_SUM_CALC_ROWS(TPE1, TPE2, IMP) \
do { \
- TPE1 *pbp, *bp, v; \
- TPE2 *rp, *rb, *rend, curval = TPE2##_nil; \
+ TPE1 *pbp, *bp; \
+ TPE2 *rp, *rb, curval = TPE2##_nil; \
pbp = bp = (TPE1*)Tloc(b, 0); \
rb = rp = (TPE2*)Tloc(r, 0); \
- rend = rp + cnt; \
if (p) { \
pnp = np = (bit*)Tloc(p, 0); \
nend = np + cnt; \
@@ -1531,54 +1535,157 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
bp += ncnt; \
rp += ncnt; \
IMP(TPE1, TPE2) \
- } else if (o || force_order) { \
+ } else { \
ncnt = cnt; \
bp += ncnt; \
rp += ncnt; \
IMP(TPE1, TPE2) \
- } else { \
- for(; rb<rend; rb++, bp++) { \
- v = *bp; \
- if(is_##TPE1##_nil(v)) { \
- *rb = TPE2##_nil; \
- has_nils = true; \
- } else { \
- *rb = (TPE2) v; \
- } \
- } \
} \
goto finish; \
} while(0);
-#define ANALYTICAL_SUM_FP_IMP_NO_OVERLAP(TPE1, TPE2) \
+#define ANALYTICAL_SUM_IMP_RANGE_PART(TPE1, TPE2) \
+ do { \
+ bit *nl = lp, *ns, *ne; \
+ TPE1 *bs, *be, v; \
+ 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++) { \
+ v = *bs; \
+ if (!is_##TPE1##_nil(v)) { \
+ if(is_##TPE2##_nil(curval)) \
+ curval = (TPE2) v; \
+ else \
+ ADD_WITH_CHECK(TPE1, v, TPE2,
curval, TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
+ } \
+ } \
+ *rb = curval; \
+ rb++; \
+ if(is_##TPE2##_nil(curval)) \
+ has_nils = true; \
+ else \
+ curval = TPE2##_nil; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_SUM_IMP_RANGE_ALL(TPE1, TPE2) \
+ do { \
+ TPE1 v; \
+ for(; pbp<bp; pbp++) { \
+ v = *pbp; \
+ if (!is_##TPE1##_nil(v)) { \
+ if(is_##TPE2##_nil(curval)) \
+ curval = (TPE2) v; \
+ else \
+ ADD_WITH_CHECK(TPE1, v, TPE2, curval,
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
+ } \
+ } \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ if(is_##TPE2##_nil(curval)) \
+ has_nils = true; \
+ } while(0); \
+
+#define ANALYTICAL_SUM_FP_IMP_RANGE_PART(TPE1, TPE2) \
+ do { \
+ bit *nl = lp, *ns, *ne; \
+ TPE1 *bs; \
+ 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); \
+ if(dofsum(bs, 0, 0, parcel, &curval, 1, TYPE_##TPE1,
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, \
+ true, "GDKanalyticalsum") ==
BUN_NONE) { \
+ goto bailout; \
+ } \
+ *rb = curval; \
+ rb++; \
+ if(is_##TPE2##_nil(curval)) \
+ has_nils = true; \
+ else \
+ curval = TPE2##_nil; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_SUM_FP_IMP_RANGE_ALL(TPE1, TPE2) \
do { \
- if(dofsum(pbp, 0, 0, ncnt, rb, 1, TYPE_##TPE1, TYPE_##TPE2,
NULL, NULL, NULL, 0, 0, true, false, true, \
+ if(dofsum(pbp, 0, 0, cnt, &curval, 1, TYPE_##TPE1, TYPE_##TPE2,
NULL, NULL, NULL, 0, 0, true, false, true, \
"GDKanalyticalsum") == BUN_NONE) { \
goto bailout; \
} \
- curval = *rb; \
for (;rb < rp; rb++) \
*rb = curval; \
if(is_##TPE2##_nil(curval)) \
has_nils = true; \
} while(0);
-#define ANALYTICAL_SUM_FP_IMP_ROWS(TPE1, TPE2) \
- do { \
- TPE1 *bs, *bl, *be; \
- bl = pbp; \
- (void) curval; \
- for(; pbp<bp; pbp++) { \
- bs = (pbp > bl+start) ? pbp - start : bl; \
- be = (pbp+end < bp) ? pbp + end + 1 : bp; \
- if(dofsum(bs, 0, 0, (be - bs), rb, 1, TYPE_##TPE1,
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, true, \
- "GDKanalyticalsum") == BUN_NONE) { \
- goto bailout; \
- } \
- if(is_##TPE2##_nil(*rb)) \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
