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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list