Changeset: a5a3468fed0b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5a3468fed0b
Added Files:
        monetdb5/extras/jaql/jaqltests/Tests/unroll.jaql
        monetdb5/extras/jaql/jaqltests/Tests/unroll.stable.err
        monetdb5/extras/jaql/jaqltests/Tests/unroll.stable.out
Modified Files:
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/jaqltests/Tests/All
Branch: Oct2012
Log Message:

unroll: fix implementation for indirections of more than one level

We didn't fully unroll the entire document for multiple-level
indirections.  We now do so, walking backwards, re-producing all
elements that are in the variable reference chain, e.g. reusing as much
as possible from the original document.


diffs (truncated from 736 to 300 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
@@ -5593,10 +5593,13 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                j->startoid = e;
                                MALCOMMENT(mb, "} j_expand");
                                break;
-                       case j_unroll:
+                       case j_unroll: {
+                               int h = 0, i = 0;
+                               tree *w;
+
                                MALCOMMENT(mb, "j_unroll {");
-                               a = dumpwalkvar(mb, j->j1, j->j5, j->startoid);
-                               b = dumprefvar(j, mb, t->tval2, a);
+                               d = dumpwalkvar(mb, j->j1, j->j5, j->startoid);
+                               b = dumprefvar(j, mb, t->tval2, d);
 
                                /* we only want the arrays from here */
                                q = newInstruction(mb, ASSIGNsymbol);
@@ -5605,274 +5608,324 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, j->j1);
                                q = pushArgument(mb, q, b);
-                               b = getArg(q, 0);
+                               a = getArg(q, 0);
                                pushInstruction(mb, q);
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, algebraRef);
                                setFunctionId(q, selectRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushBte(mb, q, 'a');
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* check out contents of arrays */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, mirrorRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               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, j->j5);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, leftjoinRef);
+                               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);
+
+                               /* create full mapping per element */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, leftjoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
                                q = pushArgument(mb, q, b);
-                               q = pushBte(mb, q, 'a');
                                c = getArg(q, 0);
                                pushInstruction(mb, q);
-
-                               /* get parent(s), we only do objects for the 
moment */
-                               q = newInstruction(mb, ASSIGNsymbol);
-                               setModuleId(q, algebraRef);
-                               setFunctionId(q, joinRef);
-                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
-                               q = pushArgument(mb, q, j->j6);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, reverseRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, c);
                                c = getArg(q, 0);
                                pushInstruction(mb, q);
+                               /* c = elemid:arraymemberid */
+
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, batRef);
-                               setFunctionId(q, mirrorRef);
-                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               setFunctionId(q, reverseRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               /* a = arrayid:arraymemberid */
+
+                               /* walk backwards up till the root array 
duplicating
+                                * entries */
+                               dumpbatwritable(j, mb, 1);
+                               dumpbatwritable(j, mb, 6);
+                               dumpbatwritable(j, mb, 7);
+                               for (w = t->tval1; w != NULL; w = w->tval1) {
+                                       MALCOMMENT(mb, "| reverse object 
traversal with re-creation");
+
+                                       /* get parents of variable matches */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, joinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j6);
+                                       q = pushArgument(mb, q, b);
+                                       i = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* retrieve all entries for the parent 
objects */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, batRef);
+                                       setFunctionId(q, reverseRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j6);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, leftjoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, e);
+                                       q = pushArgument(mb, q, i);
+                                       d = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* explode into count that we need 
(array sizes) */
+                                       g = dumpnextid(mb, j->j1);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markTRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, c);
+                                       q = pushArgument(mb, q, g);
+                                       h = 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, d);
+                                       q = pushArgument(mb, q, h);
+                                       f = 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, f);
+                                       f = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* insert object names for values from 
arrays */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, semijoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j7);
+                                       q = pushArgument(mb, q, b);
+                                       e = 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, a);
+                                       g = 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, g);
+                                       q = pushArgument(mb, q, e);
+                                       e = 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, j->j7);
+                                       q = pushArgument(mb, q, e);
+                                       j->j7 = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* extract items we need to 
expand/unroll */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markHRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, f);
+                                       q = pushOid(mb, q, 0);
+                                       g = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, leftjoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, g);
+                                       q = pushArgument(mb, q, b);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* and replace with their array values 
*/
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markTRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, e);
+                                       q = pushOid(mb, q, 0);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markHRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, c);
+                                       q = pushOid(mb, q, 0);
+                                       d = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, leftjoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, e);
+                                       q = pushArgument(mb, q, d);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* create new full objects */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, putName("kdifference", 
11));
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, g);
+                                       q = pushArgument(mb, q, e);
+                                       g = 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, e);
+                                       q = pushArgument(mb, q, g);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* restore original order */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markTRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, f);
+                                       q = pushOid(mb, q, 0);
+                                       f = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, leftjoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, f);
+                                       q = pushArgument(mb, q, e);
+                                       f = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* and insert */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, batRef);
+                                       setFunctionId(q, insertRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j6);
+                                       q = pushArgument(mb, q, f);
+                                       j->j6 = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* generate kind elems for result 
(again, just objects) */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, batRef);
+                                       setFunctionId(q, reverseRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, h);
+                                       f = 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, f);
+                                       q = pushBte(mb, q, 'o');
+                                       f = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* append to kinds */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, batRef);
+                                       setFunctionId(q, insertRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j1);
+                                       q = pushArgument(mb, q, f);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to