ClickHouse

Форк
0
/
toLowCardinality.cpp 
58 строк · 1.7 Кб
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
11
{
12

13
class FunctionToLowCardinality: public IFunction
14
{
15
public:
16
    static constexpr auto name = "toLowCardinality";
17
    static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionToLowCardinality>(); }
18

19
    String getName() const override { return name; }
20

21
    size_t getNumberOfArguments() const override { return 1; }
22

23
    bool useDefaultImplementationForNulls() const override { return false; }
24
    bool useDefaultImplementationForConstants() const override { return true; }
25
    bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
26
    bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
27

28
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
29
    {
30
        if (arguments[0]->lowCardinality())
31
            return arguments[0];
32

33
        return std::make_shared<DataTypeLowCardinality>(arguments[0]);
34
    }
35

36
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & res_type, size_t /*input_rows_count*/) const override
37
    {
38
        const auto & arg = arguments[0];
39

40
        if (arg.type->lowCardinality())
41
            return arg.column;
42
        else
43
        {
44
            auto column = res_type->createColumn();
45
            typeid_cast<ColumnLowCardinality &>(*column).insertRangeFromFullColumn(*arg.column, 0, arg.column->size());
46
            return column;
47
        }
48
    }
49
};
50

51
}
52

53
REGISTER_FUNCTION(ToLowCardinality)
54
{
55
    factory.registerFunction<FunctionToLowCardinality>();
56
}
57

58
}
59

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

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

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

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