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

Reply via email to