Changeset: 0449c4969f1f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0449c4969f1f
Modified Files:
        monetdb5/modules/mal/mal_weld.c
        monetdb5/modules/mal/mal_weld.h
        monetdb5/modules/mal/mal_weld.mal
        monetdb5/modules/mal/mal_weld.mal.sh
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_weld.c
Branch: mal-weld
Log Message:

weld impl for batcalc.isnil and batcalc.ifthenelse

batcalc.ifthenelse is temporarily disabled due to a bug in weld
https://github.com/weld-project/weld/issues/335


diffs (259 lines):

diff --git a/monetdb5/modules/mal/mal_weld.c b/monetdb5/modules/mal/mal_weld.c
--- a/monetdb5/modules/mal/mal_weld.c
+++ b/monetdb5/modules/mal/mal_weld.c
@@ -201,9 +201,9 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
        }
        inputLen += sprintf(inputStmt + inputLen,
                                                "i8MIN:i8, i8MAX:i8, 
i32MIN:i32, i32MAX:i32, i64MIN:i64, i64MAX:i64, "
-                                               "f32MIN:f32, f32MAX:f32, 
f64MIN:f64, f64MAX:f64, ");
+                                               "f32MIN:f32, f32MAX:f32, 
f64MIN:f64, f64MAX:f64,");
        inputLen += sprintf(inputStmt + inputLen,
-                                               "i8nil:i8, i32nil:i32, 
oidnil:i64, i64nil:i64, f32nil:f32, f64nil:f64, ");
+                                               "i8nil:i8, i32nil:i32, 
oidnil:i64, i64nil:i64, f32nil:f32, f64nil:f64,");
 
        inputStmt[0] = '|';
        inputStmt[inputLen - 1] = '|';
@@ -882,6 +882,94 @@ WeldBatcalcMODsignal(Client cntxt, MalBl
        return WeldBatcalcBinary(mb, stk, pci, "%", "weld.batcalcmod");
 }
 
+str
+WeldBatcalcIsNil(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       (void)cntxt;
+       int ret = getArg(pci, 0); /* bat[:bit] */
+       int bid = getArg(pci, 1); /* bat[:any_1] */
+       int sid = -1;
+       bat s;
+       if (pci->argc == 4) {
+               sid = getArg(pci, 2);
+               s = *getArgReference_bat(stk, pci, 2); /* might have value */
+       }
+       weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /* 
has value */
+       str any_1 = getWeldType(getBatType(getArgType(mb, pci, 0)));
+       char weldStmt[STR_SIZE_INC];
+       if (sid != -1) {
+               sprintf(weldStmt,
+               "let v%d = result("
+               "       for(%s, appender[i8], |b, i, oid|"
+               "               if(lookup(v%d, oid - v%dhseqbase) == %snil,"
+               "                       merge(b, 1c),"
+               "                       merge(b, 0c)"
+               "               )"
+               "       )"
+               ");"
+               "let v%dhseqbase = 0L",
+               ret, getWeldCandList(sid, s), bid, bid, any_1, ret);
+       } else {
+               sprintf(weldStmt,
+               "let v%d = result("
+               "       for(v%d, appender[i8], |b, i, x|"
+               "               if(x == %snil,"
+               "                       merge(b, 1c),"
+               "                       merge(b, 0c)"
+               "               )"
+               "       )"
+               ");"
+               "let v%dhseqbase = 0L;",
+               ret, bid, any_1, ret);  
+       }
+       appendWeldStmt(wstate, weldStmt);
+       return MAL_SUCCEED;
+}
+
+str
+WeldBatcalcIfThenElse(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       (void)cntxt;
+       int ret = getArg(pci, 0);                                               
                                   /* bat[:any_1] */
+       int cond = getArg(pci, 1);                                              
                                   /* bat[:bit] */
+       int bthen = getArg(pci, 2);                                             
                                   /* bat[:any_1] */
+       int belse = getArg(pci, 3);                                             
                                   /* bat[:any_1] */
+       weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /* 
has value */
+       str any_1 = getWeldType(getBatType(getArgType(mb, pci, 0)));
+       int bthenType = getArgType(mb, pci, 2);
+       int belseType = getArgType(mb, pci, 3);
+       char weldStmt[STR_SIZE_INC];
+       char bthenStmt[64], belseStmt[64];
+
+       if (isaBatType(bthenType)) {
+               sprintf(bthenStmt, "lookup(v%d, i)", bthen);
+       } else {
+               sprintf(bthenStmt, "v%d", bthen);
+       }
+       if (isaBatType(belseType)) {
+               sprintf(belseStmt, "lookup(v%d, i)", belse);
+       } else {
+               sprintf(belseStmt, "v%d", belse);
+       }
+   
+       sprintf(weldStmt,
+       "let v%d = result("
+       "       for (v%d, appender[?], |b, i, x|"
+       "               if(x == i8nil,"
+       "                       merge(b, %snil),"
+       "                       if(x != 0c,"
+       "                               merge(b, %s),"
+       "                               merge(b, %s)"
+       "                       )"
+       "               )"
+       "       )"
+       ");"
+       "let v%dhseqbase = 0L;",
+       ret, cond, any_1, bthenStmt, belseStmt, ret);
+       appendWeldStmt(wstate, weldStmt);
+       return MAL_SUCCEED;
+}
+
 /* Ignore the existing groups and instead use all the columns up to this point 
to
  * generate the new group ids. Weld will remove the unnecessary computations. 
e.g.:
  * g1, e1, h1 = group.group(col1)  -> for(zip(col1), dictmerger[ty1, i64, 
min]...
diff --git a/monetdb5/modules/mal/mal_weld.h b/monetdb5/modules/mal/mal_weld.h
--- a/monetdb5/modules/mal/mal_weld.h
+++ b/monetdb5/modules/mal/mal_weld.h
@@ -43,6 +43,8 @@ mal_export str WeldBatcalcEQsignal(Clien
 mal_export str WeldBatcalcGTsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldBatcalcGEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldBatcalcNEsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+mal_export str WeldBatcalcIsNil(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+mal_export str WeldBatcalcIfThenElse(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 mal_export str WeldGroup(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 mal_export str WeldAggrSubSum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldAggrSubProd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
diff --git a/monetdb5/modules/mal/mal_weld.mal 
b/monetdb5/modules/mal/mal_weld.mal
--- a/monetdb5/modules/mal/mal_weld.mal
+++ b/monetdb5/modules/mal/mal_weld.mal
@@ -120,6 +120,26 @@ pattern algebraintersect(l:bat[:any_1], 
 address WeldAlgebraIntersect
 comment "algebra.intersect";
 
+pattern batcalcisnil(b:bat[:any], wstate:ptr):bat[:bit]
+address WeldBatcalcIsNil
+comment "batcalcisnil";
+pattern batcalcisnil(b:bat[:any], s:bat[:oid], wstate:ptr):bat[:bit]
+address WeldBatcalcIsNil
+comment "batcalcisnil";
+
+pattern batcalcifthenelse(b:bat[:bit], b1:bat[:any_1], b2:bat[:any_1], 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], b1:bat[:any_1], v2:any_1, 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], v1:any_1, b2:bat[:any_1], 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], v1:any_1, v2:any_1, 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+
 pattern aggrsum(b:bat[:bte], wstate:ptr):bte
 address WeldAggrSum
 comment "aggr.sum";
diff --git a/monetdb5/modules/mal/mal_weld.mal.sh 
b/monetdb5/modules/mal/mal_weld.mal.sh
--- a/monetdb5/modules/mal/mal_weld.mal.sh
+++ b/monetdb5/modules/mal/mal_weld.mal.sh
@@ -130,6 +130,26 @@ pattern algebraintersect(l:bat[:any_1], 
 address WeldAlgebraIntersect
 comment "algebra.intersect";
 
+pattern batcalcisnil(b:bat[:any], wstate:ptr):bat[:bit]
+address WeldBatcalcIsNil
+comment "batcalcisnil";
+pattern batcalcisnil(b:bat[:any], s:bat[:oid], wstate:ptr):bat[:bit]
+address WeldBatcalcIsNil
+comment "batcalcisnil";
+
+pattern batcalcifthenelse(b:bat[:bit], b1:bat[:any_1], b2:bat[:any_1], 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], b1:bat[:any_1], v2:any_1, 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], v1:any_1, b2:bat[:any_1], 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+pattern batcalcifthenelse(b:bat[:bit], v1:any_1, v2:any_1, 
wstate:ptr):bat[:any_1]
+address WeldBatcalcIfThenElse
+comment "batcalc.ifthenelse";
+
 EOF
 
 for tp in ${numeric[@]}; do
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -152,6 +152,7 @@ str intersectRef;
 str intRef;
 str ioRef;
 str iteratorRef;
+str isnilRef;
 str jitRef;
 str joinRef;
 str jsonRef;
@@ -330,6 +331,8 @@ str weldBatcalcGtRef;
 str weldBatcalcGeRef;
 str weldBatcalcNeRef;
 str weldBatcalcIdentityRef;
+str weldBatcalcIsNilRef;
+str weldBatcalcIfThenElseRef;
 str weldBatMergeCandRef;
 str weldBatMirrorRef;
 str weldBatMtimeYearRef;
@@ -482,6 +485,7 @@ void optimizerInit(void)
        intRef = putName("int");
        ioRef = putName("io");
        iteratorRef = putName("iterator");
+       isnilRef = putName("isnil");
        projectionpathRef = putName("projectionpath");
        joinRef = putName("join");
        semijoinRef = putName("semijoin");
@@ -657,6 +661,8 @@ void optimizerInit(void)
        weldBatcalcGeRef = putName("batcalcge");
        weldBatcalcNeRef = putName("batcalcne");
        weldBatcalcIdentityRef = putName("batcalcidentity");
+       weldBatcalcIsNilRef = putName("batcalcisnil");
+       weldBatcalcIfThenElseRef = putName("batcalcifthenelse");
        weldBatMergeCandRef = putName("batmergecand");
        weldBatMirrorRef = putName("batmirror");
        weldBatMtimeYearRef = putName("batmtimeyear");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -151,6 +151,7 @@ mal_export  str intersectRef;
 mal_export  str intRef;
 mal_export  str ioRef;
 mal_export  str iteratorRef;
+mal_export  str isnilRef;
 mal_export  str jitRef;
 mal_export  str joinRef;
 mal_export  str jsonRef;
@@ -338,6 +339,8 @@ mal_export  str weldBatcalcGtRef;
 mal_export  str weldBatcalcGeRef;
 mal_export  str weldBatcalcNeRef;
 mal_export  str weldBatcalcIdentityRef;
+mal_export  str weldBatcalcIsNilRef;
+mal_export  str weldBatcalcIfThenElseRef;
 mal_export  str weldBatMergeCandRef;
 mal_export  str weldBatMirrorRef;
 mal_export  str weldBatMtimeYearRef;
diff --git a/monetdb5/optimizer/opt_weld.c b/monetdb5/optimizer/opt_weld.c
--- a/monetdb5/optimizer/opt_weld.c
+++ b/monetdb5/optimizer/opt_weld.c
@@ -18,7 +18,7 @@
 #include "mal_instruction.h"
 #include "opt_weld.h"
 
-#define NUM_WELD_INSTR 34
+#define NUM_WELD_INSTR 35
 #define UNMARKED 0
 #define TEMP_MARK 1
 #define PERM_MARK 2
@@ -70,6 +70,7 @@ static void initWeldInstrs(void) {
        addWeldInstr(batcalcRef, geRef, weldBatcalcGeRef);                      
                 /* batcalc.>= */
        addWeldInstr(batcalcRef, neRef, weldBatcalcNeRef);                      
                 /* batcalc.!= */
        addWeldInstr(batcalcRef, identityRef, weldBatcalcIdentityRef);          
 /* batcalc.identity */
+       addWeldInstr(batcalcRef, isnilRef, weldBatcalcIsNilRef);                
         /* batcalc.isnil */
        addWeldInstr(batRef, mergecandRef, weldBatMergeCandRef);                
         /* bat.mergecand */
        addWeldInstr(batRef, mirrorRef, weldBatMirrorRef);                      
                 /* bat.mirror */
        addWeldInstr(batmtimeRef, yearRef, weldBatMtimeYearRef);                
         /* batmtime.year */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to