ClickHouse
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
7namespace DB::GatherUtils
8{
9
10namespace
11{
12
13struct Selector : public ArraySourceSelector<Selector>
14{
15template <typename Source>
16static void selectSource(bool is_const, bool is_nullable, Source && source,
17const IColumn & length_column, ColumnArray::MutablePtr & result)
18{
19using SourceType = typename std::decay<Source>::type;
20using Sink = typename SourceType::SinkType;
21
22if (is_nullable)
23{
24using NullableSource = NullableArraySource<SourceType>;
25using NullableSink = typename NullableSource::SinkType;
26
27auto & nullable_source = static_cast<NullableSource &>(source);
28
29result = ColumnArray::create(nullable_source.createValuesColumn());
30NullableSink sink(result->getData(), result->getOffsets(), source.getColumnSize());
31
32if (is_const)
33sliceFromLeftDynamicLength(static_cast<ConstSource<NullableSource> &>(source), sink, length_column);
34else
35sliceFromLeftDynamicLength(static_cast<NullableSource &>(source), sink, length_column);
36}
37else
38{
39result = ColumnArray::create(source.createValuesColumn());
40Sink sink(result->getData(), result->getOffsets(), source.getColumnSize());
41
42if (is_const)
43sliceFromLeftDynamicLength(static_cast<ConstSource<SourceType> &>(source), sink, length_column);
44else
45sliceFromLeftDynamicLength(source, sink, length_column);
46}
47}
48};
49
50}
51
52ColumnArray::MutablePtr sliceFromLeftDynamicLength(IArraySource & src, const IColumn & length_column)
53{
54ColumnArray::MutablePtr res;
55Selector::select(src, length_column, res);
56return res;
57}
58}
59
60#endif
61