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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list