Changeset: 77bc30a14304 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=77bc30a14304
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_calc.c
        monetdb5/modules/kernel/batstr.c
        monetdb5/modules/kernel/batstr.mal
        monetdb5/modules/mal/batcalc.c
        monetdb5/modules/mal/batcalc.mal
        monetdb5/modules/mal/batcalc.mal.sh
        monetdb5/optimizer/Tests/inline09.stable.out
Branch: default
Log Message:

Moved implementation of baclac.+ on strings to gdk_calc.


diffs (truncated from 399 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2162,8 +2162,6 @@ str STRUpper(str *res, str *arg1);
 str STRWChrAt(int *res, str *arg1, int *at);
 str STRascii(int *ret, str *s);
 str STRbatBytes(bat *ret, bat *l);
-str STRbatConcat(bat *ret, bat *l, bat *r);
-str STRbatConcatcst(bat *ret, bat *l, str *cst);
 str STRbatLength(bat *ret, bat *l);
 str STRbatLower(bat *ret, bat *l);
 str STRbatLtrim(bat *ret, bat *l);
@@ -2191,7 +2189,6 @@ str STRbatstringLength(bat *ret, bat *l)
 str STRbatsubstring(bat *ret, bat *l, bat *r, bat *t);
 str STRbatsubstringcst(bat *ret, bat *bid, int *start, int *length);
 str STRcodeset(str *res);
-str STRcstConcatbat(bat *ret, str *cst, bat *r);
 str STRcstPrefixbat(bat *ret, str *cst, bat *r);
 str STRcstRstrSearchbat(bat *ret, str *cst, bat *r);
 str STRcstSuffixbat(bat *ret, str *cst, bat *r);
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -1874,6 +1874,74 @@ add_typeswitchloop(const void *lft, int 
        return BUN_NONE;
 }
 
+static BUN
+addstr_loop(BAT *b1, const char *l, BAT *b2, const char *r, BAT *bn,
+           BUN cnt, BUN start, BUN end, const oid *cand, const oid *candend)
+{
+       BUN i, j, k, frst = BUNfirst(bn);
+       BUN nils = start + (cnt - end);
+       char *s;
+       size_t slen, llen, rlen;
+       BATiter b1i, b2i;
+       oid candoff;
+
+       assert(b1 != NULL || b2 != NULL); /* at least one not NULL */
+       candoff = b1 ? b1->H->seq : b2->H->seq;
+       b1i = bat_iterator(b1);
+       b2i = bat_iterator(b2);
+       slen = 1024;
+       s = GDKmalloc(slen);
+       if (s == NULL)
+               goto bunins_failed;
+       for (k = 0; k < start; k++)
+               tfastins_nocheck(bn, k + frst, str_nil, Tsize(bn));
+       for (i = start + (b1 ? BUNfirst(b1) : 0), j = start + (b2 ? 
BUNfirst(b2) : 0), k = start;
+            k < end; i++, j++, k++) {
+               if (cand) {
+                       if (k < *cand - candoff) {
+                               nils++;
+                               tfastins_nocheck(bn, k + frst, str_nil, 
Tsize(bn));
+                               continue;
+                       }
+                       assert(k == *cand - candoff);
+                       if (++cand == candend)
+                               end = k + 1;
+               }
+               if (b1)
+                       l = BUNtvar(b1i, i);
+               if (b2)
+                       r = BUNtvar(b2i, j);
+               if (strcmp(l, str_nil) == 0 || strcmp(r, str_nil) == 0) {
+                       nils++;
+                       tfastins_nocheck(bn, k + frst, str_nil, Tsize(bn));
+               } else {
+                       llen = strlen(l);
+                       rlen = strlen(r);
+                       if (llen + rlen >= slen) {
+                               slen = llen + rlen + 1024;
+                               GDKfree(s);
+                               s = GDKmalloc(slen);
+                               if (s == NULL)
+                                       goto bunins_failed;
+                       }
+#ifdef HAVE_STPCPY
+                       (void) stpcpy(stpcpy(s, l), r);
+#else
+                       snprintf(s, slen, "%s%s", l, r);
+#endif
+                       tfastins_nocheck(bn, k + frst, s, Tsize(bn));
+               }
+       }
+       for (k = end; k < cnt; k++)
+               tfastins_nocheck(bn, k + frst, str_nil, Tsize(bn));
+       GDKfree(s);
+       return nils;
+
+  bunins_failed:
+       GDKfree(s);
+       return BUN_NONE;
+}
+
 BAT *
 BATcalcadd(BAT *b1, BAT *b2, BAT *s, int tp, int abort_on_error)
 {
@@ -1894,12 +1962,19 @@ BATcalcadd(BAT *b1, BAT *b2, BAT *s, int
        if (bn == NULL)
                return NULL;
 
-       nils = add_typeswitchloop(Tloc(b1, b1->U->first), b1->T->type, 1,
-                                 Tloc(b2, b2->U->first), b2->T->type, 1,
-                                 Tloc(bn, bn->U->first), tp,
-                                 cnt, start, end,
-                                 cand, candend, b1->H->seq,
-                                 abort_on_error, "BATcalcadd");
+       if (b1->T->type == TYPE_str && b2->T->type == TYPE_str && tp == 
TYPE_str) {
+               nils = addstr_loop(b1, NULL, b2, NULL, bn,
+                                  cnt, start, end, cand, candend);
+       } else {
+               nils = add_typeswitchloop(Tloc(b1, b1->U->first),
+                                         b1->T->type, 1,
+                                         Tloc(b2, b2->U->first),
+                                         b2->T->type, 1,
+                                         Tloc(bn, bn->U->first), tp,
+                                         cnt, start, end,
+                                         cand, candend, b1->H->seq,
+                                         abort_on_error, "BATcalcadd");
+       }
 
        if (nils == BUN_NONE) {
                BBPunfix(bn->batCacheid);
@@ -1942,12 +2017,17 @@ BATcalcaddcst(BAT *b, const ValRecord *v
        if (bn == NULL)
                return NULL;
 
-       nils = add_typeswitchloop(Tloc(b, b->U->first), b->T->type, 1,
-                                 VALptr(v), v->vtype, 0,
-                                 Tloc(bn, bn->U->first), tp,
-                                 cnt, start, end,
-                                 cand, candend, b->H->seq,
-                                 abort_on_error, "BATcalcaddcst");
+       if (b->T->type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
+               nils = addstr_loop(b, NULL, NULL, v->val.sval, bn,
+                                  cnt, start, end, cand, candend);
+       } else {
+               nils = add_typeswitchloop(Tloc(b, b->U->first), b->T->type, 1,
+                                         VALptr(v), v->vtype, 0,
+                                         Tloc(bn, bn->U->first), tp,
+                                         cnt, start, end,
+                                         cand, candend, b->H->seq,
+                                         abort_on_error, "BATcalcaddcst");
+       }
 
        if (nils == BUN_NONE) {
                BBPunfix(bn->batCacheid);
@@ -1990,12 +2070,17 @@ BATcalccstadd(const ValRecord *v, BAT *b
        if (bn == NULL)
                return NULL;
 
-       nils = add_typeswitchloop(VALptr(v), v->vtype, 0,
-                                 Tloc(b, b->U->first), b->T->type, 1,
-                                 Tloc(bn, bn->U->first), tp,
-                                 cnt, start, end,
-                                 cand, candend, b->H->seq,
-                                 abort_on_error, "BATcalccstadd");
+       if (b->T->type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
+               nils = addstr_loop(NULL, v->val.sval, b, NULL, bn,
+                                  cnt, start, end, cand, candend);
+       } else {
+               nils = add_typeswitchloop(VALptr(v), v->vtype, 0,
+                                         Tloc(b, b->U->first), b->T->type, 1,
+                                         Tloc(bn, bn->U->first), tp,
+                                         cnt, start, end,
+                                         cand, candend, b->H->seq,
+                                         abort_on_error, "BATcalccstadd");
+       }
 
        if (nils == BUN_NONE) {
                BBPunfix(bn->batCacheid);
diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -66,9 +66,6 @@ batstr_export str STRcststrSearchbat(bat
 batstr_export str STRbatRstrSearch(bat *ret, bat *l, bat *r);
 batstr_export str STRbatRstrSearchcst(bat *ret, bat *l, str *cst);
 batstr_export str STRcstRstrSearchbat(bat *ret, str *cst, bat *r);
-batstr_export str STRbatConcat(bat *ret, bat *l, bat *r);
-batstr_export str STRbatConcatcst(bat *ret, bat *l, str *cst);
-batstr_export str STRcstConcatbat(bat *ret, str *cst, bat *r);
 batstr_export str STRbatTail(bat *ret, bat *l, bat *r);
 batstr_export str STRbatTailcst(bat *ret, bat *l, bat *cst);
 batstr_export str STRbatWChrAt(bat *ret, bat *l, bat *r);
@@ -618,99 +615,6 @@ bunins_failed:
        throw(MAL, "batstr""r_search", OPERATION_FAILED " During bulk 
operation");
 }
 
-str STRbatConcat(bat *ret, bat *l, bat *r)
-{
-       BATiter lefti, righti;
-       BAT *bn, *left, *right;
-       BUN p,q;
-       str v, *vp= &v;
-
-       prepareOperand2(left,l,right,r,"batstr.+");
-       if( BATcount(left) != BATcount(right) )
-               throw(MAL, "batstr.+", ILLEGAL_ARGUMENT " Requires bats of 
identical size");
-       prepareResult2(bn,left,right,TYPE_str,"batstr.+");
-
-       lefti = bat_iterator(left);
-       righti = bat_iterator(right);
-
-       BATloop(left, p, q) {
-               ptr h = BUNhead(lefti,p);
-               str tl = (str) BUNtail(lefti,p);
-               str tr = (str) BUNtail(righti,p);
-               STRConcat(vp, &tl, &tr);
-               bunfastins(bn, h, v);
-               GDKfree(v);
-       }
-       bn->T->nonil = 0;
-       BBPreleaseref(right->batCacheid);
-       finalizeResult(ret,bn,left);
-       return MAL_SUCCEED;
-
-bunins_failed:
-       BBPreleaseref(left->batCacheid);
-       BBPreleaseref(right->batCacheid);
-       BBPunfix(*ret);
-       throw(MAL, "batstr." "+", OPERATION_FAILED " During bulk operation");
-}
-
-str STRbatConcatcst(bat *ret, bat *l, str *cst)
-{
-       BATiter lefti;
-       BAT *bn, *left;
-       BUN p,q;
-       str v, *vp= &v;
-
-       prepareOperand(left,l,"batstr.+");
-       prepareResult(bn,left,TYPE_str,"batstr.+");
-
-       lefti = bat_iterator(left);
-
-       BATloop(left, p, q) {
-               ptr h = BUNhead(lefti,p);
-               str tl = (str) BUNtail(lefti,p);
-               STRConcat(vp, &tl, cst);
-               bunfastins(bn, h, v);
-               GDKfree(v);
-       }
-       bn->T->nonil = 0;
-       finalizeResult(ret,bn,left);
-       return MAL_SUCCEED;
-
-bunins_failed:
-       BBPreleaseref(left->batCacheid);
-       BBPunfix(*ret);
-       throw(MAL, "batstr""+", OPERATION_FAILED " During bulk operation");
-}
-
-str STRcstConcatbat(bat *ret, str *cst, bat *r)
-{
-       BATiter righti;
-       BAT *bn, *right;
-       BUN p,q;
-       str v, *vp= &v;
-
-       prepareOperand(right,r,"batstr.+");
-       prepareResult(bn,right,TYPE_str,"batstr.+");
-
-       righti = bat_iterator(right);
-
-       BATloop(right, p, q) {
-               ptr h = BUNhead(righti,p);
-               str tr = (str) BUNtail(righti,p);
-               STRConcat(vp, cst, &tr);
-               bunfastins(bn, h, v);
-               GDKfree(v);
-       }
-       bn->T->nonil = 0;
-       finalizeResult(ret,bn,right);
-       return MAL_SUCCEED;
-
-bunins_failed:
-       BBPreleaseref(right->batCacheid);
-       BBPunfix(*ret);
-       throw(MAL, "batstr""+", OPERATION_FAILED " During bulk operation");
-}
-
 str STRbatTail(bat *ret, bat *l, bat *r)
 {
        BATiter lefti, righti;
diff --git a/monetdb5/modules/kernel/batstr.mal 
b/monetdb5/modules/kernel/batstr.mal
--- a/monetdb5/modules/kernel/batstr.mal
+++ b/monetdb5/modules/kernel/batstr.mal
@@ -57,16 +57,6 @@ command batstr.r_search( s:bat[:oid,:str
 address STRbatRstrSearchcst
 comment "Reverse search for a substring. Returns position, -1 if not found.";
 
-command batcalc.+( l:bat[:oid,:str], r:bat[:oid,:str]) :bat[:oid,:str]
-address STRbatConcat
-comment "Concatenate two strings.";
-command batcalc.+( l:bat[:oid,:str], r:str) :bat[:oid,:str]
-address STRbatConcatcst
-comment "Concatenate a string to a bat of strings.";
-command batcalc.+( l:str, r:bat[:oid,:str]) :bat[:oid,:str]
-address STRcstConcatbat
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to