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