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::GatherUtils8{
9
10namespace
11{
12
13struct SliceFromRightConstantOffsetBoundedSelectArraySource14: public ArraySourceSelector<SliceFromRightConstantOffsetBoundedSelectArraySource>15{
16template <typename Source>17static void selectSource(bool is_const, bool is_nullable, Source && source, size_t & offset, ssize_t & length, 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)33sliceFromRightConstantOffsetBounded(static_cast<ConstSource<NullableSource> &>(source), sink, offset, length);34else35sliceFromRightConstantOffsetBounded(static_cast<NullableSource &>(source), sink, offset, length);36}37else38{39result = ColumnArray::create(source.createValuesColumn());40Sink sink(result->getData(), result->getOffsets(), source.getColumnSize());41
42if (is_const)43sliceFromRightConstantOffsetBounded(static_cast<ConstSource<SourceType> &>(source), sink, offset, length);44else45sliceFromRightConstantOffsetBounded(source, sink, offset, length);46}47}48};49
50}
51
52ColumnArray::MutablePtr sliceFromRightConstantOffsetBounded(IArraySource & src, size_t offset, ssize_t length)53{
54ColumnArray::MutablePtr res;55SliceFromRightConstantOffsetBoundedSelectArraySource::select(src, offset, length, res);56return res;57}
58}
59
60#endif61