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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list