From f93b1c1adb2fbc5e32bab17859d3f3a70887943c Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Thu, 26 Sep 2019 18:13:52 +0300 Subject: [PATCH] [search] Add relaxed search for cities. --- search/geocoder.cpp | 7 +++++++ .../processor_test.cpp | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/search/geocoder.cpp b/search/geocoder.cpp index 4634207080..7579a4ad92 100644 --- a/search/geocoder.cpp +++ b/search/geocoder.cpp @@ -965,7 +965,14 @@ void Geocoder::MatchCities(BaseContext & ctx) continue; LocalityFilter filter(cityFeatures); + + size_t const numEmitted = ctx.m_numEmitted; LimitedSearch(ctx, filter); + if (numEmitted == ctx.m_numEmitted) + { + TRACE(Relaxed); + EmitResult(ctx, *ctx.m_city, ctx.m_city->m_tokenRange, false /* allTokensUsed */); + } } } } diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index 2f16031aec..4910a40634 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -379,7 +379,10 @@ UNIT_CLASS_TEST(ProcessorTest, SearchByName) Rules rules = {ExactMatch(wonderlandId, hydePark)}; TEST(ResultsMatch("hyde park", rules), ()); TEST(ResultsMatch("london hyde park", rules), ()); - TEST(ResultsMatch("hyde london park", Rules()), ()); + } + { + Rules rules = {ExactMatch(worldId, london)}; + TEST(ResultsMatch("hyde london park", rules), ()); } SetViewport(m2::RectD(m2::PointD(0.5, 0.5), m2::PointD(1.5, 1.5))); @@ -1099,7 +1102,7 @@ UNIT_CLASS_TEST(ProcessorTest, FuzzyMatch) TEST(ResultsMatch("масква ленинргадский черчиль", "ru", rules), ()); // Too many errors, can't do anything. - TEST(ResultsMatch("масква лениноргадсский чирчиль", "ru", Rules{}), ()); + TEST(ResultsMatch("маcсква лениноргадсский чирчиль", "ru", Rules{}), ()); TEST(ResultsMatch("моксва ленинргадский черчиль", "ru", rules), ()); @@ -1395,9 +1398,9 @@ UNIT_CLASS_TEST(ProcessorTest, RelaxedRetrieval) { Rules rulesStrict = {ExactMatch(countryId, street)}; - Rules rulesRelaxed = {}; + Rules rulesRelaxed = {ExactMatch(worldId, city)}; - // Cities and larger toponyms should not be relaxed. + // Should return relaxed result for city. // "city" instead of "city-street" TEST(ResultsMatch("sick city queer street ", rulesStrict), ()); TEST(ResultsMatch("sick city sick street ", rulesRelaxed), ()); @@ -1405,9 +1408,9 @@ UNIT_CLASS_TEST(ProcessorTest, RelaxedRetrieval) { Rules rulesStrict = {ExactMatch(countryId, street)}; - Rules rulesRelaxed = {}; + Rules rulesRelaxed = {ExactMatch(worldId, city)}; - // Should not be relaxed. + // Should return relaxed result for city. // "country-city" instead of "country-city-street" TEST(ResultsMatch("wonderland sick city queer street ", rulesStrict), ()); TEST(ResultsMatch("wonderland sick city other street ", rulesRelaxed), ()); @@ -1415,9 +1418,9 @@ UNIT_CLASS_TEST(ProcessorTest, RelaxedRetrieval) { Rules rulesStrict = {ExactMatch(countryId, poi0)}; - Rules rulesRelaxed = {}; + Rules rulesRelaxed = {ExactMatch(worldId, city)}; - // Should not be relaxed. + // Should return relaxed result for city. // "city" instead of "city-poi" TEST(ResultsMatch("sick city pharmacy ", rulesStrict), ()); TEST(ResultsMatch("sick city library ", rulesRelaxed), ());