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

Add a 3rd argument for the aggregate


diffs (258 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
@@ -50,8 +50,8 @@ rebuild_segmentree(oid ncount, oid data_
        return GDK_SUCCEED;
 }
 
-/* segment_tree, levels_offset and nlevels must be already defined. ARG1 and 
ARG2 are to be used by the aggregate */
-#define populate_segment_tree(CAST, COUNT, INIT_AGGREGATE, COMPUTE_LEVEL0, 
COMPUTE_LEVELN, ARG1, ARG2) \
+/* segment_tree, levels_offset and nlevels must be already defined. ARG1, ARG2 
and ARG3 are to be used by the aggregate */
+#define populate_segment_tree(CAST, COUNT, INIT_AGGREGATE, COMPUTE_LEVEL0, 
COMPUTE_LEVELN, ARG1, ARG2, ARG3) \
        do {    \
                CAST *ctree = (CAST *) segment_tree; \
                CAST *prev_level_begin = ctree; \
@@ -63,7 +63,7 @@ rebuild_segmentree(oid ncount, oid data_
        \
                        for (oid x = pos; x < end; x++) { \
                                CAST computed; \
-                               COMPUTE_LEVEL0(x, ARG1, ARG2);  \
+                               COMPUTE_LEVEL0(x, ARG1, ARG2, ARG3);    \
                                ctree[tree_offset++] = computed; \
                        } \
                } \
@@ -75,9 +75,9 @@ rebuild_segmentree(oid ncount, oid data_
                                oid begin = pos, end = MIN(level_size, pos + 
SEGMENT_TREE_FANOUT), width = end - begin; \
                                CAST computed; \
        \
-                               INIT_AGGREGATE(ARG1, ARG2);     \
+                               INIT_AGGREGATE(ARG1, ARG2, ARG3);       \
                                for (oid x = 0; x < width; x++) \
-                                       COMPUTE_LEVELN(prev_level_begin[x], 
ARG1, ARG2);        \
+                                       COMPUTE_LEVELN(prev_level_begin[x], 
ARG1, ARG2, ARG3);  \
                                ctree[tree_offset++] = computed; \
                                prev_level_begin += width; \
                        } \
@@ -85,12 +85,12 @@ rebuild_segmentree(oid ncount, oid data_
                } \
        } while (0)
 
-#define compute_on_segment_tree(CAST, START, END, INIT_AGGREGATE, COMPUTE, 
FINALIZE_AGGREGATE, ARG1, ARG2)     \
+#define compute_on_segment_tree(CAST, START, END, INIT_AGGREGATE, COMPUTE, 
FINALIZE_AGGREGATE, ARG1, ARG2, ARG3)       \
        do { /* taken from https://www.vldb.org/pvldb/vol8/p1058-leis.pdf */    
\
                oid begin = START, tend = END; \
                CAST computed; \
        \
-               INIT_AGGREGATE(ARG1, ARG2);     \
+               INIT_AGGREGATE(ARG1, ARG2, ARG3);       \
                for (oid level = 0; level < nlevels; level++) { \
                        CAST *tlevel = (CAST *) segment_tree + 
levels_offset[level]; \
                        oid parent_begin = begin / SEGMENT_TREE_FANOUT; \
@@ -98,25 +98,25 @@ rebuild_segmentree(oid ncount, oid data_
        \
                        if (parent_begin == parent_end) { \
                                for (oid pos = begin; pos < tend; pos++) \
-                                       COMPUTE(tlevel[pos], ARG1, ARG2);       
\
+                                       COMPUTE(tlevel[pos], ARG1, ARG2, ARG3); 
\
                                break; \
                        } \
                        oid group_begin = parent_begin * SEGMENT_TREE_FANOUT; \
                        if (begin != group_begin) { \
                                oid limit = group_begin + SEGMENT_TREE_FANOUT; \
                                for (oid pos = begin; pos < limit; pos++) \
-                                       COMPUTE(tlevel[pos], ARG1, ARG2);       
\
+                                       COMPUTE(tlevel[pos], ARG1, ARG2, ARG3); 
\
                                parent_begin++; \
                        } \
                        oid group_end = parent_end * SEGMENT_TREE_FANOUT; \
                        if (tend != group_end) { \
                                for (oid pos = group_end; pos < tend; pos++) \
-                                       COMPUTE(tlevel[pos], ARG1, ARG2);       
\
+                                       COMPUTE(tlevel[pos], ARG1, ARG2, ARG3); 
\
                        } \
                        begin = parent_begin; \
                        tend = parent_end; \
                } \
-               FINALIZE_AGGREGATE(ARG1, ARG2); \
+               FINALIZE_AGGREGATE(ARG1, ARG2, ARG3); \
        } while (0)
 
 #define NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST, VALIDATION)       \
@@ -865,15 +865,15 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                } \
        } while (0)
 
-#define INIT_AGGREGATE_MIN_MAX_FIXED(TPE, MIN_MAX) \
+#define INIT_AGGREGATE_MIN_MAX_FIXED(TPE, MIN_MAX, NOTHING) \
        do { \
                computed = TPE##_nil; \
        } while (0)
-#define COMPUTE_LEVEL0_MIN_MAX_FIXED(X, TPE, MIN_MAX) \
+#define COMPUTE_LEVEL0_MIN_MAX_FIXED(X, TPE, MIN_MAX, NOTHING) \
        do { \
                computed = bp[j + X]; \
        } while (0)
-#define COMPUTE_LEVELN_MIN_MAX_FIXED(VAL, TPE, MIN_MAX) \
+#define COMPUTE_LEVELN_MIN_MAX_FIXED(VAL, TPE, MIN_MAX, NOTHING) \
        do { \
                if (!is_##TPE##_nil(VAL)) {     \
                        if (is_##TPE##_nil(computed))   \
@@ -882,7 +882,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                                computed = MIN_MAX(computed, VAL); \
                } \
        } while (0)
-#define FINALIZE_AGGREGATE_MIN_MAX_FIXED(TPE, MIN_MAX) \
+#define FINALIZE_AGGREGATE_MIN_MAX_FIXED(TPE, MIN_MAX, NOTHING) \
        do { \
                rb[k] = computed;       \
                has_nils |= is_##TPE##_nil(computed); \
@@ -892,9 +892,9 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                oid ncount = i - k; \
                if ((res = rebuild_segmentree(ncount, sizeof(TPE), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
                        goto cleanup; \
-               populate_segment_tree(TPE, ncount, 
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVEL0_MIN_MAX_FIXED, 
COMPUTE_LEVELN_MIN_MAX_FIXED, TPE, MIN_MAX); \
+               populate_segment_tree(TPE, ncount, 
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVEL0_MIN_MAX_FIXED, 
COMPUTE_LEVELN_MIN_MAX_FIXED, TPE, MIN_MAX, NOTHING); \
                for (; k < i; k++) \
-                       compute_on_segment_tree(TPE, start[k] - j, end[k] - j, 
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVELN_MIN_MAX_FIXED, 
FINALIZE_AGGREGATE_MIN_MAX_FIXED, TPE, MIN_MAX); \
+                       compute_on_segment_tree(TPE, start[k] - j, end[k] - j, 
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVELN_MIN_MAX_FIXED, 
FINALIZE_AGGREGATE_MIN_MAX_FIXED, TPE, MIN_MAX, NOTHING); \
                j = k; \
        } while (0)
 
@@ -976,15 +976,15 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                } \
        } while (0)
 
-#define INIT_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING) \
+#define INIT_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING1, NOTHING2) \
        do { \
                computed = (void*) nil; \
        } while (0)
-#define COMPUTE_LEVEL0_MIN_MAX_VARSIZED(X, GT_LT, NOTHING) \
+#define COMPUTE_LEVEL0_MIN_MAX_VARSIZED(X, GT_LT, NOTHING1, NOTHING2) \
        do { \
                computed = BUNtail(bpi, j + X); \
        } while (0)
-#define COMPUTE_LEVELN_MIN_MAX_VARSIZED(VAL, GT_LT, NOTHING) \
+#define COMPUTE_LEVELN_MIN_MAX_VARSIZED(VAL, GT_LT, NOTHING1, NOTHING2) \
        do { \
                if (atomcmp(VAL, nil) != 0) {           \
                        if (atomcmp(computed, nil) == 0)        \
@@ -993,7 +993,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                                computed = atomcmp(VAL, computed) GT_LT 0 ? 
computed : VAL; \
                } \
        } while (0)
-#define FINALIZE_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING) \
+#define FINALIZE_AGGREGATE_MIN_MAX_VARSIZED(GT_LT, NOTHING1, NOTHING2) \
        do { \
                if ((res = tfastins_nocheckVAR(r, k, computed, Tsize(r))) != 
GDK_SUCCEED) \
                        goto cleanup; \
@@ -1004,9 +1004,9 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
                oid ncount = i - k; \
                if ((res = rebuild_segmentree(ncount, sizeof(void*), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
                        goto cleanup; \
-               populate_segment_tree(void*, ncount, 
INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVEL0_MIN_MAX_VARSIZED, 
COMPUTE_LEVELN_MIN_MAX_VARSIZED, GT_LT, NOTHING); \
+               populate_segment_tree(void*, ncount, 
INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVEL0_MIN_MAX_VARSIZED, 
COMPUTE_LEVELN_MIN_MAX_VARSIZED, GT_LT, NOTHING, NOTHING); \
                for (; k < i; k++) \
-                       compute_on_segment_tree(void*, start[k] - j, end[k] - 
j, INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVELN_MIN_MAX_VARSIZED, 
FINALIZE_AGGREGATE_MIN_MAX_VARSIZED, GT_LT, NOTHING); \
+                       compute_on_segment_tree(void*, start[k] - j, end[k] - 
j, INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVELN_MIN_MAX_VARSIZED, 
FINALIZE_AGGREGATE_MIN_MAX_VARSIZED, GT_LT, NOTHING, NOTHING); \
                j = k; \
        } while (0)
 
@@ -1202,19 +1202,19 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } \
        } while (0)
 
-#define INIT_AGGREGATE_COUNT(TPE, NOTHING) \
+#define INIT_AGGREGATE_COUNT(TPE, NOTHING1, NOTHING2) \
        do { \
                computed = 0; \
        } while (0)
-#define COMPUTE_LEVEL0_COUNT_FIXED(X, TPE, NOTHING) \
+#define COMPUTE_LEVEL0_COUNT_FIXED(X, TPE, NOTHING1, NOTHING2) \
        do { \
                computed = !is_##TPE##_nil(bp[j + X]); \
        } while (0)
-#define COMPUTE_LEVELN_COUNT(VAL, NOTHING1, NOTHING2) \
+#define COMPUTE_LEVELN_COUNT(VAL, NOTHING1, NOTHING2, NOTHING3) \
        do { \
                computed += VAL; \
        } while (0)
-#define FINALIZE_AGGREGATE_COUNT(NOTHING1, NOTHING2) \
+#define FINALIZE_AGGREGATE_COUNT(NOTHING1, NOTHING2, NOTHING3) \
        do { \
                rb[k] = computed;       \
        } while (0)
@@ -1227,9 +1227,9 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                        oid ncount = i - k; \
                        if ((res = rebuild_segmentree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
                                goto cleanup; \
-                       populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_FIXED, COMPUTE_LEVELN_COUNT, TPE, 
NOTHING); \
+                       populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_FIXED, COMPUTE_LEVELN_COUNT, TPE, 
NOTHING, NOTHING); \
                        for (; k < i; k++) \
-                               compute_on_segment_tree(lng, start[k] - j, 
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT, 
FINALIZE_AGGREGATE_COUNT, TPE, NOTHING); \
+                               compute_on_segment_tree(lng, start[k] - j, 
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT, 
FINALIZE_AGGREGATE_COUNT, TPE, NOTHING, NOTHING); \
                        j = k; \
                }       \
        } while (0)
@@ -1321,7 +1321,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } \
        } while (0)
 
-#define COMPUTE_LEVEL0_COUNT_OTHERS(X, NOTHING1, NOTHING2) \
+#define COMPUTE_LEVEL0_COUNT_OTHERS(X, NOTHING1, NOTHING2, NOTHING3) \
        do { \
                computed = cmp(BUNtail(bpi, j + X), nil) != 0; \
        } while (0)
@@ -1334,9 +1334,9 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                        oid ncount = i - k; \
                        if ((res = rebuild_segmentree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
                                goto cleanup; \
-                       populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_OTHERS, COMPUTE_LEVELN_COUNT, 
NOTHING, NOTHING); \
+                       populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_OTHERS, COMPUTE_LEVELN_COUNT, 
NOTHING, NOTHING, NOTHING); \
                        for (; k < i; k++) \
-                               compute_on_segment_tree(lng, start[k] - j, 
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT, 
FINALIZE_AGGREGATE_COUNT, NOTHING, NOTHING); \
+                               compute_on_segment_tree(lng, start[k] - j, 
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT, 
FINALIZE_AGGREGATE_COUNT, NOTHING, NOTHING, NOTHING); \
                        j = k; \
                }       \
        } while (0)
@@ -1520,16 +1520,16 @@ cleanup:
                } \
        } while (0)
 
-#define INIT_AGGREGATE_SUM(NOTHING, TPE2) \
+#define INIT_AGGREGATE_SUM(NOTHING1, TPE2, NOTHING2) \
        do { \
                computed = TPE2##_nil; \
        } while (0)
-#define COMPUTE_LEVEL0_SUM(X, TPE1, TPE2) \
+#define COMPUTE_LEVEL0_SUM(X, TPE1, TPE2, NOTHING) \
        do { \
                TPE1 v = bp[j + X]; \
                computed = is_##TPE1##_nil(v) ? TPE2##_nil : (TPE2) v; \
        } while (0)
-#define COMPUTE_LEVELN_SUM_NUM(VAL, NOTHING, TPE2) \
+#define COMPUTE_LEVELN_SUM_NUM(VAL, NOTHING1, TPE2, NOTHING2) \
        do { \
                if (!is_##TPE2##_nil(VAL)) {            \
                        if (is_##TPE2##_nil(computed))  \
@@ -1538,7 +1538,7 @@ cleanup:
                                ADD_WITH_CHECK(VAL, computed, TPE2, computed, 
GDK_##TPE2##_max, goto calc_overflow); \
                }       \
        } while (0)
-#define FINALIZE_AGGREGATE_SUM(NOTHING, TPE2) \
+#define FINALIZE_AGGREGATE_SUM(NOTHING1, TPE2, NOTHING2) \
        do { \
                rb[k] = computed;       \
                has_nils |= is_##TPE2##_nil(computed); \
@@ -1548,9 +1548,9 @@ cleanup:
                oid ncount = i - k; \
                if ((res = rebuild_segmentree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
                        goto cleanup; \
-               populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_SUM, 
COMPUTE_LEVEL0_SUM, COMPUTE_LEVELN_SUM_NUM, TPE1, TPE2); \
+               populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_SUM, 
COMPUTE_LEVEL0_SUM, COMPUTE_LEVELN_SUM_NUM, TPE1, TPE2, NOTHING); \
                for (; k < i; k++) \
-                       compute_on_segment_tree(TPE2, start[k] - j, end[k] - j, 
INIT_AGGREGATE_SUM, COMPUTE_LEVELN_SUM_NUM, FINALIZE_AGGREGATE_SUM, TPE1, 
TPE2); \
+                       compute_on_segment_tree(TPE2, start[k] - j, end[k] - j, 
INIT_AGGREGATE_SUM, COMPUTE_LEVELN_SUM_NUM, FINALIZE_AGGREGATE_SUM, TPE1, TPE2, 
NOTHING); \
                j = k; \
        } while (0)
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to