Changeset: caa27e234528 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=caa27e234528
Modified Files:
gdk/gdk_select.c
Branch: Oct2014
Log Message:
Cleanup: get rid of too generic BATslice2.
diffs (185 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -86,54 +86,70 @@ newempty(const char *func)
}
static BAT *
-BATslice2(BAT *b, BUN l1, BUN h1, BUN l2, BUN h2)
+doublerange(oid l1, oid h1, oid l2, oid h2)
{
- BUN p, q;
BAT *bn;
- BATiter bi = bat_iterator(b);
+ oid *p;
- BATcheck(b, "BATslice");
- if (h2 > BATcount(b))
- h2 = BATcount(b);
- if (h1 < l1)
- h1 = l1;
- if (h2 < l2)
- h2 = l2;
- l1 += BUNfirst(b);
- l2 += BUNfirst(b);
- h1 += BUNfirst(b);
- h2 += BUNfirst(b);
+ assert(l1 <= h1);
+ assert(l2 <= h2);
+ assert(h1 <= l2);
+ if (l1 == h1 || l2 == h2) {
+ bn = BATnew(TYPE_void, TYPE_void, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
+ return NULL;
+ BATsetcount(bn, h1 - l1 + h2 - l2);
+ BATseqbase(bn, 0);
+ BATseqbase(BATmirror(bn), l1 == h1 ? l2 : l1);
+ return bn;
+ }
+ bn = BATnew(TYPE_void, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
+ return NULL;
+ BATsetcount(bn, h1 - l1 + h2 - l2);
+ BATseqbase(bn, 0);
+ p = (oid *) Tloc(bn, BUNfirst(bn));
+ while (l1 < h1)
+ *p++ = l1++;
+ while (l2 < h2)
+ *p++ = l2++;
+ bn->tkey = 1;
+ bn->tsorted = 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ return bn;
+}
- if (l1 > BUN_MAX || l2 > BUN_MAX || h1 > BUN_MAX || h2 > BUN_MAX) {
- GDKerror("BATslice2: boundary out of range\n");
+static BAT *
+doubleslice(BAT *b, BUN l1, BUN h1, BUN l2, BUN h2)
+{
+ BAT *bn;
+ oid *p;
+ const oid *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 = BATnew(TYPE_void, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+ if (bn == NULL)
return NULL;
- }
-
- bn = BATnew(TYPE_void, ATOMtype(b->htype), h1 - l1 + h2 - l2,
TRANSIENT);
- if (bn == NULL)
- return bn;
- for (p = (BUN) l1, q = (BUN) h1; p < q; p++) {
- bunfastapp(bn, BUNhead(bi, p));
- }
- for (p = (BUN) l2, q = (BUN) h2; p < q; p++) {
- bunfastapp(bn, BUNhead(bi, p));
- }
+ BATsetcount(bn, h1 - l1 + h2 - l2);
BATseqbase(bn, 0);
- bn->tsorted = BAThordered(b);
- bn->trevsorted = BAThrevordered(b);
- BATkey(BATmirror(bn), BAThkey(b));
- bn->T->nonil = b->H->nonil;
- bn->T->nil = 0;
- if (bn->tkey && bn->ttype == TYPE_oid) {
- if (BATcount(bn) == 0) {
- bn->tdense = TRUE;
- BATseqbase(BATmirror(bn), 0);
- }
- }
- return bn;
- bunins_failed:
- BBPreclaim(bn);
- return NULL;
+ p = (oid *) Tloc(bn, BUNfirst(bn));
+ o = (const oid *) Tloc(b, BUNfirst(b) + l1);
+ while (l1++ < h1)
+ *p++ = *o++;
+ o = (const oid *) Tloc(b, BUNfirst(b) + l2);
+ while (l2++ < h2)
+ *p++ = *o++;
+ bn->tkey = 1;
+ bn->tsorted = 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ return virtualize(bn);
}
static BAT *
@@ -1150,7 +1166,6 @@ BATsubselect(BAT *b, BAT *s, const void
}
if (b->tsorted || b->trevsorted) {
- BAT *v;
BUN low = 0;
BUN high = b->batCount;
@@ -1181,6 +1196,8 @@ BATsubselect(BAT *b, BAT *s, const void
l = 0;
if ((BUN) l > low)
low = (BUN) l;
+ if (low > high)
+ low = high;
} else if (b->tsorted) {
ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
",s=%s,anti=%d): sorted\n",
@@ -1238,11 +1255,13 @@ BATsubselect(BAT *b, BAT *s, const void
low = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) high + b->H->seq;
high = SORTfndfirst(s, &o) -
BUNfirst(s);
- v = VIEWhead(BATmirror(s));
+ bn = doubleslice(s, first, low, high,
BATcount(s));
} else {
- v = VIEWhead(b); /* [oid,nil] */
+ bn = doublerange(first + b->hseqbase,
+ low + b->hseqbase,
+ high + b->hseqbase,
+ BATcount(b) +
b->hseqbase);
}
- bn = BATslice2(v, first, low, high,
BATcount(v));
} else {
BUN last = SORTfndlast(b, nil) - BUNfirst(b);
/* match: [0..low) + [high..last) */
@@ -1253,11 +1272,13 @@ BATsubselect(BAT *b, BAT *s, const void
low = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) high + b->H->seq;
high = SORTfndfirst(s, &o) -
BUNfirst(s);
- v = VIEWhead(BATmirror(s));
+ bn = doubleslice(s, 0, low, high, last);
} else {
- v = VIEWhead(b); /* [oid,nil] */
+ bn = doublerange(0 + b->hseqbase,
+ low + b->hseqbase,
+ high + b->hseqbase,
+ last + b->hseqbase);
}
- bn = BATslice2(v, 0, low, high, last);
}
} else {
/* match: [low..high) */
@@ -1266,13 +1287,13 @@ BATsubselect(BAT *b, BAT *s, const void
low = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) high + b->H->seq;
high = SORTfndfirst(s, &o) - BUNfirst(s);
- v = VIEWhead(BATmirror(s));
+ bn = doubleslice(s, 0, 0, low, high);
} else {
- v = VIEWhead(b); /* [oid,nil] */
+ bn = doublerange(0, 0,
+ low + b->hseqbase,
+ high + b->hseqbase);
}
- bn = BATmirror(BATslice(v, low, high));
}
- BBPunfix(v->batCacheid);
bn->hseqbase = 0;
bn->hkey = 1;
bn->hsorted = 1;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list