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

Reply via email to