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