ClickHouse
68 строк · 3.1 Кб
1#include <AggregateFunctions/AggregateFunctionQuantile.h>
2#include <AggregateFunctions/QuantileExact.h>
3#include <AggregateFunctions/AggregateFunctionFactory.h>
4#include <AggregateFunctions/Helpers.h>
5#include <DataTypes/DataTypeDate.h>
6#include <DataTypes/DataTypeDateTime.h>
7#include <Core/Field.h>
8
9
10namespace DB
11{
12struct Settings;
13
14namespace ErrorCodes
15{
16extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
17extern const int ILLEGAL_TYPE_OF_ARGUMENT;
18}
19
20namespace
21{
22
23template <typename Value, bool _> using FuncQuantileExactHigh = AggregateFunctionQuantile<Value, QuantileExactHigh<Value>, NameQuantileExactHigh, false, void, false, false>;
24template <typename Value, bool _> using FuncQuantilesExactHigh = AggregateFunctionQuantile<Value, QuantileExactHigh<Value>, NameQuantilesExactHigh, false, void, true, false>;
25
26
27template <template <typename, bool> class Function>
28AggregateFunctionPtr createAggregateFunctionQuantile(
29const std::string & name, const DataTypes & argument_types, const Array & params, const Settings *)
30{
31if (argument_types.empty())
32throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Aggregate function {} requires at least one argument", name);
33
34const DataTypePtr & argument_type = argument_types[0];
35WhichDataType which(argument_type);
36
37#define DISPATCH(TYPE) \
38if (which.idx == TypeIndex::TYPE) return std::make_shared<Function<TYPE, true>>(argument_types, params);
39FOR_BASIC_NUMERIC_TYPES(DISPATCH)
40#undef DISPATCH
41if (which.idx == TypeIndex::Date) return std::make_shared<Function<DataTypeDate::FieldType, false>>(argument_types, params);
42if (which.idx == TypeIndex::DateTime) return std::make_shared<Function<DataTypeDateTime::FieldType, false>>(argument_types, params);
43if (which.idx == TypeIndex::DateTime64) return std::make_shared<Function<DateTime64, false>>(argument_types, params);
44
45if (which.idx == TypeIndex::Decimal32) return std::make_shared<Function<Decimal32, false>>(argument_types, params);
46if (which.idx == TypeIndex::Decimal64) return std::make_shared<Function<Decimal64, false>>(argument_types, params);
47if (which.idx == TypeIndex::Decimal128) return std::make_shared<Function<Decimal128, false>>(argument_types, params);
48if (which.idx == TypeIndex::Decimal256) return std::make_shared<Function<Decimal256, false>>(argument_types, params);
49
50throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument for aggregate function {}",
51argument_type->getName(), name);
52}
53
54}
55
56void registerAggregateFunctionsQuantileExactHigh(AggregateFunctionFactory & factory)
57{
58/// For aggregate functions returning array we cannot return NULL on empty set.
59AggregateFunctionProperties properties = { .returns_default_when_only_null = true };
60
61factory.registerFunction(NameQuantileExactHigh::name, createAggregateFunctionQuantile<FuncQuantileExactHigh>);
62factory.registerFunction(NameQuantilesExactHigh::name, { createAggregateFunctionQuantile<FuncQuantilesExactHigh>, properties });
63
64/// 'median' is an alias for 'quantile'
65factory.registerAlias("medianExactHigh", NameQuantileExactHigh::name);
66}
67
68}
69