Changeset: f51ee5727b6f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f51ee5727b6f
Modified Files:
gdk/gdk_batop.c
Branch: Oct2014
Log Message:
Try harder to return a void-void bat for candidate lists.
diffs (165 lines):
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1884,6 +1884,21 @@ BATcount_no_nil(BAT *b)
return cnt;
}
+static BAT *
+newdensecand(oid first, oid last)
+{
+ BAT *bn;
+
+ if ((bn = BATnew(TYPE_void, TYPE_void, 0, TRANSIENT)) == NULL)
+ return NULL;
+ if (last < first)
+ first = last = 0; /* empty range */
+ BATsetcount(bn, last - first + 1);
+ BATseqbase(bn, 0);
+ BATseqbase(BATmirror(bn), first);
+ return bn;
+}
+
/* merge two candidate lists and produce a new one
*
* candidate lists are VOID-headed BATs with an OID tail which is
@@ -1913,10 +1928,10 @@ BATmergecand(BAT *a, BAT *b)
assert(b->T->nonil);
/* we can return a if b is empty (and v.v.) */
- if ( BATcount(a) == 0){
+ if (BATcount(a) == 0) {
return BATcopy(b, b->htype, b->ttype, 0, TRANSIENT);
}
- if ( BATcount(b) == 0){
+ if (BATcount(b) == 0) {
return BATcopy(a, a->htype, a->ttype, 0, TRANSIENT);
}
/* we can return a if a fully covers b (and v.v) */
@@ -1928,11 +1943,24 @@ BATmergecand(BAT *a, BAT *b)
bl = *(oid*) BUNtail(bi, BUNlast(b) - 1);
ad = (af + BATcount(a) - 1 == al); /* i.e., dense */
bd = (bf + BATcount(b) - 1 == bl); /* i.e., dense */
+ if (ad && bd) {
+ /* both are dense */
+ if (af <= bf && bf <= al + 1) {
+ /* partial overlap starting with a, or b is
+ * smack bang after a */
+ return newdensecand(af, al < bl ? bl : al);
+ }
+ if (bf <= af && af <= bl + 1) {
+ /* partial overlap starting with b, or a is
+ * smack bang after b */
+ return newdensecand(bf, al < bl ? bl : al);
+ }
+ }
if (ad && af <= bf && al >= bl) {
- return BATcopy(a, a->htype, a->ttype, 0, TRANSIENT);
+ return newdensecand(af, al);
}
if (bd && bf <= af && bl >= al) {
- return BATcopy(b, b->htype, b->ttype, 0, TRANSIENT);
+ return newdensecand(bf, bl);
}
bn = BATnew(TYPE_void, TYPE_oid, BATcount(a) + BATcount(b), TRANSIENT);
@@ -1997,11 +2025,22 @@ BATmergecand(BAT *a, BAT *b)
/* properties */
BATsetcount(bn, (BUN) (p - (oid *) Tloc(bn, BUNfirst(bn))));
BATseqbase(bn, 0);
- bn->trevsorted = 0;
+ bn->trevsorted = BATcount(bn) <= 1;
bn->tsorted = 1;
bn->tkey = 1;
bn->T->nil = 0;
bn->T->nonil = 1;
+ af = * (const oid *) Tloc(bn, BUNfirst(bn));
+ if (af + BATcount(bn) - 1 == *(const oid *) Tloc(bn, BUNlast(bn) - 1)) {
+ /* new bat is in fact dense, replace by void column */
+ bn->tseqbase = af;
+ bn->tdense = 1;
+ HEAPfree(&bn->T->heap);
+ bn->ttype = TYPE_void;
+ bn->tvarsized = 1;
+ bn->T->width = 0;
+ bn->T->shift = 0;
+ }
return bn;
}
@@ -2015,7 +2054,9 @@ BATintersectcand(BAT *a, BAT *b)
{
BAT *bn;
const oid *ap, *bp, *ape, *bpe;
- oid *p, i;
+ oid *p;
+ oid af, al, bf, bl;
+ BATiter ai, bi;
BATcheck(a, "BATintersectcand");
BATcheck(b, "BATintersectcand");
@@ -2031,30 +2072,19 @@ BATintersectcand(BAT *a, BAT *b)
assert(b->T->nonil);
if (BATcount(a) == 0 || BATcount(b) == 0) {
- bn = BATnew(TYPE_void, TYPE_void, 0, TRANSIENT);
- if (bn) {
- BATseqbase(bn, 0);
- BATseqbase(BATmirror(bn), 0);
- }
- return bn;
+ return newdensecand(0, 0);
}
- if (a->ttype == TYPE_void && b->ttype == TYPE_void) {
+ ai = bat_iterator(a);
+ bi = bat_iterator(b);
+ af = *(oid*) BUNtail(ai, BUNfirst(a));
+ bf = *(oid*) BUNtail(bi, BUNfirst(b));
+ al = *(oid*) BUNtail(ai, BUNlast(a) - 1);
+ bl = *(oid*) BUNtail(bi, BUNlast(b) - 1);
+
+ if ((af + BATcount(a) - 1 == al) && (bf + BATcount(b) - 1 == bl)) {
/* both lists are VOID */
- bn = BATnew(TYPE_void, TYPE_void, 0, TRANSIENT);
- if (bn == NULL)
- return NULL;
- i = MAX(a->tseqbase, b->tseqbase);
- if (a->tseqbase + BATcount(a) <= b->tseqbase ||
- b->tseqbase + BATcount(b) <= a->tseqbase) {
- /* no overlap */
- BATsetcount(bn, 0);
- } else {
- BATsetcount(bn, MIN(a->tseqbase + BATcount(a) - i,
- b->tseqbase + BATcount(b) - i));
- }
- BATseqbase(BATmirror(bn), i);
- return bn;
+ return newdensecand(MAX(af, bf), MIN(al, bl));
}
bn = BATnew(TYPE_void, TYPE_oid, MIN(BATcount(a), BATcount(b)),
TRANSIENT);
@@ -2096,10 +2126,22 @@ BATintersectcand(BAT *a, BAT *b)
/* properties */
BATsetcount(bn, (BUN) (p - (oid *) Tloc(bn, BUNfirst(bn))));
BATseqbase(bn, 0);
- bn->trevsorted = 0;
+ bn->trevsorted = BATcount(bn) <= 1;
bn->tsorted = 1;
bn->tkey = 1;
bn->T->nil = 0;
bn->T->nonil = 1;
+ if (BATcount(bn) == 0 ||
+ (af = * (const oid *) Tloc(bn, BUNfirst(bn))) + BATcount(bn) - 1 ==
+ * (const oid *) Tloc(bn, BUNlast(bn) - 1)) {
+ /* new bat is in fact dense, replace by void column */
+ bn->tseqbase = BATcount(bn) == 0 ? 0 : af;
+ bn->tdense = 1;
+ HEAPfree(&bn->T->heap);
+ bn->ttype = TYPE_void;
+ bn->tvarsized = 1;
+ bn->T->width = 0;
+ bn->T->shift = 0;
+ }
return bn;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list