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

Reply via email to