Changeset: f28c64889f73 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f28c64889f73 Modified Files: gdk/gdk_analytic.h gdk/gdk_analytic_bounds.c gdk/gdk_analytic_func.c sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.mal sql/backends/monet5/sql_rank.mal.sh sql/common/sql_types.c sql/server/rel_select.c sql/test/analytics/Tests/analytics00.stable.out sql/test/analytics/Tests/analytics01.stable.err sql/test/analytics/Tests/analytics01.stable.out sql/test/analytics/Tests/analytics02.sql sql/test/analytics/Tests/analytics02.stable.err sql/test/analytics/Tests/analytics02.stable.out sql/test/analytics/Tests/analytics06.sql sql/test/analytics/Tests/analytics06.stable.out Branch: analytics Log Message:
Allow first_value, last_value and nth_value functions to use frames, and fixed
nulls values handling in range and groups frames.
diffs (truncated from 1589 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
@@ -21,13 +21,13 @@ gdk_export gdk_return GDKanalyticaldiff(
gdk_export gdk_return GDKanalyticalntile(BAT *r, BAT *b, BAT *p, int tpe,
const void* restrict ntile);
gdk_export gdk_return GDKanalyticallag(BAT *r, BAT *b, BAT *p, BUN lag, const
void* restrict default_value, int tpe);
gdk_export gdk_return GDKanalyticallead(BAT *r, BAT *b, BAT *p, BUN lead,
const void* restrict default_value, int tpe);
-gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *p, int tpe);
-gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *p, int tpe);
-gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BUN nth,
int tpe);
gdk_export gdk_return GDKanalyticalwindowbounds(BAT *r, BAT *b, BAT *p, BAT
*l, const void* restrict bound,
int tp1, int tp2, int unit, bool preceding, lng first_half);
+gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int
tpe);
+gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int
tpe);
+gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e,
BUN nth, int tpe);
gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *b, BAT *s, BAT *e, int
tpe);
gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *b, BAT *s, BAT *e, int
tpe);
gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *b, BAT *s, BAT *e, const
bit* restrict ignore_nils, int tpe);
diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c
--- a/gdk/gdk_analytic_bounds.c
+++ b/gdk/gdk_analytic_bounds.c
@@ -42,18 +42,22 @@
for(; k<i; k++, rb++) { \
rlimit = (TPE2) LIMIT; \
v = bp[k]; \
- if(is_##TPE1##_nil(v)) \
- j = m; \
- else \
+ if(is_##TPE1##_nil(v)) { \
+ for(j=k; j>m; j--) { \
+ if(!is_##TPE1##_nil(bp[j])) \
+ break; \
+ } \
+ } else { \
for(j=k; j>m; j--) { \
if(is_##TPE1##_nil(bp[j])) \
- continue; \
+ break; \
SUB_WITH_CHECK(TPE1, v, TPE1, bp[j],
TPE1, calc, GDK_##TPE1##_max, goto calc_overflow); \
if ((TPE2)(ABSOLUTE(calc)) > rlimit) { \
j++; \
break; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -65,16 +69,20 @@
for(; k<i; k++, rb++) { \
rlimit = (TPE2) LIMIT; \
v = bp[k]; \
- if(is_##TPE1##_nil(v)) \
- j = i; \
- else \
+ if(is_##TPE1##_nil(v)) { \
+ for(j=k+1; j<i; j++) { \
+ if(!is_##TPE1##_nil(bp[j])) \
+ break; \
+ } \
+ } else { \
for(j=k+1; j<i; j++) { \
if(is_##TPE1##_nil(bp[j])) \
- continue; \
+ break; \
SUB_WITH_CHECK(TPE1, v, TPE1, bp[j],
TPE1, calc, GDK_##TPE1##_max, goto calc_overflow); \
if ((TPE2)(ABSOLUTE(calc)) > rlimit) \
break; \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -85,12 +93,15 @@
for(; k<i; k++, rb++) { \
TPE2 rlimit = (TPE2) LIMIT; \
TPE1 v = bp[k]; \
- if(is_##TPE1##_nil(v)) \
- j = m; \
- else \
+ if(is_##TPE1##_nil(v)) { \
+ for(j=k; j>m; j--) { \
+ if(!is_##TPE1##_nil(bp[j])) \
+ break; \
+ } \
+ } else { \
for(j=k; j>m; j--) { \
if(is_##TPE1##_nil(bp[j])) \
- continue; \
+ break; \
if(v != bp[j]) { \
if(rlimit == 0) { \
j++; \
@@ -100,6 +111,7 @@
v = bp[j]; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -109,12 +121,15 @@
for(; k<i; k++, rb++) { \
TPE2 rlimit = (TPE2) LIMIT; \
TPE1 v = bp[k]; \
- if(is_##TPE1##_nil(v)) \
- j = i; \
- else \
+ if(is_##TPE1##_nil(v)) { \
+ for(j=k+1; j<i; j++) { \
+ if(!is_##TPE1##_nil(bp[j])) \
+ break; \
+ } \
+ } else { \
for(j=k+1; j<i; j++) { \
if(is_##TPE1##_nil(bp[j])) \
- continue; \
+ break; \
if(v != bp[j]) { \
if(rlimit == 0) \
break; \
@@ -122,6 +137,7 @@
v = bp[j]; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -151,18 +167,22 @@
lng m = k; \
for(; k<i; k++, rb++) { \
void *v = BUNtail(bpi, (BUN) k); \
- if(atomcmp(v, nil) == 0) \
- j = m; \
- else \
+ if(atomcmp(v, nil) == 0) { \
+ for(j=k; j>m; j--) { \
+ if(atomcmp(BUNtail(bpi, (BUN) j), nil)
!= 0) \
+ break; \
+ } \
+ } else { \
for(j=k; j>m; j--) { \
void *next = BUNtail(bpi, (BUN) j); \
if(atomcmp(next, nil) == 0) \
- continue; \
+ break; \
if(ABSOLUTE(atomcmp(v, next)) > (int)
LIMIT) { \
j++; \
break; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -171,16 +191,20 @@
do { \
for(; k<i; k++, rb++) { \
void *v = BUNtail(bpi, (BUN) k); \
- if(atomcmp(v, nil) == 0) \
- j = i; \
- else \
+ if(atomcmp(v, nil) == 0) { \
+ for(j=k+1; j<i; j++) { \
+ if(atomcmp(BUNtail(bpi, (BUN) j), nil)
!= 0) \
+ break; \
+ } \
+ } else { \
for(j=k+1; j<i; j++) { \
void *next = BUNtail(bpi, (BUN) j); \
if(atomcmp(next, nil) == 0) \
- continue; \
+ break; \
if(ABSOLUTE(atomcmp(v, next)) > (int)
LIMIT) \
break; \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -191,13 +215,16 @@
for(; k<i; k++, rb++) { \
lng rlimit = (lng) LIMIT; \
void *v = BUNtail(bpi, (BUN) k); \
- if(atomcmp(v, nil) == 0) \
- j = m; \
- else \
+ if(atomcmp(v, nil) == 0) { \
+ for(j=k; j>m; j--) { \
+ if(atomcmp(BUNtail(bpi, (BUN) j), nil)
!= 0) \
+ break; \
+ } \
+ } else { \
for(j=k; j>m; j--) { \
void *next = BUNtail(bpi, (BUN) j); \
if(atomcmp(next, nil) == 0) \
- continue; \
+ break; \
if(atomcmp(v, next)) { \
if(rlimit == 0) { \
j++; \
@@ -207,6 +234,7 @@
v = next; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -216,13 +244,16 @@
for(; k<i; k++, rb++) { \
lng rlimit = (lng) LIMIT; \
void *v = BUNtail(bpi, (BUN) k); \
- if(atomcmp(v, nil) == 0) \
- j = i; \
- else \
+ if(atomcmp(v, nil) == 0) { \
+ for(j=k+1; j<i; j++) { \
+ if(atomcmp(BUNtail(bpi, (BUN) j), nil)
!= 0) \
+ break; \
+ } \
+ } else { \
for(j=k+1; j<i; j++) { \
void *next = BUNtail(bpi, (BUN) j); \
if(atomcmp(next, nil) == 0) \
- continue; \
+ break; \
if(atomcmp(v, next)) { \
if(rlimit == 0) \
break; \
@@ -230,6 +261,7 @@
v = next; \
} \
} \
+ } \
*rb = j; \
} \
} while(0)
@@ -388,7 +420,7 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B
if (*np) {
i += (np - pnp);
j = k;
- for (; k < i; k++, rb++)
+ for (; k<i; k++, rb++)
*rb = j;
pnp = np;
}
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
@@ -198,62 +198,31 @@ GDKanalyticalntile(BAT *r, BAT *b, BAT *
return GDK_SUCCEED;
}
-#define FIRST_CALC(TPE) \
- do { \
- for (;rb < rp; rb++) \
- *rb = curval; \
- if(is_##TPE##_nil(curval)) \
- has_nils = true; \
- } while(0)
-
-#define ANALYTICAL_FIRST_IMP(TPE) \
- do { \
- TPE *rp, *rb, *restrict bp, curval; \
- rb = rp = (TPE*)Tloc(r, 0); \
- bp = (TPE*)Tloc(b, 0); \
- curval = *bp; \
- if (p) { \
- pnp = np = (bit*)Tloc(p, 0); \
- end = np + cnt; \
- for(; np<end; np++) { \
- if (*np) { \
- ncnt = (np - pnp); \
- rp += ncnt; \
- bp += ncnt; \
- FIRST_CALC(TPE); \
- curval = *bp; \
- pnp = np; \
- } \
- } \
- ncnt = (np - pnp); \
- rp += ncnt; \
- bp += ncnt; \
- FIRST_CALC(TPE); \
- } else { \
- rp += cnt; \
- FIRST_CALC(TPE); \
- } \
- } while(0)
-
-#define ANALYTICAL_FIRST_OTHERS \
- do { \
- curval = BUNtail(bpi, j); \
- if (atomcmp(curval, nil) == 0) \
- has_nils = true; \
- for (;j < i; j++) { \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
