Try some improvements

This commit is contained in:
achulkov2 2019-12-26 16:23:04 +03:00
parent f6fd331156
commit 1fb0daf209

View File

@ -231,10 +231,10 @@ void IPolygonDictionary::getString(
const auto & null_value = getNullValue<String>(dict_struct.attributes[ind].null_value); const auto & null_value = getNullValue<String>(dict_struct.attributes[ind].null_value);
getItemsImpl<String, String>( getItemsImpl<String, StringRef>(
ind, ind,
key_columns, 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; }); [&](const size_t) { return null_value; });
} }
@ -341,16 +341,32 @@ void IPolygonDictionary::getItemsImpl(
{ {
const auto points = extractPoints(key_columns); const auto points = extractPoints(key_columns);
using ColVecType = std::conditional_t<IsDecimalNumber<AttributeType>, ColumnDecimal<AttributeType>, ColumnVector<AttributeType>>;
using ColType = std::conditional_t<std::is_same<AttributeType, String>::value, ColumnString, ColVecType>;
const auto column = typeid_cast<const ColType *>(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())) for (const auto i : ext::range(0, points.size()))
{ {
size_t id = 0; size_t id = 0;
auto found = find(points[i], id); const auto found = find(points[i], id);
set_value(i, found ? static_cast<OutputType>((*attributes[attribute_ind])[id].get<AttributeType>()) : get_default(i)); if (!found)
{
const auto def = get_default(i);
set_value(i, static_cast<OutputType>(def));
continue;
}
if constexpr (std::is_same<AttributeType, String>::value)
set_value(i, static_cast<OutputType>(column->getDataAt(id)));
else
set_value(i, static_cast<OutputType>(column->getElement(id)));
} }
query_count.fetch_add(points.size(), std::memory_order_relaxed); query_count.fetch_add(points.size(), std::memory_order_relaxed);
} }
IPolygonDictionary::Point IPolygonDictionary::fieldToPoint(const Field &field) IPolygonDictionary::Point IPolygonDictionary::fieldToPoint(const Field &field)
{ {
if (field.getType() == Field::Types::Array) if (field.getType() == Field::Types::Array)