Changeset: 822b8d536c94 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=822b8d536c94 Modified Files: gdk/gdk_analytic.c gdk/gdk_analytic.h sql/backends/monet5/sql_rank.c sql/test/analytics/Tests/analytics02.sql sql/test/analytics/Tests/analytics02.stable.out Branch: analytics Log Message:
Overlapped average aggregate on a window.
diffs (truncated from 861 to 300 lines):
diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -2537,245 +2537,233 @@ finish:
#undef ANALYTICAL_PROD_IMP_FP
#undef ANALYTICAL_PROD_IMP_FP_REAL
-#define ANALYTICAL_AVERAGE_TYPE_LNG_HGE(TPE,lng_hge) \
- do { \
- TPE *pbp, *bp, a, v; \
- dbl *rp, *rb; \
- pbp = bp = (TPE*)Tloc(b, 0); \
- rb = rp = (dbl*)Tloc(r, 0); \
- if (p) { \
- pnp = np = (bit*)Tloc(p, 0);
\
- end = np + cnt;
\
- for(; np<end; np++) {
\
- if (*np) {
\
- ncnt = np - pnp;
\
- bp += ncnt;
\
- rp += ncnt;
\
- for(; pbp<bp; pbp++) {
\
- v = *pbp;
\
- if (!is_##TPE##_nil(v)) {
\
- ADD_WITH_CHECK(TPE, v,
lng_hge, sum, \
-
lng_hge, sum, \
-
GDK_##lng_hge##_max, \
-
goto avg_overflow##TPE); \
- /* count only when no
overflow occurs */\
- n++;
\
- }
\
- }
\
- if(0) {
\
-avg_overflow##TPE: \
- assert(n > 0);
\
- if (sum >= 0) {
\
- a = (TPE) (sum /
(lng_hge) n); \
- rr = (BUN) (sum %
(SBUN) n); \
- } else {
\
- sum = -sum;
\
- a = - (TPE) (sum /
(lng_hge) n); \
- rr = (BUN) (sum %
(SBUN) n); \
- if (r) {
\
- a--;
\
- rr = n - rr;
\
- }
\
- }
\
- for(; pbp<bp; pbp++) {
\
- v = *pbp;
\
- if (is_##TPE##_nil(v))
\
- continue;
\
- AVERAGE_ITER(TPE, v, a,
rr, n); \
- }
\
- curval = a + (dbl) rr / n;
\
- goto calc_done##TPE;
\
- }
\
- curval = n > 0 ? (dbl) sum / n :
dbl_nil; \
-calc_done##TPE: \
- has_nils = has_nils || (n == 0);
\
- for (;rb < rp; rb++)
\
- *rb = curval;
\
- n = 0;
\
- sum = 0;
\
- pnp = np;
\
- pbp = bp;
\
- }
\
- }
\
- ncnt = np - pnp;
\
- bp += ncnt;
\
- rp += ncnt;
\
- for(; pbp<bp; pbp++) {
\
- v = *pbp;
\
- if (!is_##TPE##_nil(v)) {
\
- ADD_WITH_CHECK(TPE, v, lng_hge, sum,
\
- lng_hge,
sum, \
-
GDK_##lng_hge##_max, \
- goto
last_avg_overflow##TPE); \
- /* count only when no overflow occurs
*/ \
- n++;
\
- }
\
- }
\
- if(0) {
\
-last_avg_overflow##TPE: \
- assert(n > 0);
\
- if (sum >= 0) {
\
- a = (TPE) (sum / (lng_hge) n);
\
- rr = (BUN) (sum % (SBUN) n);
\
- } else {
\
- sum = -sum;
\
- a = - (TPE) (sum / (lng_hge) n);
\
- rr = (BUN) (sum % (SBUN) n);
\
- if (r) {
\
- a--;
\
- rr = n - rr;
\
- }
\
- }
\
- for(; pbp<bp; pbp++) {
\
- v = *pbp;
\
- if (is_##TPE##_nil(v))
\
- continue;
\
- AVERAGE_ITER(TPE, v, a, rr, n);
\
- }
\
- curval = a + (dbl) rr / n;
\
- goto last_calc_done##TPE;
\
- }
\
- curval = n > 0 ? (dbl) sum / n : dbl_nil;
\
-last_calc_done##TPE: \
- has_nils = has_nils || (n == 0);
\
- for (;rb < rp; rb++)
\
- *rb = curval;
\
- } else if (o || force_order) { \
- TPE *bend = bp + cnt; \
- for(; bp<bend; bp++) {
\
- v = *bp;
\
- if (!is_##TPE##_nil(v)) {
\
- ADD_WITH_CHECK(TPE, v, lng_hge, sum,
lng_hge, \
- sum,
GDK_##lng_hge##_max, \
- goto
single_overflow##TPE); \
- /* count only when no overflow occurs
*/ \
- n++;
\
- }
\
- }
\
- if(0) {
\
-single_overflow##TPE: \
- assert(n > 0);
\
- if (sum >= 0) {
\
- a = (TPE) (sum / (lng_hge) n);
\
- rr = (BUN) (sum % (SBUN) n);
\
- } else {
\
- sum = -sum;
\
- a = - (TPE) (sum / (lng_hge) n);
\
- rr = (BUN) (sum % (SBUN) n);
\
- if (r) {
\
- a--;
\
- rr = n - rr;
\
- }
\
- }
\
- for(; bp<bend; bp++) {
\
- v = *bp;
\
- if (is_##TPE##_nil(v))
\
- continue;
\
- AVERAGE_ITER(TPE, v, a, rr, n);
\
- }
\
- curval = a + (dbl) rr / n;
\
- goto single_calc_done##TPE;
\
- }
\
- curval = n > 0 ? (dbl) sum / n : dbl_nil;
\
- has_nils = (n == 0);
\
-single_calc_done##TPE: \
- rp += cnt;
\
- for (;rb < rp; rb++)
\
- *rb = curval;
\
- } else { /* single value, ie no ordering */ \
- dbl* rend = rp + cnt;
\
- for(; rp<rend; rp++, bp++) {
\
- v = *bp;
\
- if(is_##TPE##_nil(v)) {
\
- *rp = dbl_nil;
\
- has_nils = true;
\
- } else {
\
- *rp = (dbl) v;
\
- }
\
- }
\
- } \
- goto finish; \
+#define ANALYTICAL_AVERAGE_NO_OVERLAP(TPE,lng_hge,LABEL) \
+ do { \
+ for(; pbp<bp; pbp++) { \
+ v = *pbp; \
+ if (!is_##TPE##_nil(v)) { \
+ ADD_WITH_CHECK(TPE, v, lng_hge, sum, lng_hge, \
+ sum,
GDK_##lng_hge##_max, \
+ goto
avg_overflow##TPE##LABEL##no_overlap); \
+ /* count only when no overflow occurs */ \
+ n++; \
+ } \
+ } \
+ if(0) { \
+avg_overflow##TPE##LABEL##no_overlap: \
+ assert(n > 0); \
+ if (sum >= 0) { \
+ a = (TPE) (sum / (lng_hge) n); \
+ rr = (BUN) (sum % (SBUN) n); \
+ } else { \
+ sum = -sum; \
+ a = - (TPE) (sum / (lng_hge) n); \
+ rr = (BUN) (sum % (SBUN) n); \
+ if (r) { \
+ a--;
\
+ rr = n - rr;
\
+ } \
+ } \
+ for(; pbp<bp; pbp++) { \
+ v = *pbp; \
+ if (is_##TPE##_nil(v)) \
+ continue;
\
+ AVERAGE_ITER(TPE, v, a, rr, n); \
+ } \
+ curval = a + (dbl) rr / n; \
+ goto calc_done##TPE##LABEL##no_overlap; \
+ } \
+ curval = n > 0 ? (dbl) sum / n : dbl_nil; \
+calc_done##TPE##LABEL##no_overlap: \
+ has_nils = has_nils || (n == 0); \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ n = 0; \
+ sum = 0; \
+ } while(0);
+
+#define ANALYTICAL_AVERAGE_OVERLAP(TPE,lng_hge,LABEL) \
+ do { \
+ TPE *bs, *bl, *be; \
+ bl = pbp; \
+ for(; pbp<bp;pbp++) { \
+ bs = (pbp > bl+start) ? pbp - start : bl; \
+ be = (pbp+end < bp) ? pbp + end + 1 : bp; \
+ for(; bs<be; bs++) { \
+ v = *bs;
\
+ if (!is_##TPE##_nil(v)) {
\
+ ADD_WITH_CHECK(TPE, v, lng_hge, sum,
lng_hge, \
+ sum,
GDK_##lng_hge##_max, \
+ goto
avg_overflow##TPE##LABEL##overlap); \
+ /* count only when no overflow occurs
*/ \
+ n++;
\
+ }
\
+ } \
+ if(0) { \
+avg_overflow##TPE##LABEL##overlap: \
+ assert(n > 0);
\
+ if (sum >= 0) {
\
+ a = (TPE) (sum / (lng_hge) n);
\
+ rr = (BUN) (sum % (SBUN) n);
\
+ } else {
\
+ sum = -sum;
\
+ a = - (TPE) (sum / (lng_hge) n);
\
+ rr = (BUN) (sum % (SBUN) n);
\
+ if (r) {
\
+ a--;
\
+ rr = n - rr;
\
+ }
\
+ }
\
+ for(; bs<be; bs++) {
\
+ v = *bs;
\
+ if (is_##TPE##_nil(v))
\
+ continue;
\
+ AVERAGE_ITER(TPE, v, a, rr, n);
\
+ }
\
+ curval = a + (dbl) rr / n;
\
+ goto calc_done##TPE##LABEL##overlap;
\
+ } \
+ curval = n > 0 ? (dbl) sum / n : dbl_nil; \
+calc_done##TPE##LABEL##overlap: \
+ has_nils = has_nils || (n == 0); \
+ *rb = curval; \
+ rb++; \
+ n = 0; \
+ sum = 0; \
+ } \
+ } while(0);
+
+#define ANALYTICAL_AVERAGE_LNG_HGE(TPE,lng_hge,IMP) \
+ do { \
+ TPE *pbp, *bp, a, v; \
+ dbl *rp, *rb; \
+ pbp = bp = (TPE*)Tloc(b, 0); \
+ rb = rp = (dbl*)Tloc(r, 0); \
+ if (p) { \
+ pnp = np = (bit*)Tloc(p, 0); \
+ nend = np + cnt; \
+ for(; np<nend; np++) { \
+ if (*np) { \
+ ncnt = np - pnp; \
+ bp += ncnt; \
+ rp += ncnt; \
+ IMP(TPE,lng_hge,middle_partition) \
+ pnp = np; \
+ pbp = bp; \
+ } \
+ } \
+ ncnt = np - pnp; \
+ bp += ncnt; \
+ rp += ncnt; \
+ IMP(TPE,lng_hge,final_partition) \
+ } else if (o || force_order) { \
+ bp += cnt; \
+ rp += cnt; \
+ IMP(TPE,lng_hge,single_partition) \
+ } else { \
+ dbl* rend = rp + cnt; \
+ for(; rp<rend; rp++, bp++) { \
+ v = *bp; \
+ if(is_##TPE##_nil(v)) { \
+ *rp = dbl_nil; \
+ has_nils = true; \
+ } else { \
+ *rp = (dbl) v; \
+ } \
+ } \
+ } \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
