Changeset: 443cbe736c85 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=443cbe736c85
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        monetdb5/modules/kernel/batstr.c
Branch: Oct2020
Log Message:

More missing bulk str implementations


diffs (truncated from 333 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -5910,6 +5910,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "rtrim",        "command batstr.rtrim(X_1:bat[:str]):bat[:str] 
",       "STRbatRtrim;", ""      ]
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrSearch;",     ""      ]
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrSearchcst;",  ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:str] ",     "STRbatsplitpart;",     ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;",  ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:bat[:str]):bat[:bit] ",   "STRbatPrefix;",        ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
@@ -5918,6 +5920,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
+[ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8186,6 +8186,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "rtrim",        "command batstr.rtrim(X_1:bat[:str]):bat[:str] 
",       "STRbatRtrim;", ""      ]
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrSearch;",     ""      ]
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrSearchcst;",  ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:str] ",     "STRbatsplitpart;",     ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;",  ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:bat[:str]):bat[:bit] ",   "STRbatPrefix;",        ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
@@ -8194,6 +8196,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
+[ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
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
@@ -1283,40 +1283,233 @@ STRbatsubstringTail(bat *ret, const bat 
 static str
 STRbatSubstitutecst(bat *ret, const bat *l, const str *arg2, const str *arg3, 
const bit *rep)
 {
-       BATiter bi;
-       BAT *bn, *b;
-       BUN p, q;
-       str x;
-       str y;
-       str err = MAL_SUCCEED;
+       BATiter lefti;
+       BAT *bn, *left;
+       BUN p,q;
+       str y = NULL, err = MAL_SUCCEED;
+
+       if (!(left = BATdescriptor(*l))) {
+               err = createException(MAL, "batstr.substritute", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) 
{
+               err = createException(MAL, "batstr.substritute", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+       bn->tnonil=true;
+       bn->tnil=false;
+
+       lefti = bat_iterator(left);
+       BATloop(left, p, q) {
+               str x = (str) BUNtvar(lefti,p);
+
+               if ((err = STRSubstitute(&y, &x, arg2, arg3, rep)) != 
MAL_SUCCEED)
+                       goto bailout;
+               if (bunfastappVAR(bn, y) != GDK_SUCCEED) {
+                       GDKfree(y);
+                       goto bailout;
+               }
+               if (strNil(y)) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               }
+               GDKfree(y);
+       }
 
-       prepareOperand(b, l, "subString");
-       prepareResult(bn, b, TYPE_int, "subString");
+bailout:
+       if (err) {
+               BBPreclaim(bn);
+       } else {
+               BATsetcount(bn, BATcount(left));
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*ret = bn->batCacheid);
+       }
+       if (left)
+               BBPunfix(left->batCacheid);
+       return err;
+}
+
+static str
+STRbatSubstitute(bat *ret, const bat *l, const bat *arg2, const bat *arg3, 
const bat *rep)
+{
+       BATiter lefti, arg2i, arg3i;
+       BAT *bn, *left, *arg2b, *arg3b, *repb;
+       BUN p,q;
+       str y = NULL, err = MAL_SUCCEED;
+       bit *restrict repi;
 
-       bi = bat_iterator(b);
+       if (!(left = BATdescriptor(*l)) || !(arg2b= BATdescriptor(*arg2)) || 
!(arg3b= BATdescriptor(*arg3)) || !(repb= BATdescriptor(*rep))) {
+               err = createException(MAL, "batstr.substritute", 
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       if (BATcount(left) != BATcount(arg2b) || BATcount(arg2b) != 
BATcount(arg3b) || BATcount(arg3b) != BATcount(repb)) {
+               err = createException(MAL, "batstr.substritute", 
ILLEGAL_ARGUMENT " Requires bats of identical size");
+               goto bailout;
+       }
+       if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) 
{
+               err = createException(MAL, "batstr.substritute", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+       bn->tnonil=true;
+       bn->tnil=false;
+
+       lefti = bat_iterator(left);
+       arg2i = bat_iterator(arg2b);
+       arg3i = bat_iterator(arg3b);
+       repi = Tloc(repb, 0);
+       BATloop(left, p, q) {
+               str n2 = (str) BUNtvar(arg2i,p);
+               str n3 = (str) BUNtvar(arg3i,p);
+               str x = (str) BUNtvar(lefti,p);
+
+               if ((err = STRSubstitute(&y, &x, &n2, &n3, &(repi[p]))) != 
MAL_SUCCEED)
+                       goto bailout;
+               if (bunfastappVAR(bn, y) != GDK_SUCCEED) {
+                       GDKfree(y);
+                       goto bailout;
+               }
+               if (strNil(y)) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               }
+               GDKfree(y);
+       }
 
-       BATloop(b, p, q) {
-               y = (str) str_nil;
-               x = (str) BUNtvar(bi, p);
-               if (!strNil(x) &&
-                       (err = STRSubstitute(&y, &x, arg2, arg3, rep)) != 
MAL_SUCCEED)
-                       goto bunins_failed;
-               if (bunfastappVAR(bn, y) != GDK_SUCCEED)
-                       goto bunins_failed;
-               if (y != str_nil)
+bailout:
+       if (err) {
+               BBPreclaim(bn);
+       } else {
+               BATsetcount(bn, BATcount(left));
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*ret = bn->batCacheid);
+       }
+       if (left)
+               BBPunfix(left->batCacheid);
+       if (arg2b)
+               BBPunfix(arg2b->batCacheid);
+       if (arg3b)
+               BBPunfix(arg3b->batCacheid);
+       if (repb)
+               BBPunfix(repb->batCacheid);
+       return err;
+}
+
+static str
+STRbatsplitpartcst(bat *ret, const bat *bid, const str *needle, const int 
*field)
+{
+       BATiter lefti;
+       BAT *bn, *left;
+       BUN p,q;
+       str y = NULL, err = MAL_SUCCEED;
+
+       if (!(left = BATdescriptor(*bid))) {
+               err = createException(MAL, "batstr.splitpart", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) 
{
+               err = createException(MAL, "batstr.splitpart", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+       bn->tnonil=true;
+       bn->tnil=false;
+
+       lefti = bat_iterator(left);
+       BATloop(left, p, q) {
+               str x = (str) BUNtvar(lefti,p);
+
+               if ((err = STRsplitpart(&y, &x, (str*)needle, (int*)field)) != 
MAL_SUCCEED)
+                       goto bailout;
+               if (bunfastappVAR(bn, y) != GDK_SUCCEED) {
                        GDKfree(y);
+                       goto bailout;
+               }
+               if (strNil(y)) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               }
+               GDKfree(y);
+       }
+
+bailout:
+       if (err) {
+               BBPreclaim(bn);
+       } else {
+               BATsetcount(bn, BATcount(left));
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*ret = bn->batCacheid);
        }
-       bn->tnonil = false;
-       finalizeResult(ret, bn, b);
-       return MAL_SUCCEED;
-bunins_failed:
-       if (err == MAL_SUCCEED && y != str_nil)
+       if (left)
+               BBPunfix(left->batCacheid);
+       return err;
+}
+
+static str
+STRbatsplitpart(bat *ret, const bat *l, const bat *r, const bat *t)
+{
+       BATiter lefti, arg2i;
+       BAT *bn, *left, *arg2b, *arg3b;
+       BUN p,q;
+       str y = NULL, err = MAL_SUCCEED;
+       int *restrict fieldi;
+
+       if (!(left = BATdescriptor(*l)) || !(arg2b= BATdescriptor(*r)) || 
!(arg3b= BATdescriptor(*t))) {
+               err = createException(MAL, "batstr.splitpart", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
+               goto bailout;
+       }
+       if (BATcount(left) != BATcount(arg2b) || BATcount(arg2b) != 
BATcount(arg3b) ) {
+               err = createException(MAL, "batstr.splitpart", ILLEGAL_ARGUMENT 
" Requires bats of identical size");
+               goto bailout;
+       }
+       if (!(bn = COLnew(left->hseqbase, TYPE_str,BATcount(left), TRANSIENT))) 
{
+               err = createException(MAL, "batstr.splitpart", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+       bn->tnonil=true;
+       bn->tnil=false;
+
+       lefti = bat_iterator(left);
+       arg2i = bat_iterator(arg2b);
+       fieldi = Tloc(arg3b, 0);
+       BATloop(left, p, q) {
+               str x = (str) BUNtvar(lefti,p);
+               str needle = (str) BUNtvar(arg2i,p);
+
+               if ((err = STRsplitpart(&y, &x, &needle, &(fieldi[p]))) != 
MAL_SUCCEED)
+                       goto bailout;
+               if (bunfastappVAR(bn, y) != GDK_SUCCEED) {
+                       GDKfree(y);
+                       goto bailout;
+               }
+               if (strNil(y)) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               }
                GDKfree(y);
-       BBPunfix(b->batCacheid);
-       BBPunfix(bn->batCacheid);
-       if (err)
-               return err;
-       throw(MAL, "batstr.subString", OPERATION_FAILED " During bulk 
operation");
+       }
+
+bailout:
+       if (err) {
+               BBPreclaim(bn);
+       } else {
+               BATsetcount(bn, BATcount(left));
+               bn->tkey = BATcount(bn) <= 1;
+               bn->tsorted = BATcount(bn) <= 1;
+               bn->trevsorted = BATcount(bn) <= 1;
+               BBPkeepref(*ret = bn->batCacheid);
+       }
+       if (left)
+               BBPunfix(left->batCacheid);
+       if (arg2b)
+               BBPunfix(arg2b->batCacheid);
+       if (arg3b)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to