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