#include "GatherUtils.h" #include "Sinks.h" #include "Sources.h" #include namespace DB::GatherUtils { /// Creates IArraySink from ColumnArray template struct ArraySinkCreator; template struct ArraySinkCreator { static std::unique_ptr create(ColumnArray & col, NullMap * null_map, size_t column_size) { using ColVecType = std::conditional_t, ColumnDecimal, ColumnVector>; if (typeid_cast(&col.getData())) { if (null_map) return std::make_unique>>(col, *null_map, column_size); return std::make_unique>(col, column_size); } return ArraySinkCreator::create(col, null_map, column_size); } }; template <> struct ArraySinkCreator<> { static std::unique_ptr create(ColumnArray & col, NullMap * null_map, size_t column_size) { if (null_map) return std::make_unique>(col, *null_map, column_size); return std::make_unique(col, column_size); } }; std::unique_ptr createArraySink(ColumnArray & col, size_t column_size) { using Creator = ApplyTypeListForClass::Type; if (auto column_nullable = typeid_cast(&col.getData())) { auto column = ColumnArray::create(column_nullable->getNestedColumnPtr()->assumeMutable(), col.getOffsetsPtr()->assumeMutable()); return Creator::create(*column, &column_nullable->getNullMapData(), column_size); } return Creator::create(col, nullptr, column_size); } }