diff --git a/search/retrieval.cpp b/search/retrieval.cpp index 1108d45a69..b403a08968 100644 --- a/search/retrieval.cpp +++ b/search/retrieval.cpp @@ -189,26 +189,28 @@ pair MatchFeatureByNameAndType(EditableMapObject const & emo, { auto const & th = emo.GetTypes(); - pair matched = {false, false}; + pair matchedByType = MatchesByType(th, request.m_categories); + + // Exactly matched by type. + if (matchedByType.second) + return {true, true}; + + pair matchedByName = {false, false}; emo.GetNameMultilang().ForEach([&](int8_t lang, string const & name) { if (name.empty() || !request.HasLang(lang)) return base::ControlFlow::Continue; vector tokens; NormalizeAndTokenizeString(name, tokens, Delimiters()); - auto const matchesByName = MatchesByName(tokens, request.m_names); - auto const matchesByType = - matchesByName.second ? make_pair(false, false) : MatchesByType(th, request.m_categories); - - matched = {matchesByName.first || matchesByType.first, - matchesByName.second || matchesByType.second}; - if (!matched.first) + auto const matched = MatchesByName(tokens, request.m_names); + matchedByName = {matchedByName.first || matched.first, matchedByName.second || matched.second}; + if (!matchedByName.second) return base::ControlFlow::Continue; return base::ControlFlow::Break; }); - return matched; + return {matchedByType.first || matchedByName.first, matchedByType.second || matchedByName.second}; } bool MatchFeatureByPostcode(EditableMapObject const & emo, TokenSlice const & slice) diff --git a/search/search_integration_tests/search_edited_features_test.cpp b/search/search_integration_tests/search_edited_features_test.cpp index b5abb53d17..ef6b5007c5 100644 --- a/search/search_integration_tests/search_edited_features_test.cpp +++ b/search/search_integration_tests/search_edited_features_test.cpp @@ -25,7 +25,7 @@ class SearchEditedFeaturesTest : public SearchTest UNIT_CLASS_TEST(SearchEditedFeaturesTest, Smoke) { TestCity city(m2::PointD(0, 0), "Quahog", "default", 100 /* rank */); - TestPOI cafe(m2::PointD(0, 0), "Bar", "default"); + TestCafe cafe(m2::PointD(0, 0), "Bar", "default"); BuildWorld([&](TestMwmBuilder & builder) { builder.Add(city); }); @@ -36,6 +36,7 @@ UNIT_CLASS_TEST(SearchEditedFeaturesTest, Smoke) { Rules const rules = {ExactMatch(id, cafe)}; + TEST(ResultsMatch("Eat ", rules), ()); TEST(ResultsMatch("Bar", rules), ()); TEST(ResultsMatch("Drunken", Rules{}), ()); @@ -43,6 +44,7 @@ UNIT_CLASS_TEST(SearchEditedFeaturesTest, Smoke) emo.SetName("The Drunken Clam", StringUtf8Multilang::kEnglishCode); }); + TEST(ResultsMatch("Eat ", rules), ()); TEST(ResultsMatch("Bar", rules), ()); TEST(ResultsMatch("Drunken", rules), ()); } @@ -59,6 +61,26 @@ UNIT_CLASS_TEST(SearchEditedFeaturesTest, Smoke) } } +UNIT_CLASS_TEST(SearchEditedFeaturesTest, NonamePoi) +{ + TestCafe nonameCafe(m2::PointD(0, 0), "", "default"); + + auto const id = + BuildCountry("Wonderland", [&](TestMwmBuilder & builder) { builder.Add(nonameCafe); }); + + FeatureID cafeId(id, 0 /* index */); + + { + Rules const rules = {ExactMatch(id, nonameCafe)}; + + TEST(ResultsMatch("Eat ", rules), ()); + + EditFeature(cafeId, [](osm::EditableMapObject & emo) { emo.SetInternet(osm::Internet::Wlan); }); + + TEST(ResultsMatch("Eat ", rules), ()); + } +} + UNIT_CLASS_TEST(SearchEditedFeaturesTest, SearchInViewport) { TestCity city(m2::PointD(0, 0), "Canterlot", "default", 100 /* rank */);