Changeset: 2dfa4a6dd06a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2dfa4a6dd06a
Modified Files:
        sql/backends/monet5/vaults/json/json.c
Branch: nested
Log Message:

simplify


diffs (120 lines):

diff --git a/sql/backends/monet5/vaults/json/json.c 
b/sql/backends/monet5/vaults/json/json.c
--- a/sql/backends/monet5/vaults/json/json.c
+++ b/sql/backends/monet5/vaults/json/json.c
@@ -93,59 +93,48 @@ read_json_file(JSONFileHandle *jfh)
        return content;
 }
 
-
-static size_t
-append_terms(allocator *sa, JSON *jt, size_t offset, BAT *b, char **error)
+static str
+append_terms(allocator *sa, JSON *jt, BAT *b)
 {
-       JSONterm *t = jt->elm + offset;
+       str error = MAL_SUCCEED;
+       size_t offset = 0;
+       JSONterm *root = jt->elm, *t;
        char *v = NULL;
-       JSONterm *prev = offset > 0 ? (jt->elm + (offset - 1)) : NULL;
-       JSONterm *next = offset < (size_t)jt->free ? jt->elm + (offset + 1): 
NULL;
-       switch(t->kind) {
-               case JSON_ARRAY:
-                       if (prev==NULL && (next && next->kind < JSON_ELEMENT)) {
-                               offset += 1;
-                       } else {
-                               // array of basic types or array of arrays
-                               v = sa_strndup(sa, t->value, t->valuelen);
-                               do {
-                                       offset += 1;
-                                       next = offset < (size_t)jt->free ? 
jt->elm + offset : NULL;
-                               } while((next && next->kind != JSON_VALUE));
-                       }
-                       break;
-               case JSON_OBJECT:
-                       v = sa_strndup(sa, t->value, t->valuelen);
-                       int depth = 0;
-                       do {
-                               offset += 1;
-                               next = offset < (size_t)jt->free ? jt->elm + 
offset : NULL;
-                               prev = jt->elm + (offset - 1);
-                               if ((next && next->kind == JSON_OBJECT) && 
prev->kind == JSON_ELEMENT)
-                                       depth += 1;
-                               if (next && next->kind == JSON_VALUE) {
-                                       depth -= 1;
+       int depth = 0;
+
+       while(offset < (size_t) jt->free && !error) {
+               t = jt->elm + offset;
+               JSONterm *prev = offset > 0 ? jt->elm + (offset - 1) : NULL;
+               switch(t->kind) {
+                       case JSON_ARRAY:
+                       case JSON_OBJECT:
+                               if ((root->kind == JSON_ARRAY && depth == 1) || 
root->kind == JSON_OBJECT) {
+                                       v = sa_strndup(sa, t->value, 
t->valuelen);
+                                       if (v) {
+                                               if (BUNappend(b, v, false) != 
GDK_SUCCEED) {
+                                                       error = 
createException(SQL, "json.append_terms", "BUNappend failed!");
+                                               }
+                                       }
                                }
-                               if (next && next->kind == JSON_VALUE && 
prev->kind == JSON_VALUE)
-                                       depth = 0;
-                       } while((next && next->kind != JSON_VALUE) || (next && 
depth > 0));
-                       break;
-               case JSON_ELEMENT:
-               case JSON_STRING:
-               case JSON_NUMBER:
-               case JSON_VALUE:
-                       offset +=1;
-                       break;
-               default:
-                       *error = createException(SQL, "json.append_terms", 
"unknown json term");
-                       break;
+                               if ((prev && (prev->kind == JSON_ARRAY || 
prev->kind == JSON_VALUE)) || (prev==NULL && root->kind ==
+                                                       JSON_ARRAY))
+                                       depth ++;
+                               break;
+                       case JSON_ELEMENT:
+                       case JSON_STRING:
+                       case JSON_NUMBER:
+                       case JSON_NULL:
+                               break;
+                       case JSON_VALUE:
+                               depth --;
+                               break;
+                       default:
+                               error = createException(SQL, 
"json.append_terms", "unknown json term");
+                               break;
+               }
+               offset +=1;
        }
-       if (v) {
-               if (BUNappend(b, v, false) != GDK_SUCCEED) {
-                       *error = createException(SQL, "json.append_terms", 
"BUNappend failed!");
-               }
-       }
-       return offset;
+       return error;
 }
 
 
@@ -246,17 +235,7 @@ JSONread_json(Client cntxt, MalBlkPtr mb
        if (jt) {
                if (jt->error == NULL) {
                        b = COLnew(0, TYPE_json, 0, TRANSIENT);
-                       size_t offset = 0;
-                       char *error = NULL;
-                       // append terms
-                       do {
-                               offset = append_terms(sa, jt, offset, b, 
&error);
-                               if (error) {
-                                       msg = error;
-                                       break;
-                               }
-                       } while(offset < (size_t)jt->free);
-                       if (msg == MAL_SUCCEED) {
+                       if ((msg = append_terms(sa, jt, b)) == MAL_SUCCEED) {
                                bat *res = getArgReference_bat(stk, pci, 0);
                                *res = b->batCacheid;
                                BBPkeepref(b);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to