From eda43f183782407038d2dc07a0f4a13be607daf3 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Fri, 27 Oct 2017 15:49:44 +0300 Subject: [PATCH] [search] Removed multiple viewports. --- search/processor.cpp | 96 +++++---------------- search/processor.hpp | 26 ++---- search/search_integration_tests/helpers.cpp | 6 ++ 3 files changed, 35 insertions(+), 93 deletions(-) diff --git a/search/processor.cpp b/search/processor.cpp index bc88cea171..0e2e2c3ba8 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -210,9 +210,20 @@ void Processor::Init(bool viewportSearch) m_preRanker.SetViewportSearch(viewportSearch); } -void Processor::SetViewport(m2::RectD const & viewport, bool forceUpdate) +void Processor::SetViewport(m2::RectD const & viewport) { - SetViewportByIndex(viewport, CURRENT_V, forceUpdate); + ASSERT(viewport.IsValid(), ()); + + if (m_viewport.IsValid()) + { + double constexpr epsMeters = 10.0; + + // Skip if viewports are equal. + if (IsEqualMercator(m_viewport, viewport, epsMeters)) + return; + } + + m_viewport = viewport; } void Processor::SetPreferredLocale(string const & locale) @@ -336,7 +347,7 @@ m2::PointD Processor::GetPivotPoint() const { bool const viewportSearch = m_mode == Mode::Viewport; - m2::RectD const & viewport = m_viewport[CURRENT_V]; + auto const & viewport = GetViewport(); if (viewportSearch || !viewport.IsPointInside(GetPosition())) return viewport.Center(); return GetPosition(); @@ -344,54 +355,18 @@ m2::PointD Processor::GetPivotPoint() const m2::RectD Processor::GetPivotRect() const { - m2::RectD const & viewport = m_viewport[CURRENT_V]; + auto const & viewport = GetViewport(); if (viewport.IsPointInside(GetPosition())) return GetRectAroundPosition(GetPosition()); return NormalizeViewport(viewport); } -void Processor::SetViewportByIndex(m2::RectD const & viewport, size_t idx, bool forceUpdate) +m2::RectD const & Processor::GetViewport() const { - ASSERT(idx < COUNT_V, (idx)); - - if (viewport.IsValid()) - { - // Check if we can skip this cache query. - if (m_viewport[idx].IsValid()) - { - // Threshold to compare for equal or inner rects. - // It doesn't influence on result cached features because it's smaller - // than minimal cell size in geometry index (i'm almost sure :)). - double constexpr epsMeters = 10.0; - - if (forceUpdate) - { - // skip if rects are equal - if (IsEqualMercator(m_viewport[idx], viewport, epsMeters)) - return; - } - else - { - // skip if the new viewport is inside the old one (no need to recache) - m2::RectD r(m_viewport[idx]); - double constexpr eps = epsMeters * MercatorBounds::degreeInMetres; - r.Inflate(eps, eps); - - if (r.IsRectInside(viewport)) - return; - } - } - - m_viewport[idx] = viewport; - } - else - { - ClearCache(idx); - } + ASSERT(m_viewport.IsValid(), ()); + return m_viewport; } -void Processor::ClearCache(size_t ind) { m_viewport[ind].MakeEmpty(); } - void Processor::LoadCitiesBoundaries() { if (m_citiesBoundaries.Load()) @@ -450,6 +425,8 @@ void Processor::Search(SearchParams const & params) bool rankPivotIsSet = false; auto const & viewport = params.m_viewport; + ASSERT(viewport.IsValid(), ()); + if (!viewportSearch && params.IsValidPosition()) { m2::PointD const pos = params.GetPositionMercator(); @@ -476,7 +453,7 @@ void Processor::Search(SearchParams const & params) SetInputLocale(params.m_inputLocale); SetQuery(params.m_query); - SetViewport(viewport, true /* forceUpdate */); + SetViewport(viewport); SetOnResults(params.m_onResults); Geocoder::Params geocoderParams; @@ -576,7 +553,7 @@ void Processor::InitGeocoder(Geocoder::Params & params) InitParams(params); params.m_mode = m_mode; if (viewportSearch) - params.m_pivot = m_viewport[CURRENT_V]; + params.m_pivot = GetViewport(); else params.m_pivot = GetPivotRect(); params.m_hotelsFilter = m_hotelsFilter; @@ -638,37 +615,10 @@ void Processor::InitEmitter() { m_emitter.Init(m_onResults); } void Processor::ClearCaches() { - for (size_t i = 0; i < COUNT_V; ++i) - ClearCache(i); - m_geocoder.ClearCaches(); m_villagesCache.Clear(); m_preRanker.ClearCaches(); m_ranker.ClearCaches(); -} - -m2::RectD const & Processor::GetViewport(ViewportID vID /*= DEFAULT_V*/) const -{ - if (vID == LOCALITY_V) - { - // special case for search address - return viewport around location - return m_viewport[vID]; - } - - ASSERT(m_viewport[CURRENT_V].IsValid(), ()); - return m_viewport[CURRENT_V]; -} - -string DebugPrint(Processor::ViewportID viewportId) -{ - switch (viewportId) - { - case Processor::DEFAULT_V: return "Default"; - case Processor::CURRENT_V: return "Current"; - case Processor::LOCALITY_V: return "Locality"; - case Processor::COUNT_V: return "Count"; - } - ASSERT(false, ("Unknown viewportId")); - return "Unknown"; + m_viewport.MakeEmpty(); } } // namespace search diff --git a/search/processor.hpp b/search/processor.hpp index 6cede1db1a..22679c86f9 100644 --- a/search/processor.hpp +++ b/search/processor.hpp @@ -68,9 +68,7 @@ public: void Init(bool viewportSearch); - /// @param[in] forceUpdate Pass true (default) to recache feature's ids even - /// if viewport is a part of the old cached rect. - void SetViewport(m2::RectD const & viewport, bool forceUpdate); + void SetViewport(m2::RectD const & viewport); void SetPreferredLocale(string const & locale); void SetInputLocale(string const & locale); void SetQuery(string const & query); @@ -88,9 +86,11 @@ public: inline m2::PointD const & GetPosition() const { return m_position; } /// Suggestions language code, not the same as we use in mwm data - int8_t m_inputLocaleCode, m_currentLocaleCode; + int8_t m_inputLocaleCode; + int8_t m_currentLocaleCode; inline bool IsEmptyQuery() const { return (m_prefix.empty() && m_tokens.empty()); } + void Search(SearchParams const & params); // Tries to generate a (lat, lon) result from |m_query|. @@ -107,16 +107,6 @@ public: void LoadCitiesBoundaries(); protected: - enum ViewportID - { - DEFAULT_V = -1, - CURRENT_V = 0, - LOCALITY_V = 1, - COUNT_V = 2 // Should always be the last - }; - - friend string DebugPrint(ViewportID viewportId); - using TMWMVector = vector>; using TOffsetsVector = map>; using TFHeader = feature::DataHeader; @@ -132,11 +122,7 @@ protected: m2::PointD GetPivotPoint() const; m2::RectD GetPivotRect() const; - void SetViewportByIndex(m2::RectD const & viewport, size_t idx, bool forceUpdate); - void ClearCache(size_t ind); - - // Returns a Rect for viewport-distance calculations. - m2::RectD const & GetViewport(ViewportID vID = DEFAULT_V) const; + m2::RectD const & GetViewport() const; void SetLanguage(int id, int8_t lang); int8_t GetLanguage(int id) const; @@ -150,7 +136,7 @@ protected: strings::UniString m_prefix; set m_preferredTypes; - m2::RectD m_viewport[COUNT_V]; + m2::RectD m_viewport; m2::PointD m_pivot; m2::PointD m_position; double m_minDistanceOnMapBetweenResults; diff --git a/search/search_integration_tests/helpers.cpp b/search/search_integration_tests/helpers.cpp index d61f7c966e..dae5558a10 100644 --- a/search/search_integration_tests/helpers.cpp +++ b/search/search_integration_tests/helpers.cpp @@ -12,6 +12,9 @@ #include "platform/platform.hpp" +#include "geometry/mercator.hpp" +#include "geometry/rect2d.hpp" + namespace search { // TestWithClassificator --------------------------------------------------------------------------- @@ -29,6 +32,9 @@ SearchTest::SearchTest() Engine::Params()) { indexer::tests_support::SetUpEditorForTesting(make_unique(m_engine)); + + SetViewport(m2::RectD(MercatorBounds::minX, MercatorBounds::minY, + MercatorBounds::maxX, MercatorBounds::maxY)); } SearchTest::~SearchTest()