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