Changeset: c4a7c1ca33b7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c4a7c1ca33b7 Modified Files: monetdb5/extras/jaql/Tests/group00.mal monetdb5/extras/jaql/Tests/group00.stable.out monetdb5/extras/jaql/jaqlgencode.c Branch: jacqueline Log Message:
funcs: make array arguments from array variables work
This is a limited fix to recognise an array result, and pass it onto the
(aggregate) function. The limitation here is that if we reference e.g.
a pair member, the code will not recognise it's dealing with an array.
It needs to be deferred to runtime.
diffs (truncated from 627 to 300 lines):
diff --git a/monetdb5/extras/jaql/Tests/group00.mal
b/monetdb5/extras/jaql/Tests/group00.mal
--- a/monetdb5/extras/jaql/Tests/group00.mal
+++ b/monetdb5/extras/jaql/Tests/group00.mal
@@ -4,3 +4,5 @@ jaql.x("[1,2,3]->group into sum($);");
jaql.x("[{\"a\":1.1},2,3.7,false,null]->group into count($);");
jaql.x("[{\"a\":1},{\"a\":2.4},{\"a\":3}]->group into sum($.a);");
+
+jaql.x("[[1,2,3]] -> transform {\"sum\": sum($[*])};");
diff --git a/monetdb5/extras/jaql/Tests/group00.stable.out
b/monetdb5/extras/jaql/Tests/group00.stable.out
--- a/monetdb5/extras/jaql/Tests/group00.stable.out
+++ b/monetdb5/extras/jaql/Tests/group00.stable.out
@@ -20,11 +20,13 @@ function user.main():void;
jaql.x("[1,2,3]->group into sum($);");
jaql.x("[{\"a\":1.1},2,3.7,false,null]->group into count($);");
jaql.x("[{\"a\":1},{\"a\":2.4},{\"a\":3}]->group into sum($.a);");
+ jaql.x("[[1,2,3]] -> transform {\"sum\": sum($[*])};");
end main;
[ 3 ]
[ 6 ]
[ 5 ]
[ 6.400000 ]
+[ { "sum": 6 } ]
# 21:51:36 >
# 21:51:36 > "Done."
diff --git a/monetdb5/extras/jaql/jaqlgencode.c
b/monetdb5/extras/jaql/jaqlgencode.c
--- a/monetdb5/extras/jaql/jaqlgencode.c
+++ b/monetdb5/extras/jaql/jaqlgencode.c
@@ -3183,7 +3183,15 @@ dumpvariabletransformation(jc *j, Client
assert(w->tval1 != NULL);
switch (w->tval1->type) {
+ enum treetype oarrtrg = j_invalid;
case j_var:
+ if (w->tval1->tval2 != NULL &&
+
w->tval1->tval2->nval == -1)
+ {
+ oarrtrg = coltypes[i];
+ coltypes[i] =
j_json_arr;
+ }
+
b =
dumpvariabletransformation(j, cntxt, mb, w->tval1, elems,
j1, j2, j3, j4,
j5, j6, j7);
switch (coltypes[i]) {
@@ -3213,6 +3221,7 @@ dumpvariabletransformation(jc *j, Client
q =
pushArgument(mb, q, *j6);
q =
pushArgument(mb, q, *j7);
q =
pushArgument(mb, q, b);
+ q = pushOid(mb,
q, (oid)0);
dynaarg[i][0] =
getArg(q, 0);
dynaarg[i][1] =
getArg(q, 1);
dynaarg[i][2] =
getArg(q, 2);
@@ -3222,6 +3231,296 @@ dumpvariabletransformation(jc *j, Client
dynaarg[i][6] =
getArg(q, 6);
pushInstruction(mb, q);
break;
+ case j_sort_arg:
+ case j_json_arr:
+ if (coltypes[i]
== j_json_arr) {
+
coltypes[i] = oarrtrg;
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, batRef);
+
setFunctionId(q, reverseRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ b =
getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, algebraRef);
+
setFunctionId(q, joinRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, *j5);
+ b =
getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, batRef);
+
setFunctionId(q, reverseRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ b =
getArg(q, 0);
+
pushInstruction(mb, q);
+ }
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
batRef);
+
setFunctionId(q, newRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushType(mb, q, TYPE_oid);
+ q =
pushType(mb, q, TYPE_bte);
+ c = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
batRef);
+
setFunctionId(q, insertRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, c);
+ q = pushOid(mb,
q, (oid)0);
+ q = pushBte(mb,
q, 'a');
+ c = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
algebraRef);
+
setFunctionId(q, putName("kdifference", 11));
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, *j1);
+ q =
pushArgument(mb, q, c);
+ a = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
batRef);
+
setFunctionId(q, insertRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, c);
+ q =
pushArgument(mb, q, a);
+ a = getArg(q,
0);
+
pushInstruction(mb, q);
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
algebraRef);
+
setFunctionId(q, projectRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ q = pushOid(mb,
q, (oid)0);
+ b = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
batRef);
+
setFunctionId(q, reverseRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ b = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
algebraRef);
+
setFunctionId(q, putName("kdifference", 11));
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, *j5);
+ q =
pushArgument(mb, q, b);
+ c = getArg(q,
0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
batRef);
+
setFunctionId(q, insertRef);
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, c);
+ b = getArg(q,
0);
+
pushInstruction(mb, q);
+ /* a = j1, b =
j5 */
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q,
putName("json", 4));
+
setFunctionId(q, putName("unwraptype", 10));
+ q =
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, a);
+ q =
pushArgument(mb, q, *j2);
+ q =
pushArgument(mb, q, *j3);
+ q =
pushArgument(mb, q, *j4);
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, *j6);
+ q =
pushArgument(mb, q, *j7);
+ dynaarg[i][0] =
getArg(q, 0);
+
pushInstruction(mb, q);
+
+ e = -1;
+ if
(dynaarg[i][1] == 0) {
+ c =
newBatType(TYPE_oid, TYPE_str);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, c));
+ q =
pushNil(mb, q, c);
+ d =
getArg(q, 0);
+
pushInstruction(mb, q);
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, calcRef);
+
setFunctionId(q, putName("==", 2));
+
q->barrier = BARRIERsymbol;
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, dynaarg[i][0]);
+ q =
pushStr(mb, q, "str");
+ e =
getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, putName("json", 4));
+
setFunctionId(q, putName("unwrap", 6));
+ q =
pushReturn(mb, q, c);
+ q =
pushArgument(mb, q, a);
+ q =
pushArgument(mb, q, *j2);
+ q =
pushArgument(mb, q, *j3);
+ q =
pushArgument(mb, q, *j4);
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, *j6);
+ q =
pushArgument(mb, q, *j7);
+ q =
pushStr(mb, q, "");
+
dynaarg[i][1] = getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newAssignment(mb);
+
getArg(q, 0) = e;
+ q->argc
= q->retc = 1;
+
q->barrier = EXITsymbol;
+ }
+
+ f = -1;
+ if
(dynaarg[i][2] == 0) {
+ c =
newBatType(TYPE_oid, TYPE_dbl);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, c));
+ q =
pushNil(mb, q, c);
+ d =
getArg(q, 0);
+
pushInstruction(mb, q);
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, calcRef);
+
setFunctionId(q, putName("==", 2));
+
q->barrier = BARRIERsymbol;
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, dynaarg[i][0]);
+ q =
pushStr(mb, q, "dbl");
+ f =
getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, putName("json", 4));
+
setFunctionId(q, putName("unwrap", 6));
+ q =
pushReturn(mb, q, d);
+ q =
pushArgument(mb, q, a);
+ q =
pushArgument(mb, q, *j2);
+ q =
pushArgument(mb, q, *j3);
+ q =
pushArgument(mb, q, *j4);
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, *j6);
+ q =
pushArgument(mb, q, *j7);
+ q =
pushDbl(mb, q, 0.0);
+
dynaarg[i][2] = getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newAssignment(mb);
+
getArg(q, 0) = f;
+ q->argc
= q->retc = 1;
+
q->barrier = EXITsymbol;
+ }
+
+ g = -1;
+ if
(dynaarg[i][3] == 0) {
+ c =
newBatType(TYPE_oid, TYPE_lng);
+ q =
newInstruction(mb, ASSIGNsymbol);
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, c));
+ q =
pushNil(mb, q, c);
+ d =
getArg(q, 0);
+
pushInstruction(mb, q);
+
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, calcRef);
+
setFunctionId(q, putName("==", 2));
+
q->barrier = BARRIERsymbol;
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, dynaarg[i][0]);
+ q =
pushStr(mb, q, "lng");
+ g =
getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, putName("json", 4));
+
setFunctionId(q, putName("unwrap", 6));
+ q =
pushReturn(mb, q, d);
+ q =
pushArgument(mb, q, a);
+ q =
pushArgument(mb, q, *j2);
+ q =
pushArgument(mb, q, *j3);
+ q =
pushArgument(mb, q, *j4);
+ q =
pushArgument(mb, q, b);
+ q =
pushArgument(mb, q, *j6);
+ q =
pushArgument(mb, q, *j7);
+ q =
pushLng(mb, q, 0);
+
dynaarg[i][3] = getArg(q, 0);
+
pushInstruction(mb, q);
+ q =
newAssignment(mb);
+
getArg(q, 0) = g;
+ q->argc
= q->retc = 1;
+
q->barrier = EXITsymbol;
+ }
+
+ if (e >= 0 && f
>= 0) {
+ q =
newInstruction(mb, ASSIGNsymbol);
+
setModuleId(q, calcRef);
+
setFunctionId(q, putName("or", 2));
+ q =
pushReturn(mb, q,
+
newTmpVariable(mb, TYPE_any));
+ q =
pushArgument(mb, q, e);
+ q =
pushArgument(mb, q, f);
+ f =
getArg(q, 0);
+
pushInstruction(mb, q);
+ } else if (e >=
0) {
+ f = e;
+ }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list
