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

Reply via email to