ClickHouse
60 строк · 2.0 Кб
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 SliceFromRightConstantOffsetUnboundedSelectArraySource
14: public ArraySourceSelector<SliceFromRightConstantOffsetUnboundedSelectArraySource>
15{
16template <typename Source>
17static void selectSource(bool is_const, bool is_nullable, Source && source, size_t & offset, 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)
33sliceFromRightConstantOffsetUnbounded(static_cast<ConstSource<NullableSource> &>(source), sink, offset);
34else
35sliceFromRightConstantOffsetUnbounded(static_cast<NullableSource &>(source), sink, offset);
36}
37else
38{
39result = ColumnArray::create(source.createValuesColumn());
40Sink sink(result->getData(), result->getOffsets(), source.getColumnSize());
41
42if (is_const)
43sliceFromRightConstantOffsetUnbounded(static_cast<ConstSource<SourceType> &>(source), sink, offset);
44else
45sliceFromRightConstantOffsetUnbounded(source, sink, offset);
46}
47}
48};
49
50}
51
52ColumnArray::MutablePtr sliceFromRightConstantOffsetUnbounded(IArraySource & src, size_t offset)
53{
54ColumnArray::MutablePtr res;
55SliceFromRightConstantOffsetUnboundedSelectArraySource::select(src, offset, res);
56return res;
57}
58}
59
60#endif
61