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

Reply via email to