diff --git a/map/framework.cpp b/map/framework.cpp index 09e428f08e..7290d056d1 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -117,7 +117,7 @@ char const kAllow3dKey[] = "Allow3d"; char const kAllow3dBuildingsKey[] = "Buildings3d"; char const kAllowAutoZoom[] = "AutoZoom"; -double const kDistEqualQuery = 100.0; +double const kDistEqualQueryMeters = 100.0; // Must correspond SearchMarkType. vector kSearchMarks = @@ -1100,10 +1100,10 @@ bool Framework::SearchEverywhere(search::EverywhereSearchParams const & params) { search::SearchParams p; p.m_query = params.m_query; - p.SetInputLocale(params.m_inputLocale); - p.SetForceSearch(true); - p.SetMode(search::Mode::Everywhere); - p.SetSuggestsEnabled(true); + p.m_inputLocale = params.m_inputLocale; + p.m_mode = search::Mode::Everywhere; + p.m_forceSearch = true; + p.m_suggestsEnabled = true; p.m_onResults = [params](search::Results const & results) { if (params.m_onResults) GetPlatform().RunOnGuiThread([params, results]() { params.m_onResults(results); }); @@ -1117,10 +1117,10 @@ bool Framework::SearchInViewport(search::ViewportSearchParams const & params) { search::SearchParams p; p.m_query = params.m_query; - p.SetInputLocale(params.m_inputLocale); - p.SetForceSearch(false); - p.SetMode(search::Mode::Viewport); - p.SetSuggestsEnabled(false); + p.m_inputLocale = params.m_inputLocale; + p.m_mode = search::Mode::Viewport; + p.m_forceSearch = false; + p.m_suggestsEnabled = false; p.m_onStarted = [params]() { if (params.m_onStarted) @@ -1143,9 +1143,9 @@ bool Framework::SearchInDownloader(DownloaderSearchParams const & params) search::SearchParams p; p.m_query = params.m_query; p.m_inputLocale = params.m_inputLocale; - p.SetMode(search::Mode::Downloader); - p.SetSuggestsEnabled(false); - p.SetForceSearch(true); + p.m_mode = search::Mode::Downloader; + p.m_forceSearch = true; + p.m_suggestsEnabled = false; p.m_onResults = search::DownloaderSearchCallback( static_cast(*this), m_model.GetIndex(), GetCountryInfoGetter(), GetStorage(), params); @@ -1262,7 +1262,7 @@ string Framework::GetCountryName(m2::PointD const & pt) const bool Framework::Search(search::SearchParams const & params) { - auto const mode = params.GetMode(); + auto const mode = params.m_mode; auto & intent = m_searchIntents[static_cast(mode)]; #ifdef FIXED_LOCATION @@ -1318,18 +1318,26 @@ bool Framework::QueryMayBeSkipped(SearchIntent const & intent, search::SearchPar auto const & lastParams = intent.m_params; auto const & lastViewport = intent.m_viewport; - if (params.IsForceSearch()) + if (params.m_forceSearch) return false; if (!lastParams.IsEqualCommon(params)) return false; - if (!lastViewport.IsValid() || !search::IsEqualMercator(lastViewport, viewport, kDistEqualQuery)) - return false; - if (!lastParams.IsSearchAroundPosition() || - ms::DistanceOnEarth(lastParams.m_lat, lastParams.m_lon, params.m_lat, params.m_lon) <= - kDistEqualQuery) + if (!lastViewport.IsValid() || + !search::IsEqualMercator(lastViewport, viewport, kDistEqualQueryMeters)) { return false; } + + if (lastParams.IsValidPosition() && params.IsValidPosition() && + ms::DistanceOnEarth(lastParams.GetPositionLatLon(), params.GetPositionLatLon()) > + kDistEqualQueryMeters) + { + return false; + } + + if (lastParams.IsValidPosition() != params.IsValidPosition()) + return false; + return true; } diff --git a/search/engine.cpp b/search/engine.cpp index 0f8c129a77..7e1e0f473a 100644 --- a/search/engine.cpp +++ b/search/engine.cpp @@ -227,7 +227,7 @@ void Engine::PostMessage(TArgs &&... args) void Engine::DoSearch(SearchParams const & params, m2::RectD const & viewport, shared_ptr handle, Processor & processor) { - bool const viewportSearch = params.GetMode() == Mode::Viewport; + bool const viewportSearch = params.m_mode == Mode::Viewport; processor.Reset(); processor.Init(viewportSearch); diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index e353017aa7..750f8af6c8 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -22,9 +22,7 @@ namespace search { - -/// All constants in meters. -double const DIST_SAME_STREET = 5000.0; +double const DIST_SAME_STREET_METERS = 5000.0; char const * const kEmptyRatingSymbol = "-"; char const * const kPricingSymbol = "$"; @@ -277,9 +275,8 @@ bool PreResult2::EqualLinearTypesF::operator() (PreResult2 const & r1, PreResult { // Note! Do compare for distance when filtering linear objects. // Otherwise we will skip the results for different parts of the map. - return (r1.m_geomType == feature::GEOM_LINE && - r1.IsEqualCommon(r2) && - PointDistance(r1.GetCenter(), r2.GetCenter()) < DIST_SAME_STREET); + return (r1.m_geomType == feature::GEOM_LINE && r1.IsEqualCommon(r2) && + PointDistance(r1.GetCenter(), r2.GetCenter()) < DIST_SAME_STREET_METERS); } bool PreResult2::IsEqualCommon(PreResult2 const & r) const diff --git a/search/processor.cpp b/search/processor.cpp index 2b8268498c..594323c168 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -110,8 +110,9 @@ void SendStatistics(SearchParams const & params, m2::RectD const & viewport, Res string posX, posY; if (params.IsValidPosition()) { - posX = strings::to_string(MercatorBounds::LonToX(params.m_lon)); - posY = strings::to_string(MercatorBounds::LatToY(params.m_lat)); + m2::PointD const position = params.GetPositionMercator(); + posX = strings::to_string(position.x); + posY = strings::to_string(position.y); } alohalytics::TStringMap const stats = { @@ -380,7 +381,7 @@ void Processor::Search(SearchParams const & params, m2::RectD const & viewport) bool rankPivotIsSet = false; if (!viewportSearch && params.IsValidPosition()) { - m2::PointD const pos = MercatorBounds::FromLatLon(params.m_lat, params.m_lon); + m2::PointD const pos = params.GetPositionMercator(); if (m2::Inflate(viewport, viewport.SizeX() / 4.0, viewport.SizeY() / 4.0).IsPointInside(pos)) { SetRankPivot(pos); @@ -391,14 +392,14 @@ void Processor::Search(SearchParams const & params, m2::RectD const & viewport) SetRankPivot(viewport.Center()); if (params.IsValidPosition()) - SetPosition(MercatorBounds::FromLatLon(params.m_lat, params.m_lon)); + SetPosition(params.GetPositionMercator()); else SetPosition(viewport.Center()); SetMinDistanceOnMapBetweenResults(params.m_minDistanceOnMapBetweenResults); - SetMode(params.GetMode()); - SetSuggestsEnabled(params.GetSuggestsEnabled()); + SetMode(params.m_mode); + SetSuggestsEnabled(params.m_suggestsEnabled); SetInputLocale(params.m_inputLocale); ASSERT(!params.m_query.empty(), ()); diff --git a/search/search_engine_pylib/api.cpp b/search/search_engine_pylib/api.cpp index f899c3d831..e87c944b50 100644 --- a/search/search_engine_pylib/api.cpp +++ b/search/search_engine_pylib/api.cpp @@ -193,9 +193,9 @@ struct SearchEngineProxy search::SearchParams sp; sp.m_query = params.m_query; sp.m_inputLocale = params.m_locale; - sp.SetMode(search::Mode::Everywhere); + sp.m_mode = search::Mode::Everywhere; sp.SetPosition(params.m_latLon.m_lat, params.m_latLon.m_lon); - sp.SetSuggestsEnabled(false); + sp.m_suggestsEnabled = false; auto const & bottomLeft = params.m_viewport.m_min; auto const & topRight = params.m_viewport.m_max; diff --git a/search/search_integration_tests/downloader_search_test.cpp b/search/search_integration_tests/downloader_search_test.cpp index ab819260e3..ac55cea658 100644 --- a/search/search_integration_tests/downloader_search_test.cpp +++ b/search/search_integration_tests/downloader_search_test.cpp @@ -129,9 +129,9 @@ private: search::SearchParams p; p.m_query = query; p.m_inputLocale = "en"; - p.SetMode(search::Mode::Downloader); - p.SetSuggestsEnabled(false); - p.SetForceSearch(true); + p.m_mode = search::Mode::Downloader; + p.m_forceSearch = true; + p.m_suggestsEnabled = false; return p; } diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index 16cef90ad7..03db7f3df8 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -36,8 +36,8 @@ public: SearchParams params; params.m_query = query; params.m_inputLocale = "en"; - params.SetMode(Mode::Everywhere); - params.SetSuggestsEnabled(false); + params.m_mode = Mode::Everywhere; + params.m_suggestsEnabled = false; auto request = make_unique(m_engine, params, m_viewport); request->Run(); @@ -290,8 +290,8 @@ UNIT_CLASS_TEST(ProcessorTest, DisableSuggests) SearchParams params; params.m_query = "londo"; params.m_inputLocale = "en"; - params.SetMode(Mode::Downloader); - params.SetSuggestsEnabled(false); + params.m_mode = Mode::Downloader; + params.m_suggestsEnabled = false; TestSearchRequest request(m_engine, params, m_viewport); request.Run(); diff --git a/search/search_params.cpp b/search/search_params.cpp index fe9da94d89..855b2e514b 100644 --- a/search/search_params.cpp +++ b/search/search_params.cpp @@ -4,20 +4,10 @@ #include "coding/multilang_utf8_string.hpp" +#include "base/assert.hpp" + namespace search { -SearchParams::SearchParams() - : m_lat(0.0) - , m_lon(0.0) - , m_minDistanceOnMapBetweenResults(0.0) - , m_searchRadiusM(-1.0) - , m_mode(Mode::Everywhere) - , m_forceSearch(false) - , m_validPos(false) - , m_suggestsEnabled(true) -{ -} - void SearchParams::SetPosition(double lat, double lon) { m_lat = lat; @@ -25,21 +15,22 @@ void SearchParams::SetPosition(double lat, double lon) m_validPos = true; } -bool SearchParams::GetSearchRect(m2::RectD & rect) const +m2::PointD SearchParams::GetPositionMercator() const { - if (IsSearchAroundPosition()) - { - rect = MercatorBounds::MetresToXY(m_lon, m_lat, m_searchRadiusM); - return true; - } - return false; + ASSERT(IsValidPosition(), ()); + return MercatorBounds::FromLatLon(m_lat, m_lon); +} + +ms::LatLon SearchParams::GetPositionLatLon() const +{ + ASSERT(IsValidPosition(), ()); + return ms::LatLon(m_lat, m_lon); } bool SearchParams::IsEqualCommon(SearchParams const & rhs) const { - return (m_query == rhs.m_query && m_inputLocale == rhs.m_inputLocale && - m_validPos == rhs.m_validPos && m_mode == rhs.m_mode && - m_searchRadiusM == rhs.m_searchRadiusM); + return m_query == rhs.m_query && m_inputLocale == rhs.m_inputLocale && + m_validPos == rhs.m_validPos && m_mode == rhs.m_mode; } string DebugPrint(SearchParams const & params) diff --git a/search/search_params.hpp b/search/search_params.hpp index 7685d3cbdd..e454d017de 100644 --- a/search/search_params.hpp +++ b/search/search_params.hpp @@ -2,6 +2,7 @@ #include "search/mode.hpp" +#include "geometry/latlon.hpp" #include "geometry/point2d.hpp" #include "geometry/rect2d.hpp" @@ -18,48 +19,34 @@ public: using TOnStarted = function; using TOnResults = function; - SearchParams(); - - /// @name Force run search without comparing with previous search params. - //@{ - void SetForceSearch(bool b) { m_forceSearch = b; } - bool IsForceSearch() const { return m_forceSearch; } - //@} - - inline void SetMode(Mode mode) { m_mode = mode; } - inline Mode GetMode() const { return m_mode; } void SetPosition(double lat, double lon); + m2::PointD GetPositionMercator() const; + ms::LatLon GetPositionLatLon() const; + inline bool IsValidPosition() const { return m_validPos; } - inline bool IsSearchAroundPosition() const { return (m_searchRadiusM > 0 && IsValidPosition()); } - inline void SetSearchRadiusMeters(double radiusM) { m_searchRadiusM = radiusM; } - bool GetSearchRect(m2::RectD & rect) const; - - /// @param[in] locale can be "fr", "en-US", "ru_RU" etc. - inline void SetInputLocale(string const & locale) { m_inputLocale = locale; } - inline void SetSuggestsEnabled(bool enabled) { m_suggestsEnabled = enabled; } - inline bool GetSuggestsEnabled() const { return m_suggestsEnabled; } bool IsEqualCommon(SearchParams const & rhs) const; - inline void Clear() { m_query.clear(); } + TOnStarted m_onStarted; TOnResults m_onResults; string m_query; string m_inputLocale; - double m_lat, m_lon; - // A minimum distance between search results in meters, needed for // pre-ranking of viewport search results. - double m_minDistanceOnMapBetweenResults; + double m_minDistanceOnMapBetweenResults = 0.0; + + Mode m_mode = Mode::Everywhere; + bool m_forceSearch = false; + bool m_suggestsEnabled = true; friend string DebugPrint(SearchParams const & params); private: - double m_searchRadiusM; - Mode m_mode; - bool m_forceSearch; - bool m_validPos; - bool m_suggestsEnabled; + double m_lat = 0.0; + double m_lon = 0.0; + + bool m_validPos = false; }; } // namespace search diff --git a/search/search_quality/features_collector_tool/features_collector_tool.cpp b/search/search_quality/features_collector_tool/features_collector_tool.cpp index 39799a7000..2b7b295656 100644 --- a/search/search_quality/features_collector_tool/features_collector_tool.cpp +++ b/search/search_quality/features_collector_tool/features_collector_tool.cpp @@ -250,9 +250,9 @@ int main(int argc, char * argv[]) search::SearchParams params; params.m_query = strings::ToUtf8(sample.m_query); params.m_inputLocale = sample.m_locale; - params.SetMode(Mode::Everywhere); + params.m_mode = Mode::Everywhere; params.SetPosition(latLon.lat, latLon.lon); - params.SetSuggestsEnabled(false); + params.m_suggestsEnabled = false; TestSearchRequest request(engine, params, sample.m_viewport); request.Run(); diff --git a/search/search_tests_support/test_search_request.cpp b/search/search_tests_support/test_search_request.cpp index be2cb101b1..27a7192a7b 100644 --- a/search/search_tests_support/test_search_request.cpp +++ b/search/search_tests_support/test_search_request.cpp @@ -17,7 +17,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q { m_params.m_query = query; m_params.m_inputLocale = locale; - m_params.SetMode(mode); + m_params.m_mode = mode; SetUpCallbacks(); } @@ -36,7 +36,7 @@ TestSearchRequest::TestSearchRequest(TestSearchEngine & engine, string const & q { m_params.m_query = query; m_params.m_inputLocale = locale; - m_params.SetMode(mode); + m_params.m_mode = mode; m_params.m_onStarted = move(onStarted); m_params.m_onResults = move(onResults); }