Changeset: 783f0627efe3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=783f0627efe3
Modified Files:
        monetdb5/extras/jaql/Tests/All
        monetdb5/extras/jaql/Tests/sort00.mal
        monetdb5/extras/jaql/Tests/sort00.stable.err
        monetdb5/extras/jaql/Tests/sort00.stable.out
        monetdb5/extras/jaql/jaql.c
        monetdb5/extras/jaql/jaql.h
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/parser/jaql.l
        monetdb5/extras/jaql/parser/jaql.y
Branch: jacqueline
Log Message:

jaql: implemented sort (with single column ordering for now)

Added sort by.


diffs (truncated from 501 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
@@ -1,4 +1,5 @@
 expand00
 filter00
+sort00
 variable00
 plan00
diff --git a/monetdb5/extras/jaql/Tests/sort00.mal 
b/monetdb5/extras/jaql/Tests/sort00.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/sort00.mal
@@ -0,0 +1,4 @@
+jaql.x("[2,1,3]->sort by [$];");
+jaql.x("[2,1,3]->sort each n by [n desc];");
+jaql.x("[{\"a\":2},{\"a\":1},3]->sort by [$];");
+jaql.x("[{\"a\":2},{\"a\":1},3]->sort by [$.a];");
diff --git a/monetdb5/extras/jaql/Tests/sort00.stable.err 
b/monetdb5/extras/jaql/Tests/sort00.stable.err
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/sort00.stable.err
@@ -0,0 +1,31 @@
+stderr of test 'sort00` in directory 'extras/jaql` itself:
+
+
+# 22:44:59 >  
+# 22:44:59 >  "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=36798" "--set" "monet_prompt=" 
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql" 
"sort00.mal"
+# 22:44:59 >  
+
+# 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 = 36798
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbname = mTests_extras_jaql
+
+# 22:44:59 >  
+# 22:44:59 >  "Done."
+# 22:44:59 >  
+
diff --git a/monetdb5/extras/jaql/Tests/sort00.stable.out 
b/monetdb5/extras/jaql/Tests/sort00.stable.out
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/sort00.stable.out
@@ -0,0 +1,33 @@
+stdout of test 'sort00` in directory 'extras/jaql` itself:
+
+
+# 22:44:59 >  
+# 22:44:59 >  "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=36798" "--set" "monet_prompt=" 
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql" 
"sort00.mal"
+# 22:44:59 >  
+
+# MonetDB 5 server v11.8.0 "jacqueline-9f61a80042c6+"
+# Serving database 'mTests_extras_jaql', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 64bit OIDs dynamically linked
+# Found 15.662 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:36798/
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+# MonetDB/DataCell module not loaded: MALException:jaql.context:JAQL 
environment not found
+function user.main():void;
+    jaql.x("[2,1,3]->sort by [$];");
+    jaql.x("[2,1,3]->sort each n by [n desc];");
+    jaql.x("[{\"a\":2},{\"a\":1},3]->sort by [$];");
+    jaql.x("[{\"a\":2},{\"a\":1},3]->sort by [$.a];");
+end main;
+[ 1, 2, 3 ]
+[ 3, 2, 1 ]
+[ 3, { "a": 2 }, { "a": 1 } ]
+[ { "a": 1 }, { "a": 2 }, 3 ]
+
+# 22:44:59 >  
+# 22:44:59 >  "Done."
+# 22:44:59 >  
+
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
@@ -199,6 +199,37 @@ make_jaql_expand(tree *var, tree *expr)
        return res;
 }
 
+/* create a sort operation defined by comparator in expr */
+tree *
+make_jaql_sort(tree *var, tree *expr)
+{
+       tree *res, *w;
+
+       assert(var != NULL && var->type == j_var);
+       assert(expr != NULL && expr->type == j_sort_arg);
+
+       res = GDKzalloc(sizeof(tree));
+
+       for (w = expr; w != NULL; w = w->next) {
+               if (strcmp(var->sval, w->tval1->sval) != 0) {
+                       char buf[128];
+                       snprintf(buf, sizeof(buf), "sort: unknown variable: %s",
+                                       w->tval1->sval);
+                       res->type = j_error;
+                       res->sval = GDKstrdup(buf);
+                       freetree(expr);
+                       freetree(var);
+                       return res;
+               }
+       }
+
+       res->type = j_sort;
+       res->tval1 = var;
+       res->tval2 = expr;
+
+       return res;
+}
+
 /* create predicate, chaining onto the previous predicate ppred,
  * applying a comparison (AND/OR/NOT currently) with the next predicate
  * pred */
@@ -246,6 +277,33 @@ make_pred(tree *var, tree *comp, tree *v
        return res;
 }
 
+tree *
+make_sort_arg(tree *var, char asc)
+{
+       tree *res = GDKzalloc(sizeof(tree));
+       res->type = j_sort_arg;
+       res->tval1 = var;
+       res->nval = asc;
+
+       return res;
+}
+
+tree *
+append_sort_arg(tree *osarg, tree *nsarg)
+{
+       tree *t = osarg;
+
+       assert(osarg != NULL && osarg->type == j_sort_arg);
+       assert(nsarg != NULL && nsarg->type == j_sort_arg);
+
+       /* find last in chain to append to */
+       while (t->next != NULL)
+               t = t->next;
+       t = t->next = nsarg;
+
+       return osarg;
+}
+
 /* create a variable name from ident */
 tree *
 make_varname(char *ident)
@@ -403,6 +461,21 @@ printtree(tree *t, int level, char op)
                                        printtree(t->tval2, level + step, op);
                                }
                                break;
+                       case j_sort:
+                               if (op) {
+                                       printf("j_sort( ");
+                                       printtree(t->tval1, level + step, op);
+                                       printf(", ( ");
+                                       printtree(t->tval2, level + step, op);
+                                       printf(") ) ");
+                               } else {
+                                       printf("as ");
+                                       printtree(t->tval1, level + step, op);
+                                       printf("-> sort: [ ");
+                                       printtree(t->tval2, level + step, op);
+                                       printf("] ");
+                               }
+                               break;
                        case j_cmpnd:
                                if (op) {
                                        printf("j_cmpnd( ");
@@ -468,6 +541,26 @@ printtree(tree *t, int level, char op)
                                        printtree(t->tval3, level + step, op);
                                }
                                break;
+                       case j_sort_arg:
+                               if (op) {
+                                       printf("j_sort_arg( ");
+                                       printtree(t->tval1, level + step, op);
+                                       printf(", ");
+                                       if (t->nval == 1) {
+                                               printf("asc ");
+                                       } else {
+                                               printf("desc ");
+                                       }
+                                       printf(") ");
+                               } else {
+                                       printtree(t->tval1, level + step, op);
+                                       if (t->nval == 1) {
+                                               printf("asc ");
+                                       } else {
+                                               printf("desc ");
+                                       }
+                               }
+                               break;
                        case j_var:
                                if (op) {
                                        printf("j_var( %s%s ",
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
@@ -63,9 +63,11 @@ enum treetype {
        j_filter,
        j_transform,
        j_expand,
+       j_sort,
        j_cmpnd,
        j_comp,
        j_pred,
+       j_sort_arg,
        j_var,
        j_num,
        j_dbl,
@@ -104,8 +106,11 @@ tree *append_jaql_pipe(tree *oaction, tr
 tree *make_jaql_filter(tree *var, tree *pred);
 tree *make_jaql_transform(tree *var, tree *tmpl);
 tree *make_jaql_expand(tree *var, tree *expr);
+tree *make_jaql_sort(tree *var, tree *expr);
 tree *make_cpred(tree *ppred, tree *comp, tree *pred);
 tree *make_pred(tree *var, tree *comp, tree *value);
+tree *make_sort_arg(tree *var, char asc);
+tree *append_sort_arg(tree *osarg, tree *nsarg);
 tree *make_varname(char *ident);
 tree *append_varname(tree *var, char *ident);
 tree *make_comp(enum comptype t);
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
@@ -506,7 +506,7 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
 {
        InstrPtr q;
        int j1 = 0, j2 = 0, j3 = 0, j4 = 0, j5 = 0, j6 = 0, j7 = 0;
-       int a, b;
+       int a, b, c, d, e, f, g;
 
        /* each iteration in this loop is a pipe (a JSON document)
         * represented by the j1..7 vars */
@@ -739,6 +739,194 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
                                j5 = getArg(q, 0);
                                pushInstruction(mb, q);
                                break;
+                       case j_sort: {
+                               int l[4][2] = {{j2, 's'}, {j3, 'i'}, {j4, 'd'}, 
{0, 0}};
+                               int lw;
+                               a = dumpwalkvar(mb, t->tval1, j1, j5);
+                               b = dumprefvar(mb, t->tval2->tval1, a, j1, j6, 
j7);
+                               /* can only sort on one type (str, lng, dbl), 
and can't
+                                * combine these, so pick first element's type 
and
+                                * sort all of those */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, newRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushType(mb, q, TYPE_chr);
+                               q = pushType(mb, q, TYPE_chr);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, c);
+                               q = pushChr(mb, q, 's');
+                               q = pushChr(mb, q, 's');
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, c);
+                               q = pushChr(mb, q, 'i');
+                               q = pushChr(mb, q, 'i');
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, c);
+                               q = pushChr(mb, q, 'd');
+                               q = pushChr(mb, q, 'd');
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to