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