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