Changeset: 9342b0732906 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9342b0732906
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/modules/weldudfs/weld_udfs.c
monetdb5/modules/weldudfs/weld_udfs.h
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
monetdb5/optimizer/opt_weld.c
Branch: mal-weld
Log Message:
weld impl for algebra.difference algebrea.intersect batcalc.and
diffs (truncated from 426 to 300 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
@@ -800,6 +800,13 @@ WeldBatcalcBinary(MalBlkPtr mb, MalStkPt
}
str
+WeldBatcalcANDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ (void) cntxt;
+ return WeldBatcalcBinary(mb, stk, pci, "&", "weld.batcalcadd");
+}
+
+str
WeldBatcalcADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
(void) cntxt;
@@ -1304,6 +1311,78 @@ WeldAlgebraJoin(Client cntxt, MalBlkPtr
}
str
+WeldAlgebraDifference(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ (void) cntxt;
+ int ret = getArg(pci, 0);
/* bat[:oid] */
+ int left = getArg(pci, 1);
/* bat[:any_1] */
+ int right = getArg(pci, 2);
/* bat[:any_1] */
+ int sleft = getArg(pci, 3);
/* bat[:oid] */
+ int sright = getArg(pci, 4);
/* bat[:oid] */
+ int nilMatches = getArg(pci, 5);
/* bit */
+ int estimate = getArg(pci, 6);
/* lng */
+ weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /*
has value */
+
+ str any_1 = getWeldType(getBatType(getArgType(mb, pci, 1)));
+ bat sleftBat = *getArgReference_bat(stk, pci, 3);
+ bat srightBat = *getArgReference_bat(stk, pci, 4);
+ char weldStmt[STR_SIZE_INC];
+ if (is_bat_nil(sleftBat) && is_bat_nil(srightBat)) {
+ sprintf(weldStmt,
+ "let diffResult = cudf[weldDifferenceNoCandList%s, {vec[i64],
i32}](v%d, v%d, v%d, v%d);",
+ any_1, left, right, nilMatches, estimate);
+ } else {
+ sprintf(weldStmt,
+ "let diffResult = cudf[weldDifference%s, {vec[i64], i32}](v%d,
v%d, v%d, v%d, v%d, v%d);",
+ any_1, left, right, sleft, sright, nilMatches, estimate);
+ }
+ sprintf(weldStmt + strlen(weldStmt),
+ "let v%d = diffResult.$0;"
+ "let v%dbat = diffResult.$1;"
+ "let v%dhseqbase = 0L;",
+ ret, ret, ret);
+ wstate->cudfOutputs[ret] = 1;
+ appendWeldStmt(wstate, weldStmt);
+ return MAL_SUCCEED;
+}
+
+str
+WeldAlgebraIntersect(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ (void) cntxt;
+ int ret = getArg(pci, 0);
/* bat[:oid] */
+ int left = getArg(pci, 1);
/* bat[:any_1] */
+ int right = getArg(pci, 2);
/* bat[:any_1] */
+ int sleft = getArg(pci, 3);
/* bat[:oid] */
+ int sright = getArg(pci, 4);
/* bat[:oid] */
+ int nilMatches = getArg(pci, 5);
/* bit */
+ int estimate = getArg(pci, 6);
/* lng */
+ weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /*
has value */
+
+ str any_1 = getWeldType(getBatType(getArgType(mb, pci, 1)));
+ bat sleftBat = *getArgReference_bat(stk, pci, 3);
+ bat srightBat = *getArgReference_bat(stk, pci, 4);
+ char weldStmt[STR_SIZE_INC];
+ if (is_bat_nil(sleftBat) && is_bat_nil(srightBat)) {
+ sprintf(weldStmt,
+ "let interResult = cudf[weldIntersectNoCandList%s, {vec[i64],
i32}](v%d, v%d, v%d, v%d);",
+ any_1, left, right, nilMatches, estimate);
+ } else {
+ sprintf(weldStmt,
+ "let interResult = cudf[weldIntersect%s, {vec[i64], i32}](v%d,
v%d, v%d, v%d, v%d, v%d);",
+ any_1, left, right, sleft, sright, nilMatches, estimate);
+ }
+ sprintf(weldStmt + strlen(weldStmt),
+ "let v%d = interResult.$0;"
+ "let v%dbat = interResult.$1;"
+ "let v%dhseqbase = 0L;",
+ ret, ret, ret);
+ wstate->cudfOutputs[ret] = 1;
+ 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
@@ -31,6 +31,7 @@ mal_export str WeldAlgebraSelect1(Client
mal_export str WeldAlgebraSelect2(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldAlgebraThetaselect1(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
mal_export str WeldAlgebraThetaselect2(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
+mal_export str WeldBatcalcANDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldBatcalcADDsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldBatcalcSUBsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldBatcalcMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
@@ -53,6 +54,8 @@ mal_export str WeldBatMergeCand(Client c
mal_export str WeldBatMirror(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldBatcalcIdentity(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
mal_export str WeldAlgebraJoin(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
+mal_export str WeldAlgebraDifference(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
+mal_export str WeldAlgebraIntersect(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
@@ -113,6 +113,14 @@ pattern algebrajoin(l:bat[:any_1], r:bat
address WeldAlgebraJoin
comment "algebra.join"
+pattern algebradifference(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid],
sr:bat[:oid], nil_matches:bit, estimate:lng, wstate:ptr):bat[:oid]
+address WeldAlgebraDifference
+comment "algebra.difference";
+
+pattern algebraintersect(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid],
sr:bat[:oid], nil_matches:bit, estimate:lng, wstate:ptr):bat[:oid]
+address WeldAlgebraIntersect
+comment "algebra.intersect";
+
pattern aggrsum(b:bat[:bte], wstate:ptr):bte
address WeldAggrSum
comment "aggr.sum";
@@ -2637,6 +2645,25 @@ pattern batcalcne(v:any_1, b:bat[:any_1]
address WeldBatcalcNEsignal
comment "batcalcne with candidates list";
+pattern batcalcand(b1:bat[:any_1], b2:bat[:any_1], wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand";
+pattern batcalcand(b1:bat[:any_1], b2:bat[:any_1], s:bat[:oid],
wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand with candidates list";
+pattern batcalcand(b:bat[:any_1], v:any_1, wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand";
+pattern batcalcand(b:bat[:any_1], v:any_1, s:bat[:oid], wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand with candidates list";
+pattern batcalcand(v:any_1, b:bat[:any_1], wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand";
+pattern batcalcand(v:any_1, b:bat[:any_1], s:bat[:oid], wstate:ptr):bat[:bit]
+address WeldBatcalcANDsignal
+comment "batcalcand with candidates list";
+
pattern language.pass(v:any_1, wstate:ptr):void
address WeldLanguagePass
comment "language.pass";
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
@@ -123,6 +123,14 @@ pattern algebrajoin(l:bat[:any_1], r:bat
address WeldAlgebraJoin
comment "algebra.join"
+pattern algebradifference(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid],
sr:bat[:oid], nil_matches:bit, estimate:lng, wstate:ptr):bat[:oid]
+address WeldAlgebraDifference
+comment "algebra.difference";
+
+pattern algebraintersect(l:bat[:any_1], r:bat[:any_1], sl:bat[:oid],
sr:bat[:oid], nil_matches:bit, estimate:lng, wstate:ptr):bat[:oid]
+address WeldAlgebraIntersect
+comment "algebra.intersect";
+
EOF
for tp in ${numeric[@]}; do
@@ -177,7 +185,7 @@ EOF
done
done
-for func in batcalclt:LT batcalcle:LE batcalceq:EQ batcalcgt:GT batcalcge:GE
batcalcne:NE; do
+for func in batcalclt:LT batcalcle:LE batcalceq:EQ batcalcgt:GT batcalcge:GE
batcalcne:NE batcalcand:AND; do
name=${func#*:}
op=${func%:*}
cat <<EOF
diff --git a/monetdb5/modules/weldudfs/weld_udfs.c
b/monetdb5/modules/weldudfs/weld_udfs.c
--- a/monetdb5/modules/weldudfs/weld_udfs.c
+++ b/monetdb5/modules/weldudfs/weld_udfs.c
@@ -102,3 +102,101 @@ joinImpl(TYPE_int, i32);
joinImpl(TYPE_oid, i64);
joinImpl(TYPE_flt, f32);
joinImpl(TYPE_dbl, f64);
+
+/* TODO - for now it only works for non string BATs */
+static void weldDifference(void *l, int ltype, void *r, int rtype, void *sl,
void *sr, bit *nilmatches,
+ lng *estimate, void *result) {
+ BAT *lbat = weldVecToBat(((WeldVec *)l)->data, ((WeldVec *)l)->length,
ltype);
+ BAT *rbat = weldVecToBat(((WeldVec *)r)->data, ((WeldVec *)r)->length,
rtype);
+ BAT *slbat =
+ sl == NULL ? NULL : weldVecToBat(((WeldVec *)sl)->data,
((WeldVec *)sl)->length, TYPE_oid);
+ BAT *srbat =
+ sr == NULL ? NULL : weldVecToBat(((WeldVec *)sr)->data,
((WeldVec *)sr)->length, TYPE_oid);
+ bat r1;
+ bat lid = lbat->batCacheid;
+ bat rid = rbat->batCacheid;
+ bat slid = slbat == NULL ? bat_nil : slbat->batCacheid;
+ bat srid = srbat == NULL ? bat_nil : srbat->batCacheid;
+ ALGdifference(&r1, &lid, &rid, &slid, &srid, nilmatches, estimate);
+
+ /* Tell gdk not to free weld's data */
+ lbat->theap.base = NULL;
+ rbat->theap.base = NULL;
+ if (slbat != NULL) slbat->theap.base = NULL;
+ if (srbat != NULL) srbat->theap.base = NULL;
+
+ BAT *r1bat = BATdescriptor(r1);
+ r1bat = replaceDenseBat(r1bat, TYPE_oid);
+
+ /* result is a pointer to a struct with 1 weld vector and 1 int */
+ char *resultPtr = result;
+ getOrSetStructMember(&resultPtr, TYPE_ptr, &r1bat->theap.base, OP_SET);
+ getOrSetStructMember(&resultPtr, TYPE_lng, &r1bat->batCount, OP_SET);
+ getOrSetStructMember(&resultPtr, TYPE_bat, &r1bat->batCacheid, OP_SET);
+}
+
+#define differenceImpl(MTYPE, WTYPE)
\
+ mal_export void weldDifferenceNoCandList##WTYPE(
\
+ WeldVec##WTYPE *l, WeldVec##WTYPE *r, bit *nilmatches, lng
*estimate, void *result) { \
+ weldDifference(l, MTYPE, r, MTYPE, NULL, NULL, nilmatches,
estimate, result); \
+ }
\
+ mal_export void weldDifference##WTYPE(WeldVec##WTYPE *l, WeldVec##WTYPE
*r, \
+
WeldVec##WTYPE *sl, WeldVec##WTYPE *sr, bit *nilmatches, \
+
lng *estimate, void *result) { \
+ weldDifference(l, MTYPE, r, MTYPE, sl, sr, nilmatches,
estimate, result); \
+ }
+
+differenceImpl(TYPE_bte, i8);
+differenceImpl(TYPE_int, i32);
+differenceImpl(TYPE_oid, i64);
+differenceImpl(TYPE_flt, f32);
+differenceImpl(TYPE_dbl, f64);
+
+/* TODO - for now it only works for non string BATs */
+static void weldIntersect(void *l, int ltype, void *r, int rtype, void *sl,
void *sr, bit *nilmatches,
+ lng *estimate, void *result) {
+ BAT *lbat = weldVecToBat(((WeldVec *)l)->data, ((WeldVec *)l)->length,
ltype);
+ BAT *rbat = weldVecToBat(((WeldVec *)r)->data, ((WeldVec *)r)->length,
rtype);
+ BAT *slbat =
+ sl == NULL ? NULL : weldVecToBat(((WeldVec *)sl)->data,
((WeldVec *)sl)->length, TYPE_oid);
+ BAT *srbat =
+ sr == NULL ? NULL : weldVecToBat(((WeldVec *)sr)->data,
((WeldVec *)sr)->length, TYPE_oid);
+ bat r1;
+ bat lid = lbat->batCacheid;
+ bat rid = rbat->batCacheid;
+ bat slid = slbat == NULL ? bat_nil : slbat->batCacheid;
+ bat srid = srbat == NULL ? bat_nil : srbat->batCacheid;
+ ALGintersect(&r1, &lid, &rid, &slid, &srid, nilmatches, estimate);
+
+ /* Tell gdk not to free weld's data */
+ lbat->theap.base = NULL;
+ rbat->theap.base = NULL;
+ if (slbat != NULL) slbat->theap.base = NULL;
+ if (srbat != NULL) srbat->theap.base = NULL;
+
+ BAT *r1bat = BATdescriptor(r1);
+ r1bat = replaceDenseBat(r1bat, TYPE_oid);
+
+ /* result is a pointer to a struct with 1 weld vector and 1 int */
+ char *resultPtr = result;
+ getOrSetStructMember(&resultPtr, TYPE_ptr, &r1bat->theap.base, OP_SET);
+ getOrSetStructMember(&resultPtr, TYPE_lng, &r1bat->batCount, OP_SET);
+ getOrSetStructMember(&resultPtr, TYPE_bat, &r1bat->batCacheid, OP_SET);
+}
+
+#define intersectImpl(MTYPE, WTYPE)
\
+ mal_export void weldIntersectNoCandList##WTYPE(WeldVec##WTYPE *l,
WeldVec##WTYPE *r, \
+
bit *nilmatches, lng *estimate, void *result) { \
+ weldIntersect(l, MTYPE, r, MTYPE, NULL, NULL, nilmatches,
estimate, result); \
+ }
\
+ mal_export void weldIntersect##WTYPE(WeldVec##WTYPE *l, WeldVec##WTYPE
*r, WeldVec##WTYPE *sl, \
+
WeldVec##WTYPE *sr, bit *nilmatches, lng *estimate, \
+
void *result) { \
+ weldIntersect(l, MTYPE, r, MTYPE, sl, sr, nilmatches, estimate,
result); \
+ }
+
+intersectImpl(TYPE_bte, i8);
+intersectImpl(TYPE_int, i32);
+intersectImpl(TYPE_oid, i64);
+intersectImpl(TYPE_flt, f32);
+intersectImpl(TYPE_dbl, f64);
diff --git a/monetdb5/modules/weldudfs/weld_udfs.h
b/monetdb5/modules/weldudfs/weld_udfs.h
--- a/monetdb5/modules/weldudfs/weld_udfs.h
+++ b/monetdb5/modules/weldudfs/weld_udfs.h
@@ -18,20 +18,39 @@ typedef struct {
lng length;
} WeldVec;
-#define joinStructAndFunc(CTYPE, WTYPE)
\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list