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

Reply via email to