Changeset: aa0cba47be2d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aa0cba47be2d
Modified Files:
monetdb5/extras/jaql/Tests/All
monetdb5/extras/jaql/Tests/group00.mal
monetdb5/extras/jaql/Tests/group00.stable.err
monetdb5/extras/jaql/Tests/group00.stable.out
monetdb5/extras/jaql/jaql.c
monetdb5/extras/jaql/jaql.h
monetdb5/extras/jaql/jaql.mal
monetdb5/extras/jaql/jaqlgencode.c
monetdb5/extras/jaql/json.c
Branch: jacqueline
Log Message:
group: implemented simplest GROUP INTO form
Implemented calling functions in transformations, which is necessary to
display the group result (INTO-clause). Some wrapping and unwrapping is
performed to deal with being unknown during compile time.
diffs (truncated from 1821 to 300 lines):
diff --git a/monetdb5/extras/jaql/Tests/All b/monetdb5/extras/jaql/Tests/All
--- a/monetdb5/extras/jaql/Tests/All
+++ b/monetdb5/extras/jaql/Tests/All
@@ -11,6 +11,7 @@ transform00
transform02
join00
join02
+group00
sort00
top00
variable00
diff --git a/monetdb5/extras/jaql/Tests/group00.mal
b/monetdb5/extras/jaql/Tests/group00.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/group00.mal
@@ -0,0 +1,6 @@
+
+jaql.x("[1,2,3]->group into count($);");
+jaql.x("[1,2,3]->group into sum($);");
+
+jaql.x("[{\"a\":1.1},2,3.7,false,null]->group into count($);");
+jaql.x("[{\"a\":1},{\"a\":2.4},{\"a\":3}]->group into sum($.a);");
diff --git a/monetdb5/extras/jaql/Tests/group00.stable.err
b/monetdb5/extras/jaql/Tests/group00.stable.err
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/group00.stable.err
@@ -0,0 +1,31 @@
+stderr of test 'group00` in directory 'extras/jaql` itself:
+
+
+# 21:51:36 >
+# 21:51:36 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"gdk_dbfarm=/net/sofia.ins.cwi.nl/export/scratch1/fabian/tmp/mtest-jacqueline-sofia.ins.cwi.nl/five/dbfarm"
"--set" "mapi_open=true" "--set" "mapi_port=37570" "--set" "monet_prompt="
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql"
"group00.mal"
+# 21:51:36 >
+
+# builtin opt gdk_dbname = demo
+# builtin opt gdk_dbfarm =
/ufs/fabian/scratch/ssd/monetdb/jacqueline/program-x86_64/var/lib/monetdb5/dbfarm
+# builtin opt gdk_debug = 0
+# builtin opt gdk_alloc_map = no
+# builtin opt gdk_vmtrim = yes
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt gdk_dbfarm =
/net/sofia.ins.cwi.nl/export/scratch1/fabian/tmp/mtest-jacqueline-sofia.ins.cwi.nl/five/dbfarm
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 37570
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbname = mTests_extras_jaql
+
+# 21:51:36 >
+# 21:51:36 > "Done."
+# 21:51:36 >
+
diff --git a/monetdb5/extras/jaql/Tests/group00.stable.out
b/monetdb5/extras/jaql/Tests/group00.stable.out
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/group00.stable.out
@@ -0,0 +1,32 @@
+stdout of test 'group00` in directory 'extras/jaql` itself:
+
+
+# 21:51:36 >
+# 21:51:36 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"gdk_dbfarm=/net/sofia.ins.cwi.nl/export/scratch1/fabian/tmp/mtest-jacqueline-sofia.ins.cwi.nl/five/dbfarm"
"--set" "mapi_open=true" "--set" "mapi_port=37570" "--set" "monet_prompt="
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql"
"group00.mal"
+# 21:51:36 >
+
+# MonetDB 5 server v11.8.0 "jacqueline-6964bb75810c"
+# Serving database 'mTests_extras_jaql', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 64bit OIDs dynamically linked
+# Found 15.630 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2012 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://sofia.ins.cwi.nl:37570/
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+function user.main():void;
+ jaql.x("[1,2,3]->group into count($);");
+ jaql.x("[1,2,3]->group into sum($);");
+ jaql.x("[{\"a\":1.1},2,3.7,false,null]->group into count($);");
+ jaql.x("[{\"a\":1},{\"a\":2.4},{\"a\":3}]->group into sum($.a);");
+end main;
+[ 3 ]
+[ 6 ]
+[ 5 ]
+[ 6.400000 ]
+
+# 21:51:36 >
+# 21:51:36 > "Done."
+# 21:51:36 >
+
diff --git a/monetdb5/extras/jaql/jaql.c b/monetdb5/extras/jaql/jaql.c
--- a/monetdb5/extras/jaql/jaql.c
+++ b/monetdb5/extras/jaql/jaql.c
@@ -1820,3 +1820,25 @@ JAQLsetVar(Client cntxt, MalBlkPtr mb, M
*ret = 0;
return MAL_SUCCEED;
}
+
+str
+JAQLcast(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ int *ret = (int *)getArgReference(stk, pci, 0);
+ int *b = (int *)getArgReference(stk, pci, 1);
+ ValPtr t = getArgReference(stk, pci, 2);
+ BAT *in;
+
+ (void)mb;
+ (void)cntxt;
+
+ in = BBPquickdesc(ABS(*b), FALSE);
+ if (*b < 0)
+ in = BATmirror(in);
+
+ if (in->ttype != t->vtype)
+ throw(MAL, "jaql.cast", "BAT tail is not of required type");
+
+ *ret = *b;
+ return MAL_SUCCEED;
+}
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
@@ -164,6 +164,7 @@ void freetree(tree *t);
jaql_export str JAQLexecute(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
jaql_export str JAQLgetVar(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
jaql_export str JAQLsetVar(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
+jaql_export str JAQLcast(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
#endif
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
@@ -33,3 +33,6 @@ pattern setVar(nme:str, kind:bat[:oid,:b
address JAQLsetVar
comment "Set or overwrite value of JSON variable";
+pattern cast(b:bat[:oid,:any], t:any_1):bat[:oid,:any_1]
+address JAQLcast
+comment "Return BAT b as BAT with tail type of t, if the BAT tail in reality
is of that type";
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
@@ -48,8 +48,12 @@ typedef struct _jgvar {
struct _jgvar *prev;
} jgvar;
-static int dumpvariabletransformation(MalBlkPtr mb, tree *t, int elems, int
*j1, int *j2, int *j3, int *j4, int *j5, int *j6, int *j7);
+#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 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);
/* 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
@@ -432,7 +436,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(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, int *j1, int
*j2, int *j3, int *j4, int *j5, int *j6, int *j7)
{
InstrPtr q;
int a, b, c, d, e, f, g;
@@ -445,7 +449,7 @@ dumpcomp(MalBlkPtr mb, tree *t, int elem
|| t->tval3->type == j_str || t->tval3->type == j_bool);
if (t->tval1->type == j_operation) {
- a = dumpvariabletransformation(mb, t->tval1, elems,
+ a = dumpvariabletransformation(j, cntxt, mb, t->tval1, elems,
j1, j2, j3, j4, j5, j6, j7);
} else {
a = dumprefvar(mb, t->tval1, elems, j1, j5, j6, j7);
@@ -467,7 +471,7 @@ dumpcomp(MalBlkPtr mb, tree *t, int elem
c = -1;
break;
case j_operation:
- b = dumpvariabletransformation(mb, t->tval3, elems,
+ b = dumpvariabletransformation(j, cntxt, mb, t->tval3,
elems,
j1, j2, j3, j4, j5, j6, j7);
c = -1;
break;
@@ -1952,7 +1956,7 @@ dumppredjoin(MalBlkPtr mb, json_var *js,
}
static int
-dumppred(MalBlkPtr mb, tree *t, int elems, int *j1, int *j2, int *j3, int *j4,
int *j5, int *j6, int *j7)
+dumppred(jc *j, Client cntxt, MalBlkPtr mb, tree *t, int elems, int *j1, int
*j2, int *j3, int *j4, int *j5, int *j6, int *j7)
{
int a, l, r;
InstrPtr q;
@@ -1962,14 +1966,14 @@ dumppred(MalBlkPtr mb, tree *t, int elem
/* comparisons only take place between tval1 = var and tval3 = val/var
* for the rest, only boolean logic is applied */
if (t->tval2->cval != j_and && t->tval2->cval != j_or)
- return dumpcomp(mb, t, elems, j1, j2, j3, j4, j5, j6, j7);
+ return dumpcomp(j, cntxt, mb, t, elems, j1, j2, j3, j4, j5, j6,
j7);
assert(t->tval1->type == j_pred);
assert(t->tval2->cval == j_and || t->tval2->cval == j_or);
assert(t->tval3->type == j_pred);
- l = dumppred(mb, t->tval1, elems, j1, j2, j3, j4, j5, j6, j7);
- r = dumppred(mb, t->tval3, elems, j1, j2, j3, j4, j5, j6, j7);
+ l = dumppred(j, cntxt, mb, t->tval1, elems, j1, j2, j3, j4, j5, j6, j7);
+ r = dumppred(j, cntxt, mb, t->tval3, elems, j1, j2, j3, j4, j5, j6, j7);
/* l,r = oid from elems that match in head */
if (t->tval2->cval == j_and) {
@@ -2047,8 +2051,7 @@ dumpnextid(MalBlkPtr mb, int j1)
* 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)
+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)
{
InstrPtr q;
int a, b, c, d, e, f, g;
@@ -2249,12 +2252,12 @@ dumpvariabletransformation(MalBlkPtr mb,
case j_operation: {
int r, s;
int u, v;
- int h, i, j, k, l;
+ int h, i, k, l, m;
InstrPtr p;
switch (t->tval1->type) {
case j_var:
case j_operation:
- b = dumpvariabletransformation(mb,
t->tval1, elems,
+ b = dumpvariabletransformation(j,
cntxt, mb, t->tval1, elems,
j1, j2, j3, j4, j5, j6,
j7);
q = newInstruction(mb, ASSIGNsymbol);
@@ -2282,7 +2285,7 @@ dumpvariabletransformation(MalBlkPtr mb,
switch (t->tval3->type) {
case j_var:
case j_operation:
- c = dumpvariabletransformation(mb,
t->tval3, elems,
+ c = dumpvariabletransformation(j,
cntxt, mb, t->tval3, elems,
j1, j2, j3, j4, j5, j6,
j7);
q = newInstruction(mb, ASSIGNsymbol);
@@ -2346,7 +2349,7 @@ dumpvariabletransformation(MalBlkPtr mb,
setFunctionId(q, reverseRef);
q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
q = pushArgument(mb, q, r);
- j = getArg(q, 0);
+ m = getArg(q, 0);
pushInstruction(mb, q);
if (c != -1) {
@@ -2461,7 +2464,7 @@ dumpvariabletransformation(MalBlkPtr mb,
setModuleId(q, algebraRef);
setFunctionId(q, joinRef);
q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
- q = pushArgument(mb, q, j);
+ q = pushArgument(mb, q, m);
q = pushArgument(mb, q, h);
h = getArg(q, 0);
pushInstruction(mb, q);
@@ -2721,7 +2724,7 @@ dumpvariabletransformation(MalBlkPtr mb,
setModuleId(q, algebraRef);
setFunctionId(q, joinRef);
q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
- q = pushArgument(mb, q, j);
+ q = pushArgument(mb, q, m);
q = pushArgument(mb, q, s);
i = getArg(q, 0);
pushInstruction(mb, q);
@@ -2738,7 +2741,7 @@ dumpvariabletransformation(MalBlkPtr mb,
setModuleId(q, algebraRef);
setFunctionId(q, projectRef);
q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
- q = pushArgument(mb, q, j);
+ q = pushArgument(mb, q, m);
q = pushBte(mb, q, 'n');
r = getArg(q, 0);
pushInstruction(mb, q);
@@ -2895,7 +2898,7 @@ dumpvariabletransformation(MalBlkPtr mb,
return a;
}
- b = dumpvariabletransformation(mb, t->tval1, elems,
+ b = dumpvariabletransformation(j, cntxt, mb, t->tval1,
elems,
j1, j2, j3, j4, j5, j6, j7);
/* only need to copy if tval1 is a var, otherwise we
have a
* new copy already */
@@ -3088,7 +3091,7 @@ dumpvariabletransformation(MalBlkPtr mb,
c = -1;
t = t->tval1;
while (t != NULL) {
- b = dumpvariabletransformation(mb, t, elems,
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list