Changeset: 208b79a98f6a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=208b79a98f6a
Modified Files:
monetdb5/extras/jaql/Tests/json03.mal
monetdb5/extras/jaql/Tests/json03.stable.out
monetdb5/extras/jaql/jaqlgencode.c
monetdb5/extras/jaql/json.c
monetdb5/extras/jaql/json.h
monetdb5/extras/jaql/json.mal
Branch: Oct2012
Log Message:
j_output: avoid extracting when only printing
print and exportResult now take a startoid argument so we can avoid an
extract to ensure the document starts at 0@0. For variable storage
we'll have to use extract to ensure a sane state.
diffs (246 lines):
diff --git a/monetdb5/extras/jaql/Tests/json03.mal
b/monetdb5/extras/jaql/Tests/json03.mal
--- a/monetdb5/extras/jaql/Tests/json03.mal
+++ b/monetdb5/extras/jaql/Tests/json03.mal
@@ -3,24 +3,24 @@
s := io.stdout();
(l1,l2,l3,l4,l5,l6,l7) :=
json.shred("[{\"id\":1,\"name\":\"Fabian\",\"data\":[0,2,true,null]},{\"id\":2,\"name\":\"Niels\"},{\"id\":3,\"name\":\"Martin\",\"data\":null}]");
-json.print(s, l1,l2,l3,l4,l5,l6,l7, true);
+json.print(s, l1,l2,l3,l4,l5,l6,l7, 0@0, true);
(r1,r2,r3,r4,r5,r6,r7) :=
json.shred("[{\"userid\":2,\"prj\":\"sql\"},{\"userid\":1,\"prj\":[\"merovingian\",\"jdbc\",\"jacqueline\"]}]");
-json.print(s, r1,r2,r3,r4,r5,r6,r7, true);
+json.print(s, r1,r2,r3,r4,r5,r6,r7, 0@0, true);
elems := bat.new(:oid, :oid);
elems := bat.insert(elems, 1@0, 4@0);
elems := bat.insert(elems, 9@0, 1@0);
(r1,r2,r3,r4,r5,r6,r7) := json.extract(r1,r2,r3,r4,r5,r6,r7,elems,0@0);
-json.print(s, r1,r2,r3,r4,r5,r6,r7, true);
+json.print(s, r1,r2,r3,r4,r5,r6,r7, 0@0, true);
elems := bat.reverse(elems);
lastid := json.nextid(r1);
(l1,l2,l3,l4,l5,l6,l7) := json.extract(l1,l2,l3,l4,l5,l6,l7,elems,lastid);
-json.print(s, l1,l2,l3,l4,l5,l6,l7, true);
+json.print(s, l1,l2,l3,l4,l5,l6,l7, lastid, true);
# objects from l and r, order should match elems and be equal to elemes
# if startoid is 0@0
@@ -71,4 +71,4 @@ r5 := bat.insert(r5, objs);
r6 := bat.insert(r6, l6);
r7 := bat.insert(r7, l7);
-json.print(s, r1,r2,r3,r4,r5,r6,r7, true);
+json.print(s, r1,r2,r3,r4,r5,r6,r7, 0@0, true);
diff --git a/monetdb5/extras/jaql/Tests/json03.stable.out
b/monetdb5/extras/jaql/Tests/json03.stable.out
--- a/monetdb5/extras/jaql/Tests/json03.stable.out
+++ b/monetdb5/extras/jaql/Tests/json03.stable.out
@@ -20,18 +20,18 @@ function user.main():void;
# use extract to semi-construct a new result
s := io.stdout();
(l1,l2,l3,l4,l5,l6,l7) :=
json.shred("[{\"id\":1,\"name\":\"Fabian\",\"data\":[0,2,true,null]},{\"id\":2,\"name\":\"Niels\"},{\"id\":3,\"name\":\"Martin\",\"data\":null}]");
- json.print(s,l1,l2,l3,l4,l5,l6,l7,true);
+ json.print(s,l1,l2,l3,l4,l5,l6,l7,0@0,true);
(r1,r2,r3,r4,r5,r6,r7) :=
json.shred("[{\"userid\":2,\"prj\":\"sql\"},{\"userid\":1,\"prj\":[\"merovingian\",\"jdbc\",\"jacqueline\"]}]");
- json.print(s,r1,r2,r3,r4,r5,r6,r7,true);
+ json.print(s,r1,r2,r3,r4,r5,r6,r7,0@0,true);
elems := bat.new(:oid,:oid);
elems := bat.insert(elems,1@0,4@0);
elems := bat.insert(elems,9@0,1@0);
(r1,r2,r3,r4,r5,r6,r7) := json.extract(r1,r2,r3,r4,r5,r6,r7,elems,0@0);
- json.print(s,r1,r2,r3,r4,r5,r6,r7,true);
+ json.print(s,r1,r2,r3,r4,r5,r6,r7,0@0,true);
elems := bat.reverse(elems);
lastid := json.nextid(r1);
(l1,l2,l3,l4,l5,l6,l7) := json.extract(l1,l2,l3,l4,l5,l6,l7,elems,lastid);
- json.print(s,l1,l2,l3,l4,l5,l6,l7,true);
+ json.print(s,l1,l2,l3,l4,l5,l6,l7,lastid,true);
# objects from l and r, order should match elems and be equal to elemes
# if startoid is 0@0
o5 := bat.reverse(l5);
@@ -73,7 +73,7 @@ function user.main():void;
r5 := bat.insert(r5,objs);
r6 := bat.insert(r6,l6);
r7 := bat.insert(r7,l7);
- json.print(s,r1,r2,r3,r4,r5,r6,r7,true);
+ json.print(s,r1,r2,r3,r4,r5,r6,r7,0@0,true);
end main;
[
{ "id": 1, "name": "Fabian", "data": [ 0, 2, true, null ] },
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
@@ -5286,7 +5286,6 @@ dumptree(jc *j, Client cntxt, MalBlkPtr
while (t != NULL) {
switch (t->type) {
case j_output_var:
- case j_output:
if (j->startoid != 0) {
a = dumpwalkvar(mb, j->j1, j->j5,
j->startoid);
q = newInstruction(mb, ASSIGNsymbol);
@@ -5326,24 +5325,22 @@ dumptree(jc *j, Client cntxt, MalBlkPtr
j->startoid = 0;
}
- if (t->type == j_output_var) {
- q = newInstruction(mb, ASSIGNsymbol);
- setModuleId(q, putName("jaql", 4));
- setFunctionId(q, putName("setVar", 6));
- q = pushReturn(mb, q,
newTmpVariable(mb, TYPE_any));
- q = pushStr(mb, q, t->sval);
- q = pushArgument(mb, q, j->j1);
- q = pushArgument(mb, q, j->j2);
- q = pushArgument(mb, q, j->j3);
- q = pushArgument(mb, q, j->j4);
- q = pushArgument(mb, q, j->j5);
- q = pushArgument(mb, q, j->j6);
- q = pushArgument(mb, q, j->j7);
- a = getArg(q, 0);
- pushInstruction(mb, q);
- break;
- }
-
+ q = newInstruction(mb, ASSIGNsymbol);
+ setModuleId(q, putName("jaql", 4));
+ setFunctionId(q, putName("setVar", 6));
+ q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
+ q = pushStr(mb, q, t->sval);
+ q = pushArgument(mb, q, j->j1);
+ q = pushArgument(mb, q, j->j2);
+ q = pushArgument(mb, q, j->j3);
+ q = pushArgument(mb, q, j->j4);
+ q = pushArgument(mb, q, j->j5);
+ q = pushArgument(mb, q, j->j6);
+ q = pushArgument(mb, q, j->j7);
+ a = getArg(q, 0);
+ pushInstruction(mb, q);
+ break;
+ case j_output:
q = newInstruction(mb, ASSIGNsymbol);
setModuleId(q, ioRef);
setFunctionId(q, putName("stdout", 6));
@@ -5363,6 +5360,11 @@ dumptree(jc *j, Client cntxt, MalBlkPtr
q = pushArgument(mb, q, j->j5);
q = pushArgument(mb, q, j->j6);
q = pushArgument(mb, q, j->j7);
+ if (j->startoid == 0) {
+ q = pushOid(mb, q, 0);
+ } else {
+ q = pushArgument(mb, q,
j->startoid);
+ }
pushInstruction(mb, q);
} else {
q = newInstruction(mb, ASSIGNsymbol);
@@ -5377,6 +5379,12 @@ dumptree(jc *j, Client cntxt, MalBlkPtr
q = pushArgument(mb, q, j->j5);
q = pushArgument(mb, q, j->j6);
q = pushArgument(mb, q, j->j7);
+ if (j->startoid == 0) {
+ q = pushOid(mb, q, 0);
+ } else {
+ q = pushArgument(mb, q,
j->startoid);
+ }
+ q = pushBit(mb, q, 0);
pushInstruction(mb, q);
}
break;
diff --git a/monetdb5/extras/jaql/json.c b/monetdb5/extras/jaql/json.c
--- a/monetdb5/extras/jaql/json.c
+++ b/monetdb5/extras/jaql/json.c
@@ -799,22 +799,26 @@ print_json_value(jsonbat *jb, stream *s,
}
str
-JSONprint(int *ret, stream **s, int *kind, int *string, int *integer, int
*doble, int *array, int *object, int *name, bit *pretty)
+JSONprint(int *ret, stream **s, int *kind, int *string, int *integer, int
*doble, int *array, int *object, int *name, oid *start, bit *pretty)
{
jsonbat jb;
BATiter bi;
+ BUN startoid;
loadbats();
bi = bat_iterator(jb.kind);
+ BUNfndOID(startoid, bi, start);
+ if (startoid == BUN_NONE)
+ throw(ILLARG, "json.print", "start must be a valid oid from
kind");
- if (*pretty == TRUE && *(char *)BUNtail(bi, BUNfirst(jb.kind)) == 'a') {
+ if (*pretty == TRUE && *(char *)BUNtail(bi, startoid) == 'a') {
BAT *elems;
BUN p, q;
size_t esize = 0, fsize = 0;
int indent;
char first = 1;
- oid id = *(oid *)BUNhead(bi, BUNfirst(jb.kind));
+ oid id = *(oid *)BUNhead(bi, startoid);
/* look into the first array's members to see if breaking up is
* going to be necessary */
@@ -858,7 +862,7 @@ JSONprint(int *ret, stream **s, int *kin
}
mnstr_printf(*s, "%c]\n", indent >= 0 ? '\n' : ' ');
} else {
- print_json_value(&jb, *s, *(oid *)BUNhead(bi,
BUNfirst(jb.kind)), -1);
+ print_json_value(&jb, *s, *(oid *)BUNhead(bi, startoid), -1);
mnstr_printf(*s, "\n");
}
@@ -869,7 +873,7 @@ JSONprint(int *ret, stream **s, int *kin
}
str
-JSONexportResult(int *ret, stream **s, int *kind, int *string, int *integer,
int *doble, int *array, int *object, int *name)
+JSONexportResult(int *ret, stream **s, int *kind, int *string, int *integer,
int *doble, int *array, int *object, int *name, oid *start)
{
stream *f;
buffer *bufstr = NULL;
@@ -881,7 +885,7 @@ JSONexportResult(int *ret, stream **s, i
bufstr = buffer_create(8096);
f = buffer_wastream(bufstr, "bufstr_write");
- JSONprint(ret, &f, kind, string, integer, doble, array, object, name,
&pretty);
+ JSONprint(ret, &f, kind, string, integer, doble, array, object, name,
start, &pretty);
/* calculate width of column, and the number of tuples */
buf = buffer_get_buf(bufstr);
diff --git a/monetdb5/extras/jaql/json.h b/monetdb5/extras/jaql/json.h
--- a/monetdb5/extras/jaql/json.h
+++ b/monetdb5/extras/jaql/json.h
@@ -37,8 +37,8 @@
json_export str JSONshred(int *kind, int *string, int *integer, int *doble,
int *array, int *object, int *name, str *json);
json_export str JSONshredstream(int *kind, int *string, int *integer, int
*doble, int *array, int *object, int *name, str *uri);
-json_export str JSONprint(int *ret, stream **s, int *kind, int *string, int
*integer, int *doble, int *array, int *object, int *name, bit *pretty);
-json_export str JSONexportResult(int *ret, stream **s, int *kind, int *string,
int *integer, int *doble, int *array, int *object, int *name);
+json_export str JSONprint(int *ret, stream **s, int *kind, int *string, int
*integer, int *doble, int *array, int *object, int *name, oid *start, bit
*pretty);
+json_export str JSONexportResult(int *ret, stream **s, int *kind, int *string,
int *integer, int *doble, int *array, int *object, int *name, oid *start);
json_export str JSONstore(int *ret, str *nme, int *kind, int *string, int
*integer, int *doble, int *array, int *object, int *name);
json_export str JSONload(int *kind, int *string, int *integer, int *doble, int
*array, int *object, int *name, str *nme);
json_export str JSONdrop(int *ret, str *name);
diff --git a/monetdb5/extras/jaql/json.mal b/monetdb5/extras/jaql/json.mal
--- a/monetdb5/extras/jaql/json.mal
+++ b/monetdb5/extras/jaql/json.mal
@@ -25,15 +25,15 @@ command shreduri(uri:str)(kind:bat[:oid,
address JSONshredstream
comment "Parse the JSON object from URI into internal shredded representation";
-command print(o:streams,
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],
pretty:bit):void
+command print(o:streams,
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],
start:oid, pretty:bit):void
address JSONprint
comment "Serialise the given JSON pointer into JSON format";
function print(o:streams,
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]):void;
- json.print(o, kind, string, integer, double, array, object, name,
false:bit);
+ json.print(o, kind, string, integer, double, array, object, name, 0@0,
false:bit);
end print;
-command exportResult(o:streams,
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]):void
+command exportResult(o:streams,
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],
start:oid):void
address JSONexportResult
comment "Serialise the given JSON pointer into JSON format, respecting the
MAPI protocol";
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list