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

Reply via email to