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