Changeset: facde0cda494 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=facde0cda494 Added Files: sql/test/json/Tests/aggregate01.sql sql/test/json/Tests/aggregate01.stable.err sql/test/json/Tests/aggregate01.stable.out Modified Files: monetdb5/modules/atoms/json.c monetdb5/modules/atoms/json.mal sql/scripts/40_json.sql sql/test/json/Tests/All sql/test/json/Tests/aggregate00.sql Branch: default Log Message:
add json aggregate for double columns diffs (truncated from 401 to 300 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 @@ -1603,11 +1603,13 @@ JSONgroupStr(str *ret, const bat *bid) { BAT *b; BUN p, q; - const char *t; + const char *t = NULL; size_t len, size = BUFSIZ, offset; str buf = GDKmalloc(size); BATiter bi; const char *err = NULL; + char temp[128] = ""; + const double * val = NULL; if (buf == NULL) throw(MAL, "json.group",MAL_MALLOC_FAIL); @@ -1620,9 +1622,20 @@ JSONgroupStr(str *ret, const bat *bid) offset = 0; bi = bat_iterator(b); BATloop(b, p, q) { - int n; + int n = 0; - t = (const char *) BUNtail(bi, p); + switch (b->ttype) { + case TYPE_str: + t = (const char *) BUNtail(bi, p); + break; + case TYPE_dbl: + val = (const double *) BUNtail(bi, p); + snprintf(temp, sizeof(temp), "%f", *val); + t = (const char *)temp; + break; + } + + //t = (const char *) BUNtail(bi, p); if (strNil(t)) continue; @@ -1635,18 +1648,37 @@ JSONgroupStr(str *ret, const bat *bid) goto failed; } } - if (offset == 0) { - if (BATcount(b) == 1) { - n = snprintf(buf, size, "[ \"%s\" ]", t); + switch (b->ttype) { + case TYPE_str: + if (offset == 0) { + if (BATcount(b) == 1) { + n = snprintf(buf, size, "[ \"%s\" ]", t); + } else { + n = snprintf(buf, size, "[ \"%s\"", t); + } } else { - n = snprintf(buf, size, "[ \"%s\"", t); + if (p == BUNlast(b) - 1) { + n = snprintf(buf + offset, size - offset, ", \"%s\" ]", t); + } else { + n = snprintf(buf + offset, size - offset, ", \"%s\"", t); + } } - } else { - if (p == BUNlast(b) - 1) { - n = snprintf(buf + offset, size - offset, ", \"%s\" ]", t); - } else { - n = snprintf(buf + offset, size - offset, ", \"%s\"", t); + break; + case TYPE_dbl: + if (offset == 0) { + if (BATcount(b) == 1) { + n = snprintf(buf, size, "[ %s ]", t); + } else { + n = snprintf(buf, size, "[ %s", t); + } + } else { + if (p == BUNlast(b) - 1) { + n = snprintf(buf + offset, size - offset, ", %s ]", t); + } else { + n = snprintf(buf + offset, size - offset, ", %s", t); + } } + break; } offset += n; } @@ -1670,7 +1702,7 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, BUN nils = 0; int isnil; const oid *cand = NULL, *candend = NULL; - const char *v; + const char *v = NULL; const oid *grps, *map; oid mapoff = 0; oid prev; @@ -1679,12 +1711,14 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, char *buf = NULL; size_t buflen, maxlen, len; const char *err; + char temp[128] = ""; + const double * val = NULL; if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &start, &end, &cnt, &cand, &candend)) != NULL) { return err; } - assert(b->ttype == TYPE_str); + assert(b->ttype == TYPE_str||b->ttype == TYPE_dbl); if (BATcount(b) == 0 || ngrp == 0) { bn = BATconstant(TYPE_str, ATOMnilptr(TYPE_str), ngrp); if (bn == NULL) @@ -1775,7 +1809,7 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, bunfastapp_nocheck(bn, BUNlast(bn), str_nil, Tsize(bn)); nils++; } - bunfastapp_nocheck(bn, BUNlast(bn), buf, Tsize(b)); + bunfastapp_nocheck(bn, BUNlast(bn), buf, Tsize(bn)); nils += strNil(buf); strncpy(buf, str_nil, maxlen); buflen = 0; @@ -1786,8 +1820,16 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, } if (isnil) continue; - v = (const char *) BUNtail(bi, BUNfirst(b) + (map ? (BUN) map[p] : p + mapoff)); - + 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)); + snprintf(temp, sizeof(temp), "%f", *val); + v = (const char *)temp; + break; + } if (strNil(v)) { if (skip_nils) continue; @@ -1803,12 +1845,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 == 0) { + 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 == 0) { + len = snprintf(buf + buflen, maxlen - buflen, "[ %s", v); + buflen += len; + } else { + len = snprintf(buf + buflen, maxlen - buflen, ", %s", v); + buflen += len; + } + break; } } } 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 @@ -172,12 +172,24 @@ command json.aggr(val:bat[:oid,:str]):st address JSONgroupStr comment "Aggregate the string values to array."; +command json.aggr(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] 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] +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] 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] +address JSONsubjsoncand +comment "Grouped aggregation of values with candidates list."; + json.prelude(); 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 @@ -104,3 +104,4 @@ returns string external name json.output -- 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; diff --git a/sql/test/json/Tests/All b/sql/test/json/Tests/All --- a/sql/test/json/Tests/All +++ b/sql/test/json/Tests/All @@ -10,3 +10,4 @@ pathexpr components load aggregate00 +aggregate01 diff --git a/sql/test/json/Tests/aggregate00.sql b/sql/test/json/Tests/aggregate00.sql --- a/sql/test/json/Tests/aggregate00.sql +++ b/sql/test/json/Tests/aggregate00.sql @@ -17,3 +17,5 @@ insert into aggrtest values ('foobar', 2 select json.tojsonarray(col1) from aggrtest; select json.tojsonarray(col1) from aggrtest group by col2; + +drop table aggrtest; diff --git a/sql/test/json/Tests/aggregate01.sql b/sql/test/json/Tests/aggregate01.sql new file mode 100644 --- /dev/null +++ b/sql/test/json/Tests/aggregate01.sql @@ -0,0 +1,21 @@ +create table aggrtest1 ( col1 double, col2 integer ); + +select json.tojsonarray(col1) from aggrtest1; + +insert into aggrtest1 values (0.1234, 1); + +select json.tojsonarray(col1) from aggrtest1; + +insert into aggrtest1 values (5.6789, 1); + +select json.tojsonarray(col1) from aggrtest1; + +select json.tojsonarray(col1) from aggrtest1 group by col2; + +insert into aggrtest1 values (0.516273849, 2); + +select json.tojsonarray(col1) from aggrtest1; + +select json.tojsonarray(col1) from aggrtest1 group by col2; + +drop table aggrtest1; diff --git a/sql/test/json/Tests/aggregate01.stable.err b/sql/test/json/Tests/aggregate01.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/json/Tests/aggregate01.stable.err @@ -0,0 +1,36 @@ +stderr of test 'aggregate01` in directory 'sql/test/json` itself: + + +# 12:36:42 > +# 12:36:42 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34481" "--set" "mapi_usock=/var/tmp/mtest-26015/.s.monetdb.34481" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/export/scratch2/rijke/monetdb/default/var/MonetDB/mTests_sql_test_json" "--set" "mal_listing=0" +# 12:36:42 > + +# builtin opt gdk_dbpath = /export/scratch2/rijke/monetdb/default/var/monetdb5/dbfarm/demo +# builtin opt gdk_debug = 0 +# builtin opt gdk_vmtrim = no +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 34481 +# cmdline opt mapi_usock = /var/tmp/mtest-26015/.s.monetdb.34481 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /export/scratch2/rijke/monetdb/default/var/MonetDB/mTests_sql_test_json +# cmdline opt mal_listing = 0 +# cmdline opt gdk_debug = 536870922 + +# 12:36:42 > +# 12:36:42 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-26015" "--port=34481" +# 12:36:42 > + + +# 12:36:43 > +# 12:36:43 > "Done." +# 12:36:43 > + diff --git a/sql/test/json/Tests/aggregate01.stable.out b/sql/test/json/Tests/aggregate01.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/json/Tests/aggregate01.stable.out @@ -0,0 +1,103 @@ +stdout of test 'aggregate01` in directory 'sql/test/json` itself: + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list