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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list