ClickHouse

Форк
0
/
AggregateFunctionQuantileTDigestWeighted.cpp 
61 строка · 2.7 Кб
1
#include <AggregateFunctions/AggregateFunctionQuantile.h>
2
#include <AggregateFunctions/QuantileTDigest.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

10
namespace DB
11
{
12
struct Settings;
13

14
namespace ErrorCodes
15
{
16
    extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
17
    extern const int ILLEGAL_TYPE_OF_ARGUMENT;
18
}
19

20
namespace
21
{
22

23
template <typename Value, bool float_return> using FuncQuantileTDigestWeighted = AggregateFunctionQuantile<Value, QuantileTDigest<Value>, NameQuantileTDigestWeighted, true, std::conditional_t<float_return, Float32, void>, false, false>;
24
template <typename Value, bool float_return> using FuncQuantilesTDigestWeighted = AggregateFunctionQuantile<Value, QuantileTDigest<Value>, NameQuantilesTDigestWeighted, true, std::conditional_t<float_return, Float32, void>, true, false>;
25

26
template <template <typename, bool> class Function>
27
AggregateFunctionPtr createAggregateFunctionQuantile(
28
    const std::string & name, const DataTypes & argument_types, const Array & params, const Settings *)
29
{
30
    if (argument_types.empty())
31
        throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Aggregate function {} requires at least one argument", name);
32

33
    const DataTypePtr & argument_type = argument_types[0];
34
    WhichDataType which(argument_type);
35

36
#define DISPATCH(TYPE) \
37
    if (which.idx == TypeIndex::TYPE) return std::make_shared<Function<TYPE, true>>(argument_types, params);
38
    FOR_BASIC_NUMERIC_TYPES(DISPATCH)
39
#undef DISPATCH
40
    if (which.idx == TypeIndex::Date) return std::make_shared<Function<DataTypeDate::FieldType, false>>(argument_types, params);
41
    if (which.idx == TypeIndex::DateTime) return std::make_shared<Function<DataTypeDateTime::FieldType, false>>(argument_types, params);
42

43
    throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument for aggregate function {}",
44
                    argument_type->getName(), name);
45
}
46

47
}
48

49
void registerAggregateFunctionsQuantileTDigestWeighted(AggregateFunctionFactory & factory)
50
{
51
    /// For aggregate functions returning array we cannot return NULL on empty set.
52
    AggregateFunctionProperties properties = { .returns_default_when_only_null = true };
53

54
    factory.registerFunction(NameQuantileTDigestWeighted::name, createAggregateFunctionQuantile<FuncQuantileTDigestWeighted>);
55
    factory.registerFunction(NameQuantilesTDigestWeighted::name, { createAggregateFunctionQuantile<FuncQuantilesTDigestWeighted>, properties });
56

57
    /// 'median' is an alias for 'quantile'
58
    factory.registerAlias("medianTDigestWeighted", NameQuantileTDigestWeighted::name);
59
}
60

61
}
62

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.