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

Reply via email to