diff --git a/search/retrieval.cpp b/search/retrieval.cpp index f969d5c554..8b0314d956 100644 --- a/search/retrieval.cpp +++ b/search/retrieval.cpp @@ -525,8 +525,9 @@ bool Retrieval::InitBucketStrategy(Bucket & bucket, double scale) try { - addressFeatures = RetrieveAddressFeatures(*bucket.m_handle.GetValue(), - *this /* cancellable */, m_params); + addressFeatures = + RetrieveAddressFeatures(*bucket.m_handle.GetValue(), *this /* cancellable */, + m_params); } catch (CancelException &) { diff --git a/search/search_query_params.cpp b/search/search_query_params.cpp index b2fe71bc29..a3f2f8906f 100644 --- a/search/search_query_params.cpp +++ b/search/search_query_params.cpp @@ -120,6 +120,12 @@ SearchQueryParams::TSynonymsVector const & SearchQueryParams::GetTokens(size_t i return i < m_tokens.size() ? m_tokens[i] : m_prefixTokens; } +SearchQueryParams::TSynonymsVector & SearchQueryParams::GetTokens(size_t i) +{ + ASSERT_LESS_OR_EQUAL(i, m_tokens.size(), ()); + return i < m_tokens.size() ? m_tokens[i] : m_prefixTokens; +} + template void SearchQueryParams::ForEachToken(ToDo && toDo) { diff --git a/search/search_query_params.hpp b/search/search_query_params.hpp index dc974f37e0..0cb7b950f7 100644 --- a/search/search_query_params.hpp +++ b/search/search_query_params.hpp @@ -33,6 +33,7 @@ struct SearchQueryParams inline bool IsLangExist(int8_t l) const { return (m_langs.count(l) > 0); } TSynonymsVector const & GetTokens(size_t i) const; + TSynonymsVector & GetTokens(size_t i); private: template diff --git a/search/v2/geocoder.cpp b/search/v2/geocoder.cpp index 653d3af00c..60ba92811c 100644 --- a/search/v2/geocoder.cpp +++ b/search/v2/geocoder.cpp @@ -168,6 +168,14 @@ void GetEnglishName(FeatureType const & ft, string & name) } } +bool IsStreetCategory(strings::UniString const & category) +{ + static auto const kCategoriesList = GetStreetCategories(); + static set const kCategoriesSet(kCategoriesList.begin(), + kCategoriesList.end()); + return kCategoriesSet.count(category) != 0; +} + template void ForEachStreetCategory(TFn && fn) { @@ -304,6 +312,19 @@ void Geocoder::SetParams(Params const & params) if (!m_params.m_prefixTokens.empty()) ++m_numTokens; + // Remove all category synonyms for streets, as they're extracted + // individually via LoadStreets. + for (size_t i = 0; i < m_numTokens; ++i) + { + auto & synonyms = m_params.GetTokens(i); + if (!synonyms.empty() && IsStreetSynonym(synonyms.front())) + { + auto b = synonyms.begin(); + auto e = synonyms.end(); + synonyms.erase(remove_if(b + 1, e, &IsStreetCategory), e); + } + } + LOG(LDEBUG, ("Languages =", m_params.m_langs)); } @@ -423,7 +444,10 @@ void Geocoder::GoImpl(vector> & infos, bool inViewport) ASSERT(m_addressFeatures[i], ()); if (viewportCBV) - m_addressFeatures[i] = coding::CompressedBitVector::Intersect(*m_addressFeatures[i], *viewportCBV); + { + m_addressFeatures[i] = + coding::CompressedBitVector::Intersect(*m_addressFeatures[i], *viewportCBV); + } } m_streets = LoadStreets(*m_context);