ClickHouse
61 строка · 1.8 Кб
1#include "GatherUtils.h"
2#include "Sinks.h"
3#include "Sources.h"
4#include <base/TypeLists.h>
5
6namespace DB::GatherUtils
7{
8/// Creates IArraySink from ColumnArray
9
10namespace
11{
12
13template <typename... Types>
14struct ArraySinkCreator;
15
16template <typename Type, typename... Types>
17struct ArraySinkCreator<Type, Types...>
18{
19static std::unique_ptr<IArraySink> create(IColumn & values, ColumnArray::Offsets & offsets, size_t column_size)
20{
21using ColVecType = ColumnVectorOrDecimal<Type>;
22
23IColumn * not_null_values = &values;
24bool is_nullable = false;
25
26if (auto * nullable = typeid_cast<ColumnNullable *>(&values))
27{
28not_null_values = &nullable->getNestedColumn();
29is_nullable = true;
30}
31
32if (typeid_cast<ColVecType *>(not_null_values))
33{
34if (is_nullable)
35return std::make_unique<NullableArraySink<NumericArraySink<Type>>>(values, offsets, column_size);
36return std::make_unique<NumericArraySink<Type>>(values, offsets, column_size);
37}
38
39return ArraySinkCreator<Types...>::create(values, offsets, column_size);
40}
41};
42
43template <>
44struct ArraySinkCreator<>
45{
46static std::unique_ptr<IArraySink> create(IColumn & values, ColumnArray::Offsets & offsets, size_t column_size)
47{
48if (typeid_cast<ColumnNullable *>(&values))
49return std::make_unique<NullableArraySink<GenericArraySink>>(values, offsets, column_size);
50return std::make_unique<GenericArraySink>(values, offsets, column_size);
51}
52};
53
54}
55
56std::unique_ptr<IArraySink> createArraySink(ColumnArray & col, size_t column_size)
57{
58using Creator = TypeListChangeRoot<ArraySinkCreator, TypeListNumberWithUUID>;
59return Creator::create(col.getData(), col.getOffsets(), column_size);
60}
61}
62