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

Fixing the bugs I created. I forgot in the unbounded cases, the peer rows get 
the same value, time for another small cleanup. Also reduced the number of 
branches in count function


diffs (truncated from 676 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
@@ -1055,166 +1055,231 @@ GDKanalytical##OP(BAT *r, BAT *p, BAT *b
 ANALYTICAL_MIN_MAX(min, MIN, >)
 ANALYTICAL_MIN_MAX(max, MAX, <)
 
-/* Counting all rows including nils */
-#define ANALYTICAL_COUNT_ALL_UNBOUNDED_TILL_CURRENT_ROW        \
-       do { \
-               curval = 0; \
-               for (; k < i; k++) \
-                       rb[k] = ++curval; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_ALL_CURRENT_ROW_TILL_UNBOUNDED        \
-       do { \
-               curval = 0; \
-               for (j = i - 1; j >= k; j--) \
-                       rb[j] = ++curval; \
-               k = i; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_ALL_ALL_ROWS  \
-       do { \
-               curval = i - k; \
-               for (; k < i; k++) \
-                       rb[k] = curval; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_ALL_CURRENT_ROW       \
-       do { \
-               for (; k < i; k++) \
-                       rb[k] = 1; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_ALL_OTHERS    \
-       do { \
-               for (; k < i; k++) \
-                       rb[k] = (end[k] > start[k]) ? (end[k] - start[k]) : 0; \
-       } while (0)
-
 /* Counting no nils for fixed sizes */
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE) \
        do { \
                curval = 0; \
-               for (; k < i; k++) { \
-                       curval += !is_##TPE##_nil(bpf[k]); \
-                       rb[k] = curval; \
-               } \
+               if (count_all) { \
+                       for (; k < i;) { \
+                               TPE v = bpf[k]; \
+                               j = k++; \
+                               curval++; \
+                               while (k < i && bpf[k] == v) { \
+                                       k++; \
+                                       curval++; \
+                               } \
+                               for (; j < k; j++) \
+                                       rb[j] = curval; \
+                       } \
+               } else { \
+                       for (; k < i;) { \
+                               TPE v = bpf[k]; \
+                               j = k++; \
+                               curval += !is_##TPE##_nil(bpf[k]); \
+                               while (k < i && bpf[k] == v) { \
+                                       k++; \
+                                       curval += !is_##TPE##_nil(bpf[k]); \
+                               } \
+                               for (; j < k; j++) \
+                                       rb[j] = curval; \
+                       } \
+               }       \
        } while (0)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE) \
        do { \
                curval = 0; \
-               for (j = i - 1; j >= k; j--) { \
-                       curval += !is_##TPE##_nil(bpf[j]); \
-                       rb[j] = curval; \
+               if (count_all) { \
+                       for (j = i - 1; j >= k; ) { \
+                               TPE v = bpf[j]; \
+                               l = j--; \
+                               curval++; \
+                               while (j >= k && bpf[j] == v) { \
+                                       j--; \
+                                       curval++; \
+                               } \
+                               m = MAX(k, j); \
+                               for (; l >= m; l--) \
+                                       rb[l] = curval; \
+                       }       \
+               } else { \
+                       for (j = i - 1; j >= k; ) { \
+                               TPE v = bpf[j]; \
+                               l = j--; \
+                               curval += !is_##TPE##_nil(bpf[j]); \
+                               while (j >= k && bpf[j] == v) { \
+                                       j--; \
+                                       curval += !is_##TPE##_nil(bpf[j]); \
+                               } \
+                               m = MAX(k, j); \
+                               for (; l >= m; l--) \
+                                       rb[l] = curval; \
+                       }       \
                } \
                k = i; \
        } while (0)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_ALL_ROWS(TPE)    \
        do { \
-               curval = 0; \
-               for (; j < i; j++) \
-                       curval += !is_##TPE##_nil(bpf[j]); \
-               for (; k < i; k++) \
-                       rb[k] = curval; \
+               if (count_all) { \
+                       curval = i - k; \
+                       for (; k < i; k++) \
+                               rb[k] = curval; \
+               } else {        \
+                       curval = 0; \
+                       for (; j < i; j++) \
+                               curval += !is_##TPE##_nil(bpf[j]); \
+                       for (; k < i; k++) \
+                               rb[k] = curval; \
+               }       \
        } while (0)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW(TPE) \
        do { \
-               for (; k < i; k++) \
-                       rb[k] = !is_##TPE##_nil(bpf[k]); \
+               if (count_all) { \
+                       for (; k < i; k++) \
+                               rb[k] = 1; \
+               } else { \
+                       for (; k < i; k++) \
+                               rb[k] = !is_##TPE##_nil(bpf[k]); \
+               } \
        } while (0)
 
 #define ANALYTICAL_COUNT_NO_NIL_FIXED_OTHERS(TPE)      \
        do { \
-               curval = 0; \
-               for (; k < i; k++) {                    \
-                       TPE *bs = bpf + start[k];               \
-                       TPE *be = bpf + end[k];         \
-                       for (; bs < be; bs++)                   \
-                               curval += !is_##TPE##_nil(*bs); \
-                       rb[k] = curval;         \
-                       curval = 0;             \
-               }                                               \
-       } while (0)
-
-/* Counting no nils for strings */
-#define ANALYTICAL_COUNT_NO_NIL_STR_UNBOUNDED_TILL_CURRENT_ROW(TPE_CAST, 
OFFSET) \
-       do { \
-               curval = 0; \
-               for (; j < i; j++) { \
-                       curval += base[(var_t) ((TPE_CAST) bp) OFFSET] != 
'\200'; \
-                       rb[j] = curval; \
-               } \
-       } while (0)
-
-#define ANALYTICAL_COUNT_NO_NIL_STR_CURRENT_ROW_TILL_UNBOUNDED(TPE_CAST, 
OFFSET)       \
-       do { \
-               curval = 0; \
-               for (j = i - 1; j >= k; j--) { \
-                       curval += base[(var_t) ((TPE_CAST) bp) OFFSET] != 
'\200'; \
-                       rb[j] = curval; \
-               } \
-               k = i; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_NO_NIL_STR_ALL_ROWS(TPE_CAST, OFFSET) \
-       do { \
-               curval = 0; \
-               for (; j < i; j++) \
-                       curval += base[(var_t) ((TPE_CAST) bp) OFFSET] != 
'\200'; \
-               for (; k < i; k++) \
-                       rb[k] = curval; \
-       } while (0)
-
-#define ANALYTICAL_COUNT_NO_NIL_STR_CURRENT_ROW(TPE_CAST, OFFSET)      \
-       do { \
-               for (; j < i; j++) \
-                       rb[j] = base[(var_t) ((TPE_CAST) bp) OFFSET] != '\200'; 
\
-       } while (0)
-
-#define ANALYTICAL_COUNT_NO_NIL_STR_OTHERS(TPE_CAST, OFFSET)           \
-       do {                                                            \
-               curval = 0; \
-               for (; k < i; k++) {                            \
-                       j = start[k];                                   \
-                       l = end[k];                                     \
-                       for (; j < l; j++)                              \
-                               curval += base[(var_t) ((TPE_CAST) bp) OFFSET] 
!= '\200'; \
-                       rb[k] = curval;                                 \
-                       curval = 0;                                     \
-               }                                                       \
+               if (count_all) { \
+                       for (; k < i; k++) \
+                               rb[k] = (end[k] > start[k]) ? (end[k] - 
start[k]) : 0; \
+               } else {        \
+                       curval = 0; \
+                       for (; k < i; k++) {                    \
+                               TPE *bs = bpf + start[k];               \
+                               TPE *be = bpf + end[k];         \
+                               for (; bs < be; bs++)                   \
+                                       curval += !is_##TPE##_nil(*bs); \
+                               rb[k] = curval;         \
+                               curval = 0;             \
+                       }                                               \
+               }       \
        } while (0)
 
 /* Counting no nils for other types */
 #define ANALYTICAL_COUNT_NO_NIL_OTHERS_UNBOUNDED_TILL_CURRENT_ROW \
        do { \
                curval = 0; \
-               if (isvarsized) { \
-                       for (; k < i; k++) { \
-                               curval += cmp(nil, base + ((const var_t *) 
bp)[k]) != 0; \
-                               rb[k] = curval; \
+               if (count_all) { \
+                       if (isvarsized) { \
+                               for (; k < i; ) { \
+                                       const void *v = base + ((const var_t *) 
bp)[k]; \
+                                       j = k++; \
+                                       curval++; \
+                                       while (k < i && cmp(base + ((const 
var_t *) bp)[k], v) == 0) { \
+                                               k++; \
+                                               curval++; \
+                                       } \
+                                       for (; j < k; j++) \
+                                               rb[j] = curval; \
+                               } \
+                       } else { \
+                               for (; k < i; ) { \
+                                       const void *v = Tloc(b, k); \
+                                       j = k++; \
+                                       curval++; \
+                                       while (k < i && cmp(Tloc(b, k), v) == 
0) { \
+                                               k++; \
+                                               curval++; \
+                                       } \
+                                       for (; j < k; j++) \
+                                               rb[j] = curval; \
+                               } \
                        } \
                } else { \
-                       for (; k < i; k++) { \
-                               curval += cmp(Tloc(b, k), nil) != 0; \
-                               rb[k] = curval; \
+                       if (isvarsized) { \
+                               for (; k < i; ) { \
+                                       const void *v = base + ((const var_t *) 
bp)[k]; \
+                                       j = k++; \
+                                       curval += cmp(v, nil) != 0; \
+                                       while (k < i && cmp(base + ((const 
var_t *) bp)[k], v) == 0) { \
+                                               k++; \
+                                               curval += cmp(base + ((const 
var_t *) bp)[k], nil) != 0; \
+                                       } \
+                                       for (; j < k; j++) \
+                                               rb[j] = curval; \
+                               } \
+                       } else { \
+                               for (; k < i; ) { \
+                                       const void *v = Tloc(b, k); \
+                                       j = k++; \
+                                       curval += cmp(v, nil) != 0; \
+                                       while (k < i && cmp(Tloc(b, k), v) == 
0) { \
+                                               k++; \
+                                               curval += cmp(Tloc(b, k), nil) 
!= 0; \
+                                       } \
+                                       for (; j < k; j++) \
+                                               rb[j] = curval; \
+                               } \
                        } \
-               } \
+               }       \
        } while (0)
 
 #define ANALYTICAL_COUNT_NO_NIL_OTHERS_CURRENT_ROW_TILL_UNBOUNDED \
        do { \
                curval = 0; \
-               if (isvarsized) { \
-                       for (j = i - 1; j >= k; j--) { \
-                               curval += cmp(nil, base + ((const var_t *) 
bp)[j]) != 0; \
-                               rb[j] = curval; \
+               if (count_all) { \
+                       if (isvarsized) { \
+                               for (j = i - 1; j >= k; ) { \
+                                       const void *v = base + ((const var_t *) 
bp)[j]; \
+                                       l = j--; \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to