Changeset: fcf088370206 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fcf088370206 Modified Files: gdk/gdk_analytic.c gdk/gdk_analytic.h sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.mal sql/backends/monet5/sql_rank.mal.sh Branch: analytics Log Message:
Implemented lead over a window and other fixes.
diffs (truncated from 592 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
@@ -73,7 +73,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *c
ptr v = BUNtail(it, 0), next;
atomcmp = ATOMcompare(tpe);
if(rp) {
- for (i=0; i<cnt; i++, rp++) {
+ for (i=0; i<cnt; i++, rb++, rp++) {
*rb = *rp;
next = BUNtail(it, i);
if (atomcmp(v, next) != 0) {
@@ -82,7 +82,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *c
}
}
} else {
- for(i=0; i<cnt; i++, rp++) {
+ for(i=0; i<cnt; i++, rb++) {
*rb = FALSE;
next = BUNtail(it, i);
if (atomcmp(v, next) != 0) {
@@ -444,7 +444,7 @@ finish:
pbp = bp = (TPE*)Tloc(b, 0); \
rb = rp = (TPE*)Tloc(r, 0); \
end = rp + cnt; \
- if(is_lng_nil(nth)) { \
+ if(nth == BUN_NONE) { \
has_nils = true; \
for(; rp<end; rp++) \
*rp = TPE##_nil; \
@@ -452,7 +452,7 @@ finish:
np = (bit*)Tloc(p, 0); \
for(; rp<end; np++, rp++, bp++) { \
if (*np) { \
- if(nth > (TPE) (bp - pbp)) { \
+ if(nth > (BUN) (bp - pbp)) { \
curval = TPE##_nil; \
} else { \
curval = *(pbp + nth); \
@@ -464,7 +464,7 @@ finish:
pbp = bp; \
} \
} \
- if(nth > (TPE) (bp - pbp)) { \
+ if(nth > (BUN) (bp - pbp)) { \
curval = TPE##_nil; \
} else { \
curval = *(pbp + nth); \
@@ -475,7 +475,7 @@ finish:
*rb = curval; \
} else { \
TPE* end = rp + cnt; \
- if(nth > (TPE) cnt) { \
+ if(nth > cnt) { \
curval = TPE##_nil; \
} else { \
curval = *(bp + nth); \
@@ -489,7 +489,7 @@ finish:
} while(0);
gdk_return
-GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *o, lng nth, int tpe)
+GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *o, BUN nth, int tpe)
{
int (*atomcmp)(const void *, const void *);
const void* restrict nil;
@@ -498,7 +498,6 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
gdk_return gdk_res = GDK_SUCCEED;
bool has_nils = false;
- assert(is_lng_nil(nth) || nth >= 0);
(void) o;
switch (tpe) {
case TYPE_bte:
@@ -529,7 +528,7 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
const void *restrict curval;
nil = ATOMnilptr(tpe);
atomcmp = ATOMcompare(tpe);
- if(is_lng_nil(nth)) {
+ if(nth == BUN_NONE) {
has_nils = true;
for(i=0; i<cnt; i++) {
if ((gdk_res = BUNappend(r, nil,
false)) != GDK_SUCCEED)
@@ -539,7 +538,7 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
np = (bit*)Tloc(p, 0);
for(i=0,j=0; i<cnt; i++, np++) {
if (*np) {
- if(nth > (lng)(i - j)) {
+ if(nth > (i - j)) {
curval = nil;
} else {
curval = BUNtail(bpi,
nth);
@@ -552,7 +551,7 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
}
}
}
- if(nth > (lng)(i - j)) {
+ if(nth > (i - j)) {
curval = nil;
} else {
curval = BUNtail(bpi, nth);
@@ -564,7 +563,7 @@ GDKanalyticalnthvalue(BAT *r, BAT *b, BA
goto finish;
}
} else { /* single value, ie no ordering */
- if(nth > (lng)cnt) {
+ if(nth > cnt) {
curval = nil;
} else {
curval = BUNtail(bpi, nth);
@@ -593,16 +592,16 @@ finish:
def = *((TPE *) default_value), next; \
bp = (TPE*)Tloc(b, 0); \
rb = rp = (TPE*)Tloc(r, 0); \
- if(is_lng_nil(lag)) { \
+ end = rb + cnt; \
+ if(lag == BUN_NONE) { \
has_nils = true; \
- end = rb + cnt; \
for(; rb<end; rb++) \
*rb = TPE##_nil; \
} else if(p) { \
- end = rp + cnt; \
np = (bit*)Tloc(p, 0); \
for(; rp<end; np++, rp++) { \
if (*np) { \
+ l = (rp - rb); \
for(i=0; i<lag && rb<rp; i++, rb++) \
*rb = def;
\
if(lag > 0 && is_##TPE##_nil(def)) \
@@ -613,7 +612,7 @@ finish:
if(is_##TPE##_nil(next))
\
has_nils = true;
\
} \
- bp += lag; \
+ bp += (lag < l) ? lag : 0; \
} \
} \
for(i=0; i<lag && rb<end; i++, rb++) \
@@ -627,7 +626,6 @@ finish:
has_nils = true; \
} \
} else { \
- end = rb + cnt; \
for(i=0; i<lag && rb<end; i++, rb++) \
*rb = def; \
if(lag > 0 && is_##TPE##_nil(def)) \
@@ -643,18 +641,16 @@ finish:
} while(0);
gdk_return
-GDKanalyticallag(BAT *r, BAT *b, BAT *p, BAT *o, lng lag, const void* restrict
default_value, int tpe)
+GDKanalyticallag(BAT *r, BAT *b, BAT *p, BAT *o, BUN lag, const void* restrict
default_value, int tpe)
{
int (*atomcmp)(const void *, const void *);
const void *restrict nil;
- lng i = 0;
- BUN j = 0, k = 0, l, cnt = BATcount(b);
+ BUN i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b);
bit *restrict np;
gdk_return gdk_res = GDK_SUCCEED;
bool has_nils = false;
assert(default_value);
- assert(is_lng_nil(lag) || lag >= 0);
(void) o;
switch (tpe) {
@@ -686,7 +682,7 @@ GDKanalyticallag(BAT *r, BAT *b, BAT *p,
const void *restrict curval;
nil = ATOMnilptr(tpe);
atomcmp = ATOMcompare(tpe);
- if(is_lng_nil(lag)) {
+ if(lag == BUN_NONE) {
has_nils = true;
for (j=0;j < cnt; j++) {
if ((gdk_res = BUNappend(r, nil,
false)) != GDK_SUCCEED)
@@ -702,7 +698,7 @@ GDKanalyticallag(BAT *r, BAT *b, BAT *p,
}
if(lag > 0 &&
(*atomcmp)(default_value, nil) == 0)
has_nils = true;
- for(l=0; k<j; k++, l++) {
+ for(l=k-lag; k<j; k++, l++) {
curval = BUNtail(bpi,
l);
if ((gdk_res =
BUNappend(r, curval, false)) != GDK_SUCCEED)
goto finish;
@@ -717,7 +713,7 @@ GDKanalyticallag(BAT *r, BAT *b, BAT *p,
}
if(lag > 0 && (*atomcmp)(default_value, nil) ==
0)
has_nils = true;
- for(l=0; k<cnt; k++, l++) {
+ for(l=k-lag; k<cnt; k++, l++) {
curval = BUNtail(bpi, l);
if ((gdk_res = BUNappend(r, curval,
false)) != GDK_SUCCEED)
goto finish;
@@ -725,8 +721,7 @@ GDKanalyticallag(BAT *r, BAT *b, BAT *p,
has_nils = true;
}
} else {
- lng lcnt = (lng) cnt;
- for(i=0; i<lag && i<lcnt; i++) {
+ for(i=0; i<lag && i<cnt; i++) {
if ((gdk_res = BUNappend(r,
default_value, false)) != GDK_SUCCEED)
goto finish;
}
@@ -751,29 +746,195 @@ finish:
#undef ANALYTICAL_LAG_IMP
+#define ANALYTICAL_LEAD_IMP(TPE) \
+ do { \
+ TPE *rp, *rb, *bp, *end, \
+ def = *((TPE *) default_value), next; \
+ bp = (TPE*)Tloc(b, 0); \
+ rb = rp = (TPE*)Tloc(r, 0); \
+ end = rb + cnt; \
+ if(lead == BUN_NONE) { \
+ has_nils = true; \
+ for(; rb<end; rb++) \
+ *rb = TPE##_nil; \
+ } else if(p) { \
+ np = (bit*)Tloc(p, 0); \
+ for(; rp<end; np++, rp++) { \
+ if (*np) { \
+ k = (rp - rb); \
+ if(lead < k) { \
+ bp += lead;
\
+ l = k - lead;
\
+ for(i=0; i<l; i++, rb++, bp++)
{ \
+ next = *bp;
\
+ *rb = next;
\
+
if(is_##TPE##_nil(next)) \
+ has_nils =
true; \
+ }
\
+ } else { \
+ bp += k;
\
+ } \
+ for(;rb<rp; rb++) \
+ *rb = def;
\
+ if(lead > 0 && is_##TPE##_nil(def)) \
+ has_nils = true;
\
+ } \
+ } \
+ k = (rp - rb); \
+ if(lead < k) { \
+ bp += lead; \
+ l = k - lead; \
+ for(i=0; i<l; i++, rb++, bp++) { \
+ next = *bp; \
+ *rb = next; \
+ if(is_##TPE##_nil(next)) \
+ has_nils = true;
\
+ } \
+ } \
+ for(;rb<end; rb++) \
+ *rb = def; \
+ if(lead > 0 && is_##TPE##_nil(def)) \
+ has_nils = true; \
+ } else { \
+ if(lead < cnt) { \
+ bp += lead; \
+ l = cnt - lead; \
+ for(i=0; i<l; i++, rb++, bp++) { \
+ next = *bp; \
+ *rb = next; \
+ if(is_##TPE##_nil(next)) \
+ has_nils = true;
\
+ } \
+ } \
+ for(;rb<end; rb++, bp++) \
+ *rb = def; \
+ if(lead > 0 && is_##TPE##_nil(def)) \
+ has_nils = true; \
+ } \
+ goto finish; \
+ } while(0);
+
gdk_return
-GDKanalyticallead(BAT *r, BAT *b, BAT *p, BAT *o, lng lead, const void*
restrict default_value, int tpe)
+GDKanalyticallead(BAT *r, BAT *b, BAT *p, BAT *o, BUN lead, const void*
restrict default_value, int tpe)
{
- //int (*atomcmp)(const void *, const void *);
- //const void* restrict nil;
- BUN /*i, j,*/ cnt = BATcount(b);
- //bit *restrict np;
+ int (*atomcmp)(const void *, const void *);
+ const void* restrict nil;
+ BUN i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b);
+ bit *restrict np;
gdk_return gdk_res = GDK_SUCCEED;
bool has_nils = false;
assert(default_value);
- assert(is_lng_nil(lead) || lead <= 0);
(void) o;
- (void) p;
- (void) tpe;
-//finish:
+ switch (tpe) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
