Changeset: b8a05ffaf5e2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b8a05ffaf5e2 Modified Files: gdk/gdk_analytic_func.c sql/test/analytics/Tests/analytics19.sql sql/test/analytics/Tests/analytics19.stable.out Branch: window-tunning Log Message:
Updated average for integers diffs (297 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 @@ -2663,26 +2663,45 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *o, } \ } while (0) -#define ANALYTICAL_AVG_INT_OTHERS(TPE) \ - do { \ - TPE avg = 0; \ - for (; k < i; k++) { \ - TPE *bs = bp + start[k], *be = bp + end[k]; \ - for (; bs < be; bs++) { \ - TPE v = *bs; \ - if (!is_##TPE##_nil(v)) \ - AVERAGE_ITER(TPE, v, avg, rem, ncnt); \ - } \ - if (ncnt == 0) { \ - has_nils = true; \ - rb[k] = TPE##_nil; \ - } else { \ - ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, ncnt); \ - rb[k] = avg; \ - } \ - rem = 0; \ - ncnt = 0; \ - } \ +#define avg_int_deltas(TPE) typedef struct avg_int_deltas_##TPE { TPE avg; lng rem, ncnt;} avg_int_deltas_##TPE; +avg_int_deltas(bte) +avg_int_deltas(sht) +avg_int_deltas(int) +avg_int_deltas(lng) + +#define INIT_AGGREGATE_AVG_INT(TPE, NOTHING1, NOTHING2) \ + do { \ + computed = (avg_int_deltas_##TPE) {.avg = 0, .rem = 0, .ncnt = 0}; \ + } while (0) +#define COMPUTE_LEVEL0_AVG_INT(X, TPE, NOTHING1, NOTHING2) \ + do { \ + TPE v = bp[j + X]; \ + computed = is_##TPE##_nil(v) ? (avg_int_deltas_##TPE) {.avg = 0, .rem = 0, .ncnt = 0} : (avg_int_deltas_##TPE) {.avg = v, .rem = 0, .ncnt = 1}; \ + } while (0) +#define COMPUTE_LEVELN_AVG_INT(VAL, TPE, NOTHING1, NOTHING2) \ + do { \ + if (VAL.ncnt > 0) \ + AVERAGE_ITER(TPE, VAL.avg, computed.avg, computed.rem, computed.ncnt); \ + } while (0) +#define FINALIZE_AGGREGATE_AVG_INT(TPE, NOTHING1, NOTHING2) \ + do { \ + if (computed.ncnt == 0) { \ + has_nils = true; \ + rb[k] = TPE##_nil; \ + } else { \ + ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(computed.avg, computed.rem, computed.ncnt); \ + rb[k] = computed.avg; \ + } \ + } while (0) +#define ANALYTICAL_AVG_INT_OTHERS(TPE) \ + do { \ + oid ncount = i - k; \ + if ((res = GDKrebuild_segment_tree(ncount, sizeof(avg_int_deltas_##TPE), &segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != GDK_SUCCEED) \ + goto cleanup; \ + populate_segment_tree(avg_int_deltas_##TPE, ncount, INIT_AGGREGATE_AVG_INT, COMPUTE_LEVEL0_AVG_INT, COMPUTE_LEVELN_AVG_INT, TPE, NOTHING, NOTHING); \ + for (; k < i; k++) \ + compute_on_segment_tree(avg_int_deltas_##TPE, start[k] - j, end[k] - j, INIT_AGGREGATE_AVG_INT, COMPUTE_LEVELN_AVG_INT, FINALIZE_AGGREGATE_AVG_INT, TPE, NOTHING, NOTHING); \ + j = k; \ } while (0) #define ANALYTICAL_AVG_INT_PARTITIONS(TPE, IMP) \ @@ -2699,6 +2718,7 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *o, } while (0) #ifdef HAVE_HGE +avg_int_deltas(hge) #define ANALYTICAL_AVG_INT_LIMIT(IMP) \ case TYPE_hge: \ ANALYTICAL_AVG_INT_PARTITIONS(hge, ANALYTICAL_AVG_INT_##IMP); \ @@ -2732,9 +2752,12 @@ gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int frame_type) { bool has_nils = false; - oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s ? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL; + oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s ? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL, + *levels_offset = NULL, tree_capacity = 0, nlevels = 0, levels_capacity = 0; lng rem = 0, ncnt = 0; bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL; + void *segment_tree = NULL; + gdk_return res = GDK_SUCCEED; if (cnt > 0) { switch (frame_type) { @@ -2759,8 +2782,11 @@ GDKanalyticalavginteger(BAT *r, BAT *p, BATsetcount(r, cnt); r->tnonil = !has_nils; r->tnil = has_nils; - return GDK_SUCCEED; - nosupport: +cleanup: + GDKfree(segment_tree); + GDKfree(levels_offset); + return res; +nosupport: GDKerror("42000!average of type %s to %s unsupported.\n", ATOMname(tpe), ATOMname(tpe)); return GDK_FAIL; } diff --git a/sql/test/analytics/Tests/analytics19.sql b/sql/test/analytics/Tests/analytics19.sql --- a/sql/test/analytics/Tests/analytics19.sql +++ b/sql/test/analytics/Tests/analytics19.sql @@ -44,4 +44,21 @@ select avg(aa) over (), select avg(CAST(NULL as interval second)) over (), avg(CAST(NULL as interval month)) over () from analytics; +select avg(aa) over (order by bb rows between 5 preceding and 0 following), + avg(aa) over (order by bb rows between 5 preceding and 2 following), + avg(aa) over (partition by bb order by bb rows between 5 preceding and 0 following), + avg(aa) over (partition by bb order by bb rows between 5 preceding and 2 following) from analytics; + +select avg(aa) over (order by bb rows 2 preceding), + avg(aa) over (partition by bb order by bb rows 2 preceding), + avg(aa) over (order by bb nulls last, aa nulls last rows 2 preceding) from analytics; + +select avg(bb) over (order by bb groups between 5 preceding and 0 following), + avg(bb) over (order by bb groups between 5 preceding and 2 following), + avg(bb) over (partition by bb order by bb groups between 5 preceding and 0 following), + avg(bb) over (partition by bb order by bb groups between 5 preceding and 2 following) from analytics; + +select avg(bb) over (order by bb groups 2 preceding), + avg(bb) over (partition by bb order by bb groups 2 preceding) from analytics; + rollback; diff --git a/sql/test/analytics/Tests/analytics19.stable.out b/sql/test/analytics/Tests/analytics19.stable.out --- a/sql/test/analytics/Tests/analytics19.stable.out +++ b/sql/test/analytics/Tests/analytics19.stable.out @@ -15,8 +15,8 @@ stdout of test 'analytics19` in director # avg(aa) over (partition by bb order by bb asc), # avg(aa) over (partition by bb order by bb desc), # avg(aa) over (order by bb desc) from analytics; -% sys.%7, sys.%16, sys.%25, sys.%34 # table_name -% %7, %16, %25, %34 # name +% sys.%1, sys.%2, sys.%3, sys.%4 # table_name +% %1, %2, %3, %4 # name % sec_interval, sec_interval, sec_interval, sec_interval # type % 5, 5, 5, 5 # length [ NULL, NULL, NULL, NULL ] @@ -33,8 +33,8 @@ stdout of test 'analytics19` in director # avg(bb) over (partition by bb order by bb asc), # avg(bb) over (partition by bb order by bb desc), # avg(bb) over (order by bb desc) from analytics; -% sys.%7, sys.%16, sys.%25, sys.%34 # table_name -% %7, %16, %25, %34 # name +% sys.%1, sys.%2, sys.%3, sys.%4 # table_name +% %1, %2, %3, %4 # name % month_interval, month_interval, month_interval, month_interval # type % 1, 1, 1, 1 # length [ 4, 4, 4, 4 ] @@ -51,8 +51,8 @@ stdout of test 'analytics19` in director # avg(aa) over (partition by aa order by aa asc), # avg(aa) over (partition by aa order by aa desc), # avg(aa) over (order by aa desc) from analytics; -% sys.%7, sys.%16, sys.%25, sys.%34 # table_name -% %7, %16, %25, %34 # name +% sys.%1, sys.%2, sys.%3, sys.%4 # table_name +% %1, %2, %3, %4 # name % sec_interval, sec_interval, sec_interval, sec_interval # type % 6, 6, 6, 6 # length [ 15.000, 15.000, 15.000, 15.000 ] @@ -69,8 +69,8 @@ stdout of test 'analytics19` in director # avg(bb) over (partition by aa order by aa asc), # avg(bb) over (partition by aa order by aa desc), # avg(bb) over (order by aa desc) from analytics; -% sys.%7, sys.%16, sys.%25, sys.%34 # table_name -% %7, %16, %25, %34 # name +% sys.%1, sys.%2, sys.%3, sys.%4 # table_name +% %1, %2, %3, %4 # name % month_interval, month_interval, month_interval, month_interval # type % 1, 1, 1, 1 # length [ 3, 3, 3, 3 ] @@ -87,8 +87,8 @@ stdout of test 'analytics19` in director # avg(interval '1' second) over (partition by bb order by bb asc), # avg(interval '1' month) over (partition by bb order by bb desc), # avg(interval '1' month) over (order by bb desc) from analytics; -% .%10, .%20, .%30, .%40 # table_name -% %10, %20, %30, %40 # name +% .%5, .%6, .%7, .%10 # table_name +% %5, %6, %7, %10 # name % sec_interval, sec_interval, month_interval, month_interval # type % 5, 5, 1, 1 # length [ 1.000, 1.000, 1, 1 ] @@ -105,8 +105,8 @@ stdout of test 'analytics19` in director # avg(interval '-1' second) over (partition by bb order by bb asc), # avg(interval '-100' month) over (partition by bb order by bb desc), # avg(interval '-100' month) over (order by bb desc) from analytics; -% .%10, .%20, .%30, .%40 # table_name -% %10, %20, %30, %40 # name +% .%5, .%6, .%7, .%10 # table_name +% %5, %6, %7, %10 # name % sec_interval, sec_interval, month_interval, month_interval # type % 6, 6, 4, 4 # length [ -1.000, -1.000, -100, -100 ] @@ -125,8 +125,8 @@ stdout of test 'analytics19` in director # avg(bb) over (), # avg(interval '1' second) over (), # avg(interval '1' month) over () from analytics; -% sys.%7, sys.%16, sys.%25, sys.%34, .%44, .%54 # table_name -% %7, %16, %25, %34, %44, %54 # name +% sys.%3, sys.%4, sys.%5, sys.%6, .%7, .%10 # table_name +% %3, %4, %5, %6, %7, %10 # name % sec_interval, month_interval, sec_interval, month_interval, sec_interval, month_interval # type % 5, 1, 5, 1, 5, 1 # length [ 5.750, 2, 5.750, 2, 1.000, 1 ] @@ -141,8 +141,8 @@ stdout of test 'analytics19` in director [ 5.750, 2, 5.750, 2, 1.000, 1 ] #select avg(CAST(NULL as interval second)) over (), # avg(CAST(NULL as interval month)) over () from analytics; -% .%10, .%20 # table_name -% %10, %20 # name +% .%3, .%4 # table_name +% %3, %4 # name % sec_interval, month_interval # type % 5, 1 # length [ NULL, NULL ] @@ -155,6 +155,75 @@ stdout of test 'analytics19` in director [ NULL, NULL ] [ NULL, NULL ] [ NULL, NULL ] +#select avg(aa) over (order by bb rows between 5 preceding and 0 following), +# avg(aa) over (order by bb rows between 5 preceding and 2 following), +# avg(aa) over (partition by bb order by bb rows between 5 preceding and 0 following), +# avg(aa) over (partition by bb order by bb rows between 5 preceding and 2 following) from analytics; +% sys.%3, sys.%6, sys.%11, sys.%14 # table_name +% %3, %6, %11, %14 # name +% sec_interval, sec_interval, sec_interval, sec_interval # type +% 5, 5, 6, 5 # length +[ 3.000, 3.000, 3.000, 3.000 ] +[ 2.500, 3.000, 2.500, 3.000 ] +[ 3.000, 3.000, 3.000, 3.000 ] +[ 3.000, 4.000, NULL, 5.500 ] +[ 3.000, 5.833, 3.000, 5.500 ] +[ 4.000, 5.714, 5.500, 5.500 ] +[ 6.400, 6.143, 15.000, 8.667 ] +[ 7.000, 6.833, 10.000, 8.667 ] +[ 7.400, 7.400, 8.667, 8.667 ] +[ 7.400, 7.400, NULL, NULL ] +#select avg(aa) over (order by bb rows 2 preceding), +# avg(aa) over (partition by bb order by bb rows 2 preceding), +# avg(aa) over (order by bb nulls last, aa nulls last rows 2 preceding) from analytics; +% sys.%3, sys.%6, sys.%11 # table_name +% %3, %6, %11 # name +% sec_interval, sec_interval, sec_interval # type +% 5, 6, 6 # length +[ 2.500, 2.500, 2.000 ] +[ 3.000, 3.000, 2.500 ] +[ 3.000, 3.000, 3.000 ] +[ 3.500, 3.000, 3.333 ] +[ 5.500, 5.500, 5.000 ] +[ 3.000, NULL, 5.500 ] +[ 9.333, 10.000, 6.500 ] +[ 8.667, 8.667, 5.500 ] +[ 8.667, 15.000, 8.667 ] +[ 5.500, NULL, 10.500 ] +#select avg(bb) over (order by bb groups between 5 preceding and 0 following), +# avg(bb) over (order by bb groups between 5 preceding and 2 following), +# avg(bb) over (partition by bb order by bb groups between 5 preceding and 0 following), +# avg(bb) over (partition by bb order by bb groups between 5 preceding and 2 following) from analytics; +% sys.%3, sys.%6, sys.%11, sys.%14 # table_name +% %3, %6, %11, %14 # name +% month_interval, month_interval, month_interval, month_interval # type +% 1, 1, 1, 1 # length +[ 1, 2, 1, 1 ] +[ 1, 2, 1, 1 ] +[ 1, 2, 1, 1 ] +[ 2, 2, 2, 2 ] +[ 2, 2, 2, 2 ] +[ 2, 2, 2, 2 ] +[ 2, 2, 3, 3 ] +[ 2, 2, 3, 3 ] +[ 2, 2, 3, 3 ] +[ 2, 2, 4, 4 ] +#select avg(bb) over (order by bb groups 2 preceding), +# avg(bb) over (partition by bb order by bb groups 2 preceding) from analytics; +% sys.%3, sys.%6 # table_name +% %3, %6 # name +% month_interval, month_interval # type +% 1, 1 # length +[ 1, 1 ] +[ 1, 1 ] +[ 1, 1 ] +[ 2, 2 ] +[ 2, 2 ] +[ 2, 2 ] +[ 2, 3 ] +[ 2, 3 ] +[ 2, 3 ] +[ 3, 4 ] #rollback; # 16:17:14 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list