Changeset: e2380018fe41 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e2380018fe41 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/mal/batMask.c Branch: unlock Log Message:
Implemented (unoptimized) mask.mask and mask.umask. diffs (154 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 @@ -7919,7 +7919,7 @@ stdout of test 'MAL-signatures` in direc [ "mapi", "stop", "command mapi.stop():void ", "SERVERstop;", "" ] [ "mapi", "suspend", "command mapi.suspend():void ", "SERVERsuspend;", "" ] [ "mapi", "trace", "command mapi.trace(X_1:int, X_2:int):void ", "SERVERtrace;", "" ] -[ "mask", "mask", "pattern mask.mask(X_1:bat[:oid]):bat[:oid] ", "MSKmask;", "" ] +[ "mask", "mask", "pattern mask.mask(X_1:bat[:oid]):bat[:msk] ", "MSKmask;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit):bat[:oid] ", "MSKselect1;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit, X_7:bit):bat[:oid] ", "MSKselect1nil;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:bat[:oid], X_3:any_1, X_4:any_1, X_5:bit, X_6:bit, X_7:bit):bat[:oid] ", "MSKselect2;", "" ] @@ -7927,7 +7927,7 @@ stdout of test 'MAL-signatures` in direc [ "mask", "selectNotNil", "command mask.selectNotNil(X_1:bat[:any_2]):bat[:any_2] ", "MSKselectNotNil;", "" ] [ "mask", "thetaselect", "command mask.thetaselect(X_1:bat[:any_1], X_2:any_1, X_3:str):bat[:oid] ", "MSKthetaselect1;", "" ] [ "mask", "thetaselect", "command mask.thetaselect(X_1:bat[:any_1], X_2:bat[:oid], X_3:any_1, X_4:str):bat[:oid] ", "MSKthetaselect2;", "" ] -[ "mask", "umask", "pattern mask.umask(X_1:bat[:oid]):bat[:oid] ", "MSKumask;", "" ] +[ "mask", "umask", "pattern mask.umask(X_1:bat[:msk]):bat[:oid] ", "MSKumask;", "" ] [ "mat", "new", "pattern mat.new(X_1:bat[:any_2]...):bat[:any_2] ", "MATpack;", "" ] [ "mat", "pack", "pattern mat.pack(X_1:bat[:any_2]...):bat[:any_2] ", "MATpack;", "" ] [ "mat", "pack", "pattern mat.pack(X_1:any_2...):bat[:any_2] ", "MATpackValues;", "" ] 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 @@ -10818,7 +10818,7 @@ stdout of test 'MAL-signatures` in direc [ "mapi", "stop", "command mapi.stop():void ", "SERVERstop;", "" ] [ "mapi", "suspend", "command mapi.suspend():void ", "SERVERsuspend;", "" ] [ "mapi", "trace", "command mapi.trace(X_1:int, X_2:int):void ", "SERVERtrace;", "" ] -[ "mask", "mask", "pattern mask.mask(X_1:bat[:oid]):bat[:oid] ", "MSKmask;", "" ] +[ "mask", "mask", "pattern mask.mask(X_1:bat[:oid]):bat[:msk] ", "MSKmask;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit):bat[:oid] ", "MSKselect1;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:any_1, X_3:any_1, X_4:bit, X_5:bit, X_6:bit, X_7:bit):bat[:oid] ", "MSKselect1nil;", "" ] [ "mask", "select", "command mask.select(X_1:bat[:any_1], X_2:bat[:oid], X_3:any_1, X_4:any_1, X_5:bit, X_6:bit, X_7:bit):bat[:oid] ", "MSKselect2;", "" ] @@ -10826,7 +10826,7 @@ stdout of test 'MAL-signatures` in direc [ "mask", "selectNotNil", "command mask.selectNotNil(X_1:bat[:any_2]):bat[:any_2] ", "MSKselectNotNil;", "" ] [ "mask", "thetaselect", "command mask.thetaselect(X_1:bat[:any_1], X_2:any_1, X_3:str):bat[:oid] ", "MSKthetaselect1;", "" ] [ "mask", "thetaselect", "command mask.thetaselect(X_1:bat[:any_1], X_2:bat[:oid], X_3:any_1, X_4:str):bat[:oid] ", "MSKthetaselect2;", "" ] -[ "mask", "umask", "pattern mask.umask(X_1:bat[:oid]):bat[:oid] ", "MSKumask;", "" ] +[ "mask", "umask", "pattern mask.umask(X_1:bat[:msk]):bat[:oid] ", "MSKumask;", "" ] [ "mat", "new", "pattern mat.new(X_1:bat[:any_2]...):bat[:any_2] ", "MATpack;", "" ] [ "mat", "pack", "pattern mat.pack(X_1:bat[:any_2]...):bat[:any_2] ", "MATpack;", "" ] [ "mat", "pack", "pattern mat.pack(X_1:any_2...):bat[:any_2] ", "MATpackValues;", "" ] diff --git a/monetdb5/modules/mal/batMask.c b/monetdb5/modules/mal/batMask.c --- a/monetdb5/modules/mal/batMask.c +++ b/monetdb5/modules/mal/batMask.c @@ -23,8 +23,8 @@ */ static str -MSKmask(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ - +MSKmask(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ BAT *b, *dst; bat *bid; int *ret; @@ -36,7 +36,52 @@ MSKmask(Client cntxt, MalBlkPtr mb, MalS bid = getArgReference_bat(stk, pci, 1); if ((b = BATdescriptor(*bid)) == NULL) throw(SQL, "bat.mask", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - dst = VIEWcreate(b->hseqbase, b); + if (BATcount(b) == 0) { + dst = COLnew(0, TYPE_msk, 0, TRANSIENT); + } else { + oid fst; + BUN cap; + BUN max = 0; + if (b->tsorted) { + fst = BUNtoid(b, 0); + dst = COLnew(fst, TYPE_msk, BUNtoid(b, BUNlast(b) - 1) + 1 - fst, TRANSIENT); + } else { + fst = 0; + dst = COLnew(0, TYPE_msk, BATcount(b), TRANSIENT); + } + cap = BATcapacity(b); + if (dst) { + memset(Tloc(dst, 0), 0, dst->theap->size); + for (BUN p = 0; p < BATcount(b); p++) { + oid o = BUNtoid(b, p); + if (is_oid_nil(o)) { + BBPunfix(b->batCacheid); + BBPreclaim(dst); + throw(MAL, "mask.mask", "no NULL allowed"); + } + o -= fst; + if (o >= cap) { + if (BATextend(dst, o + 1) != GDK_SUCCEED) { + BBPunfix(b->batCacheid); + BBPreclaim(dst); + throw(MAL, "mask.mask", GDK_EXCEPTION); + } + cap = BATcapacity(dst); + } + mskSetVal(dst, o, true); + if (o > max) + max = o; + } + BATsetcount(dst, max + 1); + dst->tsorted = dst->trevsorted = false; + dst->tkey = false; + dst->tnil = false; + dst->tnonil = true; + } + } + BBPunfix(b->batCacheid); + if (dst == NULL) + throw(MAL, "mask.mask", GDK_EXCEPTION); *ret= dst->batCacheid; BBPkeepref(*ret); @@ -44,8 +89,8 @@ MSKmask(Client cntxt, MalBlkPtr mb, MalS } static str -MSKumask(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ - +MSKumask(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ BAT *b, *dst; bat *bid; int *ret; @@ -57,7 +102,18 @@ MSKumask(Client cntxt, MalBlkPtr mb, Mal bid = getArgReference_bat(stk, pci, 1); if ((b = BATdescriptor(*bid)) == NULL) throw(SQL, "bat.umask", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); - dst = VIEWcreate(b->hseqbase, b); + dst = COLnew(0, TYPE_oid, 0, TRANSIENT); + if (dst == NULL) { + BBPunfix(b->batCacheid); + throw(MAL, "mask.umask", GDK_EXCEPTION); + } + for (BUN p = 0; p < BATcount(b); p++) { + if (mskGetVal(b, p) && + BUNappend(dst, &(oid){p + b->hseqbase}, false) != GDK_SUCCEED) { + BBPunfix(b->batCacheid); + throw(MAL, "mask.umask", GDK_EXCEPTION); + } + } *ret= dst->batCacheid; BBPkeepref(*ret); @@ -67,10 +123,8 @@ MSKumask(Client cntxt, MalBlkPtr mb, Mal #include "mel.h" mel_func batMask_init_funcs[] = { -//pattern("mask", "mask", MSKmask, false, "", args(1,2, batarg("r", msk), batarg("b",oid))), -//pattern("mask", "umask", MSKumask, false, "", args(1,2, batarg("r", oid), batarg("b",msk))), - pattern("mask", "mask", MSKmask, false, "", args(1,2, batarg("r", oid), batarg("b",oid))), - pattern("mask", "umask", MSKumask, false, "", args(1,2, batarg("r", oid), batarg("b",oid))), + pattern("mask", "mask", MSKmask, false, "", args(1,2, batarg("r", msk), batarg("b",oid))), + pattern("mask", "umask", MSKumask, false, "", args(1,2, batarg("r", oid), batarg("b",msk))), { .imp=NULL } }; #include "mal_import.h" _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list