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

Reply via email to