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
