2017-07-12 01:16:01 +00:00
|
|
|
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
|
|
|
#include <AggregateFunctions/Helpers.h>
|
2017-12-20 07:36:30 +00:00
|
|
|
#include <AggregateFunctions/FactoryHelpers.h>
|
|
|
|
|
2017-07-12 01:16:01 +00:00
|
|
|
#include <AggregateFunctions/AggregateFunctionQuantile.h>
|
|
|
|
|
2017-12-20 21:22:04 +00:00
|
|
|
#include <DataTypes/DataTypeDate.h>
|
|
|
|
#include <DataTypes/DataTypeDateTime.h>
|
|
|
|
|
2017-12-20 07:36:30 +00:00
|
|
|
|
2017-07-12 01:16:01 +00:00
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2017-12-20 07:36:30 +00:00
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
|
|
|
|
}
|
|
|
|
|
2017-07-12 01:16:01 +00:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
|
2017-12-21 01:19:25 +00:00
|
|
|
template <template <typename> class Data, typename Name, bool have_second_arg, typename FloatReturnType, bool returns_many>
|
2017-12-20 07:36:30 +00:00
|
|
|
AggregateFunctionPtr createAggregateFunctionQuantile(const std::string & name, const DataTypes & argument_types, const Array & params)
|
2017-07-12 01:16:01 +00:00
|
|
|
{
|
2017-12-20 20:58:43 +00:00
|
|
|
if (have_second_arg)
|
|
|
|
assertBinary(name, argument_types);
|
|
|
|
else
|
|
|
|
assertUnary(name, argument_types);
|
|
|
|
|
2017-12-20 07:36:30 +00:00
|
|
|
const DataTypePtr & argument_type = argument_types[0];
|
|
|
|
|
2017-12-20 08:14:33 +00:00
|
|
|
#define CREATE(TYPE) \
|
|
|
|
if (typeid_cast<const DataType ## TYPE *>(argument_type.get())) \
|
2017-12-21 01:19:25 +00:00
|
|
|
return std::make_shared<AggregateFunctionQuantile<TYPE, Data<TYPE>, Name, have_second_arg, FloatReturnType, returns_many>>(argument_type, params);
|
2017-12-20 08:14:33 +00:00
|
|
|
|
|
|
|
FOR_NUMERIC_TYPES(CREATE)
|
|
|
|
#undef CREATE
|
|
|
|
|
|
|
|
if (typeid_cast<const DataTypeDate *>(argument_type.get()))
|
2017-12-20 20:25:22 +00:00
|
|
|
return std::make_shared<AggregateFunctionQuantile<
|
2017-12-21 01:19:25 +00:00
|
|
|
DataTypeDate::FieldType, Data<DataTypeDate::FieldType>, Name, have_second_arg, void, returns_many>>(argument_type, params);
|
2017-12-20 08:14:33 +00:00
|
|
|
if (typeid_cast<const DataTypeDateTime *>(argument_type.get()))
|
2017-12-20 20:25:22 +00:00
|
|
|
return std::make_shared<AggregateFunctionQuantile<
|
2017-12-21 01:19:25 +00:00
|
|
|
DataTypeDateTime::FieldType, Data<DataTypeDateTime::FieldType>, Name, have_second_arg, void, returns_many>>(argument_type, params);
|
2017-12-20 08:14:33 +00:00
|
|
|
|
|
|
|
throw Exception("Illegal type " + argument_type->getName() + " of argument for aggregate function " + name, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef FOR_NUMERIC_TYPES
|
|
|
|
|
2017-07-12 01:16:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void registerAggregateFunctionsQuantile(AggregateFunctionFactory & factory)
|
|
|
|
{
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantile::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileReservoirSampler, NameQuantile, false, Float64, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantiles::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileReservoirSampler, NameQuantiles, false, Float64, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileDeterministic::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileReservoirSamplerDeterministic, NameQuantileDeterministic, true, Float64, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesDeterministic::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileReservoirSamplerDeterministic, NameQuantilesDeterministic, true, Float64, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileExact::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileExact, NameQuantileExact, false, void, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesExact::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileExact, NameQuantilesExact, false, void, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileExactWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileExactWeighted, NameQuantileExactWeighted, true, void, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesExactWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileExactWeighted, NameQuantilesExactWeighted, true, void, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileTiming::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTiming, NameQuantileTiming, false, Float32, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesTiming::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTiming, NameQuantilesTiming, false, Float32, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileTimingWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTiming, NameQuantileTimingWeighted, true, Float32, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesTimingWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTiming, NameQuantilesTimingWeighted, true, Float32, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileTDigest::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTDigest, NameQuantileTDigest, false, Float32, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesTDigest::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTDigest, NameQuantilesTDigest, false, Float32, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
factory.registerFunction(NameQuantileTDigestWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTDigest, NameQuantileTDigestWeighted, true, Float32, false>);
|
2017-12-20 20:25:22 +00:00
|
|
|
factory.registerFunction(NameQuantilesTDigestWeighted::name,
|
2017-12-21 01:19:25 +00:00
|
|
|
createAggregateFunctionQuantile<QuantileTDigest, NameQuantilesTDigestWeighted, true, Float32, true>);
|
2017-12-20 20:25:22 +00:00
|
|
|
|
|
|
|
/// 'median' is an alias for 'quantile'
|
2018-07-25 16:08:23 +00:00
|
|
|
factory.registerAlias("median", NameQuantile::name);
|
|
|
|
factory.registerAlias("medianDeterministic", NameQuantileDeterministic::name);
|
|
|
|
factory.registerAlias("medianExact", NameQuantileExact::name);
|
|
|
|
factory.registerAlias("medianExactWeighted", NameQuantileExactWeighted::name);
|
|
|
|
factory.registerAlias("medianTiming", NameQuantileTiming::name);
|
|
|
|
factory.registerAlias("medianTimingWeighted", NameQuantileTimingWeighted::name);
|
|
|
|
factory.registerAlias("medianTDigest", NameQuantileTDigest::name);
|
|
|
|
factory.registerAlias("medianTDigestWeighted", NameQuantileTDigestWeighted::name);
|
2017-07-12 01:16:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|