From 3824e3ca4288fa2dbbd7954c251303cf9d252945 Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Mon, 26 Aug 2019 19:12:07 +0300 Subject: [PATCH] [search] Index street number for search. --- .../generator_tests_support/test_feature.cpp | 2 ++ .../generator_tests_support/test_feature.hpp | 2 ++ generator/search_index_builder.cpp | 4 ++++ search/ranker.cpp | 7 +++++++ .../processor_test.cpp | 20 +++++++++++++++++++ 5 files changed, 35 insertions(+) diff --git a/generator/generator_tests_support/test_feature.cpp b/generator/generator_tests_support/test_feature.cpp index f0bcbf4cdd..c9de491c90 100644 --- a/generator/generator_tests_support/test_feature.cpp +++ b/generator/generator_tests_support/test_feature.cpp @@ -223,6 +223,8 @@ void TestStreet::Serialize(FeatureBuilder & fb) const auto const & classificator = classif(); fb.SetType(classificator.GetTypeByPath({"highway", m_highwayType})); + fb.GetParams().ref = m_roadNumber; + for (auto const & point : m_points) fb.AddPoint(point); fb.SetLinear(false /* reverseGeometry */); diff --git a/generator/generator_tests_support/test_feature.hpp b/generator/generator_tests_support/test_feature.hpp index 21ee64c729..d7208d71c8 100644 --- a/generator/generator_tests_support/test_feature.hpp +++ b/generator/generator_tests_support/test_feature.hpp @@ -125,6 +125,7 @@ public: TestStreet(std::vector const & points, StringUtf8Multilang const & name); void SetHighwayType(std::string const & type) { m_highwayType = type; } + void SetRoadNumber(std::string const & roadNumber) { m_roadNumber = roadNumber; } // TestFeature overrides: void Serialize(feature::FeatureBuilder & fb) const override; @@ -133,6 +134,7 @@ public: private: std::vector m_points; std::string m_highwayType; + std::string m_roadNumber; }; class TestSquare : public TestFeature diff --git a/generator/search_index_builder.cpp b/generator/search_index_builder.cpp index a5fab5455e..b21158acf6 100644 --- a/generator/search_index_builder.cpp +++ b/generator/search_index_builder.cpp @@ -315,6 +315,10 @@ public: if (types.Empty()) return; + // Road number. + if (hasStreetType && !f.GetParams().ref.empty()) + inserter(StringUtf8Multilang::kDefaultCode, f.GetParams().ref); + if (ftypes::IsAirportChecker::Instance()(types)) { string const iata = f.GetMetadata().Get(feature::Metadata::FMD_AIRPORT_IATA); diff --git a/search/ranker.cpp b/search/ranker.cpp index 2cf95ee10f..06b4ee08e9 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -145,6 +145,13 @@ pair GetNameScores(FeatureType & ft, Geocoder::Params const }); } + if (type == Model::TYPE_STREET) + { + auto const roadNumber = ft.GetRoadNumber(); + if (!roadNumber.empty()) + UpdateNameScores(roadNumber, sliceNoCategories, bestScores); + } + return make_pair(bestScores, matchedLength); } diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index 4477a3f875..157ae3a48a 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -2347,5 +2347,25 @@ UNIT_CLASS_TEST(ProcessorTest, CityPostcodes) TEST(ResultsMatch("Tverskaya 4 Moscow 123456 ", rules), ()); } } + +UNIT_CLASS_TEST(ProcessorTest, StreetNumber) +{ + string const countryName = "Wonderland"; + + TestStreet street(vector{m2::PointD(-1.0, -1.0), m2::PointD(1.0, 1.0)}, + "Симферопольское шоссе", "ru"); + street.SetRoadNumber("M2"); + + auto countryId = BuildCountry(countryName, [&](TestMwmBuilder & builder) { + builder.Add(street); + }); + + SetViewport(m2::RectD(m2::PointD(0.0, 0.0), m2::PointD(1.0, 2.0))); + { + Rules rules = {ExactMatch(countryId, street)}; + TEST(ResultsMatch("M2 ", rules), ()); + } +} + } // namespace } // namespace search