Changeset: 2b04c33c75e5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2b04c33c75e5
Modified Files:
monetdb5/modules/mal/mal_weld.c
Branch: mal-weld
Log Message:
weld aggr.subcount with skip_nils
diffs (147 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
@@ -86,7 +86,7 @@ static str getWeldUTypeFromWidth(int wid
return "u64";
}
-static void getOrSetStructMember(char **addr, int type, void *value, int op) {
+static void getOrSetStructMember(char **addr, int type, const void *value, int
op) {
if (type == TYPE_bte) {
getOrSetStructMemberImpl(addr, char, value, op);
} else if (type == TYPE_int) {
@@ -196,13 +196,15 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
}
}
/* Min/Max constants for the Weld types */
- if (inputLen + 128 > inputMaxLen) {
+ if (inputLen + 512 > inputMaxLen) {
inputMaxLen += STR_SIZE_INC;
inputStmt = realloc(inputStmt, inputMaxLen * sizeof(char));
}
inputLen += sprintf(inputStmt + inputLen,
"i8MIN:i8, i8MAX:i8,
i32MIN:i32, i32MAX:i32, i64MIN:i64, i64MAX:i64, "
- "f32MIN:f32, f32MAX:f32,
f64MIN:f64, f64MAX:f64 ");
+ "f32MIN:f32, f32MAX:f32,
f64MIN:f64, f64MAX:f64, ");
+ inputLen += sprintf(inputStmt + inputLen,
+ "i8nil:i8, i32nil:i32,
oidnil:i64, i64nil:i64, f32nil:f32, f64nil:f64, ");
inputStmt[0] = '|';
inputStmt[inputLen - 1] = '|';
@@ -284,6 +286,12 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
getOrSetStructMember(&inputPtr, TYPE_flt, &weldMinMaxInst.f32max,
OP_SET);
getOrSetStructMember(&inputPtr, TYPE_dbl, &weldMinMaxInst.f64min,
OP_SET);
getOrSetStructMember(&inputPtr, TYPE_dbl, &weldMinMaxInst.f64max,
OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_bte, &bte_nil, OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_int, &int_nil, OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_lng, &lng_nil, OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_oid, &oid_nil, OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_flt, &flt_nil, OP_SET);
+ getOrSetStructMember(&inputPtr, TYPE_dbl, &dbl_nil, OP_SET);
weld_value_t arg = weld_value_new(inputStruct);
conf = weld_conf_new();
@@ -304,7 +312,7 @@ WeldRun(Client cntxt, MalBlkPtr mb, MalS
/* TODO check if the sorted props are important for the
rest of the execution */
b->tsorted = b->trevsorted = 0;
if (getBatType(type) == TYPE_str) {
- char *base;
+ char *base = NULL;
long size;
getOrSetStructMember(&outputStruct, TYPE_str,
&base, OP_GET);
getOrSetStructMember(&outputStruct, TYPE_lng,
&size, OP_GET);
@@ -1055,11 +1063,20 @@ str
WeldAggrSubCount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
(void) cntxt;
- int ret = getArg(pci, 0); /* any_1 */
+ (void) mb;
+ int ret = getArg(pci, 0); /* bat[:lng] */
+ int bid = getArg(pci, 1); /* bat[: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);
+ int sid = -1;
+ int skip_nils;
+ if (pci->argc == 6) {
+ skip_nils = *getArgReference_bit(stk, pci, 4);
+ } else {
+ sid = getArg(pci, 4);
+ skip_nils = *getArgReference_bit(stk, pci, 5);
+ }
+ int bidType = getBatType(getArgType(mb, pci, 1));
weldState *wstate = *getArgReference_ptr(stk, pci, pci->argc - 1); /*
has value */
char weldStmt[STR_SIZE_INC];
sprintf(weldStmt,
@@ -1069,26 +1086,52 @@ WeldAggrSubCount(Client cntxt, MalBlkPtr
" )"
");",
eid);
- if (isaBatType(sidType)) {
+ if (sid != -1) {
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 = 0L;",
- ret, getWeldCandList(sid, s), gid, gid, ret);
+ if (skip_nils) {
+ sprintf(weldStmt + strlen(weldStmt),
+ "let v%d = result("
+ " for(%s, vecmerger[i64, +](empty), |b, i, oid|"
+ " let groupId = lookup(v%d, oid -
v%dhseqbase);"
+ " let value = lookup(v%d, oid -
v%dhseqbase);"
+ " if(value != %snil, merge(b, {groupId,
1L}), b)"
+ " )"
+ ");"
+ "let v%dhseqbase = 0L;",
+ ret, getWeldCandList(sid, s), gid, gid, bid, bid,
bidType == TYPE_oid ? "oid" : getWeldType(bidType), ret);
+ } else {
+ 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 = 0L;",
+ 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 = 0L;",
- ret, gid, ret);
+ if (skip_nils) {
+ sprintf(weldStmt + strlen(weldStmt),
+ "let v%d = result("
+ " for(zip(v%d, v%d), vecmerger[i64, +](empty),
|b, i, x|"
+ " let groupId = x.$0;"
+ " let value = x.$1;"
+ " if(value != %snil, merge(b, {groupId,
1L}), b)"
+ " )"
+ ");"
+ "let v%dhseqbase = 0L;",
+ ret, gid, bid, bidType == TYPE_oid ? "oid" :
getWeldType(bidType), 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 = 0L;",
+ ret, gid, ret);
+ }
}
appendWeldStmt(wstate, weldStmt);
return MAL_SUCCEED;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list