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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to