Changeset: 5f28f362245c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5f28f362245c
Modified Files:
monetdb5/modules/atoms/json.c
monetdb5/modules/atoms/json.mal
sql/scripts/40_json.sql
sql/test/json/Tests/aggregate01.sql
Branch: default
Log Message:
handle special case for aggregate if BATdense and rename functions so that
mitosis magic works for these functions
diffs (154 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
@@ -1761,12 +1761,6 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g,
}
}
}
- if (g && BATtdense(g)) {
- /* singleton groups: return group ID's (g's tail) and original
- * values from b */
- bn = VIEWcreate(BATmirror(g), b);
- goto out;
- }
maxlen = BUFSIZ;
if ((buf = GDKmalloc(maxlen)) == NULL) {
@@ -1798,6 +1792,59 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g,
} else {
map = (const oid *) Tloc(t2, BUNfirst(t2));
}
+ if (g && BATtdense(g)) {
+ for (p = 0, q = BATcount(g); p < q; p++) {
+ switch(b->ttype) {
+ case TYPE_str:
+ v = (const char *) BUNtail(bi, BUNfirst(b) +
(map ? (BUN) map[p] : p + mapoff));
+ break;
+ case TYPE_dbl:
+ val = (const double *) BUNtail(bi, BUNfirst(b)
+ (map ? (BUN) map[p] : p + mapoff));
+ 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);
+ isnil = 1;
+ } else {
+ len = strlen(v);
+ if (len >= maxlen - buflen) {
+ maxlen += len + BUFSIZ;
+ buf = GDKrealloc(buf, maxlen);
+ if (buf == NULL) {
+ err = MAL_MALLOC_FAIL;
+ goto bunins_failed;
+ }
+ }
+ switch (b->ttype) {
+ case TYPE_str:
+ len = snprintf(buf + buflen, maxlen - buflen,
"[ \"%s\" ]", v);
+ buflen += len;
+ break;
+ case TYPE_dbl:
+ len = snprintf(buf + buflen, maxlen - buflen,
"[ %s ]", v);
+ buflen += len;
+ break;
+ }
+ }
+ bunfastapp_nocheck(bn, BUNlast(bn), buf, Tsize(bn));
+ buflen = 0;
+ }
+ BATseqbase(bn, min);
+ bn->T->nil = nils != 0;
+ bn->T->nonil = nils == 0;
+ bn->T->sorted = BATcount(bn) <= 1;
+ bn->T->revsorted = BATcount(bn) <= 1;
+ bn->T->key = BATcount(bn) <= 1;
+ goto out;
+ }
grps = (const oid *) Tloc(g, BUNfirst(g));
prev = grps[0];
isnil = 0;
diff --git a/monetdb5/modules/atoms/json.mal b/monetdb5/modules/atoms/json.mal
--- a/monetdb5/modules/atoms/json.mal
+++ b/monetdb5/modules/atoms/json.mal
@@ -168,27 +168,27 @@ pattern calc.isnil(v:json):bit
address CMDvarISNIL
comment "Nil test for json value";
-command json.aggr(val:bat[:oid,:str]):str
+command aggr.jsonaggr(val:bat[:oid,:str]):str
address JSONgroupStr
comment "Aggregate the string values to array.";
-command json.aggr(val:bat[:oid,:dbl]):str
+command aggr.jsonaggr(val:bat[:oid,:dbl]):str
address JSONgroupStr
comment "Aggregate the double values to array.";
-command json.subaggr(val:bat[:oid,:str],g:bat[:oid,:oid],e:bat[:oid,:any_1],
skip_nils:bit) :bat[:oid,:str]
+command
aggr.subjsonaggr(val:bat[:oid,:str],g:bat[:oid,:oid],e:bat[:oid,:any_1],
skip_nils:bit) :bat[:oid,:str]
address JSONsubjson
comment "Grouped aggregation of values.";
-command json.subaggr(val:bat[:oid,:dbl],g:bat[:oid,:oid],e:bat[:oid,:any_1],
skip_nils:bit) :bat[:oid,:str]
+command
aggr.subjsonaggr(val:bat[:oid,:dbl],g:bat[:oid,:oid],e:bat[:oid,:any_1],
skip_nils:bit) :bat[:oid,:str]
address JSONsubjson
comment "Grouped aggregation of values.";
-command
json.subaggr(val:bat[:oid,:str],g:bat[:oid,:oid],e:bat[:oid,:any_1],s:bat[:oid,:oid],
skip_nils:bit) :bat[:oid,:str]
+command
aggr.subjsonaggr(val:bat[:oid,:str],g:bat[:oid,:oid],e:bat[:oid,:any_1],s:bat[:oid,:oid],
skip_nils:bit) :bat[:oid,:str]
address JSONsubjsoncand
comment "Grouped aggregation of values with candidates list.";
-command
json.subaggr(val:bat[:oid,:dbl],g:bat[:oid,:oid],e:bat[:oid,:any_1],s:bat[:oid,:oid],
skip_nils:bit) :bat[:oid,:str]
+command
aggr.subjsonaggr(val:bat[:oid,:dbl],g:bat[:oid,:oid],e:bat[:oid,:any_1],s:bat[:oid,:oid],
skip_nils:bit) :bat[:oid,:str]
address JSONsubjsoncand
comment "Grouped aggregation of values with candidates list.";
diff --git a/sql/scripts/40_json.sql b/sql/scripts/40_json.sql
--- a/sql/scripts/40_json.sql
+++ b/sql/scripts/40_json.sql
@@ -103,5 +103,5 @@ returns string external name json.output
-- create function json.nest table( id integer, k string, v string)
-- returns json external name json.nest;
-create aggregate json.tojsonarray( x string ) returns string external name
json.aggr;
-create aggregate json.tojsonarray( x double ) returns string external name
json.aggr;
+create aggregate json.tojsonarray( x string ) returns string external name
aggr.jsonaggr;
+create aggregate json.tojsonarray( x double ) returns string external name
aggr.jsonaggr;
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
@@ -26,7 +26,7 @@ select json.tojsonarray(col1) from aggrt
insert into aggrtest01 values (NULL, 1);
-select * from aggrtest01;
+--select * from aggrtest01;
select json.tojsonarray(col1) from aggrtest01;
@@ -42,14 +42,14 @@ 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 * 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;
drop table aggrtest01;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list