aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/AggregateFunctions/AggregateFunctionCombinatorFactory.cpp
blob: 7f815f74e7c07e79790a55d585039ed700f6770d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <Common/StringUtils/StringUtils.h>
#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>


namespace DB
{

namespace ErrorCodes
{
    extern const int LOGICAL_ERROR;
}

void AggregateFunctionCombinatorFactory::registerCombinator(const AggregateFunctionCombinatorPtr & value)
{
    CombinatorPair pair{
        .name = value->getName(),
        .combinator_ptr = value,
    };

    /// lower_bound() cannot be used since sort order of the dict is by length of the combinator
    /// but there are just a few combiners, so not a problem.
    if (std::find(dict.begin(), dict.end(), pair) != dict.end())
        throw Exception(ErrorCodes::LOGICAL_ERROR, "AggregateFunctionCombinatorFactory: the name '{}' is not unique",
            value->getName());
    dict.emplace(std::lower_bound(dict.begin(), dict.end(), pair), pair);
}

AggregateFunctionCombinatorPtr AggregateFunctionCombinatorFactory::tryFindSuffix(const std::string & name) const
{
    /// O(N) is ok for just a few combinators.
    for (const auto & suffix_value : dict)
        if (endsWith(name, suffix_value.name))
            return suffix_value.combinator_ptr;
    return {};
}

AggregateFunctionCombinatorFactory & AggregateFunctionCombinatorFactory::instance()
{
    static AggregateFunctionCombinatorFactory ret;
    return ret;
}

}