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

Reply via email to