From 8efd58305d05e5d0ce187eac9024e721c568fef0 Mon Sep 17 00:00:00 2001 From: vng Date: Tue, 14 Feb 2012 12:23:10 +0300 Subject: [PATCH] [search] Repeat search Near My Position if not enough results for current viewport. --- search/search_engine.cpp | 22 ++++++++++++++++++++-- search/search_query.hpp | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 295bbff6c4..c7aa7ac5cd 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -148,7 +148,8 @@ void Engine::SearchAsync() } // Initialize query. - if (params.IsNearMeMode()) + bool const nearMe = params.IsNearMeMode(); + if (nearMe) m_pQuery->SetViewport(GetViewportRect(params.m_lat, params.m_lon)); else m_pQuery->SetViewport(viewport); @@ -158,15 +159,32 @@ void Engine::SearchAsync() else m_pQuery->NullPosition(); + unsigned int const resultsNeeded = 10; Results res; + + // Run first search with needed params. try { - m_pQuery->Search(params.m_query, res); + m_pQuery->Search(params.m_query, res, resultsNeeded); } catch (Query::CancelException const &) { } + // If not enough results, run second search with "Near Me" viewport. + if (!m_pQuery->IsCanceled() && !nearMe && params.m_validPos && (res.Count() < resultsNeeded)) + { + m_pQuery->SetViewport(GetViewportRect(params.m_lat, params.m_lon)); + + try + { + m_pQuery->Search(params.m_query, res, resultsNeeded); + } + catch (Query::CancelException const &) + { + } + } + // Emit results in any way, even if search was canceled. params.m_callback(res); } diff --git a/search/search_query.hpp b/search/search_query.hpp index eae4948151..620b2919af 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -60,6 +60,7 @@ public: void ClearCache(); inline void DoCancel() { m_cancel = true; } + inline bool IsCanceled() const { return m_cancel; } struct CancelException {}; private: