Changeset: 03d1f4af553c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=03d1f4af553c
Modified Files:
        gdk/gdk_join.c
Branch: linear-hashing
Log Message:

Delegate to leftjoin if we don't want right output.


diffs (94 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3610,6 +3610,11 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
 
        ALGODEBUG t0 = GDKusec();
 
+       if (r2p == NULL)
+               return leftjoin(r1p, NULL, l, r, sl, sr, nil_matches,
+                               false, false, false, false, estimate,
+                               __func__, t0);
+
        if ((parent = VIEWtparent(l)) != 0) {
                BAT *b = BBPdescriptor(parent);
                if (l->hseqbase == b->hseqbase &&
@@ -3627,9 +3632,8 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
        rcnt = canditer_init(&rci, r, sr);
 
        *r1p = NULL;
-       if (r2p) {
-               *r2p = NULL;
-       }
+       *r2p = NULL;
+
        if (joinparamcheck(l, r, NULL, sl, sr, __func__) != GDK_SUCCEED)
                return GDK_FAIL;
 
@@ -3655,7 +3659,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                /* single value to join, use select */
                return selectjoin(r1p, r2p, l, r, sl, sr,
                                  &lci, nil_matches, t0, false, __func__);
-       } else if (r2p != NULL && (rcnt == 1 || (BATordered(r) && 
BATordered_rev(r)) || (r->ttype == TYPE_void && is_oid_nil(r->tseqbase)))) {
+       } else if (rcnt == 1 || (BATordered(r) && BATordered_rev(r)) || 
(r->ttype == TYPE_void && is_oid_nil(r->tseqbase))) {
                /* single value to join, use select */
                return selectjoin(r2p, r1p, r, l, sr, sl,
                                  &rci, nil_matches, t0, true, __func__);
@@ -3663,7 +3667,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                /* use special implementation for dense right-hand side */
                return mergejoin_void(r1p, r2p, l, r, sl, sr, &lci, &rci,
                                      false, false, t0, false, __func__);
-       } else if (r2p && BATtdense(l) && lci.tpe == cand_dense) {
+       } else if (BATtdense(l) && lci.tpe == cand_dense) {
                /* use special implementation for dense right-hand side */
                return mergejoin_void(r2p, r1p, r, l, sr, sl, &rci, &lci,
                                      false, false, t0, true, __func__);
@@ -3719,16 +3723,16 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
        if (lhash && rhash) {
                if (lcnt == lslots && rcnt == rslots) {
                        /* both perfect hashes, smallest on right */
-                       swap = r2p && lcnt < rcnt;
-               } else if (r2p && lcnt == lslots) {
+                       swap = lcnt < rcnt;
+               } else if (lcnt == lslots) {
                        /* left is perfect (right isn't): swap */
                        swap = true;
                } else if (rcnt != rslots) {
                        /* neither is perfect, shortest chains on right */
-                       swap = r2p && lcnt / lslots < rcnt / rslots;
+                       swap = lcnt / lslots < rcnt / rslots;
                } /* else: right is perfect */
                reason = "both have hash";
-       } else if (r2p && lhash) {
+       } else if (lhash) {
                /* only left has hash, swap */
                swap = true;
                reason = "left has hash";
@@ -3736,8 +3740,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                /* only right has hash, don't swap */
                swap = false;
                reason = "right has hash";
-       } else if (r2p &&
-                  (BATordered(l) || BATordered_rev(l)) &&
+       } else if ((BATordered(l) || BATordered_rev(l)) &&
                   (BATtvoid(l) || rcnt < 1024 || MIN(lsize, rsize) > 
mem_size)) {
                /* only left is sorted, swap; but only if right is
                 * "large" and the smaller of the two isn't too large
@@ -3755,7 +3758,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                return mergejoin(r1p, r2p, l, r, sl, sr, &lci, &rci,
                                 nil_matches, false, false, false, false,
                                 estimate, t0, false, __func__);
-       } else if (r2p && !l->batTransient && r->batTransient) {
+       } else if (!l->batTransient && r->batTransient) {
                /* l is persistent and r is not, create hash on l
                 * since it may be reused */
                swap = true;
@@ -3765,7 +3768,7 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                 * since it may be reused */
                /* nothing */;
                reason = "right is persistent";
-       } else if (r2p && lcnt < rcnt) {
+       } else if (lcnt < rcnt) {
                /* no hashes, not sorted, create hash on smallest BAT */
                swap = true;
                reason = "left is smaller";
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to