Changeset: 1b2d6f3d2635 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b2d6f3d2635
Modified Files:
gdk/gdk_group.c
gdk/gdk_join.c
gdk/gdk_search.c
gdk/gdk_select.c
gdk/gdk_unique.c
Branch: Jul2015
Log Message:
Do not create hash on parent if BAT has hash or parent is not persistent.
diffs (117 lines):
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -778,7 +778,7 @@ BATgroup_internal(BAT **groups, BAT **ex
e ? BATgetId(e) : "NULL", e ? BATcount(e) : 0,
h ? BATgetId(h) : "NULL", h ? BATcount(h) : 0,
subsorted);
- if ((parent = VIEWtparent(b)) != 0) {
+ if (b->T->hash == NULL && (parent = VIEWtparent(b)) != 0) {
/* b is a view on another bat (b2 for now).
* calculate the bounds [lo, hi) in the parent
* that b uses */
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -1839,12 +1839,26 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
return GDK_SUCCEED;
}
+ rl = BUNfirst(r);
if (VIEWtparent(r)) {
BAT *b = BBPdescriptor(-VIEWtparent(r));
- rl = (BUN) ((r->T->heap.base - b->T->heap.base) >> r->T->shift)
+ BUNfirst(r);
- r = b;
- } else {
- rl = BUNfirst(r);
+ if (b->batPersistence == PERSISTENT || BATcheckhash(b)) {
+ /* only use parent's hash if it is persistent
+ * or already has a hash */
+ ALGODEBUG
+ fprintf(stderr, "#hashjoin(%s#"BUNFMT"): "
+ "using parent(%s#"BUNFMT") for hash\n",
+ BATgetId(r), BATcount(r),
+ BATgetId(b), BATcount(b));
+ rl = (BUN) ((r->T->heap.base - b->T->heap.base) >>
r->T->shift) + BUNfirst(r);
+ r = b;
+ } else {
+ ALGODEBUG
+ fprintf(stderr, "#hashjoin(%s#"BUNFMT"): not "
+ "using parent(%s#"BUNFMT") for hash\n",
+ BATgetId(r), BATcount(r),
+ BATgetId(b), BATcount(b));
+ }
}
rh = rl + rend;
rl += rstart;
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -315,17 +315,6 @@ BAThash(BAT *b, BUN masksize)
BAT *o = NULL;
lng t0 = 0, t1 = 0;
- if (VIEWtparent(b)) {
- bat p = -VIEWtparent(b);
- o = b;
- b = BATdescriptor(p);
- assert(b != NULL);
- if (!ALIGNsynced(o, b) || BUNfirst(o) != BUNfirst(b)) {
- BBPunfix(b->batCacheid);
- b = o;
- o = NULL;
- }
- }
if (BATcheckhash(b)) {
if (o != NULL) {
o->T->hash = b->T->hash;
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -174,14 +174,28 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn,
assert(bn->ttype == TYPE_oid);
assert(BAThdense(b));
seq = b->hseqbase;
+ l = BUNfirst(b);
+ h = BUNlast(b);
if (VIEWtparent(b)) {
BAT *b2 = BBPdescriptor(-VIEWtparent(b));
- l = (BUN) ((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);
+ if (b2->batPersistence == PERSISTENT || BATcheckhash(b2)) {
+ /* only use parent's hash if it is persistent
+ * or already has a hash */
+ ALGODEBUG
+ fprintf(stderr, "#hashselect(%s#"BUNFMT"): "
+ "using parent(%s#"BUNFMT") for hash\n",
+ BATgetId(b), BATcount(b),
+ BATgetId(b2), BATcount(b2));
+ l = (BUN) ((b->T->heap.base - b2->T->heap.base) >>
b->T->shift) + BUNfirst(b);
+ h = l + BATcount(b);
+ b = b2;
+ } else {
+ ALGODEBUG
+ fprintf(stderr, "#hashselect(%s#"BUNFMT"): not "
+ "using parent(%s#"BUNFMT") for hash\n",
+ BATgetId(b), BATcount(b),
+ BATgetId(b2), BATcount(b2));
+ }
}
if (s && BATtdense(s)) {
/* no need for binary search in s, we just adjust the
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -257,7 +257,7 @@ BATsubunique(BAT *b, BAT *s)
s ? BATgetId(s) : "NULL",
s ? BATcount(s) : 0);
seq = b->hseqbase;
- if ((parent = VIEWtparent(b)) != 0) {
+ if (b->T->hash == NULL && (parent = VIEWtparent(b)) != 0) {
BAT *b2 = BBPdescriptor(-parent);
lo = (BUN) ((b->T->heap.base - b2->T->heap.base) >>
b->T->shift) + BUNfirst(b);
b = b2;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list