ClickHouse

Форк
0
/
flattenTuple.cpp 
68 строк · 2.1 Кб
1
#include <Functions/IFunction.h>
2
#include <Functions/FunctionFactory.h>
3
#include <Functions/FunctionHelpers.h>
4
#include <DataTypes/DataTypeTuple.h>
5
#include <DataTypes/ObjectUtils.h>
6
#include <Columns/ColumnTuple.h>
7

8
namespace DB
9
{
10

11
namespace ErrorCodes
12
{
13
    extern const int ILLEGAL_COLUMN;
14
    extern const int ILLEGAL_TYPE_OF_ARGUMENT;
15
}
16

17
namespace
18
{
19

20
class FunctionFlattenTuple : public IFunction
21
{
22
public:
23
    static constexpr auto name = "flattenTuple";
24
    static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionFlattenTuple>(); }
25

26
    String getName() const override { return name; }
27
    size_t getNumberOfArguments() const override { return 1; }
28
    bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override { return true; }
29
    bool useDefaultImplementationForConstants() const override { return true; }
30

31
    DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
32
    {
33
        const auto & type = arguments[0];
34
        const auto * type_tuple = checkAndGetDataType<DataTypeTuple>(type.get());
35
        if (!type_tuple || !type_tuple->haveExplicitNames())
36
            throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
37
                "Argument for function '{}' must be Named Tuple. Got '{}'",
38
                getName(), type->getName());
39

40
        auto [paths, types] = flattenTuple(type);
41
        Names names;
42
        names.reserve(paths.size());
43
        for (const auto & path : paths)
44
            names.push_back(path.getPath());
45

46
        return std::make_shared<DataTypeTuple>(types, names);
47
    }
48

49
    ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
50
    {
51
        auto column = arguments.at(0).column;
52
        if (!checkAndGetColumn<ColumnTuple>(column.get()))
53
            throw Exception(ErrorCodes::ILLEGAL_COLUMN,
54
                "Illegal column {} of first argument of function {}. Expected ColumnTuple",
55
                column->getName(), getName());
56

57
        return flattenTuple(column);
58
    }
59
};
60

61
}
62

63
REGISTER_FUNCTION(FlattenTuple)
64
{
65
    factory.registerFunction<FunctionFlattenTuple>();
66
}
67

68
}
69

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

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

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

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