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

Reply via email to