diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 6fd9d1b676..272345ed46 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -14,6 +14,7 @@ #include "coding/byte_stream.hpp" #include "base/logging.hpp" +#include "base/string_utils.hpp" #include "std/cstring.hpp" #include "std/algorithm.hpp" @@ -76,6 +77,11 @@ void FeatureBuilder1::SetRank(uint8_t rank) m_params.rank = rank; } +void FeatureBuilder1::SetTestId(uint64_t id) +{ + m_params.GetMetadata().Set(Metadata::FMD_TEST_ID, strings::to_string(id)); +} + void FeatureBuilder1::AddHouseNumber(string const & houseNumber) { m_params.AddHouseNumber(houseNumber); diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp index b2005d10b9..4e63c16858 100644 --- a/generator/feature_builder.hpp +++ b/generator/feature_builder.hpp @@ -33,6 +33,8 @@ public: void SetRank(uint8_t rank); + void SetTestId(uint64_t id); + void AddHouseNumber(string const & houseNumber); void AddStreet(string const & streetName); diff --git a/indexer/feature_meta.cpp b/indexer/feature_meta.cpp index 3185e9a367..5aa7ff8dbf 100644 --- a/indexer/feature_meta.cpp +++ b/indexer/feature_meta.cpp @@ -71,6 +71,7 @@ string DebugPrint(feature::Metadata::EType type) case Metadata::FMD_MIN_HEIGHT: return "min_height"; case Metadata::FMD_DENOMINATION: return "denomination"; case Metadata::FMD_BUILDING_LEVELS: return "building:levels"; + case Metadata::FMD_TEST_ID: return "test_id"; case Metadata::FMD_COUNT: CHECK(false, ("FMD_COUNT can not be used as a type.")); }; diff --git a/indexer/feature_meta.hpp b/indexer/feature_meta.hpp index 7efa8f3b1c..7569ae613b 100644 --- a/indexer/feature_meta.hpp +++ b/indexer/feature_meta.hpp @@ -115,6 +115,7 @@ public: FMD_MIN_HEIGHT = 20, FMD_DENOMINATION = 21, FMD_BUILDING_LEVELS = 22, + FMD_TEST_ID = 23, FMD_COUNT }; diff --git a/search/search_tests_support/test_feature.cpp b/search/search_tests_support/test_feature.cpp index 4ac152e79a..43491f9022 100644 --- a/search/search_tests_support/test_feature.cpp +++ b/search/search_tests_support/test_feature.cpp @@ -5,12 +5,14 @@ #include "indexer/classificator.hpp" #include "indexer/feature.hpp" #include "indexer/feature_algo.hpp" +#include "indexer/feature_meta.hpp" #include "indexer/ftypes_matcher.hpp" #include "coding/multilang_utf8_string.hpp" #include "base/assert.hpp" +#include "std/atomic.hpp" #include "std/sstream.hpp" namespace search @@ -19,41 +21,38 @@ namespace tests_support { namespace { -double const kTestPrecision = 1e-4; +uint64_t GenUniqueId() +{ + static atomic id; + return id.fetch_add(1); +} } // namespace // TestFeature ------------------------------------------------------------------------------------- TestFeature::TestFeature(string const & name, string const & lang) - : m_center(0, 0), m_hasCenter(false), m_name(name), m_lang(lang) + : m_id(GenUniqueId()), m_center(0, 0), m_hasCenter(false), m_name(name), m_lang(lang) { } TestFeature::TestFeature(m2::PointD const & center, string const & name, string const & lang) - : m_center(center), m_hasCenter(true), m_name(name), m_lang(lang) + : m_id(GenUniqueId()), m_center(center), m_hasCenter(true), m_name(name), m_lang(lang) { } -void TestFeature::Serialize(FeatureBuilder1 & fb) const -{ - if (m_hasCenter) - fb.SetCenter(m_center); - CHECK(fb.AddName(m_lang, m_name), ("Can't set feature name:", m_name, "(", m_lang, ")")); -} - bool TestFeature::Matches(FeatureType const & feature) const { - uint8_t const langIndex = StringUtf8Multilang::GetLangIndex(m_lang); - string name; - bool const nameMatches = feature.GetName(langIndex, name) && m_name == name; - if (!nameMatches) - return false; + istringstream is(feature.GetMetadata().Get(feature::Metadata::FMD_TEST_ID)); + uint64_t id; + is >> id; + return id == m_id; +} + +void TestFeature::Serialize(FeatureBuilder1 & fb) const +{ + fb.SetTestId(m_id); if (m_hasCenter) - { - auto const center = feature::GetCenter(feature); - if (!m_center.EqualDxDy(center, kTestPrecision)) - return false; - } - return true; + fb.SetCenter(m_center); + CHECK(fb.AddName(m_lang, m_name), ("Can't set feature name:", m_name, "(", m_lang, ")")); } // TestCountry ------------------------------------------------------------------------------------- @@ -165,11 +164,6 @@ void TestPOI::Serialize(FeatureBuilder1 & fb) const fb.AddStreet(m_streetName); } -bool TestPOI::Matches(FeatureType const & feature) const -{ - return TestFeature::Matches(feature) && m_houseNumber == feature.GetHouseNumber(); -} - string TestPOI::ToString() const { ostringstream os; @@ -226,29 +220,6 @@ void TestBuilding::Serialize(FeatureBuilder1 & fb) const fb.SetType(classificator.GetTypeByPath({"building"})); } -bool TestBuilding::Matches(FeatureType const & feature) const -{ - auto const & checker = ftypes::IsBuildingChecker::Instance(); - if (!checker(feature)) - return false; - if (!TestFeature::Matches(feature)) - return false; - if (m_houseNumber != feature.GetHouseNumber()) - return false; - - // TODO(@y): consider to check m_boundary. - if (!m_hasCenter && !m_boundary.empty()) - { - m2::PointD center(0, 0); - for (auto const & p : m_boundary) - center += p; - center = center / m_boundary.size(); - if (!center.EqualDxDy(feature::GetCenter(feature), kTestPrecision)) - return false; - } - return true; -} - string TestBuilding::ToString() const { ostringstream os; diff --git a/search/search_tests_support/test_feature.hpp b/search/search_tests_support/test_feature.hpp index 259e8e1760..70c91944d5 100644 --- a/search/search_tests_support/test_feature.hpp +++ b/search/search_tests_support/test_feature.hpp @@ -17,16 +17,17 @@ class TestFeature public: virtual ~TestFeature() = default; - virtual void Serialize(FeatureBuilder1 & fb) const; - virtual bool Matches(FeatureType const & feature) const; - virtual string ToString() const = 0; - + bool Matches(FeatureType const & feature) const; inline string const & GetName() const { return m_name; } + virtual void Serialize(FeatureBuilder1 & fb) const; + virtual string ToString() const = 0; + protected: TestFeature(string const & name, string const & lang); TestFeature(m2::PointD const & center, string const & name, string const & lang); + uint64_t const m_id; m2::PointD const m_center; bool const m_hasCenter; string const m_name; @@ -89,7 +90,6 @@ public: // TestFeature overrides: void Serialize(FeatureBuilder1 & fb) const override; - bool Matches(FeatureType const & feature) const override; string ToString() const override; inline void SetHouseNumber(string const & houseNumber) { m_houseNumber = houseNumber; } @@ -112,7 +112,6 @@ public: // TestFeature overrides: void Serialize(FeatureBuilder1 & fb) const override; - bool Matches(FeatureType const & feature) const override; string ToString() const override; private: