diff --git a/map/discovery/discovery_manager.cpp b/map/discovery/discovery_manager.cpp index f3c212323d..90f48e28a7 100644 --- a/map/discovery/discovery_manager.cpp +++ b/map/discovery/discovery_manager.cpp @@ -42,8 +42,12 @@ search::DiscoverySearchParams Manager::GetSearchParams(Manager::Params const & p p.m_viewport = params.m_viewport; p.m_position = params.m_viewportCenter; p.m_itemsCount = params.m_itemsCount; + + using Sorting = search::DiscoverySearchParams::SortingType; if (type == ItemType::Hotels) - p.m_sortingType = search::DiscoverySearchParams::SortingType::HotelRating; + p.m_sortingType = Sorting::HotelRating; + else if (type == ItemType::Attractions || type == ItemType::Cafes) + p.m_sortingType = Sorting::Popularity; return p; } diff --git a/map/discovery/discovery_search_params.hpp b/map/discovery/discovery_search_params.hpp index cf2d2a217e..9a73c3d76b 100644 --- a/map/discovery/discovery_search_params.hpp +++ b/map/discovery/discovery_search_params.hpp @@ -18,7 +18,8 @@ struct DiscoverySearchParams enum class SortingType { None, - HotelRating + HotelRating, + Popularity }; struct HotelRatingComparator @@ -29,6 +30,18 @@ struct DiscoverySearchParams } }; + struct PopularityComparator + { + bool operator()(Result const & lhs, Result const & rhs) const + { + // Move results without names to the end. + if (lhs.GetString().empty()) + return false; + + return lhs.GetRankingInfo().m_popularity > rhs.GetRankingInfo().m_popularity; + } + }; + using OnResults = std::function; std::string m_query; diff --git a/map/search_api.cpp b/map/search_api.cpp index 18b8b85fd4..91d741c82c 100644 --- a/map/search_api.cpp +++ b/map/search_api.cpp @@ -240,6 +240,13 @@ void SearchAPI::SearchForDiscovery(DiscoverySearchParams const & params) params.m_onResults(r); break; } + case DiscoverySearchParams::SortingType::Popularity: + { + Results r(results); + r.SortBy(DiscoverySearchParams::PopularityComparator()); + params.m_onResults(r); + break; + } } };