From 4589286244fe7542d83dc262e88da160dafb023d Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Thu, 21 Jan 2016 13:50:46 +0300 Subject: [PATCH] [search] Removed redundant calls to clusterize. --- search/v2/geocoder.cpp | 48 +++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/search/v2/geocoder.cpp b/search/v2/geocoder.cpp index bed00d295e..e37b8a7d6f 100644 --- a/search/v2/geocoder.cpp +++ b/search/v2/geocoder.cpp @@ -682,22 +682,6 @@ void Geocoder::MatchPOIsAndBuildings(size_t curToken) // list of ids. vector clusters[SearchModel::SEARCH_TYPE_STREET]; - auto clusterize = [&](uint32_t featureId) - { - if (m_streets->GetBit(featureId)) - return; - - FeatureType feature; - m_context->m_vector.GetByIndex(featureId, feature); - feature.ParseTypes(); - SearchModel::SearchType const searchType = m_model.GetSearchType(feature); - - // All SEARCH_TYPE_CITY features were filtered in DoGeocodingWithLocalities(). - // All SEARCH_TYPE_STREET features were filtered in GreedyMatchStreets(). - if (searchType < SearchModel::SEARCH_TYPE_STREET) - clusters[searchType].push_back(featureId); - }; - unique_ptr intersection; coding::CompressedBitVector * features = nullptr; @@ -741,9 +725,35 @@ void Geocoder::MatchPOIsAndBuildings(size_t curToken) if (coding::CompressedBitVector::IsEmpty(features) && !looksLikeHouseNumber) break; - for (auto & cluster : clusters) - cluster.clear(); - coding::CompressedBitVectorEnumerator::ForEach(*features, clusterize); + if (n == 1) + { + auto clusterize = [&](uint32_t featureId) + { + if (m_streets->GetBit(featureId)) + return; + + FeatureType feature; + m_context->m_vector.GetByIndex(featureId, feature); + feature.ParseTypes(); + SearchModel::SearchType const searchType = m_model.GetSearchType(feature); + + // All SEARCH_TYPE_CITY features were filtered in DoGeocodingWithLocalities(). + // All SEARCH_TYPE_STREET features were filtered in GreedyMatchStreets(). + if (searchType < SearchModel::SEARCH_TYPE_STREET) + clusters[searchType].push_back(featureId); + }; + + coding::CompressedBitVectorEnumerator::ForEach(*features, clusterize); + } + else + { + auto noFeature = [&features](uint32_t featureId) -> bool + { + return !features->GetBit(featureId); + }; + for (auto & cluster : clusters) + cluster.erase(remove_if(cluster.begin(), cluster.end(), noFeature), cluster.end()); + } for (size_t i = 0; i < ARRAY_SIZE(clusters); ++i) {