diff --git a/indexer/banners.hpp b/indexer/banners.hpp index 1c4805f504..a360439376 100644 --- a/indexer/banners.hpp +++ b/indexer/banners.hpp @@ -14,7 +14,6 @@ struct Banner Banner(Type t, std::string id) : m_type(t), m_bannerId(id) {} - Type m_type = Type::None; std::string m_bannerId; }; diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index af09f9d6e2..62cf01724e 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -171,6 +171,11 @@ string Info::GetApproximatePricing() const return result; } +bool Info::HasBanner() const +{ + return facebook::Ads::Instance().HasBanner(m_types); +} + banners::Banner Info::GetBanner() const { using namespace banners; @@ -184,7 +189,6 @@ banners::Banner Info::GetBanner() const /// Deprecated, there was not only removed in order not to break the build. /// Should be removed in nearest time. /////////////////////////////////////////////////////////////////////////////// -bool Info::HasBanner() const { return true; } string Info::GetBannerTitleId() const { return {}; } string Info::GetBannerMessageId() const { return {}; } string Info::GetBannerIconId() const { return {}; } diff --git a/map/place_page_info.hpp b/map/place_page_info.hpp index 871c76bd87..c1bb6fa83b 100644 --- a/map/place_page_info.hpp +++ b/map/place_page_info.hpp @@ -79,11 +79,11 @@ public: /// @returns string with |kPricingSymbol| signs or empty string if it isn't booking object string GetApproximatePricing() const; + bool HasBanner() const; banners::Banner GetBanner() const; /// Deprecated, there was not only removed in order not to break the build. /// Should be removed in nearest time. /////////////////////////////////////////////////////////////////////////////// - bool HasBanner() const; string GetBannerTitleId() const; string GetBannerMessageId() const; string GetBannerIconId() const; diff --git a/partners_api/facebook_ads.cpp b/partners_api/facebook_ads.cpp index decf824b42..5248868acf 100644 --- a/partners_api/facebook_ads.cpp +++ b/partners_api/facebook_ads.cpp @@ -3,6 +3,27 @@ #include "indexer/classificator.hpp" #include "indexer/feature_data.hpp" +namespace +{ +using namespace facebook; + +template +It FindType(feature::TypesHolder const & types, It first, It last) +{ + for (auto const t : types) + { + auto const it = std::find_if(first, last, [t](TypeAndlevel const & tl) { + auto truncatedType = t; + ftype::TruncValue(truncatedType, tl.m_level); + return truncatedType == tl.m_type; + }); + if (it != last) + return it; + } + return last; +} +} // namespace + namespace facebook { Ads::Ads() @@ -59,6 +80,8 @@ Ads::Ads() "185237551520383_1384652351578891"); // Financial. AppendEntry({{"amenity", "bank"}, {"amenity", "atm"}}, "185237551520383_1384652658245527"); + + SetExcludeTypes({{"sponsored", "booking"}}); } void Ads::AppendEntry(std::vector> const & types, std::string const & id) @@ -70,6 +93,12 @@ void Ads::AppendEntry(std::vector> const & types, std:: m_typesToBanners.push_back(move(entry)); } +void Ads::SetExcludeTypes(std::vector> const & types) +{ + for (auto const & type : types) + m_excludeTypes.emplace_back(classif().GetTypeByPath(type), type.size()); +} + // static Ads const & Ads::Instance() { @@ -77,22 +106,21 @@ Ads const & Ads::Instance() return ads; } +bool Ads::HasBanner(feature::TypesHolder const & types) const +{ + return FindType(types, m_excludeTypes.begin(), m_excludeTypes.end()) == m_excludeTypes.end(); +} + std::string Ads::GetBannerId(feature::TypesHolder const & types) const { + if (!HasBanner(types)) + return {}; + for (auto const & typesToBanner : m_typesToBanners) { - for (auto const t : types) - { - auto const it = std::find_if(typesToBanner.m_types.begin(), typesToBanner.m_types.end(), - [t](TypeAndlevel const & tl) { - auto truncatedType = t; - ftype::TruncValue(truncatedType, tl.m_level); - return truncatedType == tl.m_type; - }); - - if (it != typesToBanner.m_types.end()) - return typesToBanner.m_bannerId; - } + auto const it = FindType(types, typesToBanner.m_types.begin(), typesToBanner.m_types.end()); + if (it != typesToBanner.m_types.end()) + return typesToBanner.m_bannerId; } return kBannerIdForOtherTypes; } diff --git a/partners_api/facebook_ads.hpp b/partners_api/facebook_ads.hpp index 79151351fa..7480045ab4 100644 --- a/partners_api/facebook_ads.hpp +++ b/partners_api/facebook_ads.hpp @@ -12,6 +12,14 @@ class TypesHolder; namespace facebook { +struct TypeAndlevel +{ + TypeAndlevel(uint32_t type, uint32_t level) : m_type(type), m_level(level) {} + + uint32_t m_type = 0; + uint32_t m_level = 0; +}; + // Class which match feature types and facebook banner ids. class Ads { @@ -20,18 +28,13 @@ public: static Ads const & Instance(); + bool HasBanner(feature::TypesHolder const & types) const; std::string GetBannerId(feature::TypesHolder const & types) const; private: Ads(); void AppendEntry(std::vector> const & types, std::string const & id); - - struct TypeAndlevel - { - TypeAndlevel(uint32_t type, uint32_t level) : m_type(type), m_level(level) {} - uint32_t m_type = 0; - uint32_t m_level = 0; - }; + void SetExcludeTypes(std::vector> const & types); struct TypesToBannerId { @@ -40,6 +43,7 @@ private: }; std::vector m_typesToBanners; + std::vector m_excludeTypes; DISALLOW_COPY_AND_MOVE(Ads); }; diff --git a/partners_api/partners_api_tests/facebook_tests.cpp b/partners_api/partners_api_tests/facebook_tests.cpp index 9d39fd78d0..c330a4ef8b 100644 --- a/partners_api/partners_api_tests/facebook_tests.cpp +++ b/partners_api/partners_api_tests/facebook_tests.cpp @@ -39,5 +39,16 @@ UNIT_TEST(Facebook_GetBanner) auto const bannerId = facebook::Ads::kBannerIdForOtherTypes; TEST_EQUAL(facebook::Ads::Instance().GetBannerId(holder), bannerId, ()); } + { + feature::TypesHolder holder; + holder.Assign(c.GetTypeByPath({"sponsored", "opentable"})); + auto const bannerId = facebook::Ads::kBannerIdForOtherTypes; + TEST_EQUAL(facebook::Ads::Instance().GetBannerId(holder), bannerId, ()); + } + { + feature::TypesHolder holder; + holder.Assign(c.GetTypeByPath({"sponsored", "booking"})); + TEST_EQUAL(facebook::Ads::Instance().GetBannerId(holder), "", ()); + } } } // namespace