Changeset: d1f3b2ad9a4c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/d1f3b2ad9a4c Modified Files: monetdb5/modules/atoms/str.c monetdb5/modules/mal/txtsim.c Branch: txtsim-imp Log Message:
Strimps filtering the batstr_join_loop.
diffs (truncated from 487 to 300 lines):
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -5217,85 +5217,107 @@ STRcontainsselect(bat *ret, const bat *b
"str.containsselect");
}
-#define APPEND(b, o) (((oid *) b->theap->base)[b->batCount++] = (o))
-#define VALUE(s, x) (s##vars + VarHeapVal(s##vals, (x), s##i.width))
+#define APPEND(b, o) (((oid *) b->theap->base)[b->batCount++] = (o))
+#define VALUE(s, x) (s##vars + VarHeapVal(s##vals, (x), s##i.width))
+
+#define set_empty_bat_props(B) \
+ do {
\
+ B->tnil = false;
\
+ B->tnonil = true;
\
+ B->tkey = true; \
+ B->tsorted = true;
\
+ B->trevsorted = true; \
+ B->tseqbase = 0;
\
+ } while (0)
/* nested loop implementation for batstr joins */
-#define batstr_join_loop(STRCMP, STR_LEN)
\
+#define batstr_join_loop(STRCMP, STR_LEN, WITH_STRIMPS)
\
do {
\
- for (BUN ridx = 0; ridx < rci.ncand; ridx++) {
\
- GDK_CHECK_TIMEOUT(timeoffset, counter,
\
- GOTO_LABEL_TIMEOUT_HANDLER(bailout));
\
- ro = canditer_next(&rci);
\
- vr = VALUE(r, ro - rbase);
\
- rlen = STR_LEN;
\
- nl = 0;
\
- canditer_reset(&lci);
\
- for (BUN lidx = 0; lidx < lci.ncand; lidx++) {
\
- lo = canditer_next(&lci);
\
- vl = VALUE(l, lo - lbase);
\
- if (strNil(vl)) {
\
- continue;
\
- } else if (!(STRCMP)) {
\
- continue;
\
+ for (BUN ridx = 0; ridx < rci.ncand; ridx++) {
\
+ GDK_CHECK_TIMEOUT(timeoffset, counter,
GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \
+ ro = canditer_next(&rci);
\
+ vr = VALUE(r, ro - rbase);
\
+ rlen = str_strlen(vr);
\
+ nl = 0;
\
+ canditer_reset(&lci);
\
+ if (with_strimps) {
\
+ BAT *tmp_sl = STRMPfilter(l, sl, vr, anti);
\
+ if (tmp_sl) {
\
+ old_sl = sl;
\
+ sl = tmp_sl;
\
+ }
\
+ }
\
+ for (BUN lidx = 0; lidx < lci.ncand; lidx++) {
\
+ lo = canditer_next(&lci);
\
+ vl = VALUE(l, lo - lbase);
\
+ if (strNil(vl)) {
\
+ continue;
\
+ } else if (!(str_cmp(vl, vr, rlen) != 0)) {
\
+ continue;
\
+ }
\
+ if (BATcount(r1) == BATcapacity(r1)) {
\
+ newcap = BATgrows(r1);
\
+ BATsetcount(r1, BATcount(r1));
\
+ if (r2)
\
+ BATsetcount(r2, BATcount(r2));
\
+ if (BATextend(r1, newcap) != GDK_SUCCEED || (r2
&& BATextend(r2, newcap) != GDK_SUCCEED)) { \
+ msg = createException(MAL, "str.%s",
fname, SQLSTATE(HY013) MAL_MALLOC_FAIL); \
+ goto bailout;
\
}
\
- if (BATcount(r1) == BATcapacity(r1)) {
\
- newcap = BATgrows(r1);
\
- BATsetcount(r1, BATcount(r1));
\
+ assert(!r2 || BATcapacity(r1) ==
BATcapacity(r2)); \
+ }
\
+ if (BATcount(r1) > 0) {
\
+ if (lastl + 1 != lo)
\
+ r1->tseqbase = oid_nil;
\
+ if (nl == 0) {
\
if (r2)
\
- BATsetcount(r2, BATcount(r2));
\
- if (BATextend(r1, newcap) !=
GDK_SUCCEED || (r2 && BATextend(r2, newcap) != GDK_SUCCEED)) { \
- msg = createException(MAL,
"pcre.join", SQLSTATE(HY013) MAL_MALLOC_FAIL); \
- goto bailout;
\
- }
\
- assert(!r2 || BATcapacity(r1) ==
BATcapacity(r2)); \
- }
\
- if (BATcount(r1) > 0) {
\
- if (lastl + 1 != lo)
\
- r1->tseqbase = oid_nil;
\
- if (nl == 0) {
\
- if (r2)
\
- r2->trevsorted = false;
\
- if (lastl > lo) {
\
- r1->tsorted = false;
\
- r1->tkey = false;
\
- } else if (lastl < lo) {
\
- r1->trevsorted = false;
\
- } else {
\
- r1->tkey = false;
\
- }
\
+ r2->trevsorted = false;
\
+ if (lastl > lo) {
\
+ r1->tsorted = false;
\
+ r1->tkey = false;
\
+ } else if (lastl < lo) {
\
+ r1->trevsorted = false;
\
+ } else {
\
+ r1->tkey = false;
\
}
\
}
\
- APPEND(r1, lo);
\
- if (r2)
\
- APPEND(r2, ro);
\
- lastl = lo;
\
- nl++;
\
}
\
- if (r2) {
\
- if (nl > 1) {
\
- r2->tkey = false;
\
- r2->tseqbase = oid_nil;
\
- r1->trevsorted = false;
\
- } else if (nl == 0) {
\
- rskipped = BATcount(r2) > 0;
\
- } else if (rskipped) {
\
- r2->tseqbase = oid_nil;
\
- }
\
- } else if (nl > 1) {
\
+ APPEND(r1, lo);
\
+ if (r2)
\
+ APPEND(r2, ro);
\
+ lastl = lo;
\
+ nl++;
\
+ }
\
+ if (r2) {
\
+ if (nl > 1) {
\
+ r2->tkey = false;
\
+ r2->tseqbase = oid_nil;
\
r1->trevsorted = false;
\
+ } else if (nl == 0) {
\
+ rskipped = BATcount(r2) > 0;
\
+ } else if (rskipped) {
\
+ r2->tseqbase = oid_nil;
\
}
\
+ } else if (nl > 1) {
\
+ r1->trevsorted = false;
\
}
\
+ if (with_strimps) {
\
+ sl = old_sl;
\
+ }
\
+ }
\
} while (0)
static str
-strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr, bit anti, bit
(*str_cmp)(const char*, const char*, int), const str fname)
+strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr, bit anti,
+ bit (*str_cmp)(const char*, const char*, int), const str fname)
{
struct canditer lci, rci;
const char *lvals, *rvals, *lvars, *rvars, *vl, *vr;
- int rskipped = 0, rlen = 0; /* whether we skipped
values in r */
- oid lbase, rbase, lo, ro, lastl = 0; /* last value inserted
into r1 */
+ int rskipped = 0, rlen = 0; /* whether we skipped
values in r */
+ oid lbase, rbase, lo, ro, lastl = 0; /* last value inserted into
r1 */
BUN nl, newcap;
+ BAT *old_sl = NULL;
+ bool with_strimps = false;
char *msg = MAL_SUCCEED;
size_t counter = 0;
@@ -5305,6 +5327,13 @@ strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r
timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ?
(qry_ctx->starttime + qry_ctx->querytimeout) : 0;
}
+ if (BAThasstrimps(l) && BAThasstrimps(r)) {
+ if (STRMPcreate(l, NULL) == GDK_SUCCEED &&
+ STRMPcreate(r, NULL) == GDK_SUCCEED)
+ with_strimps = true;
+ /* else throw the GDK error and default to nested loop without
filters */
+ }
+
TRC_DEBUG(ALGO,
"%s(l=%s#" BUNFMT "[%s]%s%s,"
"r=%s#" BUNFMT "[%s]%s%s,sl=%s#" BUNFMT "%s%s,"
@@ -5339,29 +5368,19 @@ strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r
lvars = li.vh->base;
rvars = ri.vh->base;
- r1->tkey = true;
- r1->tsorted = true;
- r1->trevsorted = true;
- r1->tnil = false;
- r1->tnonil = true;
- if (r2) {
- r2->tkey = true;
- r2->tsorted = true;
- r2->trevsorted = true;
- r2->tnil = false;
- r2->tnonil = true;
- }
-
- if (anti) {
- batstr_join_loop(str_cmp(vl, vr, rlen) == 0, str_strlen(vr));
- } else {
- batstr_join_loop(str_cmp(vl, vr, rlen) != 0, str_strlen(vr));
- }
+ set_empty_bat_props(r1);
+ if (r2)
+ set_empty_bat_props(r2);
+
+ if (anti)
+ batstr_join_loop(str_cmp(vl, vr, rlen) == 0, str_strlen(vr),
with_strimps);
+ else
+ batstr_join_loop(str_cmp(vl, vr, rlen) != 0, str_strlen(vr),
with_strimps);
+
bat_iterator_end(&li);
bat_iterator_end(&ri);
assert(!r2 || BATcount(r1) == BATcount(r2));
- /* also set other bits of heap to correct value to indicate size */
BATsetcount(r1, BATcount(r1));
if (r2)
BATsetcount(r2, BATcount(r2));
@@ -5375,93 +5394,86 @@ strjoin(BAT *r1, BAT *r2, BAT *l, BAT *r
if (r2)
r2->tseqbase = 0;
}
+
if (r2)
TRC_DEBUG(ALGO,
-
"%s(l=%s,r=%s)=(%s#"BUNFMT"%s%s,%s#"BUNFMT"%s%s\n",
- fname,
- BATgetId(l), BATgetId(r),
- BATgetId(r1), BATcount(r1),
- r1->tsorted ? "-sorted" : "",
- r1->trevsorted ? "-revsorted" : "",
- BATgetId(r2), BATcount(r2),
- r2->tsorted ? "-sorted" : "",
- r2->trevsorted ? "-revsorted" : "");
+
"%s(l=%s,r=%s)=(%s#"BUNFMT"%s%s,%s#"BUNFMT"%s%s\n",
+ fname,
+ BATgetId(l), BATgetId(r),
+ BATgetId(r1), BATcount(r1),
+ r1->tsorted ? "-sorted" : "",
+ r1->trevsorted ? "-revsorted" : "",
+ BATgetId(r2), BATcount(r2),
+ r2->tsorted ? "-sorted" : "",
+ r2->trevsorted ? "-revsorted" : "");
else
TRC_DEBUG(ALGO,
- "%s(l=%s,r=%s)=(%s#"BUNFMT"%s%s\n",
- fname,
- BATgetId(l), BATgetId(r),
- BATgetId(r1), BATcount(r1),
- r1->tsorted ? "-sorted" : "",
- r1->trevsorted ? "-revsorted" : "");
+ "%s(l=%s,r=%s)=(%s#"BUNFMT"%s%s\n",
+ fname,
+ BATgetId(l), BATgetId(r),
+ BATgetId(r1), BATcount(r1),
+ r1->tsorted ? "-sorted" : "",
+ r1->trevsorted ? "-revsorted" : "");
return MAL_SUCCEED;
-bailout:
+ bailout:
bat_iterator_end(&li);
bat_iterator_end(&ri);
assert(msg != MAL_SUCCEED);
return msg;
}
-
static str
STRjoin(bat *r1, bat *r2, const bat lid, const bat rid, const bat slid, const
bat srid, const bit anti, bit (*str_cmp)(const char*, const char*, int), const
str fname)
{
- BAT *left = NULL, *right = NULL, *candleft = NULL, *candright = NULL;
- BAT *result1 = NULL, *result2 = NULL;
- char *msg = MAL_SUCCEED;
-
- left = BATdescriptor(lid);
- right = BATdescriptor(rid);
- if (!left || !right) {
+ BAT *left = NULL, *right = NULL, *cleft = NULL, *cright = NULL,
+ *res1 = NULL, *res2 = NULL;
+ str msg = MAL_SUCCEED;
+
+ if (!(left = BATdescriptor(lid)) || !(right = BATdescriptor(rid))) {
msg = createException(MAL, fname, SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
- goto fail;
+ goto exit;
}
- if ((!is_bat_nil(slid) && (candleft = BATdescriptor(slid)) == NULL) ||
- (!is_bat_nil(srid) && (candright = BATdescriptor(srid)) ==
NULL) ) {
+
+ if ((!is_bat_nil(slid) && (cleft = BATdescriptor(slid)) == NULL) ||
+ (!is_bat_nil(srid) && (cright = BATdescriptor(srid)) == NULL) )
{
msg = createException(MAL, fname, SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
