Changeset: d2f58b9bdad2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d2f58b9bdad2
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/backends/monet5/generator/Tests/generator03.sql
sql/backends/monet5/generator/Tests/generator03.stable.out
sql/backends/monet5/generator/generator.c
sql/scripts/40_json.sql
sql/test/json/Tests/All
sql/test/json/Tests/aggregate00.sql
sql/test/json/Tests/aggregate00.stable.out
Branch: transaction-replication
Log Message:
Merge with default branch
diffs (truncated from 751 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,9 +1820,21 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g,
}
if (isnil)
continue;
- v = (const char *) BUNtail(bi, BUNfirst(b) + (map ?
(BUN) map[p] : p + mapoff));
-
- if (strNil(v)) {
+ 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);
@@ -1803,12 +1849,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/backends/monet5/generator/Tests/generator03.sql
b/sql/backends/monet5/generator/Tests/generator03.sql
--- a/sql/backends/monet5/generator/Tests/generator03.sql
+++ b/sql/backends/monet5/generator/Tests/generator03.sql
@@ -1,12 +1,26 @@
-select cast( '2008-03-01 00:00' as timestamp);
-select cast( '10' as interval second);
+select timestamp '2008-03-01 00:00';
+select cast( '10' as interval hour);
select * from generate_series(
- cast( '2008-03-01 00:00' as timestamp),
- cast( '2008-03-04 12:00' as timestamp),
+ timestamp '2008-03-01 00:00',
+ timestamp '2008-03-04 12:00',
cast( '10' as interval hour));
select * from generate_series(
- cast( '2008-03-01 00:00' as timestamp),
- cast( '2008-03-04 12:00' as timestamp),
+ timestamp '2008-03-01 00:00',
+ timestamp '2008-03-04 12:00',
cast( '1' as interval day));
+
+select * from generate_series(
+ timestamp '2008-03-01 00:00',
+ timestamp '2008-03-04 12:00',
+ cast( '10' as interval hour))
+where value < timestamp '2008-03-22 00:00';
+
+select * from generate_series(
+ timestamp '2008-03-01 00:00',
+ timestamp '2008-03-04 12:00',
+ cast( '10' as interval hour))
+where value > timestamp '2008-03-01 00:00'
+and value < timestamp '2008-03-22 00:00';
+
diff --git a/sql/backends/monet5/generator/Tests/generator03.stable.out
b/sql/backends/monet5/generator/Tests/generator03.stable.out
--- a/sql/backends/monet5/generator/Tests/generator03.stable.out
+++ b/sql/backends/monet5/generator/Tests/generator03.stable.out
@@ -35,9 +35,10 @@ Ready.
% single_value # name
% sec_interval # type
% 0 # length
-[ 10.000 ]
-#select * from generate_series(cast( '2008-03-01 00:00' as timestamp),
-# cast( '2008-03-04 12:00' as timestamp),
+[ 36000.000 ]
+#select * from generate_series(
+# timestamp '2008-03-01 00:00',
+# timestamp '2008-03-04 12:00',
# cast( '10' as
interval hour));
% . # table_name
% value # name
diff --git a/sql/backends/monet5/generator/generator.c
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -18,7 +18,7 @@
*/
/*
- * (c) Martin Kersten
+ * (c) Martin Kersten, Sjoerd Mullender
* Series generating module for integer, decimal, real, double and timestamps.
*/
@@ -289,10 +289,11 @@ findLastAssign(MalBlkPtr mb, InstrPtr pc
{
InstrPtr q, p = NULL;
int i;
+ str vaultRef = putName("vault",5);
for (i = 1; i < mb->stop; i++) {
q = getInstrPtr(mb, i);
- if (q->argv[0] == target)
+ if (q->argv[0] == target && getModuleId(q) == vaultRef)
p = q;
if (q == pci)
return p;
@@ -759,16 +760,15 @@ str VLTgenerator_leftfetchjoin(Client cn
/* The operands of a join operation can either be defined on a generator */
#define VLTjoin(TPE) \
- { TPE f,l,s;\
- TPE *v,w;\
+ { TPE f,l,s; TPE *v; BUN w;\
f = *(TPE*) getArgReference(stk,p, 1);\
l = *(TPE*) getArgReference(stk,p, 2);\
s = *(TPE*) getArgReference(stk,p, 3);\
for( ; cnt >0; cnt--,os++,o++){\
v = (TPE*) Tloc(bl,BUNfirst(bl));\
- w = floor((*v -f)/s);\
- if ( *v >= f && *v < l && f + w * s == *v ){\
- *or++ = (oid) w;\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list