Changeset: ffb46ba9f229 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffb46ba9f229
Removed Files:
sql/scripts/11_times.sql
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
gdk/gdk_aggr.c
gdk/gdk_calc.h
gdk/gdk_group.c
monetdb5/modules/kernel/aggr.c
monetdb5/modules/kernel/aggr.mal
monetdb5/modules/kernel/aggr.mal.sh
sql/ChangeLog.Nov2019
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_upgrades.c
sql/common/sql_list.c
sql/include/sql_relation.h
sql/scripts/39_analytics.sql
sql/scripts/39_analytics_hge.sql
sql/scripts/Makefile.ag
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/test/BugDay_2005-10-06_2.9.3/Tests/union_limitation.SF-921992.stable.out
sql/test/BugTracker-2016/Tests/leftjoin.Bug-3981.stable.out
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
sql/test/Tests/window_functions.stable.out
sql/test/analytics/Tests/analytics09.stable.err
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade/Tests/upgrade.stable.out
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/mergetables/Tests/sqlsmith.Bug-6455.stable.out
sql/test/subquery/Tests/subquery2.sql
sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.stable.out
sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out
sql/test/sys-schema/Tests/systemfunctions.stable.out
sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:
Merge with Nov2019 branch.
diffs (truncated from 4090 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -124,6 +124,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "max", "command aggr.max(b:bat[:any_2]):any_2 ",
"ALGmaxany;", "Return the highest tail value or nil." ]
[ "aggr", "max", "command aggr.max(b:bat[:any_2], skipnil:bit):any_2 ",
"ALGmaxany_skipnil;", "Return the highest tail value or nil." ]
[ "aggr", "median", "command aggr.median(b:bat[:any_1]):any_1 ",
"AGGRmedian;", "Median aggregate" ]
+[ "aggr", "median_avg", "command aggr.median_avg(b:bat[:any_1]):dbl ",
"AGGRmedian_avg;", "Median aggregate" ]
[ "aggr", "min", "command aggr.min(b:bat[:any_1], g:bat[:oid],
e:bat[:any_2]):bat[:any_1] ", "AGGRmin3;", "" ]
[ "aggr", "min", "command aggr.min(b:bat[:any_2]):any_2 ",
"ALGminany;", "Return the lowest tail value or nil." ]
[ "aggr", "min", "command aggr.min(b:bat[:any_2], skipnil:bit):any_2 ",
"ALGminany_skipnil;", "Return the lowest tail value or nil." ]
@@ -209,6 +210,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid],
nil_if_empty:bit):lng ", "CMDBATprod;", "Calculate aggregate product of B
with candidate list." ]
[ "aggr", "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid],
nil_if_empty:bit):sht ", "CMDBATprod;", "Calculate aggregate product of B
with candidate list." ]
[ "aggr", "quantile", "command aggr.quantile(b:bat[:any_1],
q:bat[:dbl]):any_1 ", "AGGRquantile;", "Quantile aggregate" ]
+[ "aggr", "quantile_avg", "command aggr.quantile_avg(b:bat[:any_1],
q:bat[:dbl]):dbl ", "AGGRquantile_avg;", "Quantile aggregate" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on bte" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on dbl" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on flt" ]
@@ -310,6 +312,8 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "submax", "command aggr.submax(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",
"AGGRsubmaxcand_val;", "Grouped maximum aggregate with candidates list"
]
[ "aggr", "submedian", "command aggr.submedian(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",
"AGGRsubmedian;", "Grouped median aggregate" ]
[ "aggr", "submedian", "command aggr.submedian(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",
"AGGRsubmediancand;", "Grouped median aggregate with candidate list" ]
+[ "aggr", "submedian_avg", "command
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2],
skip_nils:bit):bat[:dbl] ", "AGGRsubmedian_avg;", "Grouped median
aggregate" ]
+[ "aggr", "submedian_avg", "command
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit):bat[:dbl] ", "AGGRsubmediancand_avg;", "Grouped median
aggregate with candidate list" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:oid] ", "AGGRsubmin;",
"Grouped minimum aggregate" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ", "AGGRsubmin_val;",
"Grouped minimum aggregate" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:oid] ",
"AGGRsubmincand;", "Grouped minimum aggregate with candidates list"
]
@@ -342,6 +346,8 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "subprod", "command aggr.subprod(b:bat[:sht], g:bat[:oid],
e:bat[:any_1], s:bat[:oid], skip_nils:bit, abort_on_error:bit):bat[:sht] ",
"AGGRsubprodcand_sht;", "Grouped product aggregate with candidates list"
]
[ "aggr", "subquantile", "command aggr.subquantile(b:bat[:any_1],
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",
"AGGRsubquantile;", "Grouped quantile aggregate" ]
[ "aggr", "subquantile", "command aggr.subquantile(b:bat[:any_1],
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit):bat[:any_1] ", "AGGRsubquantilecand;", "Grouped quantile
aggregate with candidate list" ]
+[ "aggr", "subquantile_avg", "command
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2],
skip_nils:bit):bat[:dbl] ", "AGGRsubquantile_avg;", "Grouped quantile
aggregate" ]
+[ "aggr", "subquantile_avg", "command
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2],
s:bat[:oid], skip_nils:bit):bat[:dbl] ", "AGGRsubquantilecand_avg;",
"Grouped quantile aggregate with candidate list" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:bte],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:dbl],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:flt],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
@@ -11751,6 +11757,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "storage", "pattern sql.storage(sname:str, tname:str,
cname:str) (schema:bat[:str], table:bat[:str], column:bat[:str],
type:bat[:str], mode:bat[:str], location:bat[:str], count:bat[:lng],
atomwidth:bat[:int], columnsize:bat[:lng], heap:bat[:lng], hashes:bat[:lng],
phash:bat[:bit], imprints:bat[:lng], sorted:bat[:bit], revsorted:bat[:bit],
key:bat[:bit], orderidx:bat[:lng]) ", "sql_storage;", "return a table with
storage information for a particular column" ]
[ "sql", "subdelta", "command sql.subdelta(col:bat[:oid],
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid]):bat[:oid] ",
"DELTAsub2;", "Return a single bat of selected delta." ]
[ "sql", "subdelta", "command sql.subdelta(col:bat[:oid],
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid], ins:bat[:oid]):bat[:oid] ",
"DELTAsub;", "Return a single bat of selected delta." ]
+[ "sql", "subnull", "command sql.subnull(l:bat[:any_1],
gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ", "SQLnil_grp;", "if
any value in l is nil with in a group return true for that group, else false"
]
[ "sql", "subzero_or_one", "inline function
sql.subzero_or_one(b:bat[:any_1], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:any_1];", "", "" ]
[ "sql", "sum", "pattern sql.sum(b:bte, s:lng, e:lng):lng ",
"SQLsum;", "return the sum of groups" ]
[ "sql", "sum", "pattern sql.sum(b:dbl, s:lng, e:lng):dbl ",
"SQLsum;", "return the sum of groups" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -132,6 +132,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "max", "command aggr.max(b:bat[:any_2]):any_2 ",
"ALGmaxany;", "Return the highest tail value or nil." ]
[ "aggr", "max", "command aggr.max(b:bat[:any_2], skipnil:bit):any_2 ",
"ALGmaxany_skipnil;", "Return the highest tail value or nil." ]
[ "aggr", "median", "command aggr.median(b:bat[:any_1]):any_1 ",
"AGGRmedian;", "Median aggregate" ]
+[ "aggr", "median_avg", "command aggr.median_avg(b:bat[:any_1]):dbl ",
"AGGRmedian_avg;", "Median aggregate" ]
[ "aggr", "min", "command aggr.min(b:bat[:any_1], g:bat[:oid],
e:bat[:any_2]):bat[:any_1] ", "AGGRmin3;", "" ]
[ "aggr", "min", "command aggr.min(b:bat[:any_2]):any_2 ",
"ALGminany;", "Return the lowest tail value or nil." ]
[ "aggr", "min", "command aggr.min(b:bat[:any_2], skipnil:bit):any_2 ",
"ALGminany_skipnil;", "Return the lowest tail value or nil." ]
@@ -246,6 +247,7 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid],
nil_if_empty:bit):lng ", "CMDBATprod;", "Calculate aggregate product of B
with candidate list." ]
[ "aggr", "prod", "pattern aggr.prod(b:bat[:sht], s:bat[:oid],
nil_if_empty:bit):sht ", "CMDBATprod;", "Calculate aggregate product of B
with candidate list." ]
[ "aggr", "quantile", "command aggr.quantile(b:bat[:any_1],
q:bat[:dbl]):any_1 ", "AGGRquantile;", "Quantile aggregate" ]
+[ "aggr", "quantile_avg", "command aggr.quantile_avg(b:bat[:any_1],
q:bat[:dbl]):dbl ", "AGGRquantile_avg;", "Quantile aggregate" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:bte], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on bte" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:dbl], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on dbl" ]
[ "aggr", "stdev", "command aggr.stdev(b:bat[:flt], g:bat[:oid],
e:bat[:any_1]):bat[:dbl] ", "AGGRstdev3_dbl;", "Grouped tail
standard deviation (sample/non-biased) on flt" ]
@@ -355,6 +357,8 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "submax", "command aggr.submax(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",
"AGGRsubmaxcand_val;", "Grouped maximum aggregate with candidates list"
]
[ "aggr", "submedian", "command aggr.submedian(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",
"AGGRsubmedian;", "Grouped median aggregate" ]
[ "aggr", "submedian", "command aggr.submedian(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:any_1] ",
"AGGRsubmediancand;", "Grouped median aggregate with candidate list" ]
+[ "aggr", "submedian_avg", "command
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2],
skip_nils:bit):bat[:dbl] ", "AGGRsubmedian_avg;", "Grouped median
aggregate" ]
+[ "aggr", "submedian_avg", "command
aggr.submedian_avg(b:bat[:any_1], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit):bat[:dbl] ", "AGGRsubmediancand_avg;", "Grouped median
aggregate with candidate list" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:oid] ", "AGGRsubmin;",
"Grouped minimum aggregate" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ", "AGGRsubmin_val;",
"Grouped minimum aggregate" ]
[ "aggr", "submin", "command aggr.submin(b:bat[:any_1],
g:bat[:oid], e:bat[:any_2], s:bat[:oid], skip_nils:bit):bat[:oid] ",
"AGGRsubmincand;", "Grouped minimum aggregate with candidates list"
]
@@ -397,6 +401,8 @@ stdout of test 'MAL-signatures` in direc
[ "aggr", "subprod", "command aggr.subprod(b:bat[:sht], g:bat[:oid],
e:bat[:any_1], s:bat[:oid], skip_nils:bit, abort_on_error:bit):bat[:sht] ",
"AGGRsubprodcand_sht;", "Grouped product aggregate with candidates list"
]
[ "aggr", "subquantile", "command aggr.subquantile(b:bat[:any_1],
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], skip_nils:bit):bat[:any_1] ",
"AGGRsubquantile;", "Grouped quantile aggregate" ]
[ "aggr", "subquantile", "command aggr.subquantile(b:bat[:any_1],
q:bat[:dbl], g:bat[:oid], e:bat[:any_2], s:bat[:oid],
skip_nils:bit):bat[:any_1] ", "AGGRsubquantilecand;", "Grouped quantile
aggregate with candidate list" ]
+[ "aggr", "subquantile_avg", "command
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2],
skip_nils:bit):bat[:dbl] ", "AGGRsubquantile_avg;", "Grouped quantile
aggregate" ]
+[ "aggr", "subquantile_avg", "command
aggr.subquantile_avg(b:bat[:any_1], q:bat[:dbl], g:bat[:oid], e:bat[:any_2],
s:bat[:oid], skip_nils:bit):bat[:dbl] ", "AGGRsubquantilecand_avg;",
"Grouped quantile aggregate with candidate list" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:bte],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:dbl],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
[ "aggr", "substdev", "command aggr.substdev(b:bat[:flt],
g:bat[:oid], e:bat[:any_1], skip_nils:bit, abort_on_error:bit):bat[:dbl] ",
"AGGRsubstdev_dbl;", "Grouped standard deviation (sample/non-biased)
aggregate" ]
@@ -16163,6 +16169,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "storage", "pattern sql.storage(sname:str, tname:str,
cname:str) (schema:bat[:str], table:bat[:str], column:bat[:str],
type:bat[:str], mode:bat[:str], location:bat[:str], count:bat[:lng],
atomwidth:bat[:int], columnsize:bat[:lng], heap:bat[:lng], hashes:bat[:lng],
phash:bat[:bit], imprints:bat[:lng], sorted:bat[:bit], revsorted:bat[:bit],
key:bat[:bit], orderidx:bat[:lng]) ", "sql_storage;", "return a table with
storage information for a particular column" ]
[ "sql", "subdelta", "command sql.subdelta(col:bat[:oid],
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid]):bat[:oid] ",
"DELTAsub2;", "Return a single bat of selected delta." ]
[ "sql", "subdelta", "command sql.subdelta(col:bat[:oid],
cand:bat[:oid], uid:bat[:oid], uval:bat[:oid], ins:bat[:oid]):bat[:oid] ",
"DELTAsub;", "Return a single bat of selected delta." ]
+[ "sql", "subnull", "command sql.subnull(l:bat[:any_1],
gp:bat[:oid], gpe:bat[:oid], no_nil:bit):bat[:bit] ", "SQLnil_grp;", "if
any value in l is nil with in a group return true for that group, else false"
]
[ "sql", "subzero_or_one", "inline function
sql.subzero_or_one(b:bat[:any_1], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit):bat[:any_1];", "", "" ]
[ "sql", "sum", "pattern sql.sum(b:bte, s:lng, e:lng):hge ",
"SQLsum;", "return the sum of groups" ]
[ "sql", "sum", "pattern sql.sum(b:bte, s:lng, e:lng):lng ",
"SQLsum;", "return the sum of groups" ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -127,9 +127,11 @@ gdk_return BATgroupavg(BAT **bnp, BAT **
BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils,
bool abort_on_error);
BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool
abort_on_error);
BAT *BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils,
bool abort_on_error);
+BAT *BATgroupmedian_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils, bool abort_on_error);
BAT *BATgroupmin(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool
abort_on_error);
BAT *BATgroupprod(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool
abort_on_error);
BAT *BATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
bool skip_nils, bool abort_on_error);
+BAT *BATgroupquantile_avg(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double
quantile, bool skip_nils, bool abort_on_error);
BAT *BATgroupsize(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool
abort_on_error);
BAT *BATgroupstdev_population(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils, bool abort_on_error);
BAT *BATgroupstdev_sample(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool
skip_nils, bool abort_on_error);
@@ -615,6 +617,7 @@ str AGGRcount3nils(bat *retval, const ba
str AGGRcount3nonils(bat *retval, const bat *bid, const bat *gid, const bat
*eid);
str AGGRmax3(bat *retval, const bat *bid, const bat *gid, const bat *eid);
str AGGRmedian(void *retval, const bat *bid);
+str AGGRmedian_avg(dbl *retval, const bat *bid);
str AGGRmin3(bat *retval, const bat *bid, const bat *gid, const bat *eid);
str AGGRprod3_bte(bat *retval, const bat *bid, const bat *gid, const bat *eid);
str AGGRprod3_dbl(bat *retval, const bat *bid, const bat *gid, const bat *eid);
@@ -624,6 +627,7 @@ str AGGRprod3_int(bat *retval, const bat
str AGGRprod3_lng(bat *retval, const bat *bid, const bat *gid, const bat *eid);
str AGGRprod3_sht(bat *retval, const bat *bid, const bat *gid, const bat *eid);
str AGGRquantile(void *retval, const bat *bid, const bat *qid);
+str AGGRquantile_avg(dbl *retval, const bat *bid, const bat *qid);
str AGGRstdev3_dbl(bat *retval, const bat *bid, const bat *gid, const bat
*eid);
str AGGRstdevp3_dbl(bat *retval, const bat *bid, const bat *gid, const bat
*eid);
str AGGRstr_group_concat(bat *retval, const bat *bid, const bat *gid, const
bat *eid);
@@ -643,7 +647,9 @@ str AGGRsubmax_val(bat *retval, const ba
str AGGRsubmaxcand(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils);
str AGGRsubmaxcand_val(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils);
str AGGRsubmedian(bat *retval, const bat *bid, const bat *gid, const bat *eid,
const bit *skip_nils);
+str AGGRsubmedian_avg(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bit *skip_nils);
str AGGRsubmediancand(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils);
+str AGGRsubmediancand_avg(bat *retval, const bat *bid, const bat *gid, const
bat *eid, const bat *sid, const bit *skip_nils);
str AGGRsubmin(bat *retval, const bat *bid, const bat *gid, const bat *eid,
const bit *skip_nils);
str AGGRsubmin_val(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bit *skip_nils);
str AGGRsubmincand(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils);
@@ -663,7 +669,9 @@ str AGGRsubprodcand_int(bat *retval, con
str AGGRsubprodcand_lng(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
str AGGRsubprodcand_sht(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
str AGGRsubquantile(bat *retval, const bat *bid, const bat *quantile, const
bat *gid, const bat *eid, const bit *skip_nils);
+str AGGRsubquantile_avg(bat *retval, const bat *bid, const bat *quantile,
const bat *gid, const bat *eid, const bit *skip_nils);
str AGGRsubquantilecand(bat *retval, const bat *bid, const bat *quantile,
const bat *gid, const bat *eid, const bat *sid, const bit *skip_nils);
+str AGGRsubquantilecand_avg(bat *retval, const bat *bid, const bat *quantile,
const bat *gid, const bat *eid, const bat *sid, const bit *skip_nils);
str AGGRsubstdev_dbl(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bit *skip_nils, const bit *abort_on_error);
str AGGRsubstdevcand_dbl(bat *retval, const bat *bid, const bat *gid, const
bat *eid, const bat *sid, const bit *skip_nils, const bit *abort_on_error);
str AGGRsubstdevp_dbl(bat *retval, const bat *bid, const bat *gid, const bat
*eid, const bit *skip_nils, const bit *abort_on_error);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2704,13 +2704,6 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
/* ---------------------------------------------------------------------- */
/* quantiles/median */
-BAT *
-BATgroupmedian(BAT *b, BAT *g, BAT *e, BAT *s, int tp,
- bool skip_nils, bool abort_on_error)
-{
- return BATgroupquantile(b,g,e,s,tp,0.5,skip_nils,abort_on_error);
-}
-
#if SIZEOF_OID == SIZEOF_INT
#define binsearch_oid(indir, offset, vals, lo, hi, v, ordering, last)
binsearch_int(indir, offset, (const int *) vals, lo, hi, (int) (v), ordering,
last)
#endif
@@ -2718,9 +2711,9 @@ BATgroupmedian(BAT *b, BAT *g, BAT *e, B
#define binsearch_oid(indir, offset, vals, lo, hi, v, ordering, last)
binsearch_lng(indir, offset, (const lng *) vals, lo, hi, (lng) (v), ordering,
last)
#endif
-BAT *
-BATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
- bool skip_nils, bool abort_on_error)
+static BAT *
+doBATgroupquantile(BAT *b, BAT *g, BAT *e, BAT *s, int tp, double quantile,
+ bool skip_nils, bool abort_on_error, bool average)
{
bool freeb = false, freeg = false;
oid min, max;
@@ -2733,10 +2726,30 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
BATiter bi;
const void *v;
const void *nil = ATOMnilptr(tp);
+ const void *dnil = nil;
+ dbl val; /* only used for average */
int (*atomcmp)(const void *, const void *) = ATOMcompare(tp);
const char *err;
(void) abort_on_error;
+ if (average) {
+ switch (ATOMbasetype(b->ttype)) {
+ case TYPE_bte:
+ case TYPE_sht:
+ case TYPE_int:
+ case TYPE_lng:
+#ifdef HAVE_HGE
+ case TYPE_hge:
+#endif
+ case TYPE_flt:
+ case TYPE_dbl:
+ break;
+ default:
+ GDKerror("BATgroupquantile: incompatible type\n");
+ return NULL;
+ }
+ dnil = &dbl_nil;
+ }
if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci,
&ncand)) != NULL) {
GDKerror("BATgroupquantile: %s\n", err);
return NULL;
@@ -2757,7 +2770,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
/* trivial: no values, thus also no quantiles,
* so return bat aligned with e with nil in the tail
* The same happens for a NULL quantile */
- return BATconstant(ngrp == 0 ? 0 : min, tp, nil, ngrp,
TRANSIENT);
+ return BATconstant(ngrp == 0 ? 0 : min, average ? TYPE_dbl :
tp, dnil, ngrp, TRANSIENT);
}
if (s) {
@@ -2786,7 +2799,10 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
if (BATtdense(g)) {
/* singleton groups, so calculating quantile is
* easy */
- bn = COLcopy(b, tp, false, TRANSIENT);
+ if (average)
+ bn = BATconvert(b, NULL, TYPE_dbl,
abort_on_error);
+ else
+ bn = COLcopy(b, tp, false, TRANSIENT);
BAThseqbase(bn, g->tseqbase); /* deals with NULL */
if (freeb)
BBPunfix(b->batCacheid);
@@ -2811,7 +2827,10 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
freeb = true;
BBPunfix(t2->batCacheid);
- bn = COLnew(min, tp, ngrp, TRANSIENT);
+ if (average)
+ bn = COLnew(min, TYPE_dbl, ngrp, TRANSIENT);
+ else
+ bn = COLnew(min, tp, ngrp, TRANSIENT);
if (bn == NULL)
goto bunins_failed;
@@ -2835,8 +2854,38 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
}
if (r == p) {
/* no non-nils found */
- v = nil;
+ v = dnil;
nils++;
+ } else if (average) {
+ double f = (p - r - 1) * quantile;
+ double lo = floor(f);
+ double hi = ceil(f);
+ switch (ATOMbasetype(tp)) {
+ case TYPE_bte:
+ val = (f - lo) * *(bte*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(bte*)BUNtail(bi, r + (BUN) lo);
+ break;
+ case TYPE_sht:
+ val = (f - lo) * *(sht*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(sht*)BUNtail(bi, r + (BUN) lo);
+ break;
+ case TYPE_int:
+ val = (f - lo) * *(int*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(int*)BUNtail(bi, r + (BUN) lo);
+ break;
+ case TYPE_lng:
+ val = (f - lo) * *(lng*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(lng*)BUNtail(bi, r + (BUN) lo);
+ break;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ val = (f - lo) * *(hge*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(hge*)BUNtail(bi, r + (BUN) lo);
+ break;
+#endif
+ case TYPE_flt:
+ val = (f - lo) * *(flt*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(flt*)BUNtail(bi, r + (BUN) lo);
+ break;
+ case TYPE_dbl:
+ val = (f - lo) * *(dbl*)BUNtail(bi, r +
(BUN) hi) + (lo + 1 - f) * *(dbl*)BUNtail(bi, r + (BUN) lo);
+ break;
+ }
+ v = &val;
} else {
/* round *down* to nearest integer */
double f = (p - r - 1) * quantile;
@@ -2845,13 +2894,13 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
assert(qindex >= r && qindex < p);
v = BUNtail(bi, qindex);
if (!skip_nils && !b->tnonil)
- nils += (*atomcmp)(v, nil) == 0;
+ nils += (*atomcmp)(v, dnil) == 0;
}
bunfastapp_nocheck(bn, BUNlast(bn), v, Tsize(bn));
}
nils += ngrp - BATcount(bn);
while (BATcount(bn) < ngrp) {
- bunfastapp_nocheck(bn, BUNlast(bn), nil, Tsize(bn));
+ bunfastapp_nocheck(bn, BUNlast(bn), dnil, Tsize(bn));
}
bn->theap.dirty = true;
BBPunfix(g->batCacheid);
@@ -2860,7 +2909,7 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
BAT *pb = NULL;
const oid *ords;
- bn = COLnew(0, tp, 1, TRANSIENT);
+ bn = COLnew(0, average ? TYPE_dbl : tp, 1, TRANSIENT);
if (bn == NULL)
goto bunins_failed;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list