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