ClickHouse

Форк
0
/
lowCardinalityKeys.cpp 
59 строк · 2.0 Кб
1
#include <Functions/IFunction.h>
2
#include <Functions/FunctionFactory.h>
3
#include <DataTypes/DataTypeLowCardinality.h>
4
#include <Columns/ColumnLowCardinality.h>
5
#include <Common/typeid_cast.h>
6

7

8
namespace DB
9
{
10
namespace ErrorCodes
11
{
12
    extern const int ILLEGAL_TYPE_OF_ARGUMENT;
13
}
14

15
namespace
16
{
17

18
class FunctionLowCardinalityKeys: public IFunction
19
{
20
public:
21
    static constexpr auto name = "lowCardinalityKeys";
22
    static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionLowCardinalityKeys>(); }
23

24
    String getName() const override { return name; }
25

26
    size_t getNumberOfArguments() const override { return 1; }
27

28
    bool useDefaultImplementationForNulls() const override { return false; }
29
    bool useDefaultImplementationForConstants() const override { return true; }
30
    bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
31
    bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
32

33
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
34
    {
35
        const auto * type = typeid_cast<const DataTypeLowCardinality *>(arguments[0].get());
36
        if (!type)
37
            throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
38
                            "First first argument of function lowCardinalityKeys must be ColumnLowCardinality, "
39
                            "but got {}", arguments[0]->getName());
40

41
        return type->getDictionaryType();
42
    }
43

44
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
45
    {
46
        const auto & arg = arguments[0];
47
        const auto * low_cardinality_column = typeid_cast<const ColumnLowCardinality *>(arg.column.get());
48
        return low_cardinality_column->getDictionary().getNestedColumn()->cloneResized(arg.column->size());
49
    }
50
};
51

52
}
53

54
REGISTER_FUNCTION(LowCardinalityKeys)
55
{
56
    factory.registerFunction<FunctionLowCardinalityKeys>();
57
}
58

59
}
60

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

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

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

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