From 6802cfd3e0f68c090f97a254bb7dca0cc640bfeb Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Tue, 25 Jun 2019 11:13:58 +0300 Subject: [PATCH] [search] Fix ranking for strasse. --- search/ranker.cpp | 37 ++++++++++++++++ .../processor_test.cpp | 43 ++++++++++++++----- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/search/ranker.cpp b/search/ranker.cpp index feed8d3b27..9f489e099c 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -55,6 +55,37 @@ void UpdateNameScores(vector const & tokens, Slice const & s bestScores.m_errorsMade = ErrorsMade::Min(bestScores.m_errorsMade, GetErrorsMade(tokens, slice)); } +// This function assumes that at most one token in |streetTokens| ends with "strasse". +bool ModifyStrasse(vector & streetTokens) +{ + auto static const kStrasse = strings::MakeUniString("strasse"); + for (size_t i = 0; i < streetTokens.size(); ++i) + { + auto & token = streetTokens[i]; + if (strings::EndsWith(token, kStrasse)) + { + if (token == kStrasse) + { + if (i != 0) + { + streetTokens[i - 1] = streetTokens[i - 1] + kStrasse; + streetTokens.erase(streetTokens.begin() + i); + return true; + } + } + else + { + streetTokens[i] = + strings::UniString(streetTokens[i].begin(), streetTokens[i].end() - kStrasse.size()); + streetTokens.insert(streetTokens.begin() + i + 1, kStrasse); + return true; + } + } + } + + return false; +} + NameScores GetNameScores(FeatureType & ft, Geocoder::Params const & params, TokenRange const & range, Model::Type type) { @@ -79,6 +110,12 @@ NameScores GetNameScores(FeatureType & ft, Geocoder::Params const & params, UpdateNameScores(tokens, slice, bestScores); UpdateNameScores(tokens, sliceNoCategories, bestScores); + + if (type == Model::TYPE_STREET && ModifyStrasse(tokens)) + { + UpdateNameScores(tokens, slice, bestScores); + UpdateNameScores(tokens, sliceNoCategories, bestScores); + } } if (type == Model::TYPE_BUILDING) diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index 3a8ede4ed9..b551a41b73 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -1965,7 +1965,7 @@ UNIT_CLASS_TEST(ProcessorTest, StreetSynonymPrefix) } } -UNIT_CLASS_TEST(ProcessorTest, StrasseIndexing) +UNIT_CLASS_TEST(ProcessorTest, Strasse) { string const countryName = "Wonderland"; @@ -1979,22 +1979,43 @@ UNIT_CLASS_TEST(ProcessorTest, StrasseIndexing) builder.Add(s2); }); + auto checkNoErrors = [&](string const & query, Rules const & rules) { + auto request = MakeRequest(query, "en"); + auto const & results = request->Results(); + + TEST(ResultsMatch(results, rules), (query)); + TEST_EQUAL(results.size(), 1, (query)); + TEST_EQUAL(results[0].GetRankingInfo().m_errorsMade, ErrorsMade(0), (query)); + auto const nameScore = results[0].GetRankingInfo().m_nameScore; + TEST(nameScore == NAME_SCORE_FULL_MATCH || nameScore == NAME_SCORE_PREFIX, (query)); + }; + SetViewport(m2::RectD(m2::PointD(0.0, 0.0), m2::PointD(1.0, 2.0))); { Rules rules = {ExactMatch(countryId, s1)}; - TEST(ResultsMatch("abcdstrasse", rules), ()); - TEST(ResultsMatch("abcdstraße", rules), ()); - TEST(ResultsMatch("abcd strasse", rules), ()); - TEST(ResultsMatch("abcd straße", rules), ()); - TEST(ResultsMatch("abcd", rules), ()); + checkNoErrors("abcdstrasse ", rules); + checkNoErrors("abcdstrasse", rules); + checkNoErrors("abcdstraße ", rules); + checkNoErrors("abcdstraße", rules); + checkNoErrors("abcd strasse ", rules); + checkNoErrors("abcd strasse", rules); + checkNoErrors("abcd straße ", rules); + checkNoErrors("abcd straße", rules); + checkNoErrors("abcd ", rules); + checkNoErrors("abcd", rules); } { Rules rules = {ExactMatch(countryId, s2)}; - TEST(ResultsMatch("xyzstrasse", rules), ()); - TEST(ResultsMatch("xyzstraße", rules), ()); - TEST(ResultsMatch("xyz strasse", rules), ()); - TEST(ResultsMatch("xyz straße", rules), ()); - TEST(ResultsMatch("xyz", rules), ()); + checkNoErrors("xyzstrasse ", rules); + checkNoErrors("xyzstrasse", rules); + checkNoErrors("xyzstraße ", rules); + checkNoErrors("xyzstraße", rules); + checkNoErrors("xyz strasse ", rules); + checkNoErrors("xyz strasse", rules); + checkNoErrors("xyz straße ", rules); + checkNoErrors("xyz straße", rules); + checkNoErrors("xyz ", rules); + checkNoErrors("xyz", rules); } } } // namespace