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