diff --git a/generator/search_index_builder.cpp b/generator/search_index_builder.cpp index 0e5af08214..262df2e0fd 100644 --- a/generator/search_index_builder.cpp +++ b/generator/search_index_builder.cpp @@ -7,6 +7,7 @@ #include "search/search_trie.hpp" #include "search/types_skipper.hpp" +#include "indexer/brands_holder.hpp" #include "indexer/categories_holder.hpp" #include "indexer/classificator.hpp" #include "indexer/data_source.hpp" @@ -302,6 +303,15 @@ public: if (!op.empty()) inserter(StringUtf8Multilang::kDefaultCode, op); + string const brand = f.GetMetadata().Get(feature::Metadata::FMD_BRAND); + if (!brand.empty()) + { + auto const & brands = indexer::GetDefaultBrands(); + brands.ForEachNameByKey(brand, [&inserter](indexer::BrandsHolder::Brand::Name const & name) { + inserter(name.m_locale, name.m_name); + }); + } + Classificator const & c = classif(); vector categoryTypes; diff --git a/search/ranker.cpp b/search/ranker.cpp index fe6b5e2999..ca447d884b 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -11,6 +11,7 @@ #include "editor/editable_data_source.hpp" +#include "indexer/brands_holder.hpp" #include "indexer/data_source.hpp" #include "indexer/feature_algo.hpp" #include "indexer/ftypes_matcher.hpp" @@ -89,6 +90,15 @@ NameScores GetNameScores(FeatureType & ft, Geocoder::Params const & params, if (!op.empty()) UpdateNameScores(op, sliceNoCategories, bestScores); + string const brand = ft.GetMetadata().Get(feature::Metadata::FMD_BRAND); + if (!brand.empty()) + { + auto const & brands = indexer::GetDefaultBrands(); + brands.ForEachNameByKey(brand, [&](indexer::BrandsHolder::Brand::Name const & name) { + UpdateNameScores(name.m_name, sliceNoCategories, bestScores); + }); + } + return bestScores; } diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index a5da18bc33..057b326d49 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -137,6 +137,27 @@ private: string m_operator; }; +class TestBrandFeature : public TestCafe +{ +public: + TestBrandFeature(m2::PointD const & center, string const & brand, string const & lang) + : TestCafe(center, {} /* name */, lang), m_brand(brand) + { + } + + // TestPOI overrides: + void Serialize(FeatureBuilder1 & fb) const override + { + TestCafe::Serialize(fb); + + auto & metadata = fb.GetMetadata(); + metadata.Set(feature::Metadata::FMD_BRAND, m_brand); + } + +private: + string m_brand; +}; + class ProcessorTest : public SearchTest { }; @@ -1604,5 +1625,36 @@ UNIT_CLASS_TEST(ProcessorTest, OperatorTest) TEST(ResultsMatch("atm alfa ", "en", rules), ()); } } + +UNIT_CLASS_TEST(ProcessorTest, BrandTest) +{ + string const countryName = "Wonderland"; + + TestBrandFeature mac(m2::PointD(1.0, 1.0), "mcdonalds", "en"); + TestBrandFeature sw(m2::PointD(1.0, 1.0), "subway", "en"); + + auto countryId = BuildCountry(countryName, [&](TestMwmBuilder & builder) { + builder.Add(mac); + builder.Add(sw); + }); + + SetViewport(m2::RectD(-1, -1, 1, 1)); + + { + TRules rules{ExactMatch(countryId, mac)}; + TEST(ResultsMatch("McDonald's", "en", rules), ()); + TEST(ResultsMatch("Mc Donalds", "en", rules), ()); + TEST(ResultsMatch("МакДональд'с", "ru", rules), ()); + TEST(ResultsMatch("Мак Доналдс", "ru", rules), ()); + TEST(ResultsMatch("マクドナルド", "ja", rules), ()); + } + + { + TRules rules{ExactMatch(countryId, sw)}; + TEST(ResultsMatch("Subway", "en", rules), ()); + TEST(ResultsMatch("Сабвэй", "ru", rules), ()); + TEST(ResultsMatch("サブウェイ", "ja", rules), ()); + } +} } // namespace } // namespace search