From 1fb0daf2097b0677ae4bd53df4d03e0c7892b4db Mon Sep 17 00:00:00 2001 From: achulkov2 Date: Thu, 26 Dec 2019 16:23:04 +0300 Subject: [PATCH] Try some improvements --- dbms/src/Dictionaries/PolygonDictionary.cpp | 24 +++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/dbms/src/Dictionaries/PolygonDictionary.cpp b/dbms/src/Dictionaries/PolygonDictionary.cpp index f50065a1a04..064e8e428bc 100644 --- a/dbms/src/Dictionaries/PolygonDictionary.cpp +++ b/dbms/src/Dictionaries/PolygonDictionary.cpp @@ -231,10 +231,10 @@ void IPolygonDictionary::getString( const auto & null_value = getNullValue(dict_struct.attributes[ind].null_value); - getItemsImpl( + getItemsImpl( ind, key_columns, - [&](const size_t, const String & value) { out->insertData(value.data(), value.size()); }, + [&](const size_t, const StringRef & value) { out->insertData(value.data, value.size); }, [&](const size_t) { return null_value; }); } @@ -341,16 +341,32 @@ void IPolygonDictionary::getItemsImpl( { const auto points = extractPoints(key_columns); + using ColVecType = std::conditional_t, ColumnDecimal, ColumnVector>; + using ColType = std::conditional_t::value, ColumnString, ColVecType>; + const auto column = typeid_cast(attributes[attribute_ind].get()); + if (!column) + throw Exception{"An attribute should be a column of its type", ErrorCodes::LOGICAL_ERROR}; for (const auto i : ext::range(0, points.size())) { size_t id = 0; - auto found = find(points[i], id); - set_value(i, found ? static_cast((*attributes[attribute_ind])[id].get()) : get_default(i)); + const auto found = find(points[i], id); + if (!found) + { + const auto def = get_default(i); + set_value(i, static_cast(def)); + continue; + } + if constexpr (std::is_same::value) + set_value(i, static_cast(column->getDataAt(id))); + else + set_value(i, static_cast(column->getElement(id))); } query_count.fetch_add(points.size(), std::memory_order_relaxed); } + + IPolygonDictionary::Point IPolygonDictionary::fieldToPoint(const Field &field) { if (field.getType() == Field::Types::Array)