#include "GatherUtils.h" namespace DB { /// Creates IArraySink from ColumnArray template struct ArraySinkCreator; template struct ArraySinkCreator { static std::unique_ptr create(ColumnArray & col, ColumnUInt8 * null_map, size_t column_size) { 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, ColumnUInt8 * 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(), col.getOffsetsPtr()); return Creator::create(*column, &column_nullable->getNullMapColumn(), column_size); } return Creator::create(col, nullptr, column_size); } }