Changeset: 96ce1e12b568 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=96ce1e12b568
Modified Files:
        monetdb5/extras/jaql/jaqlgencode.c
Branch: jacqueline
Log Message:

group: propagate group ids through functions

We now translate the array id returned by json.unwrap back to the
element id it originated from to get correct (aligned) output from group
functions.
Handle the any-bat type functions (count) as lng-consumers, since we
need the entire festival of going through unwrap to maintain the
arrayids vs the values to do grouping correctly.

This makes sum and count work as expected also for group01.  We still
need to get the co-groups working for it to be enabled, though.


diffs (223 lines):

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
@@ -2043,7 +2043,7 @@ static int
 dumpvariabletransformation(jc *j, Client cntxt, MalBlkPtr mb, tree *t, int 
elems, int *j1, int *j2, int *j3, int *j4, int *j5, int *j6, int *j7)
 {
        InstrPtr q;
-       int a, b, c, d, e, f, g;
+       int a, b, c, d, e, f, g, h;
 
        assert (t != NULL);
 
@@ -3212,6 +3212,7 @@ dumpvariabletransformation(jc *j, Client
                                                                dynaarg[i][6] = 
getArg(q, 6);
                                                                
pushInstruction(mb, q);
                                                                break;
+                                                       case j_func_arg:
                                                        case j_sort_arg: /* 
bat[:oid,:num] */
                                                                /* check that b 
consists of arrays */
                                                                q = 
newInstruction(mb, ASSIGNsymbol);
@@ -3303,47 +3304,57 @@ dumpvariabletransformation(jc *j, Client
                                                                q = 
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                                                                q = 
pushArgument(mb, q, b);
                                                                q = pushOid(mb, 
q, (oid)0);
-                                                               b = getArg(q, 
0);
+                                                               h = 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);
+                                                               q = 
pushArgument(mb, q, h);
+                                                               h = 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);
+                                                               q = 
pushArgument(mb, q, h);
                                                                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, h);
                                                                q = 
pushArgument(mb, q, c);
-                                                               b = getArg(q, 
0);
+                                                               h = 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);
-                                                               q = pushOid(mb, 
q, (oid)0);
-                                                               dynaarg[i][0] = 
getArg(q, 0);
-                                                               
pushInstruction(mb, q);
+                                                               /* a = j1, h = 
j5 */
+
+                                                               if (coltypes[i] 
== j_sort_arg) {
+                                                                       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, h);
+                                                                       q = 
pushArgument(mb, q, *j6);
+                                                                       q = 
pushArgument(mb, q, *j7);
+                                                                       q = 
pushOid(mb, q, (oid)0);
+                                                                       
dynaarg[i][0] = getArg(q, 0);
+                                                                       
pushInstruction(mb, q);
+                                                               } else {
+                                                                       q = 
newInstruction(mb, ASSIGNsymbol);
+                                                                       q = 
pushReturn(mb, q,
+                                                                               
        newTmpVariable(mb, TYPE_any));
+                                                                       q = 
pushStr(mb, q, "lng");
+                                                                       
dynaarg[i][0] = getArg(q, 0);
+                                                                       
pushInstruction(mb, q);
+                                                                       
dynaarg[i][3] = 0;
+                                                               }
 
                                                                e = -1;
                                                                if 
(dynaarg[i][1] == 0) {
@@ -3373,7 +3384,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, *j2);
                                                                        q = 
pushArgument(mb, q, *j3);
                                                                        q = 
pushArgument(mb, q, *j4);
-                                                                       q = 
pushArgument(mb, q, b);
+                                                                       q = 
pushArgument(mb, q, h);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
                                                                        q = 
pushOid(mb, q, (oid)0);
@@ -3414,7 +3425,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, *j2);
                                                                        q = 
pushArgument(mb, q, *j3);
                                                                        q = 
pushArgument(mb, q, *j4);
-                                                                       q = 
pushArgument(mb, q, b);
+                                                                       q = 
pushArgument(mb, q, h);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
                                                                        q = 
pushOid(mb, q, (oid)0);
@@ -3455,7 +3466,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, *j2);
                                                                        q = 
pushArgument(mb, q, *j3);
                                                                        q = 
pushArgument(mb, q, *j4);
-                                                                       q = 
pushArgument(mb, q, b);
+                                                                       q = 
pushArgument(mb, q, h);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
                                                                        q = 
pushOid(mb, q, (oid)0);
@@ -3501,7 +3512,7 @@ dumpvariabletransformation(jc *j, Client
                                                                q->barrier = 
BARRIERsymbol;
                                                                q = 
pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                                                                q = 
pushArgument(mb, q, g);
-                                                               b = getArg(q, 
0);
+                                                               h = getArg(q, 
0);
                                                                
pushInstruction(mb, q);
                                                                q = 
newInstruction(mb, ASSIGNsymbol);
                                                                setModuleId(q, 
languageRef);
@@ -3511,22 +3522,13 @@ dumpvariabletransformation(jc *j, Client
                                                                                
"type from JSON array");
                                                                
pushInstruction(mb, q);
                                                                q = 
newAssignment(mb);
-                                                               getArg(q, 0) = 
b;
+                                                               getArg(q, 0) = 
h;
                                                                q->argc = 
q->retc = 1;
                                                                q->barrier = 
EXITsymbol;
 
-                                                               break;
-                                                       case j_func_arg:
-                                                               q = 
newInstruction(mb, ASSIGNsymbol);
-                                                               setModuleId(q, 
algebraRef);
-                                                               
setFunctionId(q, projectRef);
-                                                               q = 
pushReturn(mb, q,
-                                                                               
newTmpVariable(mb, TYPE_any));
-                                                               q = pushOid(mb, 
q, 0);
-                                                               q = 
pushArgument(mb, q, b);
-                                                               b = getArg(q, 
0);
-                                                               
pushInstruction(mb, q);
-                                                               dynaarg[i][0] = 
b;
+                                                               if (coltypes[i] 
== j_func_arg)
+                                                                       
dynaarg[i][0] = dynaarg[i][3];
+
                                                                break;
                                                        case j_bool:
                                                                q = 
newInstruction(mb, ASSIGNsymbol);
@@ -3815,16 +3817,15 @@ dumpvariabletransformation(jc *j, Client
                                r = pushNil(mb, r, newBatType(TYPE_oid, 
TYPE_any));
                                pushInstruction(mb, r);
 
-                               conditionalcall(&a, mb, t,
-                                               coltypes, dynaarg, coltpos, q);
-
-                               b = dumpnextid(mb, *j1);
+                               conditionalcall(&a, mb, t, coltypes, dynaarg, 
coltpos, q);
+
+                               h = dumpnextid(mb, *j1);
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, algebraRef);
                                setFunctionId(q, markHRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, a);
-                               q = pushArgument(mb, q, b);
+                               q = pushArgument(mb, q, h);
                                c = getArg(q, 0);
                                pushInstruction(mb, q);
 
@@ -3987,27 +3988,12 @@ dumpvariabletransformation(jc *j, Client
                                setFunctionId(q, markHRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, a);
-                               q = pushArgument(mb, q, b);
+                               q = pushArgument(mb, q, h);
                                a = 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, elems);
-                               b = getArg(q, 0);
-                               pushInstruction(mb, q);
-                               q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, algebraRef);
-                               setFunctionId(q, putName("fetch", 5));
-                               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, algebraRef);
-                               setFunctionId(q, projectRef);
+                               setFunctionId(q, joinRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, a);
                                q = pushArgument(mb, q, b);
@@ -5144,7 +5130,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                setModuleId(q, algebraRef);
                                                setFunctionId(q, projectRef);
                                                q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
-                                               q = pushOid(mb, q, b);
+                                               q = pushArgument(mb, q, b);
                                                q = pushArgument(mb, q, a);
                                                a = getArg(q, 0);
                                                pushInstruction(mb, q);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to