ClickHouse

Форк
0
/
createArraySink.cpp 
61 строка · 1.8 Кб
1
#include "GatherUtils.h"
2
#include "Sinks.h"
3
#include "Sources.h"
4
#include <base/TypeLists.h>
5

6
namespace DB::GatherUtils
7
{
8
/// Creates IArraySink from ColumnArray
9

10
namespace
11
{
12

13
template <typename... Types>
14
struct ArraySinkCreator;
15

16
template <typename Type, typename... Types>
17
struct ArraySinkCreator<Type, Types...>
18
{
19
    static std::unique_ptr<IArraySink> create(IColumn & values, ColumnArray::Offsets & offsets, size_t column_size)
20
    {
21
        using ColVecType = ColumnVectorOrDecimal<Type>;
22

23
        IColumn * not_null_values = &values;
24
        bool is_nullable = false;
25

26
        if (auto * nullable = typeid_cast<ColumnNullable *>(&values))
27
        {
28
            not_null_values = &nullable->getNestedColumn();
29
            is_nullable = true;
30
        }
31

32
        if (typeid_cast<ColVecType *>(not_null_values))
33
        {
34
            if (is_nullable)
35
                return std::make_unique<NullableArraySink<NumericArraySink<Type>>>(values, offsets, column_size);
36
            return std::make_unique<NumericArraySink<Type>>(values, offsets, column_size);
37
        }
38

39
        return ArraySinkCreator<Types...>::create(values, offsets, column_size);
40
    }
41
};
42

43
template <>
44
struct ArraySinkCreator<>
45
{
46
    static std::unique_ptr<IArraySink> create(IColumn & values, ColumnArray::Offsets & offsets, size_t column_size)
47
    {
48
        if (typeid_cast<ColumnNullable *>(&values))
49
            return std::make_unique<NullableArraySink<GenericArraySink>>(values, offsets, column_size);
50
        return std::make_unique<GenericArraySink>(values, offsets, column_size);
51
    }
52
};
53

54
}
55

56
std::unique_ptr<IArraySink> createArraySink(ColumnArray & col, size_t column_size)
57
{
58
    using Creator = TypeListChangeRoot<ArraySinkCreator, TypeListNumberWithUUID>;
59
    return Creator::create(col.getData(), col.getOffsets(), column_size);
60
}
61
}
62

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

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

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

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