Changeset: ef12f771922c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef12f771922c
Modified Files:
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_join.c
        gdk/gdk_logger.c
        monetdb5/modules/atoms/json.c
        monetdb5/modules/mal/tokenizer.c
        sql/backends/monet5/sql_cast.c
        sql/storage/bat/bat_logger.c
        sql/storage/bat/bat_table.c
Branch: default
Log Message:

New macro: BUNtoid(BAT *b, BUN p).
The macro returns the value at BUN position p in the (v)oid BAT b.
If b is dense (void or oid), it calculates the value (i.e. doesn't
touch the heap for oid).
There is no need for an iterator since it doesn't return a pointer to
the value.


diffs (truncated from 387 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1229,6 +1229,15 @@ typedef var_t stridx_t;
 #define BUNtvar(bi,p)  (assert((bi).b->ttype && (bi).b->tvarsized), 
Tbase((bi).b)+BUNtvaroff(bi,p))
 #define BUNtail(bi,p)  
((bi).b->ttype?(bi).b->tvarsized?BUNtvar(bi,p):BUNtloc(bi,p):BUNtpos(bi,p))
 
+/* return the oid value at BUN position p from the (v)oid bat b
+ * works with any TYPE_void or TYPE_oid bat */
+#define BUNtoid(b,p)   (assert(ATOMtype((b)->ttype) == TYPE_oid),      \
+                        (is_oid_nil((b)->tseqbase)                     \
+                         ? ((b)->ttype == TYPE_void                    \
+                            ? (void) (p), oid_nil                      \
+                            : ((const oid *) (b)->T.heap.base)[p])     \
+                         : (oid) ((b)->tseqbase + (BUN) (p))))
+
 static inline BATiter
 bat_iterator(BAT *b)
 {
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1339,11 +1339,10 @@ gdk_return
 void_replace_bat(BAT *b, BAT *p, BAT *u, bool force)
 {
        BUN r, s;
-       BATiter uii = bat_iterator(p);
        BATiter uvi = bat_iterator(u);
 
        BATloop(u, r, s) {
-               oid updid = *(oid *) BUNtail(uii, r);
+               oid updid = BUNtoid(p, r);
                const void *val = BUNtail(uvi, r);
 
                if (void_inplace(b, updid, val, force) != GDK_SUCCEED)
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -705,7 +705,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
                if (b->ttype != TYPE_void && b->tsorted && BATtdense(b) &&
                    (BATtdense(n) == 0 ||
                     cand != NULL ||
-                    1 + *(oid *) BUNtloc(bi, last) != *(oid *) BUNtail(ni, 
start))) {
+                    1 + *(oid *) BUNtloc(bi, last) != BUNtoid(n, start))) {
                        b->tseqbase = oid_nil;
                }
                b->tnonil &= n->tnonil;
@@ -2050,7 +2050,6 @@ BATmergecand(BAT *a, BAT *b)
        const oid *restrict ap, *restrict bp, *ape, *bpe;
        oid *restrict p, i;
        oid af, al, bf, bl;
-       BATiter ai, bi;
        bit ad, bd;
 
        BATcheck(a, "BATmergecand", NULL);
@@ -2072,12 +2071,10 @@ BATmergecand(BAT *a, BAT *b)
                return COLcopy(a, a->ttype, false, TRANSIENT);
        }
        /* we can return a if a fully covers b (and v.v) */
-       ai = bat_iterator(a);
-       bi = bat_iterator(b);
-       af = *(oid*) BUNtail(ai, 0);
-       bf = *(oid*) BUNtail(bi, 0);
-       al = *(oid*) BUNtail(ai, BUNlast(a) - 1);
-       bl = *(oid*) BUNtail(bi, BUNlast(b) - 1);
+       af = BUNtoid(a, 0);
+       bf = BUNtoid(b, 0);
+       al = BUNtoid(a, BUNlast(a) - 1);
+       bl = BUNtoid(b, BUNlast(b) - 1);
        ad = (af + BATcount(a) - 1 == al); /* i.e., dense */
        bd = (bf + BATcount(b) - 1 == bl); /* i.e., dense */
        if (ad && bd) {
@@ -2181,7 +2178,6 @@ BATintersectcand(BAT *a, BAT *b)
        const oid *restrict ap, *restrict bp, *ape, *bpe;
        oid *restrict p;
        oid af, al, bf, bl;
-       BATiter ai, bi;
 
        BATcheck(a, "BATintersectcand", NULL);
        BATcheck(b, "BATintersectcand", NULL);
@@ -2198,12 +2194,10 @@ BATintersectcand(BAT *a, BAT *b)
                return newdensecand(0, 0);
        }
 
-       ai = bat_iterator(a);
-       bi = bat_iterator(b);
-       af = *(oid*) BUNtail(ai, 0);
-       bf = *(oid*) BUNtail(bi, 0);
-       al = *(oid*) BUNtail(ai, BUNlast(a) - 1);
-       bl = *(oid*) BUNtail(bi, BUNlast(b) - 1);
+       af = BUNtoid(a, 0);
+       bf = BUNtoid(b, 0);
+       al = BUNtoid(a, BUNlast(a) - 1);
+       bl = BUNtoid(b, BUNlast(b) - 1);
 
        if ((af + BATcount(a) - 1 == al) && (bf + BATcount(b) - 1 == bl)) {
                /* both lists are VOID */
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2538,7 +2538,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
        BUN rstart, rend, rcnt;
        const oid *rcand = NULL, *rcandend = NULL;
        oid lo, ro;
-       BATiter ri, sri;
+       BATiter ri;
        BUN rb;
        BUN rl, rh;
        oid rseq;
@@ -2643,7 +2643,6 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                hsh = r->thash;
        }
        ri = bat_iterator(r);
-       sri = bat_iterator(sr);
        t = ATOMbasetype(r->ttype);
 
        if (lcand) {
@@ -2662,7 +2661,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                                for (rb = HASHget(hsh, HASHprobe(hsh, v));
                                     rb != HASHnil(hsh);
                                     rb = HASHgetlink(hsh, rb)) {
-                                       ro = * (const oid *) BUNtail(sri, rb);
+                                       ro = BUNtoid(sr, rb);
                                        if ((*cmp)(v, BUNtail(ri, ro - 
r->hseqbase)) != 0)
                                                continue;
                                        if (only_misses) {
@@ -2793,7 +2792,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                                        for (rb = HASHget(hsh, HASHprobe(hsh, 
v));
                                             rb != HASHnil(hsh);
                                             rb = HASHgetlink(hsh, rb)) {
-                                               ro = * (const oid *) 
BUNtail(sri, rb);
+                                               ro = BUNtoid(sr, rb);
                                                if ((*cmp)(v, BUNtail(ri, ro - 
r->hseqbase)) != 0)
                                                        continue;
                                                if (only_misses) {
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -580,11 +580,10 @@ la_bat_updates(logger *lg, logaction *la
                }
        } else if (la->type == LOG_UPDATE) {
                BATiter vi = bat_iterator(la->b);
-               BATiter ii = bat_iterator(la->uid);
                BUN p, q;
 
                BATloop(la->b, p, q) {
-                       oid h = * (const oid *) BUNtail(ii, p);
+                       oid h = BUNtoid(la->uid, p);
                        const void *t = BUNtail(vi, p);
 
                        if (h < b->hseqbase || h >= b->hseqbase + BATcount(b)) {
@@ -2643,7 +2642,6 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        lg->changes += l.nr;
 
        if (l.nr) {
-               BATiter ii = bat_iterator(uid);
                BATiter vi = bat_iterator(uval);
                gdk_return (*wh) (const void *, stream *, size_t) = 
BATatoms[TYPE_oid].atomWrite;
                gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[uval->ttype].atomWrite;
@@ -2654,10 +2652,10 @@ log_delta(logger *lg, BAT *uid, BAT *uva
                        return GDK_FAIL;
 
                for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) {
-                       const void *id = BUNtail(ii, p);
+                       const oid id = BUNtoid(uid, p);
                        const void *val = BUNtail(vi, p);
 
-                       ok = wh(id, lg->log, 1);
+                       ok = wh(&id, lg->log, 1);
                        if (ok == GDK_SUCCEED)
                                ok = wt(val, lg->log, 1);
                }
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -1807,7 +1807,7 @@ static str
 JSONfoldKeyValue(str *ret, const bat *id, const bat *key, const bat *values)
 {
        BAT *bo = 0, *bk = 0, *bv;
-       BATiter boi, bki, bvi;
+       BATiter bki, bvi;
        int tpe;
        char *row, *val = 0, *nme = 0;
        BUN i, cnt;
@@ -1851,17 +1851,15 @@ JSONfoldKeyValue(str *ret, const bat *id
        row[1] = 0;
        len = 1;
        if (id) {
-               boi = bat_iterator(bo);
-               o = *(oid *) BUNtail(boi, 0);
+               o = BUNtoid(bo, 0);
        }
 
        for (i = 0; i < cnt; i++) {
                if (id && bk) {
-                       p = BUNtail(boi, i);
-                       if (*(oid *) p != o) {
+                       if (BUNtoid(bo, i) != o) {
                                snprintf(row + len, lim - len, ", ");
                                len += 2;
-                               o = *(oid *) p;
+                               o = BUNtoid(bo, i);
                        }
                }
 
diff --git a/monetdb5/modules/mal/tokenizer.c b/monetdb5/modules/mal/tokenizer.c
--- a/monetdb5/modules/mal/tokenizer.c
+++ b/monetdb5/modules/mal/tokenizer.c
@@ -65,12 +65,11 @@ static char name[128];
 static int prvlocate(BAT* b, BAT* bidx, oid *prv, str part)
 {
        BATiter bi = bat_iterator(b);
-       BATiter biidx = bat_iterator(bidx);
        BUN p;
 
        if (BAThash(b) == GDK_SUCCEED) {
                HASHloop_str(bi, b->thash, p, part) {
-                       if (*((oid *) BUNtail(biidx, p)) == *prv) {
+                       if (BUNtoid(bidx, p) == *prv) {
                                *prv = (oid) p;
                                return TRUE;
                        }
@@ -80,7 +79,7 @@ static int prvlocate(BAT* b, BAT* bidx, 
                BUN q;
 
                BATloop(b, p, q) {
-                       if (*((oid *) BUNtail(biidx, p)) == *prv &&
+                       if (BUNtoid(bidx, p) == *prv &&
                                strcmp(BUNtail(bi, p), part) == 0) {
                                *prv = (oid) p;
                                return TRUE;
@@ -522,7 +521,6 @@ takeOid(oid id, str *val)
        str parts[MAX_TKNZR_DEPTH];
        size_t lngth = 0;
        str s;
-       BATiter biidx; /* Iterator for index bat */
 
        if (id >= BATcount(tokenBAT[INDEX].val)) {
                throw(MAL, "tokenizer.takeOid", OPERATION_FAILED " illegal 
oid");
@@ -535,9 +533,8 @@ takeOid(oid id, str *val)
 
        for (i = depth - 1; i >= 0; i--) {
                BATiter bi = bat_iterator(tokenBAT[i].val);
-               biidx = bat_iterator(tokenBAT[i].idx);
                parts[i] = (str) BUNtvar(bi, id);
-               id = *(oid *) BUNtail(biidx, id);
+               id = BUNtoid(tokenBAT[i].idx, id);
                lngth += strlen(parts[i]);
        }
 
diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c
--- a/sql/backends/monet5/sql_cast.c
+++ b/sql/backends/monet5/sql_cast.c
@@ -101,7 +101,7 @@ batstr_2_timestamp(bat *res, const bat *
                throw(SQL, "sql.2_timestamp", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
        BATloop(b, p, q) {
-               str v = (str) BUNtail(bi, p);
+               str v = (str) BUNtvar(bi, p);
                timestamp r;
                msg = str_2_timestamp(&r, &v);
                if (msg) {
@@ -196,7 +196,7 @@ batstr_2_daytime(bat *res, const bat *bi
                throw(SQL, "sql.2_daytime", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
        BATloop(b, p, q) {
-               str v = (str) BUNtail(bi, p);
+               str v = (str) BUNtvar(bi, p);
                daytime r;
                msg = str_2_daytime(&r, &v);
                if (msg) {
@@ -304,7 +304,7 @@ batstr_2_date(bat *res, const bat *bid)
                throw(SQL, "sql.2_date", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
        BATloop(b, p, q) {
-               str v = (str) BUNtail(bi, p);
+               str v = (str) BUNtvar(bi, p);
                date r;
                msg = str_2_date(&r, &v);
                if (msg) {
@@ -373,7 +373,7 @@ batstr_2_sqlblob(bat *res, const bat *bi
                throw(SQL, "sql.2_sqlblob", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
        BATloop(b, p, q) {
-               str v = (str) BUNtail(bi, p);
+               str v = (str) BUNtvar(bi, p);
                sqlblob *r;
                msg = str_2_sqlblob(&r, &v);
                if (msg) {
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -74,8 +74,7 @@ find_table_id(logger *lg, const char *va
                bat_destroy(s);
                return 0;
        }
-       bi = bat_iterator(s);
-       o = * (const oid *) BUNtail(bi, 0);
+       o = BUNtoid(s, 0);
        bat_destroy(s);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to