Changeset: 02b58044ee9d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=02b58044ee9d
Modified Files:
        gdk/gdk.h
        gdk/gdk_orderidx.c
        gdk/gdk_search.c
        gdk/gdk_select.c
        monetdb5/modules/mal/orderidx.c
Branch: default
Log Message:

We don't need the MSK bit in the order index anymore.
It was used to save on an indirection during the scan at the end of
binary search, but we don't scan anymore since changeset bafd08bb1cf1.


diffs (truncated from 344 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -587,8 +587,6 @@ typedef size_t BUN;
 #else
 #define BUN_NONE ((BUN) LLONG_MAX)
 #endif
-#define BUN_MSK (~BUN_NONE)
-#define BUN_UNMSK BUN_NONE
 #define BUN_MAX (BUN_NONE - 1) /* maximum allowed size of a BAT */
 
 #define BUN2 2
diff --git a/gdk/gdk_orderidx.c b/gdk/gdk_orderidx.c
--- a/gdk/gdk_orderidx.c
+++ b/gdk/gdk_orderidx.c
@@ -10,7 +10,7 @@
 #include "gdk.h"
 #include "gdk_private.h"
 
-#define ORDERIDX_VERSION       ((oid) 1)
+#define ORDERIDX_VERSION       ((oid) 2)
 
 #ifdef PERSISTENTIDX
 struct idxsync {
@@ -205,22 +205,6 @@ BATorderidx(BAT *b, int stable)
        return GDK_SUCCEED;
 }
 
-#define UNARY_MERGE(TYPE)                                              \
-       do {                                                            \
-               TYPE *v = (TYPE *) Tloc(b, 0);                          \
-               if (p < q) {                                            \
-                       *mv++ = *p++;                                   \
-               }                                                       \
-               while (p < q) {                                         \
-                       *mv = *p++;                                     \
-                       if (v[*mv - b->hseqbase] != v[*(mv-1) - b->hseqbase]) { 
\
-                               *(mv-1) |= BUN_MSK;                     \
-                       }                                               \
-                       mv++;                                           \
-               }                                                       \
-               *(mv-1) |= BUN_MSK;                                     \
-       } while (0)
-
 #define BINARY_MERGE(TYPE)                                             \
        do {                                                            \
                TYPE *v = (TYPE *) Tloc(b, 0);                          \
@@ -242,34 +226,17 @@ BATorderidx(BAT *b, int stable)
                }                                                       \
                while (p0 < q0 && p1 < q1) {                            \
                        if (v[*p0 - b->hseqbase] <= v[*p1 - b->hseqbase]) { \
-                               *mv = *p0++;                            \
-                               if (v[*mv - b->hseqbase] != v[*(mv-1) - 
b->hseqbase]) { \
-                                       *(mv-1) |= BUN_MSK;             \
-                               }                                       \
-                               mv++;                                   \
+                               *mv++ = *p0++;                          \
                        } else {                                        \
-                               *mv = *p1++;                            \
-                               if (v[*mv - b->hseqbase] != v[*(mv-1) - 
b->hseqbase]) { \
-                                       *(mv-1) |= BUN_MSK;             \
-                               }                                       \
-                               mv++;                                   \
+                               *mv++ = *p1++;                          \
                        }                                               \
                }                                                       \
                while (p0 < q0) {                                       \
-                       *mv = *p0++;                                    \
-                       if (v[*mv - b->hseqbase] != v[*(mv-1) - b->hseqbase]) { 
\
-                               *(mv-1) |= BUN_MSK;                     \
-                       }                                               \
-                       mv++;                                           \
+                       *mv++ = *p0++;                                  \
                }                                                       \
                while (p1 < q1) {                                       \
-                       *mv = *p1++;                                    \
-                       if (v[*mv - b->hseqbase] != v[*(mv-1) - b->hseqbase]) { 
\
-                               *(mv-1) |= BUN_MSK;                     \
-                       }                                               \
-                       mv++;                                           \
+                       *mv++ = *p1++;                                  \
                }                                                       \
-               *(mv-1) |= BUN_MSK;                                     \
        } while(0)
 
 #define swap(X,Y,TMP)  (TMP)=(X);(X)=(Y);(Y)=(TMP)
@@ -329,11 +296,7 @@ BATorderidx(BAT *b, int stable)
                        HEAPIFY(0);                                     \
                }                                                       \
                while (n_ar > 1) {                                      \
-                       *mv = *(p[0])++;                                \
-                       if (v[*mv - b->hseqbase] != v[*(mv-1) - b->hseqbase]) { 
\
-                               *(mv-1) |= BUN_MSK;                     \
-                       }                                               \
-                       mv++;                                           \
+                       *mv++ = *(p[0])++;                              \
                        if (p[0] < q[0]) {                              \
                                minhp[0] = v[*p[0] - b->hseqbase];      \
                                HEAPIFY(0);                             \
@@ -346,13 +309,8 @@ BATorderidx(BAT *b, int stable)
                        }                                               \
                }                                                       \
                while (p[0] < q[0]) {                                   \
-                       *mv = *(p[0])++;                                \
-                       if (v[*mv - b->hseqbase] != v[*(mv-1) - b->hseqbase]) { 
\
-                               *(mv-1) |= BUN_MSK;                     \
-                       }                                               \
-                       mv++;                                           \
+                       *mv++ = *(p[0])++;                              \
                }                                                       \
-               *(mv-1) |= BUN_MSK;                                     \
                GDKfree(minhp);                                         \
        } while (0)
 
@@ -391,33 +349,13 @@ GDKmergeidx(BAT *b, BAT**a, int n_ar)
        *mv++ = (oid) BATcount(b);
 
        if (n_ar == 1) {
-               const oid *restrict p, *q;
                /* One oid order bat, nothing to merge */
                assert(BATcount(a[0]) == BATcount(b));
                assert((VIEWtparent(a[0]) == b->batCacheid ||
                        VIEWtparent(a[0]) == VIEWtparent(b)) &&
                       a[0]->torderidx);
-               p = (const oid *) a[0]->torderidx->base + ORDERIDXOFF;
-               q = p + BATcount(a[0]);
-               switch (ATOMstorage(b->ttype)) {
-               case TYPE_bte: UNARY_MERGE(bte); break;
-               case TYPE_sht: UNARY_MERGE(sht); break;
-               case TYPE_int: UNARY_MERGE(int); break;
-               case TYPE_lng: UNARY_MERGE(lng); break;
-#ifdef HAVE_HGE
-               case TYPE_hge: UNARY_MERGE(hge); break;
-#endif
-               case TYPE_flt: UNARY_MERGE(flt); break;
-               case TYPE_dbl: UNARY_MERGE(dbl); break;
-               case TYPE_str:
-               default:
-                       /* TODO: support strings, date, timestamps etc. */
-                       assert(0);
-                       HEAPfree(m, 1);
-                       GDKfree(m);
-                       MT_lock_unset(&GDKhashLock(b->batCacheid));
-                       return GDK_FAIL;
-               }
+               memcpy(mv, (const oid *) a[0]->torderidx->base + ORDERIDXOFF,
+                      BATcount(a[0]) * SIZEOF_OID);
        } else if (n_ar == 2) {
                /* sort merge with 1 comparison per BUN */
                const oid *restrict p0, *restrict p1, *q0, *q1;
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -66,31 +66,31 @@ binsearch_##TYPE(const oid *restrict ind
        if (ordering > 0) {                                             \
                if (indir) {                                            \
                        if (last > 0) {                                 \
-                               if ((x = vals[(indir[lo] & BUN_UNMSK) - 
offset]) > v) \
+                               if ((x = vals[indir[lo] - offset]) > v) \
                                        return lo;                      \
-                               if ((x = vals[(indir[hi] & BUN_UNMSK) - 
offset]) <= v) \
+                               if ((x = vals[indir[hi] - offset]) <= v) \
                                        return hi + 1;                  \
                                                                        \
                                /* loop invariant: */                   \
                                /* value@lo <= v < value@hi */          \
                                while (hi - lo > 1) {                   \
                                        mid = (hi + lo) / 2;            \
-                                       if (vals[(indir[mid] & BUN_UNMSK) - 
offset] > v) \
+                                       if (vals[indir[mid] - offset] > v) \
                                                hi = mid;               \
                                        else                            \
                                                lo = mid;               \
                                }                                       \
                        } else {                                        \
-                               if ((x = vals[(indir[lo] & BUN_UNMSK) - 
offset]) >= v) \
+                               if ((x = vals[indir[lo] - offset]) >= v) \
                                        return last == 0 || x == v ? lo : 
BUN_NONE; \
-                               if ((x = vals[(indir[hi] & BUN_UNMSK) - 
offset]) < v) \
+                               if ((x = vals[indir[hi] - offset]) < v) \
                                        return last == 0 ? hi + 1 : BUN_NONE; \
                                                                        \
                                /* loop invariant: */                   \
                                /* value@lo < v <= value@hi */          \
                                while (hi - lo > 1) {                   \
                                        mid = (hi + lo) / 2;            \
-                                       if (vals[(indir[mid] & BUN_UNMSK) - 
offset] >= v) \
+                                       if (vals[indir[mid] - offset] >= v) \
                                                hi = mid;               \
                                        else                            \
                                                lo = mid;               \
@@ -132,31 +132,31 @@ binsearch_##TYPE(const oid *restrict ind
        } else {                                                        \
                if (indir) {                                            \
                        if (last > 0) {                                 \
-                               if ((x = vals[(indir[lo] & BUN_UNMSK) - 
offset]) < v) \
+                               if ((x = vals[indir[lo] - offset]) < v) \
                                        return lo;                      \
-                               if ((x = vals[(indir[hi] & BUN_UNMSK) - 
offset]) >= v) \
+                               if ((x = vals[indir[hi] - offset]) >= v) \
                                        return hi + 1;                  \
                                                                        \
                                /* loop invariant: */                   \
                                /* value@lo >= v > value@hi */          \
                                while (hi - lo > 1) {                   \
                                        mid = (hi + lo) / 2;            \
-                                       if (vals[(indir[mid] & BUN_UNMSK) - 
offset] < v) \
+                                       if (vals[indir[mid] - offset] < v) \
                                                hi = mid;               \
                                        else                            \
                                                lo = mid;               \
                                }                                       \
                        } else {                                        \
-                               if ((x = vals[(indir[lo] & BUN_UNMSK) - 
offset]) <= v) \
+                               if ((x = vals[indir[lo] - offset]) <= v) \
                                        return last == 0 || x == v ? lo : 
BUN_NONE; \
-                               if ((x = vals[(indir[hi] & BUN_UNMSK) - 
offset]) > v) \
+                               if ((x = vals[indir[hi] - offset]) > v) \
                                        return last == 0 ? hi + 1 : BUN_NONE; \
                                                                        \
                                /* loop invariant: */                   \
                                /* value@lo > v >= value@hi */          \
                                while (hi - lo > 1) {                   \
                                        mid = (hi + lo) / 2;            \
-                                       if (vals[(indir[mid] & BUN_UNMSK) - 
offset] <= v) \
+                                       if (vals[indir[mid] - offset] <= v) \
                                                hi = mid;               \
                                        else                            \
                                                lo = mid;               \
@@ -196,7 +196,7 @@ binsearch_##TYPE(const oid *restrict ind
                        }                                               \
                }                                                       \
        }                                                               \
-       return last >= 0 || (indir ? vals[(indir[hi] & BUN_UNMSK) - offset] : 
vals[hi]) == v ? hi : BUN_NONE; \
+       return last >= 0 || (indir ? vals[indir[hi] - offset] : vals[hi]) == v 
? hi : BUN_NONE; \
 }
 
 BINSEARCHFUNC(bte)
@@ -261,21 +261,21 @@ binsearch(const oid *restrict indir, oid
        cmp = ATOMcompare(type);
 
        if (last > 0) {
-               if ((c = ordering * cmp(VALUE(indir ? (indir[lo] & BUN_UNMSK) - 
offset : lo), v)) > 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[lo] - offset : lo), 
v)) > 0)
                        return lo;
-               if ((c = ordering * cmp(VALUE(indir ? (indir[hi] & BUN_UNMSK) - 
offset : hi), v)) <= 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[hi] - offset : hi), 
v)) <= 0)
                        return hi + 1;
        } else if (last == 0) {
-               if ((c = ordering * cmp(VALUE(indir ? (indir[lo] & BUN_UNMSK) - 
offset : lo), v)) >= 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[lo] - offset : lo), 
v)) >= 0)
                        return lo;
-               if ((c = ordering * cmp(VALUE(indir ? (indir[hi] & BUN_UNMSK) - 
offset : hi), v)) < 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[hi] - offset : hi), 
v)) < 0)
                        return hi + 1;
        } else {
-               if ((c = ordering * cmp(VALUE(indir ? (indir[lo] & BUN_UNMSK) - 
offset : lo), v)) > 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[lo] - offset : lo), 
v)) > 0)
                        return BUN_NONE;
                if (c == 0)
                        return lo;
-               if ((c = ordering * cmp(VALUE(indir ? (indir[hi] & BUN_UNMSK) - 
offset : hi), v)) < 0)
+               if ((c = ordering * cmp(VALUE(indir ? indir[hi] - offset : hi), 
v)) < 0)
                        return BUN_NONE;
                if (c == 0)
                        return hi;
@@ -295,7 +295,7 @@ binsearch(const oid *restrict indir, oid
         * vars (in VALUE()) already, so we're beyond caring. */
        while (hi - lo > 1) {
                mid = (hi + lo) / 2;
-               if ((c = ordering * cmp(VALUE(indir ? (indir[mid] & BUN_UNMSK) 
- offset : mid), v)) > 0 ||
+               if ((c = ordering * cmp(VALUE(indir ? indir[mid] - offset : 
mid), v)) > 0 ||
                    (last <= 0 && c == 0))
                        hi = mid;
                else
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1627,8 +1627,8 @@ BATselect(BAT *b, BAT *s, const void *tl
                                rbn = (oid *) Tloc((bn), 0);
 
                                for (i = low; i < high; i++) {
-                                       if (vwl <= ((*rs)&BUN_UNMSK) && 
((*rs)&BUN_UNMSK) < vwh) {
-                                               *rbn++ = ((*rs)&BUN_UNMSK);
+                                       if (vwl <= *rs && *rs < vwh) {
+                                               *rbn++ = *rs;
                                                cnt++;
                                        }
                                        rs++;
@@ -2079,15 +2079,12 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                        high += l->hseqbase;
                        if (use_orderidx) {
                                const oid *ord;
-                               oid o;
                                ord = (const oid *) l->torderidx->base + 
ORDERIDXOFF;
 
                                if (sl) {
                                        assert(BATtdense(sl));
-                                       o = (oid) ((*(ord+low))&BUN_UNMSK);
-                                       ll = SORTfndfirst(sl, &o);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to