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

Implemented bulk implementations of suffix,prefix and repeat string functions. 
Later I will clean the rest.

We have to review who implemented the batstr module in the past. Doing malloc 
and free for every row???


diffs (121 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
@@ -5890,6 +5890,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "nbytes",       "command batstr.nbytes(X_1:bat[:str]):bat[:int] 
",      "STRbatBytes;", ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:str):bat[:int] ",   "STRbatRstrSearchcst;", ""      ]
+[ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatrepeat;",        ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatRpad2_bat_bat;", ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatRpad2_bat_const;",       ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, 
X_3:bat[:str]):bat[:str] ",        "STRbatRpad2_const_bat;",       ""      ]
@@ -5905,6 +5906,8 @@ stdout of test 'MAL-signatures` in direc
 [ "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;",  ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffix;",        ""      ]
 [ "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:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
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
@@ -8166,6 +8166,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "nbytes",       "command batstr.nbytes(X_1:bat[:str]):bat[:int] 
",      "STRbatBytes;", ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:str):bat[:int] ",   "STRbatRstrSearchcst;", ""      ]
+[ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatrepeat;",        ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatRpad2_bat_bat;", ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatRpad2_bat_const;",       ""      ]
 [ "batstr",    "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, 
X_3:bat[:str]):bat[:str] ",        "STRbatRpad2_const_bat;",       ""      ]
@@ -8181,6 +8182,8 @@ stdout of test 'MAL-signatures` in direc
 [ "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;",  ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffix;",        ""      ]
 [ "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:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
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
@@ -1138,6 +1138,67 @@ STRbatWChrAtcst(bat *ret, const bat *l, 
 }
 
 static str
+do_batstr_str_int(bat *ret, const bat *l, const int *cst, const char *name, 
str (*func)(str *, const str *, const int *))
+{
+       BATiter bi;
+       BAT *bn, *b;
+       BUN p, q;
+       str x, y, msg = MAL_SUCCEED;
+
+       prepareOperand(b, l, name);
+       prepareResult(bn, b, TYPE_str, name);
+
+       bi = bat_iterator(b);
+
+       BATloop(b, p, q) {
+               y = NULL;
+               x = (str) BUNtvar(bi, p);
+               if (!strNil(x) &&
+                       (msg = (*func)(&y, &x, cst)) != MAL_SUCCEED)
+                       goto bailout;
+               if (y == NULL)
+                       y = (str) str_nil;
+               if (bunfastappVAR(bn, y) != GDK_SUCCEED) {
+                       if (y != str_nil)
+                               GDKfree(y);
+                       goto bailout;
+               }
+               if (y == str_nil) {
+                       bn->tnonil = false;
+                       bn->tnil = true;
+               } else
+                       GDKfree(y);
+       }
+       finalizeResult(ret, bn, b);
+       return MAL_SUCCEED;
+
+bailout:
+       BBPunfix(b->batCacheid);
+       BBPunfix(bn->batCacheid);
+       if (msg != MAL_SUCCEED)
+               return msg;
+       throw(MAL, name, OPERATION_FAILED " During bulk operation");
+}
+
+static str
+STRbatprefix(bat *ret, const bat *l, const int *cst)
+{
+       return do_batstr_str_int(ret, l, cst, "batstr.prefix", STRprefix);
+}
+
+static str
+STRbatsuffix(bat *ret, const bat *l, const int *cst)
+{
+       return do_batstr_str_int(ret, l, cst, "batstr.suffix", STRsuffix);
+}
+
+static str
+STRbatrepeat(bat *ret, const bat *l, const int *cst)
+{
+       return do_batstr_str_int(ret, l, cst, "batstr.repeat", STRrepeat);
+}
+
+static str
 STRbatSubstitutecst(bat *ret, const bat *l, const str *arg2, const str *arg3, 
const bit *rep)
 {
        BATiter bi;
@@ -1328,6 +1389,9 @@ mel_func batstr_init_funcs[] = {
  command("batstr", "unicodeAt", STRbatWChrAt, false, "get a unicode character 
(as an int) from a string position.", args(1,3, 
batarg("",int),batarg("s",str),batarg("index",int))),
  command("batstr", "unicodeAt", STRbatWChrAtcst, false, "get a unicode 
character (as an int) from a string position.", args(1,3, 
batarg("",int),batarg("s",str),arg("index",int))),
  command("batstr", "substitute", STRbatSubstitutecst, false, "Substitute first 
occurrence of 'src' by\n'dst'.  Iff repeated = true this is\nrepeated while 
'src' can be found in the\nresult string. In order to prevent\nrecursion and 
result strings of unlimited\nsize, repeating is only done iff src is\nnot a 
substring of dst.", args(1,5, 
batarg("",str),batarg("s",str),arg("src",str),arg("dst",str),arg("rep",bit))),
+ command("batstr", "stringleft", STRbatprefix, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("l",int))),
+ command("batstr", "stringright", STRbatsuffix, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("l",int))),
+ command("batstr", "repeat", STRbatrepeat, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("c",int))),
  { .imp=NULL }
 };
 #include "mal_import.h"
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to