Changeset: 4e7e3a850b9a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e7e3a850b9a Modified Files: monetdb5/extras/jaql/Tests/transform00.mal monetdb5/extras/jaql/Tests/transform00.stable.out monetdb5/extras/jaql/jaqlgencode.c Branch: jacqueline Log Message:
transform: implemented variable references Plain variable references now also work in transform. First work on arithmetic done, but not yet error-free. diffs (truncated from 888 to 300 lines): diff --git a/monetdb5/extras/jaql/Tests/transform00.mal b/monetdb5/extras/jaql/Tests/transform00.mal --- a/monetdb5/extras/jaql/Tests/transform00.mal +++ b/monetdb5/extras/jaql/Tests/transform00.mal @@ -1,1 +1,2 @@ jaql.x("[1,2,3] -> transform 2 * 2;"); +jaql.x("[{\"a\": 1}, {\"a\": 2}] -> transform $.a;"); diff --git a/monetdb5/extras/jaql/Tests/transform00.stable.out b/monetdb5/extras/jaql/Tests/transform00.stable.out --- a/monetdb5/extras/jaql/Tests/transform00.stable.out +++ b/monetdb5/extras/jaql/Tests/transform00.stable.out @@ -18,8 +18,10 @@ stdout of test 'transform00` in director # MonetDB/DataCell module not loaded: MALException:jaql.context:JAQL environment not found function user.main():void; jaql.x("[1,2,3] -> transform 2 * 2;"); + jaql.x("[{\"a\": 1}, {\"a\": 2}] -> transform $.a;"); end main; [ 4, 4, 4 ] +[ 1, 2 ] # 21:27:13 > # 21:27:13 > "Done." 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 @@ -545,6 +545,689 @@ dumpnextid(MalBlkPtr mb, int j1) return a; } +/* returns a BAT which is the subset of j1 that refer to the values + * returned from the variable and its optional calculation applied to it + * the j{1..7} variables are updated to point to the updated BATs as + * insertions of new values (the serialised versions of the variable) */ +static int +dumpvariabletransformation(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; + + (void) f; + (void) g; + + assert (t != NULL); + + switch (t->type) { + case j_str: + case j_num: + case j_dbl: + /* shortcut, simple action */ + a = dumpnextid(mb, *j1); + + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, projectRef); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, elems); + if (t->type == j_num) { + q = pushLng(mb, q, t->nval); + } else if (t->type == j_dbl) { + q = pushDbl(mb, q, t->dval); + } else { + q = pushStr(mb, q, t->sval); + } + b = 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, elems); + if (t->type == j_num) { + q = pushChr(mb, q, 'i'); + d = *j3; + } else if (t->type == j_dbl) { + q = pushChr(mb, q, 'd'); + d = *j4; + } else { + q = pushChr(mb, q, 's'); + d = *j2; + } + c = getArg(q, 0); + pushInstruction(mb, q); + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, putName("markH", 5)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, b); + q = pushArgument(mb, q, a); + b = 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, d); + q = pushArgument(mb, q, b); + if (t->type == j_num) { + *j3 = getArg(q, 0); + } else if (t->type == j_dbl) { + *j4 = getArg(q, 0); + } else if (t->type == j_str) { + *j2 = getArg(q, 0); + } + pushInstruction(mb, q); + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, putName("markH", 5)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, c); + q = pushArgument(mb, q, a); + c = 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, c); + *j1 = getArg(q, 0); + pushInstruction(mb, q); + + return c; + case j_var: { + int *lv[] = {j2, j3, j4, j5, j6, NULL}; + int **lp = lv; + + a = dumpnextid(mb, *j1); + + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, batRef); + setFunctionId(q, reverseRef); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, elems); + 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, *j1); + q = pushArgument(mb, q, c); + c = getArg(q, 0); + pushInstruction(mb, q); + b = dumprefvar(mb, t, c, *j1, *j6, *j7); + + 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); + c = getArg(q, 0); + pushInstruction(mb, q); + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, putName("markH", 5)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, c); + q = pushArgument(mb, q, a); + c = 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, c); + *j1 = getArg(q, 0); + pushInstruction(mb, q); + + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, putName("markT", 5)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, b); + q = pushArgument(mb, q, a); + d = 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); + d = getArg(q, 0); + pushInstruction(mb, q); + + for (; *lp != NULL; lp++) { + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, semijoinRef); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, **lp); + q = pushArgument(mb, q, b); + e = 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, e); + e = 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, **lp); + q = pushArgument(mb, q, e); + **lp = getArg(q, 0); + pushInstruction(mb, q); + } + + return c; + } + case j_operation: { + int r, s; + int u, v, w; + int h, i, j, k, l; + InstrPtr p; + switch (t->tval1->type) { + case j_var: + case j_operation: + b = dumpvariabletransformation(mb, t->tval1, elems, + j1, j2, j3, j4, j5, j6, j7); + + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, semijoinRef); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, *j3); + q = pushArgument(mb, q, b); + d = 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, *j4); + q = pushArgument(mb, q, b); + e = getArg(q, 0); + pushInstruction(mb, q); + break; + default: + assert(0); + } + /* d:int and e:dbl are values from val1 */ + + switch (t->tval3->type) { + case j_var: + case j_operation: + c = dumpvariabletransformation(mb, t->tval3, elems, + j1, j2, j3, j4, j5, j6, j7); + + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, algebraRef); + setFunctionId(q, semijoinRef); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, *j3); + q = pushArgument(mb, q, c); + f = 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, *j4); + q = pushArgument(mb, q, c); + g = getArg(q, 0); + pushInstruction(mb, q); + q = newInstruction(mb, ASSIGNsymbol); + break; + case j_num: + c = -1; + q = newInstruction(mb, ASSIGNsymbol); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushLng(mb, q, t->tval3->nval); + f = getArg(q, 0); + pushInstruction(mb, q); + q = newInstruction(mb, ASSIGNsymbol); + setModuleId(q, calcRef); + setFunctionId(q, putName("dbl", 3)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushArgument(mb, q, f); + g = getArg(q, 0); + pushInstruction(mb, q); + break; + case j_dbl: + c = -1; + f = -1; + q = newInstruction(mb, ASSIGNsymbol); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); + q = pushDbl(mb, q, t->tval3->dval); + g = getArg(q, 0); + pushInstruction(mb, q); + default: + assert(0); + } + /* f:int and g:dbl are values from val3, bats if c != -1 */ + + a = dumpnextid(mb, *j1); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list