ClickHouse

Форк
0
/
sliceFromLeftDynamicLength.cpp 
60 строк · 1.9 Кб
1
#ifndef __clang_analyzer__ // It's too hard to analyze.
2

3
#include "GatherUtils.h"
4
#include "Selectors.h"
5
#include "Algorithms.h"
6

7
namespace DB::GatherUtils
8
{
9

10
namespace
11
{
12

13
struct Selector : public ArraySourceSelector<Selector>
14
{
15
    template <typename Source>
16
    static void selectSource(bool is_const, bool is_nullable, Source && source,
17
                             const IColumn & length_column, ColumnArray::MutablePtr & result)
18
    {
19
        using SourceType = typename std::decay<Source>::type;
20
        using Sink = typename SourceType::SinkType;
21

22
        if (is_nullable)
23
        {
24
            using NullableSource = NullableArraySource<SourceType>;
25
            using NullableSink = typename NullableSource::SinkType;
26

27
            auto & nullable_source = static_cast<NullableSource &>(source);
28

29
            result = ColumnArray::create(nullable_source.createValuesColumn());
30
            NullableSink sink(result->getData(), result->getOffsets(), source.getColumnSize());
31

32
            if (is_const)
33
                sliceFromLeftDynamicLength(static_cast<ConstSource<NullableSource> &>(source), sink, length_column);
34
            else
35
                sliceFromLeftDynamicLength(static_cast<NullableSource &>(source), sink, length_column);
36
        }
37
        else
38
        {
39
            result = ColumnArray::create(source.createValuesColumn());
40
            Sink sink(result->getData(), result->getOffsets(), source.getColumnSize());
41

42
            if (is_const)
43
                sliceFromLeftDynamicLength(static_cast<ConstSource<SourceType> &>(source), sink, length_column);
44
            else
45
                sliceFromLeftDynamicLength(source, sink, length_column);
46
        }
47
    }
48
};
49

50
}
51

52
ColumnArray::MutablePtr sliceFromLeftDynamicLength(IArraySource & src, const IColumn & length_column)
53
{
54
    ColumnArray::MutablePtr res;
55
    Selector::select(src, length_column, res);
56
    return res;
57
}
58
}
59

60
#endif
61

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

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

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

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