Changeset: 6301a4a0a2c4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6301a4a0a2c4
Modified Files:
        gdk/gdk_analytic_func.c
Branch: window-tunning
Log Message:

Fixed current row until unbounded implementation


diffs (truncated from 513 to 300 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
@@ -810,21 +810,22 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 #define ANALYTICAL_MIN_MAX_CALC_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE, MIN_MAX) 
\
        do { \
                TPE curval = TPE##_nil; \
-               for (j = i - 1; j >= k; ) { \
-                       l = j; \
-                       do {    \
-                               if (!is_##TPE##_nil(bp[j])) {           \
-                                       if (is_##TPE##_nil(curval))     \
-                                               curval = bp[j]; \
-                                       else                            \
-                                               curval = MIN_MAX(bp[j], 
curval); \
-                               }       \
-                               j--; \
-                       } while (j >= k && !op[j]);     \
-                       m = MAX(k, j); \
-                       for (; l >= m; l--) \
-                               rb[l] = curval; \
-                       has_nils |= is_##TPE##_nil(curval); \
+               l = i - 1; \
+               for (j = l; ; j--) { \
+                       if (!is_##TPE##_nil(bp[j])) {   \
+                               if (is_##TPE##_nil(curval))     \
+                                       curval = bp[j]; \
+                               else                            \
+                                       curval = MIN_MAX(bp[j], curval); \
+                       }       \
+                       if (op[j] || j == k) {  \
+                               for (; l >= j; l--) \
+                                       rb[l] = curval; \
+                               has_nils |= is_##TPE##_nil(curval); \
+                               if (j == k)     \
+                                       break;  \
+                               l = j - 1;      \
+                       }       \
                }       \
                k = i; \
        } while (0)
@@ -903,23 +904,24 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED(GT_LT)     
\
        do { \
                const void *curval = nil;       \
-               for (j = i - 1; j >= k; ) { \
-                       l = j; \
-                       do {    \
-                               void *next = BUNtail(bpi, j); \
-                               if (atomcmp(next, nil) != 0) {          \
-                                       if (atomcmp(curval, nil) == 0)  \
-                                               curval = next;          \
-                                       else                            \
-                                               curval = atomcmp(next, curval) 
GT_LT 0 ? curval : next; \
-                               }                                       \
-                               j--; \
-                       } while (j >= k && !op[j]);     \
-                       m = MAX(k, j); \
-                       for (; l >= m; l--) \
-                               if (tfastins_nocheckVAR(r, l, curval, Tsize(r)) 
!= GDK_SUCCEED) \
-                                       return GDK_FAIL; \
-                       has_nils |= atomcmp(curval, nil) == 0;          \
+               l = i - 1; \
+               for (j = l; ; j--) { \
+                       void *next = BUNtail(bpi, j); \
+                       if (atomcmp(next, nil) != 0) {          \
+                               if (atomcmp(curval, nil) == 0)  \
+                                       curval = next;          \
+                               else                            \
+                                       curval = atomcmp(next, curval) GT_LT 0 
? curval : next; \
+                       }                                       \
+                       if (op[j] || j == k) {  \
+                               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)
@@ -1036,7 +1038,7 @@ gdk_return                                                
                \
 GDKanalytical##OP(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, l = 0, m = 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, *restrict op = o ? Tloc(o, 0) 
: NULL;         \
        BATiter bpi = bat_iterator(b);                          \
@@ -1099,27 +1101,28 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
 #define ANALYTICAL_COUNT_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE) \
        do { \
                curval = 0; \
+               l = i - 1; \
                if (count_all) { \
-                       for (j = i - 1; j >= k; ) { \
-                               l = j; \
-                               do {    \
-                                       curval++;       \
-                                       j--; \
-                               } while (j >= k && !op[j]);     \
-                               m = MAX(k, j); \
-                               for (; l >= m; l--) \
-                                       rb[l] = curval; \
+                       for (j = l; ; j--) { \
+                               curval++;       \
+                               if (op[j] || j == k) {  \
+                                       for (; l >= j; l--) \
+                                               rb[l] = curval; \
+                                       if (j == k)     \
+                                               break;  \
+                                       l = j - 1;      \
+                               }       \
                        }       \
                } else { \
-                       for (j = i - 1; j >= k; ) { \
-                               l = j; \
-                               do {    \
-                                       curval += !is_##TPE##_nil(bp[j]); \
-                                       j--; \
-                               } while (j >= k && !op[j]);     \
-                               m = MAX(k, j); \
-                               for (; l >= m; l--) \
-                                       rb[l] = curval; \
+                       for (j = l; ; j--) { \
+                               curval += !is_##TPE##_nil(bp[j]); \
+                               if (op[j] || j == k) {  \
+                                       for (; l >= j; l--) \
+                                               rb[l] = curval; \
+                                       if (j == k)     \
+                                               break;  \
+                                       l = j - 1;      \
+                               }       \
                        }       \
                } \
                k = i; \
@@ -1199,27 +1202,28 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
 #define ANALYTICAL_COUNT_OTHERS_CURRENT_ROW_TILL_UNBOUNDED \
        do { \
                curval = 0; \
+               l = i - 1; \
                if (count_all) { \
-                       for (j = i - 1; j >= k; ) { \
-                               l = j; \
-                               do {    \
-                                       curval++;       \
-                                       j--; \
-                               } while (j >= k && !op[j]);     \
-                               m = MAX(k, j); \
-                               for (; l >= m; l--) \
-                                       rb[l] = curval; \
+                       for (j = l; ; j--) { \
+                               curval++;       \
+                               if (op[j] || j == k) {  \
+                                       for (; l >= j; l--) \
+                                               rb[l] = curval; \
+                                       if (j == k)     \
+                                               break;  \
+                                       l = j - 1;      \
+                               }       \
                        }       \
                } else { \
-                       for (j = i - 1; j >= k; ) { \
-                               l = j; \
-                               do {    \
-                                       curval += cmp(BUNtail(bpi, j), nil) != 
0; \
-                                       j--; \
-                               } while (j >= k && !op[j]);     \
-                               m = MAX(k, j); \
-                               for (; l >= m; l--) \
-                                       rb[l] = curval; \
+                       for (j = l; ; j--) { \
+                               curval += cmp(BUNtail(bpi, j), nil) != 0;       
\
+                               if (op[j] || j == k) {  \
+                                       for (; l >= j; l--) \
+                                               rb[l] = curval; \
+                                       if (j == k)     \
+                                               break;  \
+                                       l = j - 1;      \
+                               }       \
                        }       \
                } \
                k = i; \
@@ -1328,7 +1332,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
 gdk_return
 GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, bit 
ignore_nils, int tpe, int frame_type)
 {
-       lng i = 0, j = 0, k = 0, l = 0, m = 0, curval = 0, cnt = (lng) 
BATcount(b);
+       lng i = 0, j = 0, k = 0, l = 0, curval = 0, cnt = (lng) BATcount(b);
        lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? 
(lng*)Tloc(e, 0) : NULL, *restrict rb = (lng *) Tloc(r, 0);
        bit *restrict np = p ? Tloc(p, 0) : NULL, *restrict op = o ? Tloc(o, 0) 
: NULL;
        const void *restrict nil = ATOMnilptr(tpe);
@@ -1384,21 +1388,22 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 #define ANALYTICAL_SUM_IMP_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2) \
        do { \
                TPE2 curval = TPE2##_nil; \
-               for (j = i - 1; j >= k; ) { \
-                       l = j; \
-                       do {    \
-                               if (!is_##TPE1##_nil(bp[j])) {          \
-                                       if (is_##TPE2##_nil(curval))    \
-                                               curval = (TPE2) bp[j];  \
-                                       else                            \
-                                               ADD_WITH_CHECK(bp[j], curval, 
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
-                               }                                       \
-                               j--; \
-                       } while (j >= k && !op[j]);     \
-                       m = MAX(k, j); \
-                       for (; l >= m; l--) \
-                               rb[l] = curval; \
-                       has_nils |= is_##TPE2##_nil(curval);    \
+               l = i - 1; \
+               for (j = l; ; j--) { \
+                       if (!is_##TPE1##_nil(bp[j])) {          \
+                               if (is_##TPE2##_nil(curval))    \
+                                       curval = (TPE2) bp[j];  \
+                               else                            \
+                                       ADD_WITH_CHECK(bp[j], curval, TPE2, 
curval, GDK_##TPE2##_max, goto calc_overflow); \
+                       }                                       \
+                       if (op[j] || j == k) {  \
+                               for (; l >= j; l--) \
+                                       rb[l] = curval; \
+                               has_nils |= is_##TPE2##_nil(curval);    \
+                               if (j == k)     \
+                                       break;  \
+                               l = j - 1;      \
+                       }       \
                }       \
                k = i; \
        } while (0)
@@ -1479,22 +1484,23 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
 
 #define ANALYTICAL_SUM_IMP_FP_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2) /* TODO 
go through a version of dofsum which returns the current partials */ \
        do { \
-               TPE2 curval = TPE2##_nil;       \
-               for (j = i - 1; j >= k; ) { \
-                       l = j; \
-                       do {    \
-                               if (!is_##TPE1##_nil(bp[j])) {          \
-                                       if (is_##TPE2##_nil(curval))    \
-                                               curval = (TPE2) bp[j];  \
-                                       else                            \
-                                               ADD_WITH_CHECK(bp[j], curval, 
TPE2, curval, GDK_##TPE2##_max, goto calc_overflow); \
-                               }                                       \
-                               j--; \
-                       } while (j >= k && !op[j]);     \
-                       m = MAX(k, j); \
-                       for (; l >= m; l--) \
-                               rb[l] = curval; \
-                       has_nils |= is_##TPE2##_nil(curval);    \
+               TPE2 curval = TPE2##_nil; \
+               l = i - 1; \
+               for (j = l; ; j--) { \
+                       if (!is_##TPE1##_nil(bp[j])) {          \
+                               if (is_##TPE2##_nil(curval))    \
+                                       curval = (TPE2) bp[j];  \
+                               else                            \
+                                       ADD_WITH_CHECK(bp[j], curval, TPE2, 
curval, GDK_##TPE2##_max, goto calc_overflow); \
+                       }                                       \
+                       if (op[j] || j == k) {  \
+                               for (; l >= j; l--) \
+                                       rb[l] = curval; \
+                               has_nils |= is_##TPE2##_nil(curval);    \
+                               if (j == k)     \
+                                       break;  \
+                               l = j - 1;      \
+                       }       \
                }       \
                k = i; \
        } while (0)
@@ -1688,7 +1694,7 @@ gdk_return
 GDKanalyticalsum(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tp1, int 
tp2, int frame_type)
 {
        bool has_nils = false;
-       lng i = 0, j = 0, k = 0, l = 0, m = 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, *restrict op = o ? Tloc(o, 0) 
: NULL;
        int abort_on_error = 1;
@@ -1755,16 +1761,17 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
 #define ANALYTICAL_PROD_CALC_NUM_CURRENT_ROW_TILL_UNBOUNDED(TPE1, TPE2, TPE3) \
        do { \
                TPE2 curval = TPE2##_nil; \
-               for (j = i - 1; j >= k; ) { \
-                       l = j; \
-                       do {    \
-                               PROD_NUM(TPE1, TPE2, TPE3, bp[j]); \
-                               j--; \
-                       } while (j >= k && !op[j]);     \
-                       m = MAX(k, j); \
-                       for (; l >= m; l--) \
-                               rb[l] = curval; \
-                       has_nils |= is_##TPE2##_nil(curval);    \
+               l = i - 1; \
+               for (j = l; ; j--) { \
+                       PROD_NUM(TPE1, TPE2, TPE3, bp[j]); \
+                       if (op[j] || j == k) {  \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to