Changeset: 4b6d0a64f745 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4b6d0a64f745
Modified Files:
monetdb5/extras/jaql/Tests/All
monetdb5/extras/jaql/Tests/top00.mal
monetdb5/extras/jaql/Tests/top00.stable.err
monetdb5/extras/jaql/Tests/top00.stable.out
monetdb5/extras/jaql/jaql.c
monetdb5/extras/jaql/jaql.h
monetdb5/extras/jaql/jaqlgencode.c
monetdb5/extras/jaql/parser/jaql.y
Branch: jacqueline
Log Message:
jaql: implemented top operator
Map the sorting top to a sort -> top for now.
Dropped unnecessary argument to dumpwalkvar.
diffs (257 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,5 +1,6 @@
expand00
filter00
sort00
+top00
variable00
plan00
diff --git a/monetdb5/extras/jaql/Tests/top00.mal
b/monetdb5/extras/jaql/Tests/top00.mal
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/top00.mal
@@ -0,0 +1,2 @@
+jaql.x("[1,2,5]->top 2;");
+jaql.x("[1,2,5]->top 2 each n by [n desc];");
diff --git a/monetdb5/extras/jaql/Tests/top00.stable.err
b/monetdb5/extras/jaql/Tests/top00.stable.err
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/top00.stable.err
@@ -0,0 +1,31 @@
+stderr of test 'top00` in directory 'extras/jaql` itself:
+
+
+# 15:23:29 >
+# 15:23:29 > "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=39621" "--set" "monet_prompt="
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql"
"top00.mal"
+# 15:23:29 >
+
+# 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 = 39621
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbname = mTests_extras_jaql
+
+# 15:23:30 >
+# 15:23:30 > "Done."
+# 15:23:30 >
+
diff --git a/monetdb5/extras/jaql/Tests/top00.stable.out
b/monetdb5/extras/jaql/Tests/top00.stable.out
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/jaql/Tests/top00.stable.out
@@ -0,0 +1,29 @@
+stdout of test 'top00` in directory 'extras/jaql` itself:
+
+
+# 15:23:29 >
+# 15:23:29 > "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=39621" "--set" "monet_prompt="
"--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_extras_jaql"
"top00.mal"
+# 15:23:29 >
+
+# MonetDB 5 server v11.8.0 "jacqueline-48a43719e63d"
+# 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:39621/
+# 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("[1,2,5]->top 2;");
+ jaql.x("[1,2,5]->top 2 each n by [n desc];");
+end main;
+[ 1, 2 ]
+[ 5, 2 ]
+
+# 15:23:30 >
+# 15:23:30 > "Done."
+# 15:23:30 >
+
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
@@ -230,6 +230,25 @@ make_jaql_sort(tree *var, tree *expr)
return res;
}
+/* create top-N limit operator for the number of elements defined in num */
+tree *
+make_jaql_top(long long int num)
+{
+ tree *res = GDKzalloc(sizeof(tree));
+
+ if (num < 0) {
+ char buf[128];
+ snprintf(buf, sizeof(buf), "top: invalid limit: %lld", num);
+ res->type = j_error;
+ res->sval = GDKstrdup(buf);
+ } else {
+ res->type = j_top;
+ res->nval = num;
+ }
+
+ return res;
+}
+
/* create predicate, chaining onto the previous predicate ppred,
* applying a comparison (AND/OR/NOT currently) with the next predicate
* pred */
@@ -476,6 +495,13 @@ printtree(tree *t, int level, char op)
printf("] ");
}
break;
+ case j_top:
+ if (op) {
+ printf("j_top( %lld ) ", t->nval);
+ } else {
+ printf("-> top: %lld ", t->nval);
+ }
+ break;
case j_cmpnd:
if (op) {
printf("j_cmpnd( ");
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
@@ -64,6 +64,7 @@ enum treetype {
j_transform,
j_expand,
j_sort,
+ j_top,
j_cmpnd,
j_comp,
j_pred,
@@ -107,6 +108,7 @@ tree *make_jaql_filter(tree *var, tree *
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_jaql_top(long long int num);
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);
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
@@ -26,13 +26,11 @@
* bat, pointing to array, so all oids from array bat that have head oid
* value 0@0) */
static int
-dumpwalkvar(MalBlkPtr mb, tree *t, int j1, int j5)
+dumpwalkvar(MalBlkPtr mb, int j1, int j5)
{
InstrPtr q;
int a;
- /* these operations all operate within a pipe */
- assert(t && t->type == j_var);
q = newInstruction(mb, ASSIGNsymbol);
setModuleId(q, algebraRef);
setFunctionId(q, putName("selectH", 7));
@@ -623,7 +621,7 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
case j_pipe:
break;
case j_filter:
- a = dumpwalkvar(mb, t->tval1, j1, j5);
+ a = dumpwalkvar(mb, j1, j5);
/* tval2 can be pred or cpred */
b = dumppred(mb, t->tval2, a, j1, j2, j3, j4,
j6, j7);
/* b = matching ids from dumpwalkvar (first
array) */
@@ -662,7 +660,7 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
case j_transform:
break;
case j_expand:
- a = dumpwalkvar(mb, t->tval1, j1, j5);
+ a = dumpwalkvar(mb, j1, j5);
a = dumprefvar(mb, t->tval2, a, j1, j6, j7);
q = newInstruction(mb, ASSIGNsymbol);
setModuleId(q, algebraRef);
@@ -742,7 +740,7 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
case j_sort: {
int l[4][2] = {{j2, 's'}, {j3, 'i'}, {j4, 'd'},
{0, 0}};
int lw;
- a = dumpwalkvar(mb, t->tval1, j1, j5);
+ a = dumpwalkvar(mb, 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
@@ -927,6 +925,49 @@ dumptree(jc *j, MalBlkPtr mb, tree *t)
j5 = getArg(q, 0);
pushInstruction(mb, q);
} break;
+ case j_top:
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, algebraRef);
+ setFunctionId(q, putName("selectH", 7));
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushArgument(mb, q, j1);
+ q = pushOid(mb, q, 0);
+ a = getArg(q, 0);
+ pushInstruction(mb, q);
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, algebraRef);
+ setFunctionId(q, semijoinRef);
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushArgument(mb, q, j5);
+ q = pushArgument(mb, q, a);
+ a = getArg(q, 0);
+ pushInstruction(mb, q);
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, algebraRef);
+ setFunctionId(q, sliceRef);
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushArgument(mb, q, a);
+ q = pushWrd(mb, q, 0);
+ q = pushWrd(mb, q, (wrd)(t->nval - 1));
+ b = getArg(q, 0);
+ pushInstruction(mb, q);
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, algebraRef);
+ setFunctionId(q, putName("sdifference", 11));
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushArgument(mb, q, a);
+ q = pushArgument(mb, q, b);
+ b = getArg(q, 0);
+ pushInstruction(mb, q);
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, algebraRef);
+ setFunctionId(q, putName("sdifference", 11));
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushArgument(mb, q, j5);
+ q = pushArgument(mb, q, b);
+ j5 = getArg(q, 0);
+ pushInstruction(mb, q);
+ break;
case j_cmpnd:
case j_comp:
case j_pred:
diff --git a/monetdb5/extras/jaql/parser/jaql.y
b/monetdb5/extras/jaql/parser/jaql.y
--- a/monetdb5/extras/jaql/parser/jaql.y
+++ b/monetdb5/extras/jaql/parser/jaql.y
@@ -126,6 +126,9 @@ action: FILTER opt_each predicates
| TRANSFORM opt_each json_fragment {$$ = make_jaql_transform($2,
$3);}
| EXPAND opt_each opt_command {$$ = make_jaql_expand($2, $3);}
| SORT opt_each BY '[' sort_arg ']' {$$ = make_jaql_sort($2, $5);}
+ | TOP _NUMBER {$$ = make_jaql_top($2);}
+ | TOP _NUMBER opt_each BY '[' sort_arg ']'
+ {$$ = append_jaql_pipe(make_jaql_sort($3, $6),
make_jaql_top($2));}
;
opt_command: /* empty */ {$$ = NULL;}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list