Changeset: de764a77f0dd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=de764a77f0dd
Modified Files:
        gdk/gdk_analytic.h
        gdk/gdk_analytic_func.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
Branch: window-tunning
Log Message:

Updated count analytical function


diffs (truncated from 693 to 300 lines):

diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -31,7 +31,7 @@ gdk_export gdk_return GDKanalyticalnthva
 
 gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *b, BAT *s, BAT *e, const 
bit *restrict ignore_nils, int tpe);
+gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *b, BAT *s, BAT 
*e, bit ignore_nils, int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticalsum(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
 gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
 gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
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
@@ -940,6 +940,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                        rb[j] = curval; \
                        has_nils |= is_##TPE##_nil(curval); \
                } \
+               k = i; \
        } while (0)
 
 #define ANALYTICAL_MIN_MAX_CALC_FIXED_ALL_ROWS(TPE, MIN_MAX)   \
@@ -1023,6 +1024,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                                return GDK_FAIL; \
                        has_nils |= atomcmp(curval, nil) == 0;          \
                } \
+               k = i; \
        } while (0)
 
 #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_ALL_ROWS(GT_LT)       \
@@ -1176,117 +1178,364 @@ GDKanalytical##OP(BAT *r, BAT *p, BAT *b
 ANALYTICAL_MIN_MAX(min, MIN, >)
 ANALYTICAL_MIN_MAX(max, MAX, <)
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(TPE)            \
-       do {                                                    \
-               TPE *bp, *bs, *be;                              \
-               bp = (TPE*)Tloc(b, 0);                          \
-               for (; i < cnt; i++, rb++) {                    \
-                       bs = bp + start[i];             \
-                       be = bp + end[i];               \
+/* 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; \
+               } \
+       } 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; \
+               } \
+               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; \
+       } while (0)
+
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW(TPE) \
+       do { \
+               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 = curval;           \
+                       rb[k] = curval;         \
                        curval = 0;             \
                }                                               \
        } while (0)
 
-#define ANALYTICAL_COUNT_NO_NIL_STR_IMP(TPE_CAST, OFFSET)              \
+/* 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 {                                                            \
-               for (; i < cnt; i++, rb++) {                            \
-                       j = start[i];                                   \
-                       l = end[i];                                     \
+               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 = curval;                                   \
+                       rb[k] = curval;                                 \
                        curval = 0;                                     \
                }                                                       \
        } while (0)
 
-gdk_return
-GDKanalyticalcount(BAT *r, BAT *b, BAT *s, BAT *e, const bit *restrict 
ignore_nils, int tpe)
-{
-       BUN i = 0, cnt = BATcount(b);
-       lng *restrict rb = (lng *) Tloc(r, 0), *restrict start, *restrict end, 
curval = 0, j = 0, l = 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; \
+                       } \
+               } else { \
+                       for (; k < i; k++) { \
+                               curval += cmp(Tloc(b, k), nil) != 0; \
+                               rb[k] = curval; \
+                       } \
+               } \
+       } while (0)
 
-       assert(s && e && ignore_nils);
-       start = (lng *) Tloc(s, 0);
-       end = (lng *) Tloc(e, 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; \
+                       } \
+               } else { \
+                       for (j = i - 1; j >= k; j--) { \
+                               curval += cmp(Tloc(b, j), nil) != 0; \
+                               rb[j] = curval; \
+                       } \
+               } \
+               k = i; \
+       } while (0)
+
+#define ANALYTICAL_COUNT_NO_NIL_OTHERS_ALL_ROWS        \
+       do { \
+               curval = 0; \
+               if (isvarsized) { \
+                       for (; j < i; j++) \
+                               curval += cmp(nil, base + ((const var_t *) 
bp)[j]) != 0; \
+               } else { \
+                       for (; j < i; j++) \
+                               curval += cmp(Tloc(b, j), nil) != 0; \
+               } \
+               for (; k < i; k++) \
+                       rb[k] = curval; \
+       } while (0)
 
-       if (!*ignore_nils || b->tnonil) {
-               for (; i < cnt; i++, rb++)
-                       *rb = (end[i] > start[i]) ? (end[i] - start[i]) : 0;
-       } else {
-               switch (ATOMbasetype(tpe)) {
-               case TYPE_bte:
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(bte);
-                       break;
-               case TYPE_sht:
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(sht);
-                       break;
-               case TYPE_int:
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(int);
-                       break;
-               case TYPE_lng:
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_SIZE_IMP(lng);
-                       break;
+#define ANALYTICAL_COUNT_NO_NIL_OTHERS_CURRENT_ROW     \
+       do { \
+               if (isvarsized) { \
+                       for (; k < i; k++) \
+                               rb[k] = cmp(nil, base + ((const var_t *) 
bp)[k]) != 0; \
+               } else { \
+                       for (; k < i; k++) \
+                               rb[k] = cmp(Tloc(b, k), nil) != 0; \
+               } \
+       } while (0)
+
+#define ANALYTICAL_COUNT_NO_NIL_OTHERS_OTHERS  \
+       do { \
+               curval = 0; \
+               if (isvarsized) { \
+                       for (; k < i; k++) { \
+                               j = start[k]; \
+                               l = end[k]; \
+                               for (; j < l; j++) \
+                                       curval += cmp(nil, base + ((const var_t 
*) bp)[j]) != 0; \
+                               rb[k] = curval; \
+                               curval = 0; \
+                       } \
+               } else { \
+                       for (; k < i; k++) { \
+                               j = start[k]; \
+                               l = end[k]; \
+                               for (; j < l; j++) \
+                                       curval += cmp(Tloc(b, j), nil) != 0; \
+                               rb[k] = curval; \
+                               curval = 0; \
+                       } \
+               } \
+       } while (0)
+
+/* Now do the count analytic function branches */
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(TPE, IMP)             \
+       do {                                    \
+               TPE *bpf = (TPE*)bp; \
+               if (p) {                                        \
+                       for (; i < cnt; i++) {          \
+                               if (np[i])                      \
+                                       
ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE); \
+                       }                                               \
+                       i = cnt;                        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE);       \
+               } else {                                \
+                       i = cnt;                                        \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to