Changeset: 7d6628762d03 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7d6628762d03
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_analytic.h
gdk/gdk_analytic_bounds.c
sql/backends/monet5/sql_rank.c
Branch: default
Log Message:
Avoid COLcopy when needed, so add scalar case for analytical diff
diffs (134 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -243,7 +243,7 @@ gdk_return GDKanalytical_variance_samp(B
gdk_return GDKanalyticalavg(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e,
int tpe, int frame_type);
gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT
*e, int tpe, int frame_type);
gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e,
bit ignore_nils, int tpe, int frame_type);
-gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, int tpe);
+gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit *restrict
npbit, int tpe);
gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
gdk_return GDKanalyticallag(BAT *r, BAT *b, BAT *p, BUN lag, const void
*restrict default_value, int tpe);
gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -14,7 +14,7 @@
#ifndef _GDK_ANALYTIC_H_
#define _GDK_ANALYTIC_H_
-gdk_export gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, int tpe);
+gdk_export gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit
*restrict npbit, int tpe);
gdk_export gdk_return GDKanalyticalntile(BAT *r, BAT *b, BAT *p, BAT *n, 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);
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
@@ -25,6 +25,16 @@
rb[i] = np[i]; \
} \
} \
+ } else if (npbit) { \
+ for (; i < cnt; i++) { \
+ TPE next = bp[i]; \
+ if (next != prev) { \
+ rb[i] = TRUE; \
+ prev = next; \
+ } else { \
+ rb[i] = npb; \
+ } \
+ } \
} else { \
for (; i < cnt; i++) { \
TPE next = bp[i]; \
@@ -52,6 +62,16 @@
rb[i] = np[i]; \
} \
} \
+ } else if (npbit) {
\
+ for (; i < cnt; i++) { \
+ TPE next = bp[i]; \
+ if (next != prev && (!is_##TPE##_nil(next) ||
!is_##TPE##_nil(prev))) { \
+ rb[i] = TRUE; \
+ prev = next; \
+ } else { \
+ rb[i] = npb; \
+ } \
+ } \
} else { \
for (; i < cnt; i++) { \
TPE next = bp[i]; \
@@ -66,10 +86,10 @@
} while (0)
gdk_return
-GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, int tpe)
+GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit *restrict npbit, int tpe)
{
BUN i = 0, cnt = BATcount(b);
- bit *restrict rb = (bit *) Tloc(r, 0), *restrict np = p ? (bit *)
Tloc(p, 0) : NULL;
+ bit *restrict rb = (bit *) Tloc(r, 0), *restrict np = p ? (bit *)
Tloc(p, 0) : NULL, npb = npbit ? *npbit : 0;
switch (ATOMbasetype(tpe)) {
case TYPE_bte:
@@ -116,6 +136,15 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
v = next;
}
}
+ } else if (npbit) {
+ for (i = 0; i < cnt; i++) {
+ rb[i] = npb;
+ next = BUNtail(it, i);
+ if (atomcmp(v, next) != 0) {
+ rb[i] = TRUE;
+ v = next;
+ }
+ }
} else {
for (i = 0; i < cnt; i++) {
next = BUNtail(it, i);
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -63,7 +63,7 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
msg = createException(SQL, "sql.diff",
SQLSTATE(HY005) "Cannot access column descriptor");
goto bailout;
}
- gdk_code = GDKanalyticaldiff(r, b, c, b->ttype);
+ gdk_code = GDKanalyticaldiff(r, b, c, NULL,
b->ttype);
} else { /* the input is a constant, so the output is
the previous sql.diff output */
assert(b->ttype == TYPE_bit);
BBPkeepref(*res = b->batCacheid);
@@ -74,13 +74,12 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
msg = createException(SQL, "sql.diff",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
goto bailout;
}
- gdk_code = GDKanalyticaldiff(r, b, NULL, b->ttype);
+ gdk_code = GDKanalyticaldiff(r, b, NULL, NULL,
b->ttype);
}
if (gdk_code != GDK_SUCCEED)
msg = createException(SQL, "sql.diff", GDK_EXCEPTION);
} else if (pci->argc > 2 && isaBatType(getArgType(mb, pci, 2))) {
- bit prev = *getArgReference_bit(stk, pci, 1);
- bit *restrict cb;
+ bit *restrict prev = getArgReference_bit(stk, pci, 1);
res = getArgReference_bat(stk, pci, 0);
if ((!(b = BATdescriptor(*getArgReference_bat(stk, pci, 2))))) {
@@ -91,14 +90,8 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
msg = createException(SQL, "sql.diff", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if (!(c = COLnew(0, TYPE_bit, BATcount(b), TRANSIENT))) {
- msg = createException(SQL, "sql.diff", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- goto bailout;
- }
- cb = (bit *) Tloc(c, 0);
- memset(cb, prev, BATcount(b));
- if (GDKanalyticaldiff(r, b, c, b->ttype) != GDK_SUCCEED)
+ if (GDKanalyticaldiff(r, b, NULL, prev, b->ttype) !=
GDK_SUCCEED)
msg = createException(SQL, "sql.diff", GDK_EXCEPTION);
} else {
bit *res = getArgReference_bit(stk, pci, 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list