diff options
author | tatiana-yan <tatiana.kondakova@gmail.com> | 2020-08-06 14:33:51 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2020-09-18 00:48:24 +0300 |
commit | d1f98bcf61510e97f6c3ee575560904bf27b8bae (patch) | |
tree | ff2c17fe7e948ee512cc4e7b8ca1474274d2ebfb /search | |
parent | 42224b6b5b10796b9f6aa57ad1604beca4808363 (diff) |
[search] Support multiple semicolon separated alt/old names.
Diffstat (limited to 'search')
-rw-r--r-- | search/ranker.cpp | 56 | ||||
-rw-r--r-- | search/search_integration_tests/processor_test.cpp | 29 |
2 files changed, 73 insertions, 12 deletions
diff --git a/search/ranker.cpp b/search/ranker.cpp index 7464b7e452..34f469bb9a 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -38,7 +38,16 @@ template <typename Slice> void UpdateNameScores(string const & name, uint8_t lang, Slice const & slice, NameScores & bestScores) { - bestScores.UpdateIfBetter(GetNameScores(name, lang, slice)); + if (lang == StringUtf8Multilang::kAltNameCode || lang == StringUtf8Multilang::kOldNameCode) + { + auto const names = strings::Tokenize(name, ";"); + for (auto const & n : names) + bestScores.UpdateIfBetter(GetNameScores(n, lang, slice)); + } + else + { + bestScores.UpdateIfBetter(GetNameScores(name, lang, slice)); + } } template <typename Slice> @@ -107,19 +116,32 @@ pair<NameScores, size_t> GetNameScores(FeatureType & ft, Geocoder::Params const string name; if (!ft.GetName(lang, name)) continue; - vector<strings::UniString> tokens; - PrepareStringForMatching(name, tokens); - - UpdateNameScores(tokens, lang, slice, bestScores); - UpdateNameScores(tokens, lang, sliceNoCategories, bestScores); + vector<vector<strings::UniString>> tokens(1); + if (lang == StringUtf8Multilang::kAltNameCode || lang == StringUtf8Multilang::kOldNameCode) + { + auto const names = strings::Tokenize(name, ";"); + tokens.resize(names.size()); + for (size_t i = 0; i < names.size(); ++i) + PrepareStringForMatching(names[i], tokens[i]); + } + else + { + PrepareStringForMatching(name, tokens[0]); + } - if (type == Model::TYPE_STREET) + for (auto const & t : tokens) { - auto const variants = ModifyStrasse(tokens); - for (auto const & variant : variants) + UpdateNameScores(t, lang, slice, bestScores); + UpdateNameScores(t, lang, sliceNoCategories, bestScores); + + if (type == Model::TYPE_STREET) { - UpdateNameScores(variant, lang, slice, bestScores); - UpdateNameScores(variant, lang, sliceNoCategories, bestScores); + auto const variants = ModifyStrasse(t); + for (auto const & variant : variants) + { + UpdateNameScores(variant, lang, slice, bestScores); + UpdateNameScores(variant, lang, sliceNoCategories, bestScores); + } } } } @@ -772,7 +794,17 @@ void Ranker::GetBestMatchName(FeatureType & f, string & name) const }; auto bestNameFinder = [&](int8_t lang, string const & s) { - updateScore(lang, s, true /* force */); + if (lang == StringUtf8Multilang::kAltNameCode || lang == StringUtf8Multilang::kOldNameCode) + { + auto const names = strings::Tokenize(s, ";"); + for (auto const & n : names) + updateScore(lang, n, true /* force */); + } + else + { + updateScore(lang, s, true /* force */); + } + // Default name should be written in the regional language. if (lang == StringUtf8Multilang::kDefaultCode) { diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index ace111fd60..7bfc8e3975 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -3095,5 +3095,34 @@ UNIT_CLASS_TEST(ProcessorTest, JaKanaNormalizationTest) TEST(ResultsMatch("トウキョウト", rules), ()); } } + +UNIT_CLASS_TEST(ProcessorTest, TestRankingInfo_MultipleOldNames) +{ + string const countryName = "Wonderland"; + + StringUtf8Multilang cityName; + cityName.AddString("default", "Санкт-Петербург"); + cityName.AddString("old_name", "Ленинград;Петроград"); + TestCity city(m2::PointD(0.0, 0.0), cityName, 100 /* rank */); + + auto worldId = BuildWorld([&](TestMwmBuilder & builder) { builder.Add(city); }); + + SetViewport(m2::RectD(-1, -1, 1, 1)); + + auto checkResult = [&](string const & query, string const & expectedName) { + auto request = MakeRequest(query, "ru"); + auto const & results = request->Results(); + + Rules rules{ExactMatch(worldId, city)}; + TEST_EQUAL(results.size(), 1, ()); + TEST(ResultsMatch(results, rules), ()); + TEST_EQUAL(results[0].GetRankingInfo().m_nameScore, NAME_SCORE_FULL_MATCH, (query, results)); + TEST_EQUAL(results[0].GetString(), expectedName, (query, results)); + }; + + checkResult("Санкт-Петербург", "Санкт-Петербург"); + checkResult("Ленинград", "Санкт-Петербург (Ленинград)"); + checkResult("Петроград", "Санкт-Петербург (Петроград)"); +} } // namespace } // namespace search |