Changeset: 04a7ceed1004 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=04a7ceed1004
Modified Files:
        monetdb5/extras/jaql/Tests/All
        monetdb5/extras/jaql/Tests/func01.mal
        monetdb5/extras/jaql/jaqlfunc.mal
        monetdb5/extras/jaql/jaqlgencode.c
Branch: jacqueline
Log Message:

funcs: make functions with singleton arguments work

Rewrote range() function to groupable and to comply to the BAT-in,
BAT-out convention.


diffs (163 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
@@ -29,3 +29,4 @@ sort01
 top01
 
 func00
+func01
diff --git a/monetdb5/extras/jaql/Tests/func01.mal 
b/monetdb5/extras/jaql/Tests/func01.mal
--- a/monetdb5/extras/jaql/Tests/func01.mal
+++ b/monetdb5/extras/jaql/Tests/func01.mal
@@ -2,3 +2,8 @@
 jaql.x("[1,2,3] -> sum();");
 jaql.x("sum([1.2,2.4,3.6]);");
 jaql.x("count([1.2,5,3.6,8,\"bla\"]);");
+
+# groupable, but with singleton arguments
+jaql.x("range(6);");
+jaql.x("range(4,8);");
+jaql.x("range(3,11,3);");
diff --git a/monetdb5/extras/jaql/jaqlfunc.mal 
b/monetdb5/extras/jaql/jaqlfunc.mal
--- a/monetdb5/extras/jaql/jaqlfunc.mal
+++ b/monetdb5/extras/jaql/jaqlfunc.mal
@@ -18,43 +18,6 @@
 # This module contains all functions that can be used from jaql
 module jaqlfunc;
 
-function range(start:lng, end:lng, 
skip:lng)(kind:bat[:oid,:bte],string:bat[:oid,:str],integer:bat[:oid,:lng],double:bat[:oid,:dbl],array:bat[:oid,:oid],object:bat[:oid,:oid],name:bat[:oid,:str]);
-       r2 := bat.new(:oid,:str);
-       r4 := bat.new(:oid,:dbl);
-       r6 := bat.new(:oid,:oid);
-       r7 := bat.new(:oid,:str);
-
-       # TODO: use array.series from sciql
-#      r3 := array.series(start, skip, end, 1, 1);
-       r3 := bat.new(:oid,:lng);
-       iend := calc.+(end, 1);
-       barrier (v,i) := language.newRange(start);
-                       r3 := bat.append(r3, i);
-                       redo (v,i) := language.nextElement(skip, iend);
-       exit (v,i);
-       r3 := algebra.markH(r3, 1@0);
-
-       r5 := algebra.project(r3, 0@0);
-       r5 := bat.reverse(r5);
-
-       r1 := bat.new(:oid,:bte);
-       r1 := bat.insert(r1, 0@0, 97:bte); # a
-       k := algebra.project(r3, 105:bte); # i
-       r1 := bat.insert(r1, k);
-
-       return (r1,r2,r3,r4,r5,r6,r7);
-end range;
-
-function range(start:lng, 
end:lng)(kind:bat[:oid,:bte],string:bat[:oid,:str],integer:bat[:oid,:lng],double:bat[:oid,:dbl],array:bat[:oid,:oid],object:bat[:oid,:oid],name:bat[:oid,:str]);
-       (r1,r2,r3,r4,r5,r6,r7) := jaqlfunc.range(start, end, 1:lng);
-       return (r1,r2,r3,r4,r5,r6,r7);
-end range;
-
-function 
range(size:lng)(kind:bat[:oid,:bte],string:bat[:oid,:str],integer:bat[:oid,:lng],double:bat[:oid,:dbl],array:bat[:oid,:oid],object:bat[:oid,:oid],name:bat[:oid,:str]);
-       s := size - 1;
-       (r1,r2,r3,r4,r5,r6,r7) := jaqlfunc.range(0:lng, s);
-       return (r1,r2,r3,r4,r5,r6,r7);
-end range;
 
 # generate a JSON record by merging two JSON arrays
 function 
arrayToRecord(kindn:bat[:oid,:bte],stringn:bat[:oid,:str],integern:bat[:oid,:lng],doublen:bat[:oid,:dbl],arrayn:bat[:oid,:oid],objectn:bat[:oid,:oid],namen:bat[:oid,:str],kindv:bat[:oid,:bte],stringv:bat[:oid,:str],integerv:bat[:oid,:lng],doublev:bat[:oid,:dbl],arrayv:bat[:oid,:oid],objectv:bat[:oid,:oid],namev:bat[:oid,:str])(kind:bat[:oid,:bte],string:bat[:oid,:str],integer:bat[:oid,:lng],double:bat[:oid,:dbl],array:bat[:oid,:oid],object:bat[:oid,:oid],name:bat[:oid,:str]);
@@ -137,3 +100,34 @@ function count(v:bat[:oid,:any]):bat[:oi
        r := batcalc.lng(x);
        return r;
 end count;
+
+function range(start:bat[:oid,:lng], vend:bat[:oid,:lng], 
skip:bat[:oid,:lng]):bat[:oid,:lng];
+       ret := bat.new(:oid,:lng);
+       barrier (b,h,t) := bat.newIterator(start);
+               iend := algebra.fetch(vend, h);
+               iskip := algebra.fetch(skip, h);
+               # TODO: use array.series from sciql
+#              ret := array.series(t, iskip, iend, 1, 1);
+               iend := calc.+(iend, 1);
+               barrier (v,i) := language.newRange(t);
+                               ret := bat.insert(ret, h, i);
+                               redo (v,i) := language.nextElement(iskip, iend);
+               exit (v,i);
+               redo (b,h,t) := bat.hasMoreElements(start);
+       exit (b,h,t);
+
+       return ret;
+end range;
+
+function range(start:bat[:oid,:lng], vend:bat[:oid,:lng]):bat[:oid,:lng];
+       step := algebra.project(start, 1:lng);
+       ret := jaqlfunc.range(start, vend, step);
+       return ret;
+end range;
+
+function range(size:bat[:oid,:lng]):bat[:oid,:lng];
+       start := algebra.project(size, 0:lng);
+       vend := batcalc.-(size,1);
+       ret := jaqlfunc.range(start, vend);
+       return ret;
+end range;
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
@@ -3355,13 +3355,13 @@ conditionalcall(int *j1, int *j2, int *j
                switch (coltypes[i]) {
                        case j_json:
                        case j_json_arr:
-                               pushArgument(mb, q, dynaarg[i][0]);
-                               pushArgument(mb, q, dynaarg[i][1]);
-                               pushArgument(mb, q, dynaarg[i][2]);
-                               pushArgument(mb, q, dynaarg[i][3]);
-                               pushArgument(mb, q, dynaarg[i][4]);
-                               pushArgument(mb, q, dynaarg[i][5]);
-                               pushArgument(mb, q, dynaarg[i][6]);
+                               q = pushArgument(mb, q, dynaarg[i][0]);
+                               q = pushArgument(mb, q, dynaarg[i][1]);
+                               q = pushArgument(mb, q, dynaarg[i][2]);
+                               q = pushArgument(mb, q, dynaarg[i][3]);
+                               q = pushArgument(mb, q, dynaarg[i][4]);
+                               q = pushArgument(mb, q, dynaarg[i][5]);
+                               q = pushArgument(mb, q, dynaarg[i][6]);
                                break;
                        case j_sort_arg:
                                a = dynaarg[i][0];
@@ -3438,7 +3438,7 @@ conditionalcall(int *j1, int *j2, int *j
                                }
                                return;
                        default:
-                               pushArgument(mb, q, dynaarg[i][0]);
+                               q = pushArgument(mb, q, dynaarg[i][0]);
                                break;
                }
        }
@@ -4827,7 +4827,27 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                case j_dbl:
                                                case j_bool:
                                                        q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
newRef);
                                                        q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushType(mb, q, 
TYPE_oid);
+                                                       if (coltypes[i] == 
j_str) {
+                                                               q = 
pushType(mb, q, TYPE_str);
+                                                       } else if (coltypes[i] 
== j_num) {
+                                                               q = 
pushType(mb, q, TYPE_lng);
+                                                       } else if (coltypes[i] 
== j_dbl) {
+                                                               q = 
pushType(mb, q, TYPE_dbl);
+                                                       } else /* j_bool */ {
+                                                               q = 
pushType(mb, q, TYPE_bit);
+                                                       }
+                                                       a = 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, 
a);
+                                                       q = pushOid(mb, q, 
(oid)0);
                                                        if (coltypes[i] == 
j_str) {
                                                                q = pushStr(mb, 
q, w->tval1->sval);
                                                        } else if (coltypes[i] 
== j_num) {
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to