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

Reply via email to