ClickHouse
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
8namespace DB
9{
10namespace ErrorCodes
11{
12extern const int ILLEGAL_TYPE_OF_ARGUMENT;
13}
14
15namespace
16{
17
18class FunctionLowCardinalityKeys: public IFunction
19{
20public:
21static constexpr auto name = "lowCardinalityKeys";
22static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionLowCardinalityKeys>(); }
23
24String getName() const override { return name; }
25
26size_t getNumberOfArguments() const override { return 1; }
27
28bool useDefaultImplementationForNulls() const override { return false; }
29bool useDefaultImplementationForConstants() const override { return true; }
30bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }
31bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return false; }
32
33DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
34{
35const auto * type = typeid_cast<const DataTypeLowCardinality *>(arguments[0].get());
36if (!type)
37throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
38"First first argument of function lowCardinalityKeys must be ColumnLowCardinality, "
39"but got {}", arguments[0]->getName());
40
41return type->getDictionaryType();
42}
43
44ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
45{
46const auto & arg = arguments[0];
47const auto * low_cardinality_column = typeid_cast<const ColumnLowCardinality *>(arg.column.get());
48return low_cardinality_column->getDictionary().getNestedColumn()->cloneResized(arg.column->size());
49}
50};
51
52}
53
54REGISTER_FUNCTION(LowCardinalityKeys)
55{
56factory.registerFunction<FunctionLowCardinalityKeys>();
57}
58
59}
60