diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2019-04-15 18:28:54 +0300 |
---|---|---|
committer | Tatiana Yan <tatiana.kondakova@gmail.com> | 2019-04-22 18:47:33 +0300 |
commit | 01c771fe7f945a53581a7badb0a6b840e98f572a (patch) | |
tree | a747713bde42905d1d99698a9fb59b2e7ccb2c21 /map | |
parent | 2397d5d659b53cd7d7f4787ba6ae5e24189302f2 (diff) |
[booking][search] booking filter improvement. review fixes
Diffstat (limited to 'map')
-rw-r--r-- | map/everywhere_search_callback.cpp | 3 | ||||
-rw-r--r-- | map/everywhere_search_callback.hpp | 3 | ||||
-rw-r--r-- | map/framework.cpp | 16 | ||||
-rw-r--r-- | map/framework.hpp | 1 | ||||
-rw-r--r-- | map/map_integration_tests/interactive_search_test.cpp | 13 | ||||
-rw-r--r-- | map/search_api.cpp | 32 | ||||
-rw-r--r-- | map/search_api.hpp | 3 | ||||
-rw-r--r-- | map/viewport_search_callback.cpp | 14 | ||||
-rw-r--r-- | map/viewport_search_callback.hpp | 17 | ||||
-rw-r--r-- | map/viewport_search_params.hpp | 4 |
10 files changed, 59 insertions, 47 deletions
diff --git a/map/everywhere_search_callback.cpp b/map/everywhere_search_callback.cpp index fa524c8a85..c0d8b80f73 100644 --- a/map/everywhere_search_callback.cpp +++ b/map/everywhere_search_callback.cpp @@ -15,7 +15,8 @@ EverywhereSearchCallback::EverywhereSearchCallback( { } -void EverywhereSearchCallback::operator()(Results const & results) +void EverywhereSearchCallback::operator()(Results const & results, + SearchParamsBase const & /* params */) { auto const prevSize = m_productInfo.size(); ASSERT_LESS_OR_EQUAL(prevSize, results.GetCount(), ()); diff --git a/map/everywhere_search_callback.hpp b/map/everywhere_search_callback.hpp index 743aaf7e34..794047ceb3 100644 --- a/map/everywhere_search_callback.hpp +++ b/map/everywhere_search_callback.hpp @@ -5,6 +5,7 @@ #include "map/search_product_info.hpp" #include "search/result.hpp" +#include "search/search_params.hpp" #include <functional> #include <vector> @@ -29,7 +30,7 @@ public: booking::filter::Tasks const & bookingFilterTasks, EverywhereSearchParams::OnResults onResults); - void operator()(Results const & results); + void operator()(Results const & results, SearchParamsBase const &); private: Delegate & m_hotelsDelegate; diff --git a/map/framework.cpp b/map/framework.cpp index 88a1527b4d..de7b2268c5 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -319,6 +319,7 @@ void Framework::OnViewportChanged(ScreenBase const & screen) return; m_currentModelView = screen; + auto const zoomLevel = static_cast<uint8_t>(df::GetZoomLevel(screen.GetScale())); GetSearchAPI().OnViewportChanged(GetCurrentViewport()); @@ -2981,10 +2982,10 @@ bool Framework::ParseEditorDebugCommand(search::SearchParams const & params) results.AddResultNoChecks(search::Result(fid, feature::GetCenter(*ft), name, edit.second, types.GetBestType(), smd)); } - params.m_onResults(results); + params.m_onResults(results, params); results.SetEndMarker(false /* isCancelled */); - params.m_onResults(results); + params.m_onResults(results, params); return true; } else if (params.m_query == "?eclear") @@ -3847,18 +3848,15 @@ void Framework::FilterResultsForHotelsQuery(booking::filter::Tasks const & filte } }; - tasksInternal.emplace_back(type, std::move(paramsInternal)); + tasksInternal.emplace_back(type, move(paramsInternal)); } - m_bookingFilterProcessor.ApplyFilters(results, std::move(tasksInternal), filterTasks.GetMode()); + m_bookingFilterProcessor.ApplyFilters(results, move(tasksInternal), filterTasks.GetMode()); } void Framework::FilterHotels(booking::filter::Tasks const & filterTasks, vector<FeatureID> && featureIds) { - if (featureIds.size() > booking::RawApi::GetMaxHotelsInAvailabilityRequest()) - return; - using namespace booking::filter; TasksRawInternal tasksInternal; @@ -3896,10 +3894,10 @@ void Framework::FilterHotels(booking::filter::Tasks const & filterTasks, } }; - tasksInternal.emplace_back(type, std::move(paramsInternal)); + tasksInternal.emplace_back(type, move(paramsInternal)); } - m_bookingFilterProcessor.ApplyFilters(std::move(featureIds), std::move(tasksInternal), + m_bookingFilterProcessor.ApplyFilters(move(featureIds), move(tasksInternal), filterTasks.GetMode()); } diff --git a/map/framework.hpp b/map/framework.hpp index 28ef5d81e3..8aa2f01d70 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -82,6 +82,7 @@ #include "base/strings_bundle.hpp" #include "base/thread_checker.hpp" +#include "std/cstdint.hpp" #include "std/function.hpp" #include "std/list.hpp" #include "std/set.hpp" diff --git a/map/map_integration_tests/interactive_search_test.cpp b/map/map_integration_tests/interactive_search_test.cpp index f6d6f18bde..ba3552a743 100644 --- a/map/map_integration_tests/interactive_search_test.cpp +++ b/map/map_integration_tests/interactive_search_test.cpp @@ -59,6 +59,11 @@ public: { } + void FilterAllHotelsInViewport(m2::RectD const & viewport, + booking::filter::Tasks const & filterTasks) override + { + } + private: Stats & m_stats; }; @@ -71,10 +76,10 @@ public: : TestDelegate(stats) , TestSearchRequest(engine, query, "en" /* locale */, Mode::Viewport, viewport) { - SetCustomOnResults( - ViewportSearchCallback(static_cast<ViewportSearchCallback::Delegate &>(*this), - {} /* bookingFilterTasks */, - bind(&InteractiveSearchRequest::OnResults, this, placeholders::_1))); + SetCustomOnResults(ViewportSearchCallback( + static_cast<ViewportSearchCallback::Delegate &>(*this), {} /* bookingFilterTasks */, + bind(&InteractiveSearchRequest::OnResults, this, placeholders::_1, + search::SearchParamsBase{}))); } }; diff --git a/map/search_api.cpp b/map/search_api.cpp index 11e9d86f3b..c6f7fd2e1c 100644 --- a/map/search_api.cpp +++ b/map/search_api.cpp @@ -5,6 +5,8 @@ #include "map/everywhere_search_params.hpp" #include "map/viewport_search_params.hpp" +#include "partners_api/booking_api.hpp" + #include "search/bookmarks/processor.hpp" #include "search/geometry_utils.hpp" #include "search/hotels_filter.hpp" @@ -23,6 +25,7 @@ #include "base/timer.hpp" #include <algorithm> +#include <cmath> #include <iterator> #include <map> #include <string> @@ -38,6 +41,9 @@ using BookmarkIdDoc = pair<bookmarks::Id, bookmarks::Doc>; double const kDistEqualQueryMeters = 100.0; double const kDistEqualQueryMercator = MercatorBounds::MetersToMercator(kDistEqualQueryMeters); +// 200 sqared kilometers. +auto const kMaxAreaToLoadAllHotelsInViewport = 200000000.0; + // Cancels search query by |handle|. void CancelQuery(weak_ptr<ProcessorHandle> & handle) { @@ -87,7 +93,7 @@ public: explicit BookmarksSearchCallback(OnResults const & onResults) : m_onResults(onResults) {} - void operator()(Results const & results) + void operator()(Results const & results, SearchParamsBase const & /* params */) { if (results.IsEndMarker()) { @@ -211,7 +217,6 @@ bool SearchAPI::SearchInViewport(ViewportSearchParams const & params) }; p.m_onResults = ViewportSearchCallback( - m_viewport, static_cast<ViewportSearchCallback::Delegate &>(*this), params.m_bookingFilterTasks, [this, params](Results const & results) { @@ -341,15 +346,22 @@ void SearchAPI::FilterResultsForHotelsQuery(booking::filter::Tasks const & filte void SearchAPI::FilterAllHotelsInViewport(m2::RectD const & viewport, booking::filter::Tasks const & filterTasks) { + if (MercatorBounds::AreaOnEarth(viewport) > kMaxAreaToLoadAllHotelsInViewport) + return; + + auto constexpr kMaxHotelFeatures = booking::RawApi::GetMaxHotelsInAvailabilityRequest(); vector<FeatureID> featureIds; - auto const types = search::GetCategoryTypes("hotel", "en", GetDefaultCategories()); - search::ForEachOfTypesInRect(m_dataSource, types, m_viewport, - [&featureIds](FeatureID const & id) - { - featureIds.push_back(id); - }); - - m_delegate.FilterHotels(filterTasks, move(featureIds)); + auto static const types = search::GetCategoryTypes("hotel", "en", GetDefaultCategories()); + search::ForEachOfTypesInRect(m_dataSource, types, viewport, [&featureIds](FeatureID const & id) { + if (featureIds.size() > kMaxHotelFeatures) + return base::ControlFlow::Break; + + featureIds.push_back(id); + return base::ControlFlow::Continue; + }); + + if (featureIds.size() <= kMaxHotelFeatures) + m_delegate.FilterHotels(filterTasks, move(featureIds)); } void SearchAPI::OnBookmarksCreated(vector<pair<kml::MarkId, kml::BookmarkData>> const & marks) diff --git a/map/search_api.hpp b/map/search_api.hpp index c6c4dde85b..3e29df3356 100644 --- a/map/search_api.hpp +++ b/map/search_api.hpp @@ -18,6 +18,7 @@ #include "geometry/rect2d.hpp" #include <cstddef> +#include <cstdint> #include <functional> #include <memory> #include <string> @@ -85,7 +86,7 @@ public: } virtual void FilterHotels(booking::filter::Tasks const & filterTasks, - vector<FeatureID> && featureIds) + std::vector<FeatureID> && featureIds) { } diff --git a/map/viewport_search_callback.cpp b/map/viewport_search_callback.cpp index 40f89c0866..971c26e531 100644 --- a/map/viewport_search_callback.cpp +++ b/map/viewport_search_callback.cpp @@ -1,7 +1,6 @@ #include "map/viewport_search_callback.hpp" #include "search/result.hpp" -#include "search/utils.hpp" #include "base/assert.hpp" @@ -32,11 +31,10 @@ booking::filter::Types FillBookingFilterTypes(search::Results const & results, namespace search { -ViewportSearchCallback::ViewportSearchCallback(m2::RectD const & viewport, Delegate & delegate, +ViewportSearchCallback::ViewportSearchCallback(Delegate & delegate, booking::filter::Tasks const & bookingFilterTasks, - OnResults const & onResults) - : m_viewport(viewport) - , m_delegate(delegate) + ViewportSearchParams::OnResults const & onResults) + : m_delegate(delegate) , m_onResults(onResults) , m_firstCall(true) , m_lastResultsSize(0) @@ -44,7 +42,7 @@ ViewportSearchCallback::ViewportSearchCallback(m2::RectD const & viewport, Deleg { } -void ViewportSearchCallback::operator()(Results const & results) +void ViewportSearchCallback::operator()(Results const & results, SearchParamsBase const & params) { ASSERT_LESS_OR_EQUAL(m_lastResultsSize, results.GetCount(), ()); @@ -96,8 +94,8 @@ void ViewportSearchCallback::operator()(Results const & results) if (results.IsEndedNormal() && results.GetType() == Results::Type::Hotels && !m_bookingFilterTasks.IsEmpty()) { - if (m_viewport.IsValid()) - m_delegate.FilterAllHotelsInViewport(m_viewport, m_bookingFilterTasks); + if (params.m_viewport.IsValid()) + m_delegate.FilterAllHotelsInViewport(params.m_viewport, m_bookingFilterTasks); m_delegate.FilterResultsForHotelsQuery(m_bookingFilterTasks, results, true /* inViewport */); } diff --git a/map/viewport_search_callback.hpp b/map/viewport_search_callback.hpp index 78e508c01a..41c7a7942a 100644 --- a/map/viewport_search_callback.hpp +++ b/map/viewport_search_callback.hpp @@ -1,6 +1,7 @@ #pragma once #include "map/booking_filter_params.hpp" +#include "map/viewport_search_params.hpp" #include "search/hotels_classifier.hpp" #include "search/result.hpp" @@ -8,9 +9,8 @@ #include "geometry/rect2d.hpp" +#include <cstdint> #include <functional> -#include <string> -#include <vector> namespace search { @@ -38,19 +38,14 @@ public: booking::filter::Tasks const & filterTasks) = 0; }; - using OnResults = SearchParams::OnResults; + ViewportSearchCallback(Delegate & delegate, booking::filter::Tasks const & bookingFilterTasks, + ViewportSearchParams::OnResults const & onResults); - ViewportSearchCallback(m2::RectD const & viewport, Delegate & delegate, - booking::filter::Tasks const & bookingFilterTasks, - OnResults const & onResults); - - void operator()(Results const & results); + void operator()(Results const & results, SearchParamsBase const & params); private: - m2::RectD m_viewport; - Delegate & m_delegate; - OnResults m_onResults; + ViewportSearchParams::OnResults m_onResults; bool m_firstCall; size_t m_lastResultsSize; diff --git a/map/viewport_search_params.hpp b/map/viewport_search_params.hpp index c257c0de65..b87bf706b3 100644 --- a/map/viewport_search_params.hpp +++ b/map/viewport_search_params.hpp @@ -15,7 +15,7 @@ class Results; struct ViewportSearchParams { using OnStarted = std::function<void()>; - using OnCompleted = std::function<void(Results const & results)>; + using OnResults = std::function<void(Results const & results)>; std::string m_query; std::string m_inputLocale; @@ -23,6 +23,6 @@ struct ViewportSearchParams booking::filter::Tasks m_bookingFilterTasks; OnStarted m_onStarted; - OnCompleted m_onCompleted; + OnResults m_onCompleted; }; } // namespace search |