Changeset: b31f168fdcd0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b31f168fdcd0 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 batmtime.year diffs (151 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 @@ -972,6 +972,35 @@ WeldAggrSubMax(Client cntxt, MalBlkPtr m } str +WeldBatMtimeYear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + (void) mb; + int ret = getArg(pci, 0); /* bat[:int] */ + int bid = getArg(pci, 1); /* bat[:date] */ + weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /* has value */ + char weldStmt[STR_SIZE_INC]; + /* Only works for days >= 0. Logic taken from mtime.c */ + sprintf(weldStmt, + "let v%d = result(" + " for(v%d, appender[i32], |b, i, x|" + " let year = x / 365;" + " let leapyears = (year - 1) / 4 + (year - 1) / 400 - (year - 1) / 100 + 1;" + " let day = (x - year * 365) - leapyears;" + " merge(b," + " iterate({day, year}, |p|" + " let year = p.$1 - 1;" + " let isLeap = year %% 4 == 0 && (year %% 100 != 0 || year %% 400 == 0);" + " {{p.$0 + if(isLeap, 366, 365), year}, p.$0 < 0}).$1 + 1)" + " )" + ");" + "let v%dhseqbase = 0L;", + ret, bid, ret); + appendWeldStmt(wstate, weldStmt); + return MAL_SUCCEED; +} + +str WeldLanguagePass(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { (void) cntxt; 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 @@ -42,6 +42,7 @@ mal_export str WeldAggrSubSum(Client cnt mal_export str WeldAggrSubProd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldAggrSubMin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldAggrSubMax(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +mal_export str WeldBatMtimeYear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mal_export str WeldLanguagePass(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); #endif 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 @@ -85,6 +85,10 @@ pattern sqlprojectdelta(select:bat[:oid] address WeldSqlProjectDelta comment "sql.projectdelta"; +pattern batmtimeyear(d:bat[:date], wstate:ptr):bat[:int] +address WeldBatMtimeYear +comment "batmtime.year"; + 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 @@ -95,6 +95,10 @@ pattern sqlprojectdelta(select:bat[:oid] address WeldSqlProjectDelta comment "sql.projectdelta"; +pattern batmtimeyear(d:bat[:date], wstate:ptr):bat[:int] +address WeldBatMtimeYear +comment "batmtime.year"; + 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 @@ -324,6 +324,7 @@ str weldBatcalcLeRef; str weldBatcalcGtRef; str weldBatcalcGeRef; str weldBatcalcNeRef; +str weldBatMtimeYearRef; str weldGetResultRef; str weldGroupRef; str weldInitStateRef; @@ -333,6 +334,7 @@ str weldRunRef; str weldSqlProjectDeltaRef; str wlcRef; str wlrRef; +str yearRef; str zero_or_oneRef; void optimizerInit(void) @@ -641,6 +643,7 @@ void optimizerInit(void) weldBatcalcGtRef = putName("batcalcgt"); weldBatcalcGeRef = putName("batcalcge"); weldBatcalcNeRef = putName("batcalcne"); + weldBatMtimeYearRef = putName("batmtimeyear"); weldGetResultRef = putName("getresult"); weldGroupRef = putName("groupgroup"); weldInitStateRef = putName("initstate"); @@ -650,6 +653,7 @@ void optimizerInit(void) weldSqlProjectDeltaRef = putName("sqlprojectdelta"); wlcRef = putName("wlc"); wlrRef = putName("wlr"); + yearRef = putName("year"); selectRef = putName("select"); thetaselectRef = putName("thetaselect"); vectorRef = putName("vector"); 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 @@ -332,6 +332,7 @@ mal_export str weldBatcalcLeRef; mal_export str weldBatcalcGtRef; mal_export str weldBatcalcGeRef; mal_export str weldBatcalcNeRef; +mal_export str weldBatMtimeYearRef; mal_export str weldGetResultRef; mal_export str weldGroupRef; mal_export str weldInitStateRef; @@ -341,5 +342,6 @@ mal_export str weldRunRef; mal_export str weldSqlProjectDeltaRef; mal_export str wlcRef; mal_export str wlrRef; +mal_export str yearRef; mal_export str zero_or_oneRef; #endif 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 25 +#define NUM_WELD_INSTR 26 #define UNMARKED 0 #define TEMP_MARK 1 #define PERM_MARK 2 @@ -64,6 +64,7 @@ static void initWeldInstrs(void) { addWeldInstr(batcalcRef, gtRef, weldBatcalcGtRef); /* batcalc.> */ addWeldInstr(batcalcRef, geRef, weldBatcalcGeRef); /* batcalc.>= */ addWeldInstr(batcalcRef, neRef, weldBatcalcNeRef); /* batcalc.!= */ + addWeldInstr(batmtimeRef, yearRef, weldBatMtimeYearRef); /* batmtime.year */ addWeldInstr(languageRef, passRef, weldLanguagePassRef); /* language.pass */ addWeldInstr(groupRef, groupRef, weldGroupRef); /* group.group*/ addWeldInstr(groupRef, subgroupRef, weldGroupRef); /* group.subgroup */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list