From d1f98bcf61510e97f6c3ee575560904bf27b8bae Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Thu, 6 Aug 2020 14:33:51 +0300 Subject: [PATCH] [search] Support multiple semicolon separated alt/old names. --- search/ranker.cpp | 58 ++++++++++++++----- .../processor_test.cpp | 29 ++++++++++ 2 files changed, 74 insertions(+), 13 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 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 @@ -107,19 +116,32 @@ pair GetNameScores(FeatureType & ft, Geocoder::Params const string name; if (!ft.GetName(lang, name)) continue; - vector tokens; - PrepareStringForMatching(name, tokens); - - UpdateNameScores(tokens, lang, slice, bestScores); - UpdateNameScores(tokens, lang, sliceNoCategories, bestScores); - - if (type == Model::TYPE_STREET) + vector> tokens(1); + if (lang == StringUtf8Multilang::kAltNameCode || lang == StringUtf8Multilang::kOldNameCode) { - auto const variants = ModifyStrasse(tokens); - for (auto const & variant : variants) + 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]); + } + + for (auto const & t : tokens) + { + 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