Changeset: 0d26d51e2881 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d26d51e2881
Modified Files:
        monetdb5/extras/jaql/Tests/expand00.mal
        monetdb5/extras/jaql/Tests/expand00.stable.out
        monetdb5/extras/jaql/Tests/plan00.stable.out
        monetdb5/extras/jaql/jaql.c
        monetdb5/extras/jaql/jaqlgencode.c
Branch: jacqueline
Log Message:

expand: implemented expand unroll

made expand unroll its own case
added complexer test than the examples give


diffs (truncated from 312 to 300 lines):

diff --git a/monetdb5/extras/jaql/Tests/expand00.mal 
b/monetdb5/extras/jaql/Tests/expand00.mal
--- a/monetdb5/extras/jaql/Tests/expand00.mal
+++ b/monetdb5/extras/jaql/Tests/expand00.mal
@@ -1,2 +1,3 @@
 jaql.x("[ [3,65,8,72], [5,98,2,65,[]] ] -> expand each arr;");
 jaql.x("[ {\"name\":\"Jon Doe\", \"movie_ids\":[3,65,8,72]}, {\"name\":\"Jane 
Dean\",\"movie_ids\":[5,98,2]} ] -> expand $.movie_ids;");
+jaql.x("[{\"x\":[1,2],\"y\":\"bla\"},{\"x\":[3]}] -> expand unroll $.x;");
diff --git a/monetdb5/extras/jaql/Tests/expand00.stable.out 
b/monetdb5/extras/jaql/Tests/expand00.stable.out
--- a/monetdb5/extras/jaql/Tests/expand00.stable.out
+++ b/monetdb5/extras/jaql/Tests/expand00.stable.out
@@ -19,9 +19,11 @@ stdout of test 'expand00` in directory '
 function user.main():void;
     jaql.x("[ [3,65,8,72], [5,98,2,65,[]] ] -> expand each arr;");
     jaql.x("[ {\"name\":\"Jon Doe\", \"movie_ids\":[3,65,8,72]}, 
{\"name\":\"Jane Dean\",\"movie_ids\":[5,98,2]} ] -> expand $.movie_ids;");
+    jaql.x("[{\"x\":[1,2],\"y\":\"bla\"},{\"x\":[3]}] -> expand unroll $.x;");
 end main;
 [ 3, 65, 8, 72, 5, 98, 2, 65, [  ] ]
 [ 3, 65, 8, 72, 5, 98, 2 ]
+[ { "x": 1, "y": "bla" }, { "x": 2, "y": "bla" }, { "x": 3 } ]
 
 # 21:15:09 >  
 # 21:15:09 >  "Done."
diff --git a/monetdb5/extras/jaql/Tests/plan00.stable.out 
b/monetdb5/extras/jaql/Tests/plan00.stable.out
--- a/monetdb5/extras/jaql/Tests/plan00.stable.out
+++ b/monetdb5/extras/jaql/Tests/plan00.stable.out
@@ -45,7 +45,7 @@ e as $ -> filter: ( ( $.mgr == true ) ||
 [ {id:1, dept:1, income:12000},{id:2, dept:1, income:13000} ] as $ -> filter: 
( $.dept == 1 ) => <result> 
 [ [3,65,8,72], [5,98,2,65] ] as arr -> expand: arr => <result> 
 [ {"name":"Jon Doe", "movie_ids":[3,65,8,72]}, {"name":"Jane 
Dean","movie_ids":[5,98,2]} ] as $ -> expand: $.movie_ids => <result> 
-[ {"name":"Jon Doe", "movie_ids":[3,65,8,72]}, {"name":"Jane 
Dean","movie_ids":[5,98,2]} ] as $ -> unroll: $.movie_ids => <result> 
+[ {"name":"Jon Doe", "movie_ids":[3,65,8,72]}, {"name":"Jane 
Dean","movie_ids":[5,98,2]} ] as $ -> expand unroll: $.movie_ids => <result> 
 A as $ -> expand: $ as $ -> transform: ( $ * 2 ) 
 A as $ -> expand: $.ids => <result> 
 [1,2,3] as $ -> transform: { "value": $ } 
diff --git a/monetdb5/extras/jaql/jaql.c b/monetdb5/extras/jaql/jaql.c
--- a/monetdb5/extras/jaql/jaql.c
+++ b/monetdb5/extras/jaql/jaql.c
@@ -279,6 +279,11 @@ make_jaql_expand(tree *var, tree *expr)
                res->tval2 = expr->tval1;
                expr->tval1 = NULL;
                freetree(expr);
+
+               if (res->tval2->tval1 == NULL) {
+                       /* unrolling an array without a parent is pointless */
+                       res->type = j_expand;
+               }
                return res;
        }
 
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
@@ -1955,6 +1955,259 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
                                j5 = getArg(q, 0);
                                pushInstruction(mb, q);
                                break;
+                       case j_unroll:
+                               a = dumpwalkvar(mb, j1, j5);
+                               b = dumprefvar(mb, t->tval2, a, j1, j6, j7);
+                               e = dumpnextid(mb, j1);
+
+                               /* we only want the arrays from here */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, semijoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j1);
+                               q = pushArgument(mb, q, b);
+                               b = 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, b);
+                               q = pushChr(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, j6);
+                               q = pushArgument(mb, q, c);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, semijoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j6);
+                               q = pushArgument(mb, q, c);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* get elements from the to be expanded array */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, semijoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j5);
+                               q = pushArgument(mb, q, b);
+                               d = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* generate kind elems for result (again, just 
objects) */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, markHRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, d);
+                               q = pushArgument(mb, q, e);
+                               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 = pushChr(mb, q, 'o');
+                               f = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               /* cleanup and append to kinds */
+                               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);
+                               j1 = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("kunion", 6));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j1);
+                               q = pushArgument(mb, q, f);
+                               j1 = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* generate the outer array */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, projectRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, f);
+                               q = pushOid(mb, q, 0); /* probably not correct 
*/
+                               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);
+                               /* cleanup and append */
+                               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, f);
+                               j5 = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("kunion", 6));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, f);
+                               q = pushArgument(mb, q, j5);
+                               j5 = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* construct the objects themselves */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, reverseRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, c);
+                               f = 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, f);
+                               q = pushArgument(mb, q, e);
+                               f = 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, f);
+                               q = pushArgument(mb, q, c);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, markTRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, d);
+                               q = pushArgument(mb, q, e);
+                               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);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("sdifference", 11));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, f);
+                               g = 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, d);
+                               q = pushArgument(mb, q, e);
+                               f = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("sunion", 6));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, f);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, sortRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               g = 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, d);
+                               f = 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, f);
+                               q = pushArgument(mb, q, j7);
+                               f = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               
+                               /* cleanup and append */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("kdifference", 11));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j6);
+                               q = pushArgument(mb, q, c);
+                               j6 = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("kunion", 6));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, j6);
+                               q = pushArgument(mb, q, g);
+                               j6 = 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, j7);
+                               q = pushArgument(mb, q, d);
+                               j7 = 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, d);
+                               j1 = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to