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