From 92f67ec15856040e46e95e90809881ee3ddde734 Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Mon, 3 Apr 2017 13:28:59 +0300 Subject: [PATCH] Restrictions are added for RB banners --- map/place_page_info.cpp | 4 +- partners_api/ads_base.cpp | 19 ++++++-- partners_api/ads_base.hpp | 23 +++++++--- partners_api/ads_engine.cpp | 18 +++++--- partners_api/ads_engine.hpp | 10 ++++- .../partners_api_tests/ads_engine_tests.cpp | 44 +++++++++++-------- .../partners_api_tests/facebook_tests.cpp | 16 +++---- partners_api/partners_api_tests/rb_tests.cpp | 30 ++++++++----- partners_api/rb_ads.cpp | 17 +++++++ 9 files changed, 126 insertions(+), 55 deletions(-) diff --git a/map/place_page_info.cpp b/map/place_page_info.cpp index 802b76e498..f53d32553a 100644 --- a/map/place_page_info.cpp +++ b/map/place_page_info.cpp @@ -181,7 +181,7 @@ bool Info::HasBanner() const if (IsMyPosition()) return false; - return m_adsEngine->HasBanner(m_types); + return m_adsEngine->HasBanner(m_types, m_countryId); } vector Info::GetBanners() const @@ -189,7 +189,7 @@ vector Info::GetBanners() const if (!m_adsEngine) return {}; - return m_adsEngine->GetBanners(m_types); + return m_adsEngine->GetBanners(m_types, m_countryId); } bool Info::IsReachableByTaxi() const diff --git a/partners_api/ads_base.cpp b/partners_api/ads_base.cpp index 0000146933..aed7397cde 100644 --- a/partners_api/ads_base.cpp +++ b/partners_api/ads_base.cpp @@ -61,14 +61,27 @@ void Container::AppendExcludedTypes(std::vector> const } } -bool Container::HasBanner(feature::TypesHolder const & types) const +void Container::AppendSupportedCountries(std::vector const & countries) { + m_supportedCountries.insert(countries.begin(), countries.end()); +} + +bool Container::HasBanner(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const +{ + if (!m_supportedCountries.empty() && + m_supportedCountries.find(countryId) == m_supportedCountries.end()) + { + return false; + } + return FindType(types, m_excludedTypes) == m_excludedTypes.cend(); } -std::string Container::GetBannerId(feature::TypesHolder const & types) const +std::string Container::GetBannerId(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const { - if (!HasBanner(types)) + if (!HasBanner(types, countryId)) return {}; auto const it = FindType(types, m_typesToBanners); diff --git a/partners_api/ads_base.hpp b/partners_api/ads_base.hpp index 536a8a818e..a1984e61c0 100644 --- a/partners_api/ads_base.hpp +++ b/partners_api/ads_base.hpp @@ -1,6 +1,6 @@ #pragma once -#include "indexer/feature_data.hpp" +#include "storage/index.hpp" #include "base/macros.hpp" @@ -8,6 +8,12 @@ #include #include #include +#include + +namespace feature +{ +class TypesHolder; +} namespace ads { @@ -15,8 +21,10 @@ class ContainerBase { public: virtual ~ContainerBase() = default; - virtual bool HasBanner(feature::TypesHolder const & types) const = 0; - virtual std::string GetBannerId(feature::TypesHolder const & types) const = 0; + virtual bool HasBanner(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const = 0; + virtual std::string GetBannerId(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const = 0; virtual std::string GetBannerIdForOtherTypes() const = 0; }; @@ -27,17 +35,22 @@ public: Container(); // ContainerBase overrides: - bool HasBanner(feature::TypesHolder const & types) const override; - std::string GetBannerId(feature::TypesHolder const & types) const override; + bool HasBanner(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const override; + std::string GetBannerId(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const override; std::string GetBannerIdForOtherTypes() const override; protected: void AppendEntry(std::vector> const & types, std::string const & id); void AppendExcludedTypes(std::vector> const & types); + void AppendSupportedCountries(std::vector const & countries); private: std::unordered_map m_typesToBanners; std::unordered_set m_excludedTypes; + // All countries are supported when empty. + std::unordered_set m_supportedCountries; DISALLOW_COPY(Container); }; diff --git a/partners_api/ads_engine.cpp b/partners_api/ads_engine.cpp index a1ddef5d05..6a802a2388 100644 --- a/partners_api/ads_engine.cpp +++ b/partners_api/ads_engine.cpp @@ -2,6 +2,8 @@ #include "partners_api/facebook_ads.hpp" #include "partners_api/rb_ads.hpp" +#include "indexer/feature_data.hpp" + #include "base/stl_add.hpp" #include @@ -15,20 +17,22 @@ Engine::Engine() m_containers.emplace_back(Banner::Type::Facebook, my::make_unique()); } -bool Engine::HasBanner(feature::TypesHolder const & types) const +bool Engine::HasBanner(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const { - return std::any_of(m_containers.cbegin(), m_containers.cend(), [&types](ContainerItem const & item) - { - return item.m_container->HasBanner(types); - }); + return std::any_of(m_containers.cbegin(), m_containers.cend(), + [&types, &countryId](ContainerItem const & item) { + return item.m_container->HasBanner(types, countryId); + }); } -std::vector Engine::GetBanners(feature::TypesHolder const & types) const +std::vector Engine::GetBanners(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const { std::vector banners; for (auto const & item : m_containers) { - auto const bannerId = item.m_container->GetBannerId(types); + auto const bannerId = item.m_container->GetBannerId(types, countryId); if (!bannerId.empty()) banners.emplace_back(item.m_type, bannerId); } diff --git a/partners_api/ads_engine.hpp b/partners_api/ads_engine.hpp index 93cfe76dc7..0d7f931801 100644 --- a/partners_api/ads_engine.hpp +++ b/partners_api/ads_engine.hpp @@ -7,6 +7,11 @@ #include #include +namespace feature +{ +class TypesHolder; +} + namespace ads { class Engine @@ -14,8 +19,9 @@ class Engine public: Engine(); - bool HasBanner(feature::TypesHolder const & types) const; - std::vector GetBanners(feature::TypesHolder const & types) const; + bool HasBanner(feature::TypesHolder const & types, storage::TCountryId const & countryId) const; + std::vector GetBanners(feature::TypesHolder const & types, + storage::TCountryId const & countryId) const; private: using ContainerPtr = std::unique_ptr; diff --git a/partners_api/partners_api_tests/ads_engine_tests.cpp b/partners_api/partners_api_tests/ads_engine_tests.cpp index d11516dfae..e245fbcf1e 100644 --- a/partners_api/partners_api_tests/ads_engine_tests.cpp +++ b/partners_api/partners_api_tests/ads_engine_tests.cpp @@ -34,38 +34,38 @@ UNIT_TEST(AdsEngine_Smoke) { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "dentist"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Ukraine"), ()); + auto result = engine.GetBanners(holder, "Ukraine"); CheckCountAndTypes(result); CheckIds(result, {"7", "185237551520383_1384652351578891"}); holder.Add(c.GetTypeByPath({"amenity", "pub"})); - TEST(engine.HasBanner(holder), ()); - result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Ukraine"), ()); + result = engine.GetBanners(holder, "Ukraine"); CheckCountAndTypes(result); CheckIds(result, {"7", "185237551520383_1384652351578891"}); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"tourism", "information", "map"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Moldova"), ()); + auto result = engine.GetBanners(holder, "Moldova"); CheckCountAndTypes(result); CheckIds(result, {"5", "185237551520383_1384651734912286"}); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"shop", "ticket"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Russia"), ()); + auto result = engine.GetBanners(holder, "Russia"); CheckCountAndTypes(result); CheckIds(result, {"2", "185237551520383_1384650804912379"}); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "bank"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Belarus"), ()); + auto result = engine.GetBanners(holder, "Belarus"); CheckCountAndTypes(result); CheckIds(result, {"8", "185237551520383_1384652658245527"}); } @@ -74,24 +74,32 @@ UNIT_TEST(AdsEngine_Smoke) { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "toilets"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(engine.HasBanner(holder, "Armenia"), ()); + auto result = engine.GetBanners(holder, "Armenia"); CheckCountAndTypes(result); CheckIds(result, {rb.GetBannerIdForOtherTypes(), facebook.GetBannerIdForOtherTypes()}); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "opentable"})); - TEST(engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); - CheckCountAndTypes(result); - CheckIds(result, {rb.GetBannerIdForOtherTypes(), facebook.GetBannerIdForOtherTypes()}); + TEST(engine.HasBanner(holder, "Brazil"), ()); + auto result = engine.GetBanners(holder, "Brazil"); + CheckIds(result, {facebook.GetBannerIdForOtherTypes()}); + TEST_EQUAL(result[0].m_type, ads::Banner::Type::Facebook, ()); + } + { + feature::TypesHolder holder; + holder.Assign(c.GetTypeByPath({"amenity", "pub"})); + TEST(engine.HasBanner(holder, "Spain"), ()); + auto result = engine.GetBanners(holder, "Spain"); + CheckIds(result, {"185237551520383_1384650164912443"}); + TEST_EQUAL(result[0].m_type, ads::Banner::Type::Facebook, ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "booking"})); - TEST(!engine.HasBanner(holder), ()); - auto result = engine.GetBanners(holder); + TEST(!engine.HasBanner(holder, "Russia"), ()); + auto result = engine.GetBanners(holder, "Russia"); TEST(result.empty(), ()); } } diff --git a/partners_api/partners_api_tests/facebook_tests.cpp b/partners_api/partners_api_tests/facebook_tests.cpp index 65defb6777..9acc685d13 100644 --- a/partners_api/partners_api_tests/facebook_tests.cpp +++ b/partners_api/partners_api_tests/facebook_tests.cpp @@ -16,41 +16,41 @@ UNIT_TEST(Facebook_GetBanner) { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "dentist"})); - TEST_EQUAL(facebook.GetBannerId(holder), "185237551520383_1384652351578891", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Brazil"), "185237551520383_1384652351578891", ()); holder.Add(c.GetTypeByPath({"amenity", "pub"})); - TEST_EQUAL(facebook.GetBannerId(holder), "185237551520383_1384652351578891", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Cuba"), "185237551520383_1384652351578891", ()); } { feature::TypesHolder holder; holder.Add(c.GetTypeByPath({"amenity", "restaurant"})); - TEST_EQUAL(facebook.GetBannerId(holder), "185237551520383_1384650164912443", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Any country"), "185237551520383_1384650164912443", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"tourism", "information", "map"})); - TEST_EQUAL(facebook.GetBannerId(holder), "185237551520383_1384651734912286", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Russia"), "185237551520383_1384651734912286", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"shop", "ticket"})); - TEST_EQUAL(facebook.GetBannerId(holder), "185237551520383_1384650804912379", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "USA"), "185237551520383_1384650804912379", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "toilets"})); auto const bannerId = facebook.GetBannerIdForOtherTypes(); - TEST_EQUAL(facebook.GetBannerId(holder), bannerId, ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Spain"), bannerId, ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "opentable"})); auto const bannerId = facebook.GetBannerIdForOtherTypes(); - TEST_EQUAL(facebook.GetBannerId(holder), bannerId, ()); + TEST_EQUAL(facebook.GetBannerId(holder, "Denmark"), bannerId, ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "booking"})); - TEST_EQUAL(facebook.GetBannerId(holder), "", ()); + TEST_EQUAL(facebook.GetBannerId(holder, "India"), "", ()); } } } // namespace diff --git a/partners_api/partners_api_tests/rb_tests.cpp b/partners_api/partners_api_tests/rb_tests.cpp index 54b4cf2557..16839bdc47 100644 --- a/partners_api/partners_api_tests/rb_tests.cpp +++ b/partners_api/partners_api_tests/rb_tests.cpp @@ -16,51 +16,61 @@ UNIT_TEST(Rb_GetBanner) { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "dentist"})); - TEST_EQUAL(rb.GetBannerId(holder), "7", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "7", ()); holder.Add(c.GetTypeByPath({"amenity", "pub"})); - TEST_EQUAL(rb.GetBannerId(holder), "7", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "7", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "restaurant"})); - TEST_EQUAL(rb.GetBannerId(holder), "1", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "1", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"tourism", "information", "map"})); - TEST_EQUAL(rb.GetBannerId(holder), "5", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "5", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"shop", "ticket"})); - TEST_EQUAL(rb.GetBannerId(holder), "2", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "2", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "bank"})); - TEST_EQUAL(rb.GetBannerId(holder), "8", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "8", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "atm"})); - TEST_EQUAL(rb.GetBannerId(holder), "8", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "8", ()); + } + { + feature::TypesHolder holder; + holder.Assign(c.GetTypeByPath({"amenity", "atm"})); + TEST_EQUAL(rb.GetBannerId(holder, "Brazil"), "", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"amenity", "toilets"})); auto const bannerId = rb.GetBannerIdForOtherTypes(); - TEST_EQUAL(rb.GetBannerId(holder), bannerId, ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), bannerId, ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "opentable"})); auto const bannerId = rb.GetBannerIdForOtherTypes(); - TEST_EQUAL(rb.GetBannerId(holder), bannerId, ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), bannerId, ()); + } + { + feature::TypesHolder holder; + holder.Assign(c.GetTypeByPath({"sponsored", "opentable"})); + TEST_EQUAL(rb.GetBannerId(holder, "Brazil"), "", ()); } { feature::TypesHolder holder; holder.Assign(c.GetTypeByPath({"sponsored", "booking"})); - TEST_EQUAL(rb.GetBannerId(holder), "", ()); + TEST_EQUAL(rb.GetBannerId(holder, "Russia"), "", ()); } } } // namespace diff --git a/partners_api/rb_ads.cpp b/partners_api/rb_ads.cpp index 756848563a..bb4db467af 100644 --- a/partners_api/rb_ads.cpp +++ b/partners_api/rb_ads.cpp @@ -14,6 +14,21 @@ auto const kFinancialPlacementId = "8"; auto const kEntertainmentPlacementId = "9"; auto const kBuildingPlacementId = "11"; auto const kBannerIdForOtherTypes = "14"; + +std::vector const kSupportedCountries = +{ + "Azerbaijan", + "Armenia", + "Belarus", + "Kazakhstan", + "Kyrgyzstan", + "Moldova", + "Russia", + "Tajikistan", + "Turkmenistan", + "Uzbekistan", + "Ukraine" +}; } // namespace namespace ads @@ -83,6 +98,8 @@ Rb::Rb() kEntertainmentPlacementId); AppendEntry({{"building"}}, kBuildingPlacementId); + + AppendSupportedCountries(kSupportedCountries); } std::string Rb::GetBannerIdForOtherTypes() const