Changeset: f8299998e550 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f8299998e550
Modified Files:
sql/backends/monet5/sql.c
Branch: nested
Log Message:
wip inserting nested json
diffs (136 lines):
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5708,8 +5708,8 @@ insert_json(JSON *js, BAT *bats, int nr,
}
#endif
-static int insert_json_object(char **msg, JSON *js, BAT **bats, int nr, int
elm, int id, int anr, sql_subtype *t);
-static int insert_json_array(char **msg, JSON *js, BAT **bats, int nr, int
elm, int id, int oanr, sql_subtype *t);
+static int insert_json_object(char **msg, JSON *js, BAT **bats, int
bat_offset, int nr, int elm, int id, int anr, sql_subtype *t);
+static int insert_json_array(char **msg, JSON *js, BAT **bats, int bat_offset,
int nr, int elm, int id, int oanr, sql_subtype *t);
static ValPtr
jsonv2local(const ValPtr t, char *v)
@@ -5738,7 +5738,7 @@ jsonv2local(const ValPtr t, char *v)
}
static int
-insert_json_object(char **msg, JSON *js, BAT **bats, int nr, int elm, int id,
int anr, sql_subtype *t)
+insert_json_object(char **msg, JSON *js, BAT **bats, int bat_offset, int nr,
int elm, int id, int anr, sql_subtype *t)
{
char buf[128]; /* TODO use proper buffer */
node *n;
@@ -5750,16 +5750,38 @@ insert_json_object(char **msg, JSON *js,
const char *name = NULL;
int nlen = 0, pos = -1, w = list_length(t->type->d.fields), i = 0;
/* TODO check if full object is there */
- for (elm++; elm >0 && elm <= jt->tail+1; elm++) {
+ for (elm++; elm > 0 && elm <= jt->tail+1; elm++) {
JSONterm *jt = js->elm+elm;
switch (jt->kind) {
case JSON_OBJECT:
- elm = insert_json_object(msg, js, bats, nr, elm, id,
anr, t);
+ if (name && nlen) {
+ // find subtype matching field
+ for(n = t->type->d.fields->h; n; n = n->next) {
+ sql_arg *a = n->data;
+ int alen = (int)strlen(a->name);
+ if (nlen == alen && strncmp(name,
a->name, nlen) == 0) {
+ t = &a->type;
+ break;
+ }
+ }
+ }
+ elm = insert_json_object(msg, js, bats, bat_offset, nr,
elm, id, anr, t);
break;
case JSON_ARRAY:
/* TODO get id for nested array from the a global
struct */
- elm = insert_json_array(msg, js, bats, nr, elm, id,
anr, t);
+ if (name && nlen) {
+ // find subtype matching field
+ for(n = t->type->d.fields->h; n; n = n->next) {
+ sql_arg *a = n->data;
+ int alen = (int)strlen(a->name);
+ if (nlen == alen && strncmp(name,
a->name, nlen) == 0) {
+ t = &a->type;
+ break;
+ }
+ }
+ }
+ elm = insert_json_array(msg, js, bats, bat_offset, nr,
elm, id, anr, t);
break;
case JSON_ELEMENT: // field
name = jt->value;
@@ -5788,21 +5810,22 @@ insert_json_object(char **msg, JSON *js,
}
if (pos < 0 || v == NULL)
return -8;
- if (elm > 0 && BUNappend(bats[pos], VALget(v), false)
!= GDK_SUCCEED) {
+ if (elm > 0 && BUNappend(bats[bat_offset], VALget(v),
false) != GDK_SUCCEED) {
return -5;
}
+ bat_offset ++;
}
}
- if (t->multiset && elm > 0 && BUNappend(bats[w], &id, false) !=
GDK_SUCCEED)
+ if (t->multiset && elm > 0 && BUNappend(bats[w + bat_offset], &id,
false) != GDK_SUCCEED)
elm = -3;
- if (t->multiset == MS_ARRAY && elm > 0 && BUNappend(bats[w+1], &anr,
false) != GDK_SUCCEED)
+ if (t->multiset == MS_ARRAY && elm > 0 && BUNappend(bats[w + 1 +
bat_offset], &anr, false) != GDK_SUCCEED)
elm = -3;
return elm;
}
static int
-insert_json_array(char **msg, JSON *js, BAT **bats, int nr, int elm, int id,
int oanr, sql_subtype *t)
+insert_json_array(char **msg, JSON *js, BAT **bats, int bat_offset, int nr,
int elm, int id, int oanr, sql_subtype *t)
{
JSONterm *ja = js->elm+elm;
int tail = ja->tail;
@@ -5811,14 +5834,20 @@ insert_json_array(char **msg, JSON *js,
return -1;
}
int anr = 1;
+ node *n;
for (; elm < tail; elm=ja->next) { /* array begin, comma, end */
ja = js->elm+elm;
for (elm++; elm >0 && elm < ja->next; elm++) {
JSONterm *jt = js->elm+elm;
-
switch (jt->kind) {
case JSON_OBJECT:
- elm = insert_json_object(msg, js, bats+1, nr,
elm, id, anr++, t);
+ // FIX assumes array of composite?
+ n = t->type->d.fields->h;
+ if (n) {
+ sql_arg *a = n->data;
+ t = &a->type;
+ }
+ elm = insert_json_object(msg, js, bats,
bat_offset + 1, nr, elm, id, anr++, t);
(void)oanr;
break;
default:
@@ -5828,7 +5857,7 @@ insert_json_array(char **msg, JSON *js,
if (elm < 0)
break;
}
- if (elm > 0 && anr > 1 && BUNappend(bats[0], &id, false) != GDK_SUCCEED)
+ if (elm > 0 && anr > 1 && BUNappend(bats[bat_offset], &id, false) !=
GDK_SUCCEED)
elm = -2;
return elm+1;
}
@@ -5841,9 +5870,9 @@ insert_json_str(const char *jstr, BAT **
if (!js)
throw(SQL, "insert_json_str", "JSONparse error");
if (t->multiset)
- (void)insert_json_array(&res, js, bats, cnt, 0, 1, 1, t);
+ (void)insert_json_array(&res, js, bats, 0, cnt, 0, 1, 1, t);
else
- (void)insert_json_object(&res, js, bats, cnt, 0, 1, 1, t);
+ (void)insert_json_object(&res, js, bats, 0, cnt, 0, 1, 1, t);
JSONfree(js);
return res;
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]