Discovery manager

This commit is contained in:
VladiMihaylenko 2017-11-17 14:50:22 +03:00 committed by Yuri Gorshenin
parent 08b561d90d
commit 941878cb4d
8 changed files with 281 additions and 1 deletions

View file

@ -26,6 +26,9 @@ set(
bookmark.hpp
chart_generator.cpp
chart_generator.hpp
discovery_client_params.hpp
discovery_manager.cpp
discovery_manager.hpp
displacement_mode_manager.cpp
displacement_mode_manager.hpp
displayed_categories_modifiers.cpp

View file

@ -0,0 +1,30 @@
#pragma once
#include "platform/preferred_languages.hpp"
#include <string>
#include <vector>
namespace discovery
{
enum class ItemType
{
Viator,
Attractions,
Cafe,
Hotels,
LocalExperts
};
using ItemTypes = std::vector<ItemType>;
struct ClientParams
{
static auto constexpr kDefaultItemsCount = 5;
std::string m_currency;
std::string m_lang = languages::GetCurrentNorm();
size_t m_itemsCount = kDefaultItemsCount;
ItemTypes m_itemTypes;
};
} // namespace discovery

64
map/discovery_manager.cpp Normal file
View file

@ -0,0 +1,64 @@
#include "map/discovery_manager.hpp"
namespace
{
std::string GetQuery(discovery::ItemType const type)
{
switch (type)
{
case discovery::ItemType::Hotels: return "hotel ";
case discovery::ItemType::Attractions: return "attraction ";
case discovery::ItemType::Cafe: return "cafe ";
case discovery::ItemType::LocalExperts:
case discovery::ItemType::Viator: ASSERT(false, ()); return "";
}
}
} // namespace
namespace discovery
{
Manager::Manager(Index const & index, search::CityFinder * const cityFinder, APIs const & apis)
: m_index(index)
, m_cityFinder(cityFinder)
, m_searchApi(apis.m_search)
, m_viatorApi(apis.m_viator)
, m_localsApi(apis.m_locals)
{
CHECK(m_cityFinder, ());
CHECK(m_searchApi, ());
CHECK(m_viatorApi, ());
CHECK(m_localsApi, ());
}
// static
search::SearchParams Manager::GetSearchParams(Manager::Params const & params, ItemType const type)
{
search::SearchParams p;
p.m_query = GetQuery(type);
p.m_inputLocale = params.m_lang;
p.m_viewport = params.m_viewport;
p.m_position = params.m_viewportCenter;
p.m_maxNumResults = params.m_itemsCount;
p.m_mode = search::Mode::Viewport;
return p;
}
std::string Manager::GetCityViatorId(m2::PointD const & point) const
{
auto const fid = m_cityFinder->GetCityFeatureID(point);
if (!fid.IsValid())
return string();
Index::FeaturesLoaderGuard const guard(m_index, fid.m_mwmId);
FeatureType ft;
if (!guard.GetFeatureByIndex(fid.m_index, ft))
{
LOG(LERROR, ("Feature can't be loaded:", fid));
return string();
}
auto const & metadata = ft.GetMetadata();
auto const sponsoredId = metadata.Get(feature::Metadata::FMD_SPONSORED_ID);
return sponsoredId;
}
} // namespace discovery

125
map/discovery_manager.hpp Normal file
View file

@ -0,0 +1,125 @@
#pragma once
#include "search/city_finder.hpp"
#include "map/discovery_client_params.hpp"
#include "map/search_api.hpp"
#include "partners_api/booking_api.hpp"
#include "partners_api/locals_api.hpp"
#include "partners_api/viator_api.hpp"
#include "indexer/index.hpp"
#include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp"
#include <functional>
#include <string>
#include <vector>
namespace discovery
{
class Manager final
{
public:
struct APIs
{
APIs(SearchAPI * const search, viator::Api * const viator, locals::Api * const locals)
: m_search(search), m_viator(viator), m_locals(locals)
{
}
SearchAPI * const m_search;
viator::Api * const m_viator;
locals::Api * const m_locals;
};
Manager(Index const & index, search::CityFinder * const cityFinder, APIs const & apis);
struct Params
{
std::string m_curency;
std::string m_lang;
size_t m_itemsCount;
m2::PointD m_viewportCenter;
m2::RectD m_viewport;
ItemTypes m_itemTypes;
};
using ErrorCalback = std::function<void(ItemType const type)>;
template <typename ResultCallback>
void Discover(Params && params, ResultCallback const & result, ErrorCalback const & error)
{
auto const & types = params.m_itemTypes;
ASSERT(!types.empty(), ("Types must contain at least one element."));
for (auto const type : types)
{
switch (type)
{
case ItemType::Viator:
{
string const sponsoredId = GetCityViatorId(params.m_viewportCenter);
if (sponsoredId.empty())
{
error(type);
break;
}
m_viatorApi->GetTop5Products(
sponsoredId, params.m_curency,
[sponsoredId, result, type](string const & destId,
std::vector<viator::Product> const & products) {
if (destId == sponsoredId)
result(products, type);
});
break;
}
case ItemType::Attractions:
case ItemType::Cafe:
{
auto p = GetSearchParams(params, type);
p.m_onResults = [result, type](search::Results const & results) {
if (results.IsEndMarker())
result(results, type);
};
m_searchApi->GetEngine().Search(p);
break;
}
case ItemType::Hotels:
{
ASSERT(false, ("Discovering hotels isn't supported yet."));
break;
}
case ItemType::LocalExperts:
{
auto const latLon = MercatorBounds::ToLatLon(params.m_viewportCenter);
auto constexpr pageNumber = 1;
m_localsApi->GetLocals(
latLon.lat, latLon.lon, params.m_lang, params.m_itemsCount, pageNumber,
[result, type](uint64_t id, std::vector<locals::LocalExpert> const & locals,
size_t /* pageNumber */, size_t /* countPerPage */,
bool /* hasPreviousPage */,
bool /* hasNextPage */) { result(locals, type); },
[error, type](uint64_t id, int errorCode, std::string const & errorMessage) {
error(type);
});
break;
}
}
}
}
private:
static search::SearchParams GetSearchParams(Params const & params, ItemType const type);
std::string GetCityViatorId(m2::PointD const & point) const;
private:
Index const & m_index;
search::CityFinder * const m_cityFinder;
SearchAPI * const m_searchApi;
viator::Api * const m_viatorApi;
locals::Api * const m_localsApi;
};
} // namespace discovery

View file

@ -97,7 +97,6 @@
#include "std/algorithm.hpp"
#include "std/bind.hpp"
#include "std/target_os.hpp"
#include "std/utility.hpp"
#include "api/internal/c/api-client-internals.h"
#include "api/src/c/api-client.h"
@ -331,6 +330,7 @@ void Framework::Migrate(bool keepDownloaded)
m_infoGetter.reset();
m_taxiEngine.reset();
m_cityFinder.reset();
m_discoveryManager.reset();
m_ugcApi.reset();
TCountriesVec existedCountries;
GetStorage().DeleteAllLocalMaps(&existedCountries);
@ -341,6 +341,7 @@ void Framework::Migrate(bool keepDownloaded)
InitUGC();
InitSearchAPI();
InitCityFinder();
InitDiscoveryManager();
InitTaxiEngine();
RegisterAllMaps();
@ -433,6 +434,7 @@ Framework::Framework(FrameworkParams const & params)
LOG(LDEBUG, ("Search API initialized"));
InitCityFinder();
InitDiscoveryManager();
InitTaxiEngine();
// All members which re-initialize in Migrate() method should be initialized before RegisterAllMaps().
@ -1346,6 +1348,16 @@ void Framework::InitSearchAPI()
}
}
void Framework::InitDiscoveryManager()
{
CHECK(m_searchAPI.get(), ("InitDiscoveryManager() must be called after InitSearchApi()"));
CHECK(m_cityFinder.get(), ("InitDiscoveryManager() must be called after InitCityFinder()"));
discovery::Manager::APIs const apis(m_searchAPI.get(), m_viatorApi.get(), m_localsApi.get());
m_discoveryManager =
make_unique<discovery::Manager>(m_model.GetIndex(), m_cityFinder.get(), apis);
}
void Framework::InitTransliteration()
{
#if defined(OMIM_OS_ANDROID)
@ -2518,6 +2530,21 @@ void Framework::EnableChoosePositionMode(bool enable, bool enableBounds, bool ap
applyPosition, position);
}
discovery::Manager::Params Framework::GetDiscoveryParams(
discovery::ClientParams && clientParams) const
{
auto constexpr rectSide = 2000.0;
discovery::Manager::Params p;
auto const currentPosition = GetCurrentPosition();
p.m_viewportCenter = currentPosition ? *currentPosition : GetViewportCenter();
p.m_viewport = MercatorBounds::RectByCenterXYAndSizeInMeters(p.m_viewportCenter, rectSide);
p.m_curency = clientParams.m_currency;
p.m_lang = clientParams.m_lang;
p.m_itemsCount = clientParams.m_itemsCount;
p.m_itemTypes = move(clientParams.m_itemTypes);
return p;
}
vector<m2::TriangleD> Framework::GetSelectedFeatureTriangles() const
{
vector<m2::TriangleD> triangles;

View file

@ -4,6 +4,7 @@
#include "map/booking_filter.hpp"
#include "map/bookmark.hpp"
#include "map/bookmark_manager.hpp"
#include "map/discovery_manager.hpp"
#include "map/displacement_mode_manager.hpp"
#include "map/feature_vec_model.hpp"
#include "map/local_ads_manager.hpp"
@ -72,6 +73,7 @@
#include "std/string.hpp"
#include "std/target_os.hpp"
#include "std/unique_ptr.hpp"
#include "std/utility.hpp"
#include "std/vector.hpp"
#include <boost/optional.hpp>
@ -202,6 +204,8 @@ protected:
LocalAdsManager m_localAdsManager;
unique_ptr<discovery::Manager> m_discoveryManager;
User m_user;
booking::filter::Filter m_bookingFilter;
@ -503,6 +507,7 @@ private:
void InitCountryInfoGetter();
void InitUGC();
void InitSearchAPI();
void InitDiscoveryManager();
DisplacementModeManager m_displacementModeManager;
@ -745,6 +750,17 @@ public:
bool LoadTrafficSimplifiedColors();
void SaveTrafficSimplifiedColors(bool simplified);
public:
template <typename ResultCallback>
void Discover(discovery::ClientParams && params, ResultCallback const & result,
discovery::Manager::ErrorCalback const & error) const
{
CHECK(m_discoveryManager.get(), ());
m_discoveryManager->Discover(GetDiscoveryParams(move(params)), result, error);
}
discovery::Manager::Params GetDiscoveryParams(discovery::ClientParams && clientParams) const;
public:
/// Routing Manager
RoutingManager & GetRoutingManager() { return m_routingManager; }

View file

@ -19,6 +19,8 @@ HEADERS += \
bookmark.hpp \
bookmark_manager.hpp \
chart_generator.hpp \
discovery_client_params.hpp \
discovery_manager.hpp \
displacement_mode_manager.hpp \
displayed_categories_modifiers.hpp \
everywhere_search_params.hpp \
@ -59,6 +61,7 @@ SOURCES += \
bookmark.cpp \
bookmark_manager.cpp \
chart_generator.cpp \
discovery_manager.cpp \
displacement_mode_manager.cpp \
displayed_categories_modifiers.cpp \
feature_vec_model.cpp \

View file

@ -125,6 +125,9 @@
F627BFC41E8E89B600B1CBF4 /* librouting_common.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F627BFC31E8E89B600B1CBF4 /* librouting_common.a */; };
F63421F81DF9BF9100A96868 /* reachable_by_taxi_checker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F63421F61DF9BF9100A96868 /* reachable_by_taxi_checker.cpp */; };
F63421F91DF9BF9100A96868 /* reachable_by_taxi_checker.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F63421F71DF9BF9100A96868 /* reachable_by_taxi_checker.hpp */; };
F63CE2BF1FBDE7D300716AD3 /* discovery_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F63CE2BD1FBDE7D200716AD3 /* discovery_manager.cpp */; };
F63CE2C01FBDE7D300716AD3 /* discovery_manager.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F63CE2BE1FBDE7D300716AD3 /* discovery_manager.hpp */; };
F63CE2C51FBF052E00716AD3 /* discovery_client_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F63CE2C41FBF052E00716AD3 /* discovery_client_params.hpp */; };
F685EB631E955C45003CA3FF /* libicu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F685EB621E955C45003CA3FF /* libicu.a */; };
F6B283031C1B03320081957A /* gps_track_collection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6B282FB1C1B03320081957A /* gps_track_collection.cpp */; };
F6B283041C1B03320081957A /* gps_track_collection.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6B282FC1C1B03320081957A /* gps_track_collection.hpp */; };
@ -280,6 +283,9 @@
F627BFC31E8E89B600B1CBF4 /* librouting_common.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librouting_common.a; path = "/Users/v.mikhaylenko/mapsme/omim/xcode/routing_common/../../../omim-build/xcode/Debug/librouting_common.a"; sourceTree = "<absolute>"; };
F63421F61DF9BF9100A96868 /* reachable_by_taxi_checker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reachable_by_taxi_checker.cpp; sourceTree = "<group>"; };
F63421F71DF9BF9100A96868 /* reachable_by_taxi_checker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = reachable_by_taxi_checker.hpp; sourceTree = "<group>"; };
F63CE2BD1FBDE7D200716AD3 /* discovery_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = discovery_manager.cpp; sourceTree = "<group>"; };
F63CE2BE1FBDE7D300716AD3 /* discovery_manager.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = discovery_manager.hpp; sourceTree = "<group>"; };
F63CE2C41FBF052E00716AD3 /* discovery_client_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = discovery_client_params.hpp; sourceTree = "<group>"; };
F685EB621E955C45003CA3FF /* libicu.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libicu.a; path = "/Users/v.mikhaylenko/mapsme/omim/xcode/icu/../../../omim-build/xcode/Debug/libicu.a"; sourceTree = "<absolute>"; };
F6B282FB1C1B03320081957A /* gps_track_collection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gps_track_collection.cpp; sourceTree = "<group>"; };
F6B282FC1C1B03320081957A /* gps_track_collection.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gps_track_collection.hpp; sourceTree = "<group>"; };
@ -475,10 +481,13 @@
675345BD1A4054AD00A0A8C3 /* map */ = {
isa = PBXGroup;
children = (
F63CE2C41FBF052E00716AD3 /* discovery_client_params.hpp */,
3D4E999F1FB4A6400025B48C /* booking_filter_cache.cpp */,
3D4E999E1FB4A6400025B48C /* booking_filter_cache.hpp */,
3D4E99A01FB4A6410025B48C /* booking_filter.cpp */,
3D4E99A11FB4A6410025B48C /* booking_filter.hpp */,
F63CE2BD1FBDE7D200716AD3 /* discovery_manager.cpp */,
F63CE2BE1FBDE7D300716AD3 /* discovery_manager.hpp */,
675345CB1A4054E800A0A8C3 /* address_finder.cpp */,
45201E921CE4AC90008A4842 /* api_mark_point.cpp */,
34921F611BFA0A6900737D6E /* api_mark_point.hpp */,
@ -595,9 +604,11 @@
675346651A4054E800A0A8C3 /* framework.hpp in Headers */,
674A2A381B2715FB001A525C /* osm_opening_hours.hpp in Headers */,
F6D2CE7F1EDEB7F500636DFD /* routing_manager.hpp in Headers */,
F63CE2C51FBF052E00716AD3 /* discovery_client_params.hpp in Headers */,
670E39411C46C5C700E9C0A6 /* gps_tracker.hpp in Headers */,
45580ABF1E2CBD5E00CD535D /* benchmark_tools.hpp in Headers */,
456E1B3B1F9A3C2A009C32E1 /* search_mark.hpp in Headers */,
F63CE2C01FBDE7D300716AD3 /* discovery_manager.hpp in Headers */,
BBD9E2C71EE9D01900DF189A /* routing_mark.hpp in Headers */,
342D833B1D5233E8000D8AEA /* displacement_mode_manager.hpp in Headers */,
F6B283041C1B03320081957A /* gps_track_collection.hpp in Headers */,
@ -731,6 +742,7 @@
F6D2CE7E1EDEB7F500636DFD /* routing_manager.cpp in Sources */,
3D74ABBE1EA76F1D0063A898 /* local_ads_supported_types.cpp in Sources */,
45A2D9D51F7556EB003310A0 /* user.cpp in Sources */,
F63CE2BF1FBDE7D300716AD3 /* discovery_manager.cpp in Sources */,
0C2B73DE1E92AB9900530BB8 /* local_ads_manager.cpp in Sources */,
F6B283071C1B03320081957A /* gps_track_storage.cpp in Sources */,
6753463A1A4054E800A0A8C3 /* address_finder.cpp in Sources */,