Changeset: 8e79c262e7fa for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e79c262e7fa Modified Files: gdk/gdk_analytic_func.c Branch: window-tunning Log Message:
Fixes for first and last diffs (173 lines): 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 @@ -209,12 +209,28 @@ nosupport: } \ } while (0) -#define ANALYTICAL_FIRST_LAST_FIXED_F_TRIVIAL(TPE) \ +#define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW_TILL_UNBOUNDED(TPE) \ do { \ - TPE curval = bp[k]; \ + 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] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ + rb[k] = v; \ + has_nils |= is_##TPE##_nil(v); \ } while (0) #define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW(TPE) \ @@ -236,7 +252,24 @@ nosupport: } \ } while (0) -#define ANALYTICAL_FIRST_LAST_VARSIZED_F_TRIVIAL \ +#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++) \ @@ -269,19 +302,20 @@ gdk_return GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) { bool has_nils = false; - lng i = 0, k = 0, cnt = (lng) BATcount(b); + 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 *restrict np = p ? Tloc(p, 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); - (void) o; switch (frame_type) { - case 3: - case 4: - case 5: { - ANALYTICAL_FIRST_LAST_BRANCHES(F_TRIVIAL); + 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); @@ -297,12 +331,26 @@ GDKanalyticalfirst(BAT *r, BAT *p, BAT * return GDK_SUCCEED; } -#define ANALYTICAL_FIRST_LAST_FIXED_L_TRIVIAL(TPE) \ +#define ANALYTICAL_FIRST_LAST_FIXED_L_UNBOUNDED_TILL_CURRENT_ROW(TPE) \ do { \ - TPE curval = bp[i - 1]; \ + 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] = curval; \ - has_nils |= is_##TPE##_nil(curval); \ + 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) @@ -317,7 +365,22 @@ GDKanalyticalfirst(BAT *r, BAT *p, BAT * } \ } while (0) -#define ANALYTICAL_FIRST_LAST_VARSIZED_L_TRIVIAL \ +#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++) \ @@ -342,19 +405,20 @@ 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, k = 0, cnt = (lng) BATcount(b); + 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 *restrict np = p ? Tloc(p, 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); - (void) o; switch (frame_type) { - case 3: - case 4: - case 5: { - ANALYTICAL_FIRST_LAST_BRANCHES(L_TRIVIAL); + 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); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list