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]

Reply via email to