#include "geo.h" #include "utils.h" namespace { using namespace ::clickhouse; template TypeRef CreateGeoType() { if constexpr (type_code == Type::Code::Point) { return Type::CreatePoint(); } else if constexpr (type_code == Type::Code::Ring) { return Type::CreateRing(); } else if constexpr (type_code == Type::Code::Polygon) { return Type::CreatePolygon(); } else if constexpr (type_code == Type::Code::MultiPolygon) { return Type::CreateMultiPolygon(); } } template std::shared_ptr CreateColumn() { if constexpr (std::is_same_v>) { return std::make_shared>( std::make_tuple(std::make_shared(), std::make_shared())); } else { return std::make_shared(); } } } // namespace namespace clickhouse { template ColumnGeo::ColumnGeo() : Column(CreateGeoType()), data_(CreateColumn()) { } template ColumnGeo::ColumnGeo(ColumnRef data) : Column(CreateGeoType()) , data_(WrapColumn(std::move(data))) { } template void ColumnGeo::Clear() { data_->Clear(); } template const typename ColumnGeo::ValueType ColumnGeo::At(size_t n) const { return data_->At(n); } template void ColumnGeo::Reserve(size_t new_cap) { data_->Reserve(new_cap); } template void ColumnGeo::Append(ColumnRef column) { if (auto col = column->template As()) { data_->Append(col->data_->template As()); } } template bool ColumnGeo::LoadBody(InputStream* input, size_t rows) { return data_->LoadBody(input, rows); } template void ColumnGeo::SaveBody(OutputStream* output) { data_->SaveBody(output); } template size_t ColumnGeo::Size() const { return data_->Size(); } template ColumnRef ColumnGeo::Slice(size_t begin, size_t len) const { return std::make_shared(data_->Slice(begin, len)); } template ColumnRef ColumnGeo::CloneEmpty() const { return std::make_shared(); } template void ColumnGeo::Swap(Column& other) { auto& col = dynamic_cast(other); data_.swap(col.data_); } template class ColumnGeo, Type::Code::Point>; template class ColumnGeo, Type::Code::Ring>; template class ColumnGeo, Type::Code::Polygon>; template class ColumnGeo, Type::Code::MultiPolygon>; } // namespace clickhouse