ClickHouse
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
8namespace DB
9{
10
11namespace ErrorCodes
12{
13extern const int ILLEGAL_COLUMN;
14extern const int ILLEGAL_TYPE_OF_ARGUMENT;
15}
16
17namespace
18{
19
20class FunctionFlattenTuple : public IFunction
21{
22public:
23static constexpr auto name = "flattenTuple";
24static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionFlattenTuple>(); }
25
26String getName() const override { return name; }
27size_t getNumberOfArguments() const override { return 1; }
28bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override { return true; }
29bool useDefaultImplementationForConstants() const override { return true; }
30
31DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
32{
33const auto & type = arguments[0];
34const auto * type_tuple = checkAndGetDataType<DataTypeTuple>(type.get());
35if (!type_tuple || !type_tuple->haveExplicitNames())
36throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
37"Argument for function '{}' must be Named Tuple. Got '{}'",
38getName(), type->getName());
39
40auto [paths, types] = flattenTuple(type);
41Names names;
42names.reserve(paths.size());
43for (const auto & path : paths)
44names.push_back(path.getPath());
45
46return std::make_shared<DataTypeTuple>(types, names);
47}
48
49ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
50{
51auto column = arguments.at(0).column;
52if (!checkAndGetColumn<ColumnTuple>(column.get()))
53throw Exception(ErrorCodes::ILLEGAL_COLUMN,
54"Illegal column {} of first argument of function {}. Expected ColumnTuple",
55column->getName(), getName());
56
57return flattenTuple(column);
58}
59};
60
61}
62
63REGISTER_FUNCTION(FlattenTuple)
64{
65factory.registerFunction<FunctionFlattenTuple>();
66}
67
68}
69