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