Changeset: 1be7ab959244 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1be7ab959244
Modified Files:
        monetdb5/extras/jaql/jaql.h
        monetdb5/extras/jaql/jaql.mal
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/json.c
        monetdb5/mal/mal_instruction.mx
        monetdb5/mal/mal_listing.c
        monetdb5/optimizer/opt_centipede.mx
        monetdb5/optimizer/opt_pipes.c
Branch: sciql
Log Message:

merged from default


diffs (truncated from 2668 to 300 lines):

diff --git a/monetdb5/extras/jaql/jaql.h b/monetdb5/extras/jaql/jaql.h
--- a/monetdb5/extras/jaql/jaql.h
+++ b/monetdb5/extras/jaql/jaql.h
@@ -53,6 +53,8 @@ typedef struct _jc {
        void *scanner;
        char explain;
        jvar *vars;
+       int j1, j2, j3, j4, j5, j6 ,j7;
+       char ro1:1, ro2:2, ro3:3, ro4:4, ro5:5, ro6:6, ro7:7;
        int vtop;
 } jc;
 
diff --git a/monetdb5/extras/jaql/jaql.mal b/monetdb5/extras/jaql/jaql.mal
--- a/monetdb5/extras/jaql/jaql.mal
+++ b/monetdb5/extras/jaql/jaql.mal
@@ -41,6 +41,22 @@ command exportResult(o:streams, kind:bat
 address JAQLexportResult
 comment "Writes the given JSON fragment to the MAPI stream"
 
+# select wrappers that preserve order
+function select(b:bat[:oid,:any_1], v:any_1):bat[:oid,:any_1];
+       j := algebra.markT(b, 0@0);
+       a := algebra.markH(b, 0@0);
+       q := algebra.select(a, v);
+       l := algebra.leftjoin(j, q);
+       return l;
+end select
+function uselect(b:bat[:oid,:any_1], v:any_1):bat[:oid,:void];
+       l := algebra.markT(b, 0@0);
+       r := algebra.markH(b, 0@0);
+       e := algebra.uselect(r, v);
+       s := algebra.leftjoin(l, e);
+       return s;
+end uselect
+
 # scenario functions and init call
 command prelude()
 address JAQLprelude;
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
@@ -50,11 +50,37 @@ typedef struct _jgvar {
 
 #define MAXJAQLARG 23
 
-static int dumpvariabletransformation(jc *j, Client cntxt, MalBlkPtr mb, tree 
*t, int elems, int *j1, int *j2, int *j3, int *j4, int *j5, int *j6, int *j7);
+static int dumpvariabletransformation(jc *j, Client cntxt, MalBlkPtr mb, tree 
*t, int elems);
 static int dumpnextid(MalBlkPtr mb, int j1);
 static int matchfuncsig(jc *j, Client cntxt, tree *t, int *coltpos, enum 
treetype (*coltypes)[MAXJAQLARG], int (*dynaarg)[MAXJAQLARG][7]);
 static void conditionalcall(int *ret, MalBlkPtr mb, tree *t, enum treetype 
coltypes[MAXJAQLARG], int dynaarg[MAXJAQLARG][7], int coltpos, InstrPtr q);
 
+/* dumps a algebra.copy for the Xth JSON BAT, if necessary, and sets the
+ * ro bit appropriately afterwards */
+static inline void
+dumpbatwritable(jc *j, MalBlkPtr mb, char X)
+{
+       int *jX = NULL;
+       InstrPtr q;
+
+       switch (X) {
+               case 1:  if (!j->ro1) return; jX = &j->j1; j->ro1 = 0;  break;
+               case 2:  if (!j->ro2) return; jX = &j->j2; j->ro2 = 0;  break;
+               case 3:  if (!j->ro3) return; jX = &j->j3; j->ro3 = 0;  break;
+               case 4:  if (!j->ro4) return; jX = &j->j4; j->ro4 = 0;  break;
+               case 5:  if (!j->ro5) return; jX = &j->j5; j->ro5 = 0;  break;
+               case 6:  if (!j->ro6) return; jX = &j->j6; j->ro6 = 0;  break;
+               case 7:  if (!j->ro7) return; jX = &j->j7; j->ro7 = 0;  break;
+       }
+       q = newInstruction(mb, ASSIGNsymbol);
+       setModuleId(q, algebraRef);
+       setFunctionId(q, copyRef);
+       /* put inplace, because we sometimes use this inside barriers */
+       q = pushReturn(mb, q, *jX);
+       q = pushArgument(mb, q, *jX);
+       pushInstruction(mb, q);
+}
+
 /* returns a bat with subset from kind bat (:oid,:bte) which are
  * referenced by the first array of the JSON structure (oid 0@0 of kind
  * bat, pointing to array, so all oids from array bat that have head oid
@@ -109,7 +135,7 @@ dumparrrefvar(MalBlkPtr mb, tree *t, int
 
        /* array indirection, entries must be arrays */
        q = newInstruction(mb, ASSIGNsymbol);
-       setModuleId(q, algebraRef);
+       setModuleId(q, putName("jaql", 4));
        setFunctionId(q, uselectRef);
        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
        q = pushArgument(mb, q, elems);
@@ -196,12 +222,11 @@ dumparrrefvar(MalBlkPtr mb, tree *t, int
                pushInstruction(mb, q);
 
                q = newInstruction(mb, ASSIGNsymbol);
-               setModuleId(q, algebraRef);
+               setModuleId(q, putName("jaql", 4));
                setFunctionId(q, selectRef);
                q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                q = pushArgument(mb, q, b);
                q = pushOid(mb, q, (oid)t->nval);
-               q = pushOid(mb, q, (oid)t->nval);
                b = getArg(q, 0);
                pushInstruction(mb, q);
                q = newInstruction(mb, ASSIGNsymbol);
@@ -244,7 +269,7 @@ dumparrrefvar(MalBlkPtr mb, tree *t, int
  * in the tail, the oid of the corresponding element from elems
  * (typically array bat, head oid 0@0) */
 static int
-dumprefvar(MalBlkPtr mb, tree *t, int elems, int *j1, int *j5, int *j6, int 
*j7)
+dumprefvar(jc *j, MalBlkPtr mb, tree *t, int elems)
 {
        InstrPtr q;
        int a = 0, b = 0, c = 0;
@@ -267,7 +292,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
        a = elems;
        for (t = t->tval1; t != NULL; t = t->tval1) {
                if (t->type == j_arr_idx) {
-                       c = dumparrrefvar(mb, t, a, *j5);
+                       c = dumparrrefvar(mb, t, a, j->j5);
                        q = newInstruction(mb, ASSIGNsymbol);
                        setModuleId(q, algebraRef);
                        setFunctionId(q, joinRef);
@@ -281,7 +306,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                        setModuleId(q, algebraRef);
                        setFunctionId(q, semijoinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, *j1);
+                       q = pushArgument(mb, q, j->j1);
                        q = pushArgument(mb, q, b);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
@@ -289,7 +314,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                                encapsulate = 1;
                } else {
                        q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
+                       setModuleId(q, putName("jaql", 4));
                        setFunctionId(q, uselectRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
@@ -300,7 +325,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                        setModuleId(q, algebraRef);
                        setFunctionId(q, semijoinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, *j6);
+                       q = pushArgument(mb, q, j->j6);
                        q = pushArgument(mb, q, a);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
@@ -323,12 +348,12 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                        setModuleId(q, algebraRef);
                        setFunctionId(q, semijoinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, *j7);
+                       q = pushArgument(mb, q, j->j7);
                        q = pushArgument(mb, q, a);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
+                       setModuleId(q, putName("jaql", 4));
                        setFunctionId(q, uselectRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
@@ -350,7 +375,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                        setModuleId(q, algebraRef);
                        setFunctionId(q, semijoinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, *j1);
+                       q = pushArgument(mb, q, j->j1);
                        q = pushArgument(mb, q, b);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
@@ -359,7 +384,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
        if (encapsulate) {
                /* we have to return the results as arrays here, since they are
                 * multi-value (x[*].y) */
-               a = dumpnextid(mb, *j1);
+               a = dumpnextid(mb, j->j1);
                q = newInstruction(mb, ASSIGNsymbol);
                setModuleId(q, algebraRef);
                setFunctionId(q, markTRef);
@@ -385,13 +410,14 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                b = getArg(q, 0);
                pushInstruction(mb, q);
                /* append to array bat */
+               dumpbatwritable(j, mb, 5);
                q = newInstruction(mb, ASSIGNsymbol);
-               setModuleId(q, algebraRef);
-               setFunctionId(q, putName("sunion", 6));
+               setModuleId(q, batRef);
+               setFunctionId(q, insertRef);
                q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-               q = pushArgument(mb, q, *j5);
+               q = pushArgument(mb, q, j->j5);
                q = pushArgument(mb, q, b);
-               *j5 = getArg(q, 0);
+               j->j5 = getArg(q, 0);
                pushInstruction(mb, q);
 
                q = newInstruction(mb, ASSIGNsymbol);
@@ -410,13 +436,14 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
                c = getArg(q, 0);
                pushInstruction(mb, q);
                /* append to kind bat */
+               dumpbatwritable(j, mb, 1);
                q = newInstruction(mb, ASSIGNsymbol);
-               setModuleId(q, algebraRef);
-               setFunctionId(q, putName("kunion", 6));
+               setModuleId(q, batRef);
+               setFunctionId(q, insertRef);
                q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-               q = pushArgument(mb, q, *j1);
+               q = pushArgument(mb, q, j->j1);
                q = pushArgument(mb, q, c);
-               *j1 = getArg(q, 0);
+               j->j1 = getArg(q, 0);
                pushInstruction(mb, q);
        }
        return b;
@@ -425,7 +452,7 @@ dumprefvar(MalBlkPtr mb, tree *t, int el
 /* returns bat with in the head the oids from elems that match the
  * comparison */
 static int
-dumpcomp(jc *j, Client cntxt, MalBlkPtr mb, tree *t, int elems, int *j1, int 
*j2, int *j3, int *j4, int *j5, int *j6, int *j7)
+dumpcomp(jc *j, Client cntxt, MalBlkPtr mb, tree *t, int elems)
 {
        InstrPtr q;
        int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
@@ -438,10 +465,9 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        || t->tval3->type == j_str || t->tval3->type == j_bool);
 
        if (t->tval1->type == j_operation) {
-               a = dumpvariabletransformation(j, cntxt, mb, t->tval1, elems,
-                               j1, j2, j3, j4, j5, j6, j7);
+               a = dumpvariabletransformation(j, cntxt, mb, t->tval1, elems);
        } else {
-               a = dumprefvar(mb, t->tval1, elems, j1, j5, j6, j7);
+               a = dumprefvar(j, mb, t->tval1, elems);
        }
 
        if (t->tval3->type != j_var && t->tval3->type != j_operation) {
@@ -456,12 +482,11 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
 
        switch (t->tval3->type) {
                case j_var:
-                       b = dumprefvar(mb, t->tval3, elems, j1, j5, j6, j7);
+                       b = dumprefvar(j, mb, t->tval3, elems);
                        c = -1;
                        break;
                case j_operation:
-                       b = dumpvariabletransformation(j, cntxt, mb, t->tval3, 
elems,
-                                       j1, j2, j3, j4, j5, j6, j7);
+                       b = dumpvariabletransformation(j, cntxt, mb, t->tval3, 
elems);
                        c = -1;
                        break;
                case j_num:
@@ -470,7 +495,7 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        setFunctionId(q, joinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
-                       q = pushArgument(mb, q, *j3);
+                       q = pushArgument(mb, q, j->j3);
                        b = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
@@ -485,7 +510,7 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        setFunctionId(q, joinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
-                       q = pushArgument(mb, q, *j4);
+                       q = pushArgument(mb, q, j->j4);
                        b = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
@@ -500,7 +525,7 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        setFunctionId(q, joinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
-                       q = pushArgument(mb, q, *j2);
+                       q = pushArgument(mb, q, j->j2);
                        b = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
@@ -515,11 +540,11 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        setFunctionId(q, joinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, a);
-                       q = pushArgument(mb, q, *j1);
+                       q = pushArgument(mb, q, j->j1);
                        b = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
+                       setModuleId(q, putName("jaql", 4));
                        setFunctionId(q, uselectRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, b);
@@ -539,7 +564,7 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                switch (t->tval2->cval) {
                        case j_equals:
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to