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