Changeset: 3822af945f28 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3822af945f28
Modified Files:
gdk/gdk_cand.c
gdk/gdk_private.h
gdk/gdk_select.c
Branch: viewless
Log Message:
Do not use BATslice to slice a candidate list, but CANDlist.
A BATslice might lead to a view, which we want to get rid of.
Instead use a CANDslice.
diffs (240 lines):
diff --git a/gdk/gdk_cand.c b/gdk/gdk_cand.c
--- a/gdk/gdk_cand.c
+++ b/gdk/gdk_cand.c
@@ -20,14 +20,14 @@
BAT *
CANDnewdense(oid first, oid last)
{
- BAT *bn;
- if ((bn = COLnew(0, TYPE_void, 0, TRANSIENT)) == NULL)
+ BAT *s;
+ if ((s = COLnew(0, TYPE_void, 0, TRANSIENT)) == NULL)
return NULL;
if (last < first)
first = last = 0; /* empty range */
- BATsetcount(bn, last - first + 1);
- BATtseqbase(bn, first);
- return bn;
+ BATsetcount(s, last - first + 1);
+ BATtseqbase(s, first);
+ return s;
}
/* binary search in a candidate list, return 1 if found, 0 if not */
@@ -87,3 +87,76 @@ CANDvirtualize(BAT *bn)
return bn;
}
+BAT *
+CANDdoublerange(oid l1, oid h1, oid l2, oid h2)
+{
+ BAT *bn;
+ oid *restrict p;
+
+ assert(l1 <= h1);
+ assert(l2 <= h2);
+ assert(h1 <= l2);
+ if (l1 == h1 || l2 == h2) {
+ bn = COLnew(0, TYPE_void, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
+ return NULL;
+ BATsetcount(bn, h1 - l1 + h2 - l2);
+ BATtseqbase(bn, l1 == h1 ? l2 : l1);
+ return bn;
+ }
+ bn = COLnew(0, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
+ return NULL;
+ BATsetcount(bn, h1 - l1 + h2 - l2);
+ p = (oid *) Tloc(bn, 0);
+ while (l1 < h1)
+ *p++ = l1++;
+ while (l2 < h2)
+ *p++ = l2++;
+ bn->tkey = 1;
+ bn->tsorted = 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ bn->tnil = 0;
+ bn->tnonil = 1;
+ return bn;
+}
+
+BAT *
+CANDdoubleslice(BAT *s, BUN l1, BUN h1, BUN l2, BUN h2)
+{
+ BAT *bn;
+ oid *restrict p;
+ const oid *restrict o;
+
+ assert(l1 <= h1);
+ assert(l2 <= h2);
+ assert(h1 <= l2);
+ assert(s->tsorted);
+ assert(s->tkey);
+ if (s->ttype == TYPE_void)
+ return CANDdoublerange(l1 + s->tseqbase, h1 + s->tseqbase,
+ l2 + s->tseqbase, h2 + s->tseqbase);
+ bn = COLnew(0, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
+ return NULL;
+ BATsetcount(bn, h1 - l1 + h2 - l2);
+ p = (oid *) Tloc(bn, 0);
+ o = (const oid *) Tloc(s, l1);
+ while (l1++ < h1)
+ *p++ = *o++;
+ o = (const oid *) Tloc(s, l2);
+ while (l2++ < h2)
+ *p++ = *o++;
+ bn->tkey = 1;
+ bn->tsorted = 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ bn->tnil = 0;
+ bn->tnonil = 1;
+ return CANDvirtualize(bn);
+}
+
+BAT *
+CANDslice(BAT *s, BUN l, BUN h)
+{
+ return CANDdoubleslice(s, 0,0, l, h);
+}
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -226,6 +226,13 @@ void BBPdump(void); /* never called: fo
__attribute__((__visibility__("hidden")));
__hidden BAT *CANDnewdense(oid first, oid last)
__attribute__((__visibility__("hidden")));
+__hidden BAT *CANDslice(BAT *s, BUN l, BUN h)
+ __attribute__((__visibility__("hidden")));
+__hidden BAT *CANDdoubleslice(BAT *s, BUN l1, BUN h1, BUN l2, BUN h2)
+ __attribute__((__visibility__("hidden")));
+__hidden BAT *CANDdoublerange(oid l1, oid h1, oid l2, oid h2)
+ __attribute__((__visibility__("hidden")));
+
__hidden void gdk_bbp_reset(void)
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -46,74 +46,6 @@ newempty(void)
return bn;
}
-static BAT *
-doublerange(oid l1, oid h1, oid l2, oid h2)
-{
- BAT *bn;
- oid *restrict p;
-
- assert(l1 <= h1);
- assert(l2 <= h2);
- assert(h1 <= l2);
- if (l1 == h1 || l2 == h2) {
- bn = COLnew(0, TYPE_void, h1 - l1 + h2 - l2, TRANSIENT);
- if (bn == NULL)
- return NULL;
- BATsetcount(bn, h1 - l1 + h2 - l2);
- BATtseqbase(bn, l1 == h1 ? l2 : l1);
- return bn;
- }
- bn = COLnew(0, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
- if (bn == NULL)
- return NULL;
- BATsetcount(bn, h1 - l1 + h2 - l2);
- p = (oid *) Tloc(bn, 0);
- while (l1 < h1)
- *p++ = l1++;
- while (l2 < h2)
- *p++ = l2++;
- bn->tkey = 1;
- bn->tsorted = 1;
- bn->trevsorted = BATcount(bn) <= 1;
- bn->tnil = 0;
- bn->tnonil = 1;
- return bn;
-}
-
-static BAT *
-doubleslice(BAT *b, BUN l1, BUN h1, BUN l2, BUN h2)
-{
- BAT *bn;
- oid *restrict p;
- const oid *restrict o;
-
- assert(l1 <= h1);
- assert(l2 <= h2);
- assert(h1 <= l2);
- assert(b->tsorted);
- assert(b->tkey);
- if (b->ttype == TYPE_void)
- return doublerange(l1 + b->tseqbase, h1 + b->tseqbase,
- l2 + b->tseqbase, h2 + b->tseqbase);
- bn = COLnew(0, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
- if (bn == NULL)
- return NULL;
- BATsetcount(bn, h1 - l1 + h2 - l2);
- p = (oid *) Tloc(bn, 0);
- o = (const oid *) Tloc(b, l1);
- while (l1++ < h1)
- *p++ = *o++;
- o = (const oid *) Tloc(b, l2);
- while (l2++ < h2)
- *p++ = *o++;
- bn->tkey = 1;
- bn->tsorted = 1;
- bn->trevsorted = BATcount(bn) <= 1;
- bn->tnil = 0;
- bn->tnonil = 1;
- return CANDvirtualize(bn);
-}
-
#define HASHloop_bound(bi, h, hb, v, lo, hi) \
for (hb = HASHget(h, HASHprobe((h), v)); \
hb != HASHnil(h); \
@@ -1359,7 +1291,7 @@ BATselect(BAT *b, BAT *s, const void *tl
oid o = b->hseqbase + BATcount(b);
BUN q = SORTfndfirst(s, &o);
BUN p = SORTfndfirst(s, &b->hseqbase);
- return BATslice(s, p, q);
+ return CANDslice(s, p, q);
} else {
return BATdense(0, b->hseqbase, BATcount(b));
}
@@ -1552,9 +1484,9 @@ BATselect(BAT *b, BAT *s, const void *tl
high = SORTfndfirst(s, &o);
o = b->hseqbase + b->batCount;
last = SORTfndfirst(s, &o);
- bn = doubleslice(s, first, low, high,
last);
+ bn = CANDdoubleslice(s, first, low,
high, last);
} else {
- bn = doublerange(first + b->hseqbase,
+ bn = CANDdoublerange(first +
b->hseqbase,
low + b->hseqbase,
high + b->hseqbase,
BATcount(b) +
b->hseqbase);
@@ -1576,9 +1508,9 @@ BATselect(BAT *b, BAT *s, const void *tl
high = SORTfndfirst(s, &o);
o = b->hseqbase;
first = SORTfndfirst(s, &o);
- bn = doubleslice(s, first, low, high,
last);
+ bn = CANDdoubleslice(s, first, low,
high, last);
} else {
- bn = doublerange(0 + b->hseqbase,
+ bn = CANDdoublerange(0 + b->hseqbase,
low + b->hseqbase,
high + b->hseqbase,
last + b->hseqbase);
@@ -1628,9 +1560,9 @@ BATselect(BAT *b, BAT *s, const void *tl
low = SORTfndfirst(s, &o);
o = (oid) high + b->hseqbase;
high = SORTfndfirst(s, &o);
- bn = doubleslice(s, 0, 0, low, high);
+ bn = CANDdoubleslice(s, 0, 0, low,
high);
} else {
- bn = doublerange(0, 0,
+ bn = CANDdoublerange(0, 0,
low + b->hseqbase,
high + b->hseqbase);
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list