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