Changeset: f2763d96d71f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f2763d96d71f
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 aggr.subcount


diffs (150 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
@@ -1047,6 +1047,49 @@ WeldAggrSubMax(Client cntxt, MalBlkPtr m
 }
 
 str
+WeldAggrSubCount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       (void) cntxt;
+       int ret = getArg(pci, 0); /* any_1 */
+       int gid = getArg(pci, 2); /* bat[:oid] */
+       int eid = getArg(pci, 3); /* bat[:oid] */
+       int sid = getArg(pci, 4); /* bat[:oid] ? */
+       int sidType = getArgType(mb, pci, 4);
+       weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /* 
has value */
+       char weldStmt[STR_SIZE_INC];
+       sprintf(weldStmt,
+       "let empty = result("
+       "       for(rangeiter(0L, len(v%d), 1L), appender[i64], |b, i, x|"
+       "               merge(b, 0L)"
+       "       )"
+       ");",
+       eid);
+       if (isaBatType(sidType)) {
+               bat s = *getArgReference_bat(stk, pci, 4);              /* 
might have value */
+               sprintf(weldStmt + strlen(weldStmt),
+               "let v%d = result("
+               "       for(%s, vecmerger[i64, +](empty), |b, i, oid|"
+               "               let groupId = lookup(v%d, oid - v%dhseqbase);"
+               "               merge(b, {groupId, 1L})"
+               "       )"
+               ");"
+               "let v%dhseqbase = 0;",
+               ret, getWeldCandList(sid, s), gid, gid, ret);
+       } else {
+               sprintf(weldStmt + strlen(weldStmt),
+               "let v%d = result("
+               "       for(v%d, vecmerger[i64, +](empty), |b, i, x|"
+               "               merge(b, {x, 1L})"
+               "       )"
+               ");"
+               "let v%dhseqbase = 0;",
+               ret, gid, ret);
+       }
+       appendWeldStmt(wstate, weldStmt);
+       return MAL_SUCCEED;
+}
+
+str
 WeldBatMtimeYear(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 WeldAggrSubCount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldBatMtimeYear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldBatMergeCand(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WeldLanguagePass(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
@@ -77,6 +77,14 @@ pattern aggrsubmax(b:bat[:any_1], g:bat[
 address WeldAggrSubMax
 comment "aggr.submax";
 
+pattern aggrsubcount(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit, 
wstate:ptr):bat[:lng]
+address WeldAggrSubCount
+comment "aggr.subcount";
+
+pattern aggrsubcount(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit, wstate:ptr):bat[:lng]
+address WeldAggrSubCount
+comment "aggr.subcount";
+
 pattern sqlprojectdelta(select:bat[:oid], col:bat[:any_3], uid:bat[:oid], 
uval:bat[:any_3], wstate:ptr):bat[:any_3]
 address WeldSqlProjectDelta
 comment "sql.projectdelta";
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
@@ -87,6 +87,14 @@ pattern aggrsubmax(b:bat[:any_1], g:bat[
 address WeldAggrSubMax
 comment "aggr.submax";
 
+pattern aggrsubcount(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], skip_nils:bit, 
wstate:ptr):bat[:lng]
+address WeldAggrSubCount
+comment "aggr.subcount";
+
+pattern aggrsubcount(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid], 
skip_nils:bit, wstate:ptr):bat[:lng]
+address WeldAggrSubCount
+comment "aggr.subcount";
+
 pattern sqlprojectdelta(select:bat[:oid], col:bat[:any_3], uid:bat[:oid], 
uval:bat[:any_3], wstate:ptr):bat[:any_3]
 address WeldSqlProjectDelta
 comment "sql.projectdelta";
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
@@ -305,6 +305,7 @@ str updateRef;
 str userRef;
 str vectorRef;
 str weldAddArgRef;
+str weldAggrSubCountRef;
 str weldAggrSubMaxRef;
 str weldAggrSubMinRef;
 str weldAggrSubProdRef;
@@ -625,6 +626,7 @@ void optimizerInit(void)
        updateRef = putName("update");
        userRef = putName("user");
        weldAddArgRef = putName("addarg");
+       weldAggrSubCountRef = putName("aggrsubcount");
        weldAggrSubMaxRef = putName("aggrsubmax");
        weldAggrSubMinRef = putName("aggrsubmin");
        weldAggrSubProdRef = putName("aggrsubprod");
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
@@ -313,6 +313,7 @@ mal_export  str updateRef;
 mal_export  str userRef;
 mal_export  str vectorRef;
 mal_export  str weldAddArgRef;
+mal_export  str weldAggrSubCountRef;
 mal_export  str weldAggrSubMaxRef;
 mal_export  str weldAggrSubMinRef;
 mal_export  str weldAggrSubProdRef;
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 27
+#define NUM_WELD_INSTR 28
 #define UNMARKED 0
 #define TEMP_MARK 1
 #define PERM_MARK 2
@@ -46,6 +46,7 @@ static void initWeldInstrs(void) {
        /* When adding or removing instructions NUM_WELD_INSTR should be 
updated */
        int i = 0;
        addWeldInstr(aggrRef, sumRef, weldAggrSumRef);                          
                 /* aggr.sum */
+       addWeldInstr(aggrRef, subcountRef, weldAggrSubCountRef);                
         /* aggr.subcount */
        addWeldInstr(aggrRef, submaxRef, weldAggrSubMaxRef);                    
         /* aggr.submax */
        addWeldInstr(aggrRef, subminRef, weldAggrSubMinRef);                    
         /* aggr.submin */
        addWeldInstr(aggrRef, subprodRef, weldAggrSubProdRef);                  
         /* aggr.subprod */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to