Changeset: a8aabbf7b564 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a8aabbf7b564
Modified Files:
        monetdb5/modules/atoms/json.c
        sql/test/json/Tests/aggregate01.sql
Branch: default
Log Message:

improve partial implementation of tojsonarry aggregate


diffs (148 lines):

diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -1802,8 +1802,12 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                prev = grps[0];
                isnil = 0;
                for (p = 0, q = BATcount(g); p <= q; p++) {
+                       if (p == 0) {
+                               strncpy(buf + buflen, "[ ", maxlen - buflen);
+                               buflen += 2;
+                       }
                        if (p == q || grps[p] != prev) {
-                               strncpy(buf + buflen, " ]", buflen);
+                               strncpy(buf + buflen, " ]", maxlen - buflen);
                                buflen += 2;
                                while (BATcount(bn) < prev - min) {
                                        bunfastapp_nocheck(bn, BUNlast(bn), 
str_nil, Tsize(bn));
@@ -1811,11 +1815,13 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                                }
                                bunfastapp_nocheck(bn, BUNlast(bn), buf, 
Tsize(bn));
                                nils += strNil(buf);
-                               strncpy(buf, str_nil, maxlen);
+                               strncpy(buf + buflen, str_nil, maxlen - buflen);
                                buflen = 0;
                                if (p == q)
                                        break;
                                prev = grps[p];
+                               strncpy(buf + buflen, "[ ", maxlen - buflen);
+                               buflen += 2;
                                isnil = 0;
                        }
                        if (isnil)
@@ -1851,8 +1857,8 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                                }
                                switch (b->ttype) {
                                case TYPE_str:
-                                       if (buflen == 0) {
-                                               len = snprintf(buf + buflen, 
maxlen - buflen, "[ \"%s\"", v);
+                                       if (buflen == 2) {
+                                               len = snprintf(buf + buflen, 
maxlen - buflen, "\"%s\"", v);
                                                buflen += len;
                                        } else {
                                                len = snprintf(buf + buflen, 
maxlen - buflen, ", \"%s\"", v);
@@ -1860,8 +1866,8 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                                        }
                                        break;
                                case TYPE_dbl:
-                                       if (buflen == 0) {
-                                               len = snprintf(buf + buflen, 
maxlen - buflen, "[ %s", v);
+                                       if (buflen == 2) {
+                                               len = snprintf(buf + buflen, 
maxlen - buflen, "%s", v);
                                                buflen += len;
                                        } else {
                                                len = snprintf(buf + buflen, 
maxlen - buflen, ", %s", v);
@@ -1875,8 +1881,22 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                t2 = NULL;
        } else {
                for (p = BUNfirst(b), q = p + BATcount(b); p < q; p++) {
-                       v = (const char *) BUNtail(bi, p);
-                       if (strNil(v)) {
+                       switch(b->ttype) {
+                               case  TYPE_str:
+                                 v = (const char *) BUNtail(bi, p);
+                               break;
+                       case TYPE_dbl:
+                               val = (const double *) BUNtail(bi, p);
+                               if (*val != dbl_nil) {
+                                       snprintf(temp, sizeof(temp), "%f", 
*val);
+                                       v = (const char *)temp;
+                               } else {
+                                       v =  NULL;
+                               }
+                               break;
+                       }
+
+                       if (!v||strNil(v)) {
                                if (skip_nils)
                                        continue;
                                strncpy(buf, str_nil, buflen);
@@ -1892,12 +1912,25 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, 
                                        goto bunins_failed;
                                }
                        }
-                       if (buflen == 0) {
-                               len = snprintf(buf + buflen, maxlen - buflen, 
"[ \"%s\"", v);
-                               buflen += len;
-                       } else {
-                               len = snprintf(buf + buflen, maxlen - buflen, 
", \"%s\"", v);
-                               buflen += len;
+                       switch (b->ttype) {
+                       case TYPE_str:
+                         if (buflen == 2) {
+                           len = snprintf(buf + buflen, maxlen - buflen, 
"\"%s\"", v);
+                           buflen += len;
+                         } else {
+                           len = snprintf(buf + buflen, maxlen - buflen, ", 
\"%s\"", v);
+                           buflen += len;
+                         }
+                         break;
+                       case TYPE_dbl:
+                         if (buflen == 2) {
+                           len = snprintf(buf + buflen, maxlen - buflen, "%s", 
v);
+                           buflen += len;
+                         } else {
+                           len = snprintf(buf + buflen, maxlen - buflen, ", 
%s", v);
+                           buflen += len;
+                         }
+                         break;
                        }
                }
                bunfastapp_nocheck(bn, BUNlast(bn), buf, Tsize(bn));
diff --git a/sql/test/json/Tests/aggregate01.sql 
b/sql/test/json/Tests/aggregate01.sql
--- a/sql/test/json/Tests/aggregate01.sql
+++ b/sql/test/json/Tests/aggregate01.sql
@@ -24,14 +24,32 @@ insert into aggrtest01 values (NULL, 1);
 
 select json.tojsonarray(col1) from aggrtest01;
 
+insert into aggrtest01 values (NULL, 1);
+
+select * from aggrtest01;
+
+select json.tojsonarray(col1) from aggrtest01;
+
+select json.tojsonarray(col1) from aggrtest01 group by col2;
+
 insert into aggrtest01 values (0.1234, 1);
 
 select json.tojsonarray(col1) from aggrtest01;
 
 insert into aggrtest01 values (0.516273849, 2);
 
+select * from aggrtest01;
+
 select json.tojsonarray(col1) from aggrtest01;
 
-select json.tojsonarray(col1) from aggrtest01 group by col2;
+--select json.tojsonarray(col1) from aggrtest01 group by col2;
+
+delete from aggrtest01 where col1 is null;
+
+select * from aggrtest01;
+
+select json.tojsonarray(col1) from aggrtest01;
+
+--select json.tojsonarray(col1) from aggrtest01 group by col2;
 
 drop table aggrtest01;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to