Changeset: 7d0a2524e8bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d0a2524e8bd
Modified Files:
        monetdb5/extras/jaql/Tests/json05.mal
        monetdb5/extras/jaql/Tests/json05.stable.out
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/json.c
        monetdb5/extras/jaql/json.h
        monetdb5/extras/jaql/json.mal
Branch: jacqueline
Log Message:

unwrap: allow to extract array values from any depth


diffs (242 lines):

diff --git a/monetdb5/extras/jaql/Tests/json05.mal 
b/monetdb5/extras/jaql/Tests/json05.mal
--- a/monetdb5/extras/jaql/Tests/json05.mal
+++ b/monetdb5/extras/jaql/Tests/json05.mal
@@ -1,19 +1,19 @@
 # Test the unwrapping of JSON arrays
 
 (j1,j2,j3,j4,j5,j6,j7) := json.shred("[false,1,2,null,4]");
-t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
 io.print(t);
-a := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0:lng);
+a := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,0:lng);
 io.print(a);
 
 (j1,j2,j3,j4,j5,j6,j7) := json.shred("[1,true,2.3,null,4]");
-t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
 io.print(t);
-b := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0:dbl);
+b := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,0:dbl);
 io.print(b);
 
 (j1,j2,j3,j4,j5,j6,j7) := json.shred("[1,2.3,null,4,\"4\",true]");
-t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
 io.print(t);
-c := json.unwrap(j1,j2,j3,j4,j5,j6,j7,"":str);
+c := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,"":str);
 io.print(c);
diff --git a/monetdb5/extras/jaql/Tests/json05.stable.out 
b/monetdb5/extras/jaql/Tests/json05.stable.out
--- a/monetdb5/extras/jaql/Tests/json05.stable.out
+++ b/monetdb5/extras/jaql/Tests/json05.stable.out
@@ -18,19 +18,19 @@ stdout of test 'json05` in directory 'ex
 function user.main():void;
 # Test the unwrapping of JSON arrays 
     (j1,j2,j3,j4,j5,j6,j7) := json.shred("[false,1,2,null,4]");
-    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
     io.print(t);
-    a := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0:lng);
+    a := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,0:lng);
     io.print(a);
     (j1,j2,j3,j4,j5,j6,j7) := json.shred("[1,true,2.3,null,4]");
-    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
     io.print(t);
-    b := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0:dbl);
+    b := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,0:dbl);
     io.print(b);
     (j1,j2,j3,j4,j5,j6,j7) := json.shred("[1,2.3,null,4,\"4\",true]");
-    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7);
+    t := json.unwraptype(j1,j2,j3,j4,j5,j6,j7,0@0);
     io.print(t);
-    c := json.unwrap(j1,j2,j3,j4,j5,j6,j7,"":str);
+    c := json.unwrap(j1,j2,j3,j4,j5,j6,j7,0@0,"":str);
     io.print(c);
 end main;
 [ "lng" ]
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
@@ -3327,6 +3327,7 @@ dumpvariabletransformation(jc *j, Client
                                                                q = 
pushArgument(mb, q, b);
                                                                q = 
pushArgument(mb, q, *j6);
                                                                q = 
pushArgument(mb, q, *j7);
+                                                               q = pushOid(mb, 
q, (oid)0);
                                                                dynaarg[i][0] = 
getArg(q, 0);
                                                                
pushInstruction(mb, q);
 
@@ -3361,6 +3362,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, b);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
+                                                                       q = 
pushOid(mb, q, (oid)0);
                                                                        q = 
pushStr(mb, q, "");
                                                                        
dynaarg[i][1] = getArg(q, 0);
                                                                        
pushInstruction(mb, q);
@@ -3401,6 +3403,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, b);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
+                                                                       q = 
pushOid(mb, q, (oid)0);
                                                                        q = 
pushDbl(mb, q, 0.0);
                                                                        
dynaarg[i][2] = getArg(q, 0);
                                                                        
pushInstruction(mb, q);
@@ -3441,6 +3444,7 @@ dumpvariabletransformation(jc *j, Client
                                                                        q = 
pushArgument(mb, q, b);
                                                                        q = 
pushArgument(mb, q, *j6);
                                                                        q = 
pushArgument(mb, q, *j7);
+                                                                       q = 
pushOid(mb, q, (oid)0);
                                                                        q = 
pushLng(mb, q, 0);
                                                                        
dynaarg[i][3] = getArg(q, 0);
                                                                        
pushInstruction(mb, q);
@@ -5581,6 +5585,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                        q = pushArgument(mb, q, 
j5);
                                                        q = pushArgument(mb, q, 
j6);
                                                        q = pushArgument(mb, q, 
j7);
+                                                       q = pushOid(mb, q, 
(oid)0);
                                                        a = getArg(q, 0);
                                                        dynaarg[i][0] = a;
                                                        pushInstruction(mb, q);
@@ -5616,6 +5621,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                q = 
pushArgument(mb, q, j5);
                                                                q = 
pushArgument(mb, q, j6);
                                                                q = 
pushArgument(mb, q, j7);
+                                                               q = pushOid(mb, 
q, (oid)0);
                                                                q = pushStr(mb, 
q, "");
                                                                dynaarg[i][1] = 
getArg(q, 0);
                                                                
pushInstruction(mb, q);
@@ -5656,6 +5662,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                q = 
pushArgument(mb, q, j5);
                                                                q = 
pushArgument(mb, q, j6);
                                                                q = 
pushArgument(mb, q, j7);
+                                                               q = pushOid(mb, 
q, (oid)0);
                                                                q = pushDbl(mb, 
q, 0.0);
                                                                dynaarg[i][2] = 
getArg(q, 0);
                                                                
pushInstruction(mb, q);
@@ -5696,6 +5703,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                q = 
pushArgument(mb, q, j5);
                                                                q = 
pushArgument(mb, q, j6);
                                                                q = 
pushArgument(mb, q, j7);
+                                                               q = pushOid(mb, 
q, (oid)0);
                                                                q = pushLng(mb, 
q, 0);
                                                                dynaarg[i][3] = 
getArg(q, 0);
                                                                
pushInstruction(mb, q);
@@ -5808,6 +5816,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                        q = 
pushArgument(mb, q, a5);
                                                                        q = 
pushArgument(mb, q, a6);
                                                                        q = 
pushArgument(mb, q, a7);
+                                                                       q = 
pushOid(mb, q, (oid)0);
                                                                        a = 
getArg(q, 0);
                                                                        
dynaarg[i][0] = a;
                                                                        
pushInstruction(mb, q);
@@ -5842,6 +5851,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                                
q = pushArgument(mb, q, a5);
                                                                                
q = pushArgument(mb, q, a6);
                                                                                
q = pushArgument(mb, q, a7);
+                                                                               
q = pushOid(mb, q, (oid)0);
                                                                                
q = pushStr(mb, q, "");
                                                                                
dynaarg[i][1] = getArg(q, 0);
                                                                                
pushInstruction(mb, q);
@@ -5882,6 +5892,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                                
q = pushArgument(mb, q, a5);
                                                                                
q = pushArgument(mb, q, a6);
                                                                                
q = pushArgument(mb, q, a7);
+                                                                               
q = pushOid(mb, q, (oid)0);
                                                                                
q = pushDbl(mb, q, 0.0);
                                                                                
dynaarg[i][2] = getArg(q, 0);
                                                                                
pushInstruction(mb, q);
@@ -5922,6 +5933,7 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                                                
q = pushArgument(mb, q, a5);
                                                                                
q = pushArgument(mb, q, a6);
                                                                                
q = pushArgument(mb, q, a7);
+                                                                               
q = pushOid(mb, q, (oid)0);
                                                                                
q = pushLng(mb, q, 0);
                                                                                
dynaarg[i][3] = getArg(q, 0);
                                                                                
pushInstruction(mb, q);
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
@@ -980,7 +980,7 @@ JSONwrap(int *rkind, int *rstring, int *
 }
 
 str
-JSONunwraptype(str *ret, int *kind, int *string, int *integer, int *doble, int 
*array, int *object, int *name)
+JSONunwraptype(str *ret, int *kind, int *string, int *integer, int *doble, int 
*array, int *object, int *name, oid *arrid)
 {
        jsonbat jb;
        BAT *b;
@@ -992,13 +992,12 @@ JSONunwraptype(str *ret, int *kind, int 
 
        /* find types of outermost array */
        bi = bat_iterator(jb.kind);
-       if (*(bte *)BUNtail(bi, BUNfirst(jb.kind)) != 'a') {
+       BUNfndOID(p, bi, arrid);
+       if (*(bte *)BUNtail(bi, p) != 'a') {
                unloadbats();
                throw(MAL, "json.unwraptype", "JSON value must be an array");
        }
-       b = BATselect(BATmirror(jb.array),
-                                       BUNhead(bi, BUNfirst(jb.kind)),
-                                       BUNhead(bi, BUNfirst(jb.kind)));
+       b = BATselect(BATmirror(jb.array), BUNhead(bi, p), BUNhead(bi, p));
        b = BATsemijoin(jb.kind, b);
        bi = bat_iterator(b);
        BATloop(b, p, q) {
@@ -1042,7 +1041,8 @@ JSONunwrap(Client cntxt, MalBlkPtr mb, M
        int *array = (int *)getArgReference(stk, pci, 5);
        int *object = (int *)getArgReference(stk, pci, 6);
        int *name = (int *)getArgReference(stk, pci, 7);
-       ValPtr tpe = getArgReference(stk, pci, 8);
+       oid *arrid = (oid *)getArgReference(stk, pci, 8);
+       ValPtr tpe = getArgReference(stk, pci, 9);
        jsonbat jb;
        BATiter bi, bis, bii, bid;
        BAT *b, *r;
@@ -1071,13 +1071,12 @@ JSONunwrap(Client cntxt, MalBlkPtr mb, M
 
        /* find types of outermost array */
        bi = bat_iterator(jb.kind);
-       if (*(bte *)BUNtail(bi, BUNfirst(jb.kind)) != 'a') {
+       BUNfndOID(p, bi, arrid);
+       if (*(bte *)BUNtail(bi, p) != 'a') {
                unloadbats();
-               throw(MAL, "json.unwraptype", "JSON value must be an array");
+               throw(MAL, "json.wraptype", "JSON value must be an array");
        }
-       b = BATselect(BATmirror(jb.array),
-                                       BUNhead(bi, BUNfirst(jb.kind)),
-                                       BUNhead(bi, BUNfirst(jb.kind)));
+       b = BATselect(BATmirror(jb.array), BUNhead(bi, p), BUNhead(bi, p));
        b = BATsemijoin(jb.kind, b);
        bi = bat_iterator(b);
 
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
@@ -42,7 +42,7 @@ json_export str JSONload(int *kind, int 
 json_export str JSONdrop(int *ret, str *name);
 json_export str JSONextract(int *rkind, int *rstring, int *rinteger, int 
*rdoble, int *rarray, int *robject, int *rname, int *kind, int *string, int 
*integer, int *doble, int *array, int *object, int *name, int *elems, oid 
*startoid);
 json_export str JSONwrap(int *rkind, int *rstring, int *rinteger, int *rdoble, 
int *rarray, int *robject, int *rname, int *elems);
-json_export str JSONunwraptype(str *ret, int *kind, int *string, int *integer, 
int *doble, int *array, int *object, int *name);
+json_export str JSONunwraptype(str *ret, int *kind, int *string, int *integer, 
int *doble, int *array, int *object, int *name, oid *arrid);
 json_export str JSONunwrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
 #endif
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
@@ -45,10 +45,10 @@ command wrap(elems:bat[:oid,:any])(kind:
 address JSONwrap
 comment "Wrap the given BAT inside a JSON array";
 
-command 
unwraptype(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]):str
+command 
unwraptype(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],arrid:oid):str
 address JSONunwraptype
 comment "Retrieve the type necessary to unwrap the given JSON array to";
 
-pattern 
unwrap(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],
 tpe:any_1)(:bat[:oid,:any_1])
+pattern 
unwrap(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],arrid:oid,tpe:any_1)(:bat[:oid,:any_1])
 address JSONunwrap
 comment "Return the outermost JSON array elements as BAT with tail type tpe 
performing the necessary casts";
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to