Changeset: 82dd54b61789 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=82dd54b61789
Modified Files:
        gdk/gdk_select.c
Branch: Oct2014
Log Message:

When doing a point select on a view of a persistent bat, use hash select.


diffs (82 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -163,22 +163,35 @@ doubleslice(BAT *b, BUN l1, BUN h1, BUN 
        return virtualize(bn);
 }
 
+#define HASHloop_bound(bi, h, hb, v, lo, hi)                   \
+       for (hb = HASHget(h, HASHprobe((h), v));                \
+            hb != HASHnil(h);                                  \
+            hb = HASHgetlink(h,hb))                            \
+               if (hb >= (lo) && hb < (hi) &&                  \
+                   ATOMcmp(h->type, v, BUNhead(bi, hb)) == 0)
+
 static BAT *
 BAT_hashselect(BAT *b, BAT *s, BAT *bn, const void *tl, BUN maximum)
 {
        BATiter bi;
        BUN i, cnt;
        oid o, *restrict dst;
-       /* off must be signed as it can be negative,
-        * e.g., if b->hseqbase == 0 and b->batFirst > 0;
-        * instead of wrd, we could also use ssize_t or int/lng with
-        * 32/64-bit OIDs */
-       wrd off;
+       BUN l, h;
+       oid seq;
 
        assert(bn->htype == TYPE_void);
        assert(bn->ttype == TYPE_oid);
        assert(BAThdense(b));
-       off = b->hseqbase - b->batFirst;
+       seq = b->hseqbase;
+       if (VIEWtparent(b)) {
+               BAT *b2 = BBPdescriptor(-VIEWtparent(b));
+               l = ((b->T->heap.base - b2->T->heap.base) >> b->T->shift) + 
BUNfirst(b);
+               h = l + BATcount(b);
+               b = b2;
+       } else {
+               l = BUNfirst(b);
+               h = BUNlast(b);
+       }
        b = BATmirror(b);       /* BATprepareHash works on HEAD column */
        if (BATprepareHash(b)) {
                BBPreclaim(bn);
@@ -189,8 +202,8 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn, 
        cnt = 0;
        if (s) {
                assert(s->tsorted);
-               HASHloop(bi, b->H->hash, i, tl) {
-                       o = (oid) (i + off);
+               HASHloop_bound(bi, b->H->hash, i, tl, l, h) {
+                       o = (oid) (i - l + seq);
                        if (SORTfnd(s, &o) != BUN_NONE) {
                                buninsfix(bn, dst, cnt, o,
                                          maximum - BATcapacity(bn),
@@ -199,8 +212,8 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn, 
                        }
                }
        } else {
-               HASHloop(bi, b->H->hash, i, tl) {
-                       o = (oid) (i + off);
+               HASHloop_bound(bi, b->H->hash, i, tl, l, h) {
+                       o = (oid) (i - l + seq);
                        buninsfix(bn, dst, cnt, o,
                                  maximum - BATcapacity(bn),
                                  maximum, NULL);
@@ -1413,9 +1426,11 @@ BATsubselect(BAT *b, BAT *s, const void 
        /* refine upper limit by exact size (if known) */
        maximum = MIN(maximum, estimate);
        hash = equi &&
-              b->batPersistence == PERSISTENT &&
-              (size_t) ATOMsize(b->ttype) > sizeof(BUN) / 4 &&
-              BATcount(b) * (ATOMsize(b->ttype) + 2 * sizeof(BUN)) < 
GDK_mem_maxsize / 2;
+               (b->batPersistence == PERSISTENT ||
+                ((parent = VIEWtparent(b)) != 0 &&
+                 BBPquickdesc(abs(parent),0)->batPersistence == PERSISTENT)) &&
+               (size_t) ATOMsize(b->ttype) > sizeof(BUN) / 4 &&
+               BATcount(b) * (ATOMsize(b->ttype) + 2 * sizeof(BUN)) < 
GDK_mem_maxsize / 2;
        if (hash && estimate == BUN_NONE && !b->T->hash) {
                /* no exact result size, but we need estimate to choose
                 * between hash- & scan-select */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to