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