Changeset: bf0a5df732c2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bf0a5df732c2
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.h
        monetdb5/modules/kernel/algebra.mal
        monetdb5/modules/mal/bitcandidates.c
        monetdb5/optimizer/opt_bitcandidates.c
Branch: compressedcandidates
Log Message:

Add the alternative for straight selects


diffs (127 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
@@ -507,6 +507,8 @@ Ready.
 [ "algebra",   "reuse",        "command 
algebra.reuse(b:bat[:any_1]):bat[:any_1] ",    "ALGreuse;",    "Reuse a 
temporary BAT if you can. Otherwise,\n\tallocate enough storage to accept 
result of an\n \toperation (not involving the heap)" ]
 [ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:oid] ",    "ALGselect1;", 
 "Select all head values for which the tail value is in range.\n\tInput is a 
dense-headed BAT, output is a dense-headed BAT with in\n\tthe tail the head 
value of the input BAT for which the tail value\n\tis between the values low 
and high (inclusive if li respectively\n\thi is set).  The output BAT is sorted 
on the tail value.  If low\n\tor high is nil, the boundary is not considered 
(effectively - and\n\t+ infinity).  If anti is set, the result is the 
complement.  Nil\n\tvalues in the tail are never matched, unless low=nil, 
high=nil,\n\tli=1, hi=1, anti=0.  All non-nil values are returned if 
low=nil,\n\thigh=nil, and li, hi are not both 1, or anti=1.\n\tNote that the 
output is suitable as second input for the other\n\tversion of this function."  
    ]
 [ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
s:bat[:oid], low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:oid] ",      
 "ALGselect2;",  "Select all head values of the first input BAT for which the 
tail value\n\tis in range and for which the head value occurs in the tail of 
the\n\tsecond input BAT.\n\tThe first input is a dense-headed BAT, the second 
input is a\n\tdense-headed BAT with sorted tail, output is a dense-headed 
BAT\n\twith in the tail the head value of the input BAT for which the\n\ttail 
value is between the values low and high (inclusive if li\n\trespectively hi is 
set).  The output BAT is sorted on the tail\n\tvalue.  If low or high is nil, 
the boundary is not considered\n\t(effectively - and + infinity).  If anti is 
set, the result is the\n\tcomplement.  Nil values in the tail are never 
matched, unless\n\tlow=nil, high=nil, li=1, hi=1, anti=0.  All non-nil values 
are\n\treturned if low=nil, high=nil, and li, hi are not both 1, or 
anti=1.\n\tNote that th
 e output is suitable as second input for this\n\tfunction."    ]
+[ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:msk] ",    
"ALGselectMsk1;",       ""      ]
+[ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
s:bat[:oid], low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:msk] ",      
 "ALGselectMsk2;",       ""      ]
 [ "algebra",   "selectNotNil", "command 
algebra.selectNotNil(b:bat[:any_2]):bat[:any_2] ",     "ALGselectNotNil;",     
"Select all not-nil values"     ]
 [ "algebra",   "semijoin",     "command algebra.semijoin(l:bat[:any_1], 
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, estimate:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ",    "ALGsemijoin;", "Semi join with candidate 
lists"        ]
 [ "algebra",   "slice",        "command algebra.slice(b:bat[:any_1], x:lng, 
y:lng):bat[:any_1] ",      "ALGslice;",    "Return the slice with the BUNs at 
position x till y."  ]
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
@@ -611,6 +611,8 @@ Ready.
 [ "algebra",   "reuse",        "command 
algebra.reuse(b:bat[:any_1]):bat[:any_1] ",    "ALGreuse;",    "Reuse a 
temporary BAT if you can. Otherwise,\n\tallocate enough storage to accept 
result of an\n \toperation (not involving the heap)" ]
 [ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:oid] ",    "ALGselect1;", 
 "Select all head values for which the tail value is in range.\n\tInput is a 
dense-headed BAT, output is a dense-headed BAT with in\n\tthe tail the head 
value of the input BAT for which the tail value\n\tis between the values low 
and high (inclusive if li respectively\n\thi is set).  The output BAT is sorted 
on the tail value.  If low\n\tor high is nil, the boundary is not considered 
(effectively - and\n\t+ infinity).  If anti is set, the result is the 
complement.  Nil\n\tvalues in the tail are never matched, unless low=nil, 
high=nil,\n\tli=1, hi=1, anti=0.  All non-nil values are returned if 
low=nil,\n\thigh=nil, and li, hi are not both 1, or anti=1.\n\tNote that the 
output is suitable as second input for the other\n\tversion of this function."  
    ]
 [ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
s:bat[:oid], low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:oid] ",      
 "ALGselect2;",  "Select all head values of the first input BAT for which the 
tail value\n\tis in range and for which the head value occurs in the tail of 
the\n\tsecond input BAT.\n\tThe first input is a dense-headed BAT, the second 
input is a\n\tdense-headed BAT with sorted tail, output is a dense-headed 
BAT\n\twith in the tail the head value of the input BAT for which the\n\ttail 
value is between the values low and high (inclusive if li\n\trespectively hi is 
set).  The output BAT is sorted on the tail\n\tvalue.  If low or high is nil, 
the boundary is not considered\n\t(effectively - and + infinity).  If anti is 
set, the result is the\n\tcomplement.  Nil values in the tail are never 
matched, unless\n\tlow=nil, high=nil, li=1, hi=1, anti=0.  All non-nil values 
are\n\treturned if low=nil, high=nil, and li, hi are not both 1, or 
anti=1.\n\tNote that th
 e output is suitable as second input for this\n\tfunction."    ]
+[ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:msk] ",    
"ALGselectMsk1;",       ""      ]
+[ "algebra",   "select",       "command algebra.select(b:bat[:any_1], 
s:bat[:oid], low:any_1, high:any_1, li:bit, hi:bit, anti:bit):bat[:msk] ",      
 "ALGselectMsk2;",       ""      ]
 [ "algebra",   "selectNotNil", "command 
algebra.selectNotNil(b:bat[:any_2]):bat[:any_2] ",     "ALGselectNotNil;",     
"Select all not-nil values"     ]
 [ "algebra",   "semijoin",     "command algebra.semijoin(l:bat[:any_1], 
r:bat[:any_1], sl:bat[:oid], sr:bat[:oid], nil_matches:bit, estimate:lng) 
(X_0:bat[:oid], X_1:bat[:oid]) ",    "ALGsemijoin;", "Semi join with candidate 
lists"        ]
 [ "algebra",   "slice",        "command algebra.slice(b:bat[:any_1], x:lng, 
y:lng):bat[:any_1] ",      "ALGslice;",    "Return the slice with the BUNs at 
position x till y."  ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -709,6 +709,8 @@ str ALGrangejoin(bat *r1, bat *r2, const
 str ALGreuse(bat *ret, const bat *bid);
 str ALGselect1(bat *result, const bat *bid, const void *low, const void *high, 
const bit *li, const bit *hi, const bit *anti);
 str ALGselect2(bat *result, const bat *bid, const bat *sid, const void *low, 
const void *high, const bit *li, const bit *hi, const bit *anti);
+str ALGselectMsk1(bat *result, const bat *bid, const void *low, const void 
*high, const bit *li, const bit *hi, const bit *anti);
+str ALGselectMsk2(bat *result, const bat *bid, const bat *sid, const void 
*low, const void *high, const bit *li, const bit *hi, const bit *anti);
 str ALGselectNotNil(bat *result, const bat *bid);
 str ALGsemijoin(bat *r1, bat *r2, const bat *l, const bat *r, const bat *sl, 
const bat *sr, const bit *nil_matches, const lng *estimate);
 str ALGslice(bat *ret, const bat *bid, const lng *start, const lng *end);
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -265,12 +265,24 @@ ALGselect2(bat *result, const bat *bid, 
 }
 
 str
+ALGselectMsk2(bat *result, const bat *bid, const bat *sid, const void *low, 
const void *high, const bit *li, const bit *hi, const bit *anti)
+{
+       return ALGselect2(result, bid, sid, low, high, li, hi, anti);
+}
+
+str
 ALGselect1(bat *result, const bat *bid, const void *low, const void *high, 
const bit *li, const bit *hi, const bit *anti)
 {
        return ALGselect2(result, bid, NULL, low, high, li, hi, anti);
 }
 
 str
+ALGselectMsk1(bat *result, const bat *bid, const void *low, const void *high, 
const bit *li, const bit *hi, const bit *anti)
+{
+       return ALGselect2(result, bid, NULL, low, high, li, hi, anti);
+}
+
+str
 ALGthetaselect2(bat *result, const bat *bid, const bat *sid, const void *val, 
const char **op)
 {
        BAT *b, *s = NULL, *bn;
diff --git a/monetdb5/modules/kernel/algebra.h 
b/monetdb5/modules/kernel/algebra.h
--- a/monetdb5/modules/kernel/algebra.h
+++ b/monetdb5/modules/kernel/algebra.h
@@ -23,7 +23,9 @@ mal_export str ALGmaxany(ptr result, con
 mal_export str ALGgroupby(bat *res, const bat *gids, const bat *cnts);
 mal_export str ALGcard(lng *result, const bat *bid);
 mal_export str ALGselect1(bat *result, const bat *bid, const void *low, const 
void *high, const bit *li, const bit *hi, const bit *anti);
+mal_export str ALGselectMsk1(bat *result, const bat *bid, const void *low, 
const void *high, const bit *li, const bit *hi, const bit *anti);
 mal_export str ALGselect2(bat *result, const bat *bid, const bat *sid, const 
void *low, const void *high, const bit *li, const bit *hi, const bit *anti);
+mal_export str ALGselectMsk2(bat *result, const bat *bid, const bat *sid, 
const void *low, const void *high, const bit *li, const bit *hi, const bit 
*anti);
 mal_export str ALGthetaselect1(bat *result, const bat *bid, const void *val, 
const char **op);
 mal_export str ALGthetaselectMsk1(bat *result, const bat *bid, const void 
*val, const char **op);
 mal_export str ALGthetaselect2(bat *result, const bat *bid, const bat *sid, 
const void *val, const char **op);
diff --git a/monetdb5/modules/kernel/algebra.mal 
b/monetdb5/modules/kernel/algebra.mal
--- a/monetdb5/modules/kernel/algebra.mal
+++ b/monetdb5/modules/kernel/algebra.mal
@@ -37,6 +37,8 @@ address ALGexist
 comment "Returns whether 'val' occurs in b.";
 
 # The range selections are targeted at the tail of the BAT.
+command select(b:bat[:any_1], low:any_1, high:any_1, li:bit, hi:bit, anti:bit) 
:bat[:msk]
+address ALGselectMsk1;
 command select(b:bat[:any_1], low:any_1, high:any_1, li:bit, hi:bit, anti:bit) 
:bat[:oid]
 address ALGselect1
 comment "Select all head values for which the tail value is in range.
@@ -52,6 +54,8 @@ comment "Select all head values for whic
        Note that the output is suitable as second input for the other
        version of this function.";
 
+command select(b:bat[:any_1], s:bat[:oid], low:any_1, high:any_1, li:bit, 
hi:bit, anti:bit) :bat[:msk]
+address ALGselectMsk2;
 command select(b:bat[:any_1], s:bat[:oid], low:any_1, high:any_1, li:bit, 
hi:bit, anti:bit) :bat[:oid]
 address ALGselect2
 comment "Select all head values of the first input BAT for which the tail value
diff --git a/monetdb5/modules/mal/bitcandidates.c 
b/monetdb5/modules/mal/bitcandidates.c
--- a/monetdb5/modules/mal/bitcandidates.c
+++ b/monetdb5/modules/mal/bitcandidates.c
@@ -146,6 +146,11 @@ BCLdecompress(Client cntxt, MalBlkPtr mb
                BBPkeepref(*ret = *val);
                return MAL_SUCCEED;
        }
+       /* TODO until we really produce a mask, simply return */
+       if( b->ttype == TYPE_msk){
+               BBPkeepref(*ret = *val);
+               return MAL_SUCCEED;
+       }
        bn = CANDdecompress(b);
        if ( bn == NULL){
                BBPunfix(*val);
diff --git a/monetdb5/optimizer/opt_bitcandidates.c 
b/monetdb5/optimizer/opt_bitcandidates.c
--- a/monetdb5/optimizer/opt_bitcandidates.c
+++ b/monetdb5/optimizer/opt_bitcandidates.c
@@ -52,6 +52,10 @@ OPTbitcandidatesImplementation(Client cn
                        setVarType( mb, getArg(p,0), newBatType(TYPE_msk));
                        actions++;
                }
+               if( getFunctionId(p) == selectRef && getModuleId(p) == 
algebraRef){
+                       setVarType( mb, getArg(p,0), newBatType(TYPE_msk));
+                       actions++;
+               }
        }
        for( ; i<slimit; i++)
                if( old[i])
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to