Changeset: c0361772d39a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c0361772d39a Modified Files: gdk/gdk_analytic_bounds.c Branch: window-tunning Log Message:
Reduce code explosion diffs (truncated from 588 to 300 lines): diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c --- a/gdk/gdk_analytic_bounds.c +++ b/gdk/gdk_analytic_bounds.c @@ -158,16 +158,21 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(IMP, TPE, LIMIT, UPCAST) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(IMP, CARD, TPE, LIMIT, UPCAST) \ do { \ if (p) { \ for (; i < cnt; i++) { \ - if (np[i]) \ + if (np[i]) { \ +rows##TPE##IMP##CARD: \ ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(TPE, LIMIT, UPCAST); \ + } \ } \ } \ - i = cnt; \ - ANALYTICAL_WINDOW_BOUNDS_ROWS##IMP(TPE, LIMIT, UPCAST); \ + if (!last) { \ + last = true; \ + i = cnt; \ + goto rows##TPE##IMP##CARD; \ + } \ } while (0) #define ANALYTICAL_WINDOW_BOUNDS_GROUPS_PRECEDING(TPE, LIMIT, UPCAST) \ @@ -209,16 +214,21 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(IMP, TPE, LIMIT, UPCAST) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(IMP, CARD, TPE, LIMIT, UPCAST) \ do { \ if (p) { \ for (; i < cnt; i++) { \ - if (np[i]) \ + if (np[i]) { \ +groups##TPE##IMP##CARD: \ ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(TPE, LIMIT, UPCAST); \ + } \ } \ } \ - i = cnt; \ - ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(TPE, LIMIT, UPCAST); \ + if (!last) { \ + last = true; \ + i = cnt; \ + goto groups##TPE##IMP##CARD; \ + } \ } while (0) #define ANALYTICAL_WINDOW_BOUNDS_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \ @@ -319,55 +329,60 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(TPE1, IMP, LIMIT, TPE2) \ +#define ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(TPE1, IMP, CARD, LIMIT, TPE2) \ do { \ TPE1 *restrict bp = (TPE1*)Tloc(b, 0); \ if (np) { \ for (; i < cnt; i++) { \ - if (np[i]) \ + if (np[i]) { \ +range##TPE1##TPE2##IMP##CARD: \ IMP(TPE1, LIMIT, TPE2); \ + } \ } \ } \ - i = cnt; \ - IMP(TPE1, LIMIT, TPE2); \ + if (!last) { \ + last = true; \ + i = cnt; \ + goto range##TPE1##TPE2##IMP##CARD; \ + } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_NUM(IMP, LIMIT, TPE2) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_NUM(IMP, CARD, LIMIT, TPE2) \ do { \ switch (tp1) { \ case TYPE_bte: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, TPE2); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, TPE2); \ break; \ case TYPE_sht: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, TPE2); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, TPE2); \ break; \ case TYPE_int: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, TPE2); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, TPE2); \ break; \ case TYPE_lng: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, TPE2); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, TPE2); \ break; \ default: \ goto type_not_supported; \ } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_FLT(IMP, LIMIT) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_FLT(IMP, CARD, LIMIT) \ do { \ switch (tp1) { \ case TYPE_flt: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(flt, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, flt); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(flt, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, flt); \ break; \ default: \ goto type_not_supported; \ } \ } while (0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_DBL(IMP, LIMIT) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_DBL(IMP, CARD, LIMIT) \ do { \ switch (tp1) { \ case TYPE_dbl: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(dbl, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, dbl); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(dbl, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, dbl); \ break; \ default: \ goto type_not_supported; \ @@ -375,23 +390,23 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } while (0) #ifdef HAVE_HGE -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(IMP, LIMIT) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(IMP, CARD, LIMIT) \ do { \ switch (tp1) { \ case TYPE_bte: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, hge); \ break; \ case TYPE_sht: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, hge); \ break; \ case TYPE_int: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, hge); \ break; \ case TYPE_lng: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, hge); \ break; \ case TYPE_hge: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(hge, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(hge, ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, CARD, LIMIT, hge); \ break; \ default: \ goto type_not_supported; \ @@ -507,44 +522,49 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p } \ } while(0) -#define ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(TPE1, IMP, LIMIT, TPE2, SUB, ADD) \ +#define ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(TPE1, IMP, CARD, LIMIT, TPE2, SUB, ADD) \ do { \ TPE1 *restrict bp = (TPE1*)Tloc(b, 0); \ if (p) { \ for (; i < cnt; i++) { \ - if (np[i]) \ + if (np[i]) { \ +rangemtime##TPE1##TPE2##IMP##CARD: \ IMP(TPE1, LIMIT, TPE2, SUB, ADD); \ + } \ } \ } \ - i = cnt; \ - IMP(TPE1, LIMIT, TPE2, SUB, ADD); \ + if (!last) { \ + last = true; \ + i = cnt; \ + goto rangemtime##TPE1##TPE2##IMP##CARD; \ + } \ } while(0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_MONTH_INTERVAL(IMP, LIMIT) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_MONTH_INTERVAL(IMP, CARD, LIMIT) \ do { \ switch (tp1) { \ case TYPE_date: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, date_sub_month, date_add_month); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, CARD, LIMIT, int, date_sub_month, date_add_month); \ break; \ case TYPE_timestamp: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, timestamp_sub_month, timestamp_add_month); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, CARD, LIMIT, int, timestamp_sub_month, timestamp_add_month); \ break; \ default: \ goto type_not_supported; \ } \ } while(0) -#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_SEC_INTERVAL(IMP, LIMIT) \ +#define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_SEC_INTERVAL(IMP, CARD, LIMIT) \ do { \ switch (tp1) { \ case TYPE_date: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, date_sub_msec, date_add_msec); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, CARD, LIMIT, lng, date_sub_msec, date_add_msec); \ break; \ case TYPE_daytime: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(daytime, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, daytime_sub_msec, daytime_add_msec); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(daytime, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, CARD, LIMIT, lng, daytime_sub_msec, daytime_add_msec); \ break; \ case TYPE_timestamp: \ - ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, timestamp_sub_msec, timestamp_add_msec); \ + ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, CARD, LIMIT, lng, timestamp_sub_msec, timestamp_add_msec); \ break; \ default: \ goto type_not_supported; \ @@ -630,12 +650,17 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B TPE *restrict bp = (TPE*)Tloc(b, 0); \ if (p) { \ for (; i < cnt; i++) { \ - if (np[i]) \ + if (np[i]) { \ +peers##TPE##IMP: \ ANALYTICAL_WINDOW_BOUNDS_PEERS_FIXED##IMP(TPE, NAN_CHECK); \ + } \ } \ } \ - i = cnt; \ - ANALYTICAL_WINDOW_BOUNDS_PEERS_FIXED##IMP(TPE, NAN_CHECK); \ + if (!last) { \ + last = true; \ + i = cnt; \ + goto peers##TPE##IMP; \ + } \ } while (0) #define NO_NAN_CHECK /* nulls match on this operator */ @@ -645,6 +670,7 @@ GDKanalyticalpeers(BAT *r, BAT *b, BAT * { oid *restrict rb = (oid *) Tloc(r, 0), i = 0, k = 0, j = 0, l = 0, cnt = BATcount(b); bit *restrict np = p ? (bit *) Tloc(p, 0) : NULL; + bool last = false; switch (ATOMbasetype(b->ttype)) { case TYPE_bte: { @@ -787,6 +813,7 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B oid cnt = BATcount(b), nils = 0, i = 0, k = 0, j = 0; bit *restrict np = p ? (bit *) Tloc(p, 0) : NULL; oid *restrict rb = (oid *) Tloc(r, 0); + bool last = false; if (l) { /* dynamic bounds */ if (l->tnil) @@ -795,27 +822,27 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B case TYPE_bte:{ bte *restrict limit = (bte *) Tloc(l, 0); if (preceding) { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, bte, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, MULTI, bte, limit[k], (oid) olimit); } else { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, bte, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, MULTI, bte, limit[k], (oid) olimit); } break; } case TYPE_sht:{ sht *restrict limit = (sht *) Tloc(l, 0); if (preceding) { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, sht, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, MULTI, sht, limit[k], (oid) olimit); } else { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, sht, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, MULTI, sht, limit[k], (oid) olimit); } break; } case TYPE_int:{ int *restrict limit = (int *) Tloc(l, 0); if (preceding) { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, int, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, MULTI, int, limit[k], (oid) olimit); } else { - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, int, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_FOLLOWING, MULTI, int, limit[k], (oid) olimit); } break; } @@ -823,15 +850,15 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B lng *restrict limit = (lng *) Tloc(l, 0); if (preceding) { #if SIZEOF_OID == SIZEOF_INT - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, lng, limit[k], (olimit > (lng) GDK_oid_max) ? GDK_oid_max : (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, MULTI, lng, limit[k], (olimit > (lng) GDK_oid_max) ? GDK_oid_max : (oid) olimit); #else - ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, lng, limit[k], (oid) olimit); + ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, MULTI, lng, limit[k], (oid) olimit); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list