Changeset: e1ad93dcc00b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e1ad93dcc00b Modified Files: gdk/gdk_analytic.h gdk/gdk_analytic_func.c sql/backends/monet5/sql.c sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.h sql/server/rel_select.c sql/test/analytics/Tests/analytics06.stable.err sql/test/analytics/Tests/analytics06.stable.out Branch: window-tunning Log Message:
For first, last and nth-value functions fallback to the previous path. It will scale in o(n) - o(nlogn) with my future changes. Now the first batch of analytics tests are passing diffs (truncated from 1256 to 300 lines): diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h --- a/gdk/gdk_analytic.h +++ b/gdk/gdk_analytic.h @@ -25,9 +25,9 @@ gdk_export gdk_return GDKanalyticalwindo int tp1, int tp2, int unit, bool preceding, lng first_half); -gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); -gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); -gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *o, BAT *s, BAT *e, BAT *l, lng *nth, int tp1, int frame_type); +gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe); +gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int tpe); +gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e, BAT *l, lng *nth, int tp1); gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type); diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c --- a/gdk/gdk_analytic_func.c +++ b/gdk/gdk_analytic_func.c @@ -152,99 +152,10 @@ nosupport: return GDK_FAIL; } -#define ANALYTICAL_FIRST_LAST_PARTITIONS(TPE, IMP) \ - do { \ - TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE*)Tloc(r, 0); \ - if (p) { \ - for (; i < cnt; i++) { \ - if (np[i]) \ - ANALYTICAL_FIRST_LAST_FIXED_##IMP(TPE); \ - } \ - } \ - i = cnt; \ - ANALYTICAL_FIRST_LAST_FIXED_##IMP(TPE); \ - } while (0) - -#ifdef HAVE_HGE -#define ANALYTICAL_FIRST_LAST_LIMIT(IMP) \ - case TYPE_hge: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(hge, IMP); \ - break; -#else -#define ANALYTICAL_FIRST_LAST_LIMIT(IMP) -#endif - -#define ANALYTICAL_FIRST_LAST_BRANCHES(IMP) \ - do { \ - switch (ATOMbasetype(tpe)) { \ - case TYPE_bte: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(bte, IMP); \ - break; \ - case TYPE_sht: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(sht, IMP); \ - break; \ - case TYPE_int: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(int, IMP); \ - break; \ - case TYPE_lng: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(lng, IMP); \ - break; \ - ANALYTICAL_FIRST_LAST_LIMIT(IMP) \ - case TYPE_flt: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(flt, IMP); \ - break; \ - case TYPE_dbl: \ - ANALYTICAL_FIRST_LAST_PARTITIONS(dbl, IMP); \ - break; \ - default: { \ - if (p) { \ - for (; i < cnt; i++) { \ - if (np[i]) \ - ANALYTICAL_FIRST_LAST_VARSIZED_##IMP; \ - } \ - } \ - i = cnt; \ - ANALYTICAL_FIRST_LAST_VARSIZED_##IMP; \ - } \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW_TILL_UNBOUNDED(TPE) \ - do { \ - for (j = l; ; j--) { \ - if (op[j] || j == k) { \ - TPE curval = bp[j]; \ - for (; l >= j; l--) \ - rb[l] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ - if (j == k) \ - break; \ - l = j - 1; \ - } \ - } \ - k = i; \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_F_ALL_ROWS(TPE) \ - do { \ - TPE v = bp[k]; \ - for (; k < i; k++) \ - rb[k] = v; \ - has_nils |= is_##TPE##_nil(v); \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW(TPE) \ - do { \ - for (; k < i; k++) { \ - TPE v = bp[k]; \ - rb[k] = v; \ - has_nils |= is_##TPE##_nil(v); \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_F_OTHERS(TPE) \ +#define ANALYTICAL_FIRST_FIXED(TPE) \ do { \ - for (; k < i; k++) { \ + TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE*)Tloc(r, 0); \ + for (; k < cnt; k++) { \ TPE *bs = bp + start[k], *be = bp + end[k]; \ TPE curval = (be > bs) ? *bs : TPE##_nil; \ rb[k] = curval; \ @@ -252,179 +163,47 @@ nosupport: } \ } while (0) -#define ANALYTICAL_FIRST_LAST_VARSIZED_F_CURRENT_ROW_TILL_UNBOUNDED \ - do { \ - for (j = l; ; j--) { \ - if (op[j] || j == k) { \ - const void *curval = BUNtail(bpi, j); \ - for (; l >= j; l--) \ - if (tfastins_nocheckVAR(r, l, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - if (j == k) \ - break; \ - l = j - 1; \ - } \ - } \ - k = i; \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_F_ALL_ROWS \ - do { \ - const void *curval = BUNtail(bpi, k); \ - for (; k < i; k++) \ - if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_F_CURRENT_ROW \ - do { \ - for (; k < i; k++) { \ - const void *curval = BUNtail(bpi, k); \ - if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_F_OTHERS \ - do { \ - for (; k < i; k++) { \ - const void *curval = (end[k] > start[k]) ? BUNtail(bpi, start[k]) : nil; \ - if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } \ - } while (0) - gdk_return -GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) +GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe) { bool has_nils = false; - lng i = 0, j = 0, k = 0, l = 0, cnt = (lng) BATcount(b); - lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL; - bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL; + lng k = 0, cnt = (lng) BATcount(b); + lng *restrict start = (lng*)Tloc(s, 0), *restrict end = (lng*)Tloc(e, 0); BATiter bpi = bat_iterator(b); const void *nil = ATOMnilptr(tpe); int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe); - switch (frame_type) { - case 4: /* current row until unbounded */ { - ANALYTICAL_FIRST_LAST_BRANCHES(F_CURRENT_ROW_TILL_UNBOUNDED); - } break; - case 3: /* unbounded until current row */ - case 5: /* all rows */ { - ANALYTICAL_FIRST_LAST_BRANCHES(F_ALL_ROWS); - } break; - case 6: /* current row */ { - ANALYTICAL_FIRST_LAST_BRANCHES(F_CURRENT_ROW); - } break; - default: { - ANALYTICAL_FIRST_LAST_BRANCHES(F_OTHERS); - } - } - - BATsetcount(r, (BUN) cnt); - r->tnonil = !has_nils; - r->tnil = has_nils; - return GDK_SUCCEED; -} - -#define ANALYTICAL_FIRST_LAST_FIXED_L_UNBOUNDED_TILL_CURRENT_ROW(TPE) \ - do { \ - for (; k < i;) { \ - j = k; \ - do { \ - k++; \ - } while (k < i && !op[k]); \ - TPE curval = bp[k - 1]; \ - for (; j < k; j++) \ - rb[j] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_L_ALL_ROWS(TPE) \ - do { \ - TPE v = bp[i - 1]; \ - for (; k < i; k++) \ - rb[k] = v; \ - has_nils |= is_##TPE##_nil(v); \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_FIXED_L_CURRENT_ROW(TPE) ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW(TPE) - -#define ANALYTICAL_FIRST_LAST_FIXED_L_OTHERS(TPE) \ - do { \ - for (; k < i; k++) { \ - TPE *bs = bp + start[k], *be = bp + end[k]; \ - TPE curval = (be > bs) ? *(be - 1) : TPE##_nil; \ - rb[k] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_L_UNBOUNDED_TILL_CURRENT_ROW \ - do { \ - for (; k < i;) { \ - j = k; \ - do { \ - k++; \ - } while (k < i && !op[k]); \ - const void *curval = BUNtail(bpi, k - 1); \ - for (; j < k; j++) \ - if (tfastins_nocheckVAR(r, j, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_L_ALL_ROWS \ - do { \ - const void *curval = BUNtail(bpi, i - 1); \ - for (; k < i; k++) \ - if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } while (0) - -#define ANALYTICAL_FIRST_LAST_VARSIZED_L_CURRENT_ROW ANALYTICAL_FIRST_LAST_VARSIZED_F_CURRENT_ROW - -#define ANALYTICAL_FIRST_LAST_VARSIZED_L_OTHERS \ - do { \ - for (; k < i; k++) { \ - const void *curval = (end[k] > start[k]) ? BUNtail(bpi, (BUN) (end[k] - 1)) : nil; \ - if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != GDK_SUCCEED) \ - return GDK_FAIL; \ - has_nils |= atomcmp(curval, nil) == 0; \ - } \ - } while (0) - -gdk_return -GDKanalyticallast(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) -{ - bool has_nils = false; - lng i = 0, j = 0, k = 0, cnt = (lng) BATcount(b); - lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? (lng*)Tloc(e, 0) : NULL; - bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL; - BATiter bpi = bat_iterator(b); - const void *nil = ATOMnilptr(tpe); - int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe); - - switch (frame_type) { - case 3: /* unbounded until current row */ { - ANALYTICAL_FIRST_LAST_BRANCHES(L_UNBOUNDED_TILL_CURRENT_ROW); - } break; - case 4: /* current row until unbounded */ - case 5: /* all rows */ { - ANALYTICAL_FIRST_LAST_BRANCHES(L_ALL_ROWS); - } break; - case 6: /* current row */ { - ANALYTICAL_FIRST_LAST_BRANCHES(L_CURRENT_ROW); - } break; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list