Changeset: 2388be79d03e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2388be79d03e
Modified Files:
        gdk/gdk_join.c
Branch: default
Log Message:

Slightly type-expand hashjoin.
For now, only the most common version is type-expanded.


diffs (160 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -1166,6 +1166,23 @@ binsearchcand(const oid *cand, BUN lo, B
        return cand[lo] == v;
 }
 
+#define HASHLOOPBODY()                                                 \
+       do {                                                            \
+               if (BUNlast(r1) == BATcapacity(r1)) {                   \
+                       newcap = BATgrows(r1);                          \
+                       BATsetcount(r1, BATcount(r1));                  \
+                       BATsetcount(r2, BATcount(r2));                  \
+                       r1 = BATextend(r1, newcap);                     \
+                       r2 = BATextend(r2, newcap);                     \
+                       if (r1 == NULL || r2 == NULL)                   \
+                               goto bailout;                           \
+                       assert(BATcapacity(r1) == BATcapacity(r2));     \
+               }                                                       \
+               APPEND(r1, lo);                                         \
+               APPEND(r2, ro);                                         \
+               nr++;                                                   \
+       } while (0)
+
 static gdk_return
 hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr, int nil_matches, 
int nil_on_miss, int semi, int must_match)
 {
@@ -1284,19 +1301,7 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                                        ro = (oid) (rb + rbun2oid);
                                        if (!binsearchcand(rcand, 0, nrcand, 
ro))
                                                continue;
-                                       if (BUNlast(r1) == BATcapacity(r1)) {
-                                               newcap = BATgrows(r1);
-                                               BATsetcount(r1, BATcount(r1));
-                                               BATsetcount(r2, BATcount(r2));
-                                               r1 = BATextend(r1, newcap);
-                                               r2 = BATextend(r2, newcap);
-                                               if (r1 == NULL || r2 == NULL)
-                                                       goto bailout;
-                                               assert(BATcapacity(r1) == 
BATcapacity(r2));
-                                       }
-                                       APPEND(r1, lo);
-                                       APPEND(r2, ro);
-                                       nr++;
+                                       HASHLOOPBODY();
                                        if (semi)
                                                break;
                                }
@@ -1305,20 +1310,8 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                                        rb0 = rb - BUNfirst(r); /* zero-based */
                                        if (rb0 < rstart || rb0 >= rend)
                                                continue;
-                                       if (BUNlast(r1) == BATcapacity(r1)) {
-                                               newcap = BATgrows(r1);
-                                               BATsetcount(r1, BATcount(r1));
-                                               BATsetcount(r2, BATcount(r2));
-                                               r1 = BATextend(r1, newcap);
-                                               r2 = BATextend(r2, newcap);
-                                               if (r1 == NULL || r2 == NULL)
-                                                       goto bailout;
-                                               assert(BATcapacity(r1) == 
BATcapacity(r2));
-                                       }
                                        ro = (oid) (rb + rbun2oid);
-                                       APPEND(r1, lo);
-                                       APPEND(r2, ro);
-                                       nr++;
+                                       HASHLOOPBODY();
                                        if (semi)
                                                break;
                                }
@@ -1383,43 +1376,57 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
                                        ro = (oid) (rb + rbun2oid);
                                        if (!binsearchcand(rcand, 0, nrcand, 
ro))
                                                continue;
-                                       if (BUNlast(r1) == BATcapacity(r1)) {
-                                               newcap = BATgrows(r1);
-                                               BATsetcount(r1, BATcount(r1));
-                                               BATsetcount(r2, BATcount(r2));
-                                               r1 = BATextend(r1, newcap);
-                                               r2 = BATextend(r2, newcap);
-                                               if (r1 == NULL || r2 == NULL)
-                                                       goto bailout;
-                                               assert(BATcapacity(r1) == 
BATcapacity(r2));
-                                       }
-                                       APPEND(r1, lo);
-                                       APPEND(r2, ro);
-                                       nr++;
+                                       HASHLOOPBODY();
                                        if (semi)
                                                break;
                                }
                        } else {
-                               HASHloop(ri, r->H->hash, rb, v) {
-                                       rb0 = rb - BUNfirst(r); /* zero-based */
-                                       if (rb0 < rstart || rb0 >= rend)
-                                               continue;
-                                       if (BUNlast(r1) == BATcapacity(r1)) {
-                                               newcap = BATgrows(r1);
-                                               BATsetcount(r1, BATcount(r1));
-                                               BATsetcount(r2, BATcount(r2));
-                                               r1 = BATextend(r1, newcap);
-                                               r2 = BATextend(r2, newcap);
-                                               if (r1 == NULL || r2 == NULL)
-                                                       goto bailout;
-                                               assert(BATcapacity(r1) == 
BATcapacity(r2));
+                               switch (r->htype) {
+                               case TYPE_int:
+#if SIZEOF_OID == SIZEOF_INT
+                               case TYPE_oid:
+#endif
+#if SIZEOF_WRD == SIZEOF_INT
+                               case TYPE_wrd:
+#endif
+                                       HASHloop_int(ri, r->H->hash, rb, v) {
+                                               rb0 = rb - BUNfirst(r); /* 
zero-based */
+                                               if (rb0 < rstart || rb0 >= rend)
+                                                       continue;
+                                               ro = (oid) (rb + rbun2oid);
+                                               HASHLOOPBODY();
+                                               if (semi)
+                                                       break;
                                        }
-                                       ro = (oid) (rb + rbun2oid);
-                                       APPEND(r1, lo);
-                                       APPEND(r2, ro);
-                                       nr++;
-                                       if (semi)
-                                               break;
+                                       break;
+                               case TYPE_lng:
+#if SIZEOF_OID == SIZEOF_LNG
+                               case TYPE_oid:
+#endif
+#if SIZEOF_WRD == SIZEOF_LNG
+                               case TYPE_wrd:
+#endif
+                                       HASHloop_lng(ri, r->H->hash, rb, v) {
+                                               rb0 = rb - BUNfirst(r); /* 
zero-based */
+                                               if (rb0 < rstart || rb0 >= rend)
+                                                       continue;
+                                               ro = (oid) (rb + rbun2oid);
+                                               HASHLOOPBODY();
+                                               if (semi)
+                                                       break;
+                                       }
+                                       break;
+                               default:
+                                       HASHloop(ri, r->H->hash, rb, v) {
+                                               rb0 = rb - BUNfirst(r); /* 
zero-based */
+                                               if (rb0 < rstart || rb0 >= rend)
+                                                       continue;
+                                               ro = (oid) (rb + rbun2oid);
+                                               HASHLOOPBODY();
+                                               if (semi)
+                                                       break;
+                                       }
+                                       break;
                                }
                        }
                        if (nr == 0) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to