Changeset: 6f556dd1195d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f556dd1195d
Modified Files:
        gdk/gdk_analytic.c
        gdk/gdk_analytic.h
        sql/backends/monet5/sql_rank.c
Branch: analytics
Log Message:

Move SQL diff implementation to the GDK layer, plus for the trivial types use 
pointer arithmetic instead of function calls for speed up.


diffs (180 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -11,6 +11,96 @@
 #include "gdk_analytic.h"
 #include "gdk_calc_private.h"
 
+#define ANALYTICAL_DIFF_IMP(TPE)              \
+       do {                                      \
+               TPE *bp = (TPE*)Tloc(b, 0);           \
+               TPE prev = *bp, *end = bp + cnt;      \
+               if(rp) {                              \
+                       for(; bp<end; bp++, rb++, rp++) { \
+                               *rb = *rp;                    \
+                               if (*bp != prev) {            \
+                                       *rb = TRUE;               \
+                                       prev = *bp;               \
+                               }                             \
+                       }                                 \
+               } else {                              \
+                       for(; bp<end; bp++, rb++) {       \
+                               *rb = FALSE;                  \
+                               if (*bp != prev) {            \
+                                       *rb = TRUE;               \
+                                       prev = *bp;               \
+                               }                             \
+                       }                                 \
+               }                                     \
+       } while(0);
+
+gdk_return
+GDKanalyticaldiff(BAT *r, BAT *b, BAT *c, int tpe)
+{
+       BUN i, cnt = BATcount(b);
+       bit *rb = (bit*)Tloc(r, 0), *rp = c ? (bit*)Tloc(c, 0) : NULL;
+       int (*atomcmp)(const void *, const void *);
+
+       switch(ATOMstorage(tpe)) {
+               case TYPE_bit:
+                       ANALYTICAL_DIFF_IMP(bit)
+                       break;
+               case TYPE_bte:
+                       ANALYTICAL_DIFF_IMP(bte)
+                       break;
+               case TYPE_sht:
+                       ANALYTICAL_DIFF_IMP(sht)
+                       break;
+               case TYPE_int:
+                       ANALYTICAL_DIFF_IMP(int)
+                       break;
+               case TYPE_lng:
+                       ANALYTICAL_DIFF_IMP(lng)
+                       break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       ANALYTICAL_DIFF_IMP(hge)
+                       break;
+#endif
+               case TYPE_flt:
+                       ANALYTICAL_DIFF_IMP(flt)
+                       break;
+               case TYPE_dbl:
+                       ANALYTICAL_DIFF_IMP(dbl)
+                       break;
+               default: {
+                       BATiter it = bat_iterator(b);
+                       ptr v = BUNtail(it, 0), next;
+                       atomcmp = ATOMcompare(tpe);
+                       if(rp) {
+                               for (i = 0; i < cnt; i++, rp++) {
+                                       *rb = *rp;
+                                       next = BUNtail(it, i);
+                                       if (atomcmp(v, next) != 0) {
+                                               *rb = TRUE;
+                                               v = next;
+                                       }
+                               }
+                       } else {
+                               for(i=0; i<cnt; i++, rp++) {
+                                       *rb = FALSE;
+                                       next = BUNtail(it, i);
+                                       if (atomcmp(v, next) != 0) {
+                                               *rb = TRUE;
+                                               v = next;
+                                       }
+                               }
+                       }
+               }
+       }
+       BATsetcount(r, cnt);
+       r->tnonil = true;
+       r->tnil = false;
+       return GDK_SUCCEED;
+}
+
+#undef ANALYTICAL_DIFF_IMP
+
 #define ANALYTICAL_LIMIT_IMP(TPE, OP)                        \
        do {                                                     \
                TPE *rp, *rb, *restrict bp, *end, curval;            \
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -16,6 +16,7 @@
 
 #include "gdk.h"
 
+gdk_export gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *c, int tpe);
 gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *b, BAT *p, BAT *o, int 
tpe);
 gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *b, BAT *p, BAT *o, int 
tpe);
 gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *b, BAT *p, BAT *o, const 
bit *ignore_nils, int tpe);
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
@@ -29,19 +29,12 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
        if (isaBatType(getArgType(mb, pci, 1))) {
                bat *res = getArgReference_bat(stk, pci, 0);
                bat *bid = getArgReference_bat(stk, pci, 1);
-               BAT *b = BATdescriptor(*bid), *c;
-               BAT *r;
-               bit *bp, *rp;
-               int i, cnt;
-               int (*cmp)(const void *, const void *);
-               BATiter it;
-               ptr v;
+               BAT *b = BATdescriptor(*bid), *c, *r;
+               gdk_return gdk_code;
 
                if (!b)
                        throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot access 
column descriptor");
-               cnt = (int)BATcount(b);
-               voidresultBAT(r, TYPE_bit, cnt, b, "sql.diff");
-               rp = (bit*)Tloc(r, 0);
+               voidresultBAT(r, TYPE_bit, (int)BATcount(b), b, "sql.diff");
                if (pci->argc > 2) {
                        c = b;
                        bid = getArgReference_bat(stk, pci, 2);
@@ -50,36 +43,16 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                                BBPunfix(c->batCacheid);
                                throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot 
access column descriptor");
                        }
-
-                       cmp = ATOMcompare(b->ttype);
-                       it = bat_iterator(b);
-                       v = BUNtail(it, 0);
-                       bp = (bit*)Tloc(c, 0);
-
-                       for(i=0; i<cnt; i++, bp++, rp++) {
-                               *rp = *bp;
-                               if (cmp(v, BUNtail(it,i)) != 0) { 
-                                       *rp = TRUE;
-                                       v = BUNtail(it, i);
-                               }
-                       }
+                       gdk_code = GDKanalyticaldiff(r, b, c, b->ttype);
                        BBPunfix(c->batCacheid);
                } else {
-                       cmp = ATOMcompare(b->ttype);
-                       it = bat_iterator(b);
-                       v = BUNtail(it, 0);
-
-                       for(i=0; i<cnt; i++, rp++) {
-                               *rp = FALSE;
-                               if (cmp(v, BUNtail(it,i)) != 0) { 
-                                       *rp = TRUE;
-                                       v = BUNtail(it, i);
-                               }
-                       }
+                       gdk_code = GDKanalyticaldiff(r, b, NULL, b->ttype);
                }
-               BATsetcount(r, cnt);
                BBPunfix(b->batCacheid);
-               BBPkeepref(*res = r->batCacheid);
+               if(gdk_code == GDK_SUCCEED)
+                       BBPkeepref(*res = r->batCacheid);
+               else
+                       throw(SQL, "sql.diff", SQLSTATE(HY001) "Unknown GDK 
error");
        } 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