Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/search
diff options
context:
space:
mode:
authortatiana-yan <tatiana.kondakova@gmail.com>2020-08-06 14:33:51 +0300
committermpimenov <mpimenov@users.noreply.github.com>2020-09-18 00:48:24 +0300
commitd1f98bcf61510e97f6c3ee575560904bf27b8bae (patch)
treeff2c17fe7e948ee512cc4e7b8ca1474274d2ebfb /search
parent42224b6b5b10796b9f6aa57ad1604beca4808363 (diff)
[search] Support multiple semicolon separated alt/old names.
Diffstat (limited to 'search')
-rw-r--r--search/ranker.cpp56
-rw-r--r--search/search_integration_tests/processor_test.cpp29
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