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

Reply via email to