From e6391b0ff61c9c2fead49d86dc65dadf5cd9d9a1 Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 27 Jun 2014 13:49:03 +0300 Subject: [PATCH] [search] More dispersed viewport results on the map. --- search/intermediate_result.cpp | 4 +++ search/intermediate_result.hpp | 1 + search/search_engine.cpp | 2 +- search/search_query.cpp | 51 +++++++++++++++++++--------------- search/search_query.hpp | 10 +++---- 5 files changed, 39 insertions(+), 29 deletions(-) diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 9534f09450..acdbf978b2 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -127,6 +127,10 @@ bool PreResult1::LessViewportDistance(PreResult1 const & r1, PreResult1 const & return LessViewportDistanceT(r1, r2); } +bool PreResult1::LessPointsForViewport(PreResult1 const & r1, PreResult1 const & r2) +{ + return r1.m_id < r2.m_id; +} void PreResult2::CalcParams(m2::RectD const & viewport, m2::PointD const & pos) { diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index 09aeff1674..b0f6dff998 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -48,6 +48,7 @@ public: static bool LessRank(PreResult1 const & r1, PreResult1 const & r2); static bool LessDistance(PreResult1 const & r1, PreResult1 const & r2); static bool LessViewportDistance(PreResult1 const & r1, PreResult1 const & r2); + static bool LessPointsForViewport(PreResult1 const & r1, PreResult1 const & r2); inline FeatureID GetID() const { return m_id; } inline m2::PointD GetCenter() const { return m_center; } diff --git a/search/search_engine.cpp b/search/search_engine.cpp index b1421e6c9e..53de750d70 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -263,7 +263,7 @@ void Engine::SearchAsync(bool viewportPoints) } // Initialize query. - m_pQuery->Init(); + m_pQuery->Init(viewportPoints); // Set search viewports according to search params. if (params.IsValidPosition()) diff --git a/search/search_query.cpp b/search/search_query.cpp index f8ea91596d..21adf7588f 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -65,8 +65,10 @@ namespace ASSERT_LESS ( id, LANG_COUNT, () ); return make_pair(g_arrLang1[id], g_arrLang2[id]); } -} + // Maximum result candidates count for each viewport/criteria. + size_t const PRE_RESULTS_COUNT = 200; +} Query::Query(Index const * pIndex, CategoriesHolder const * pCategories, @@ -86,13 +88,10 @@ Query::Query(Index const * pIndex, ASSERT ( m_pIndex, () ); // Results queue's initialization. - STATIC_ASSERT ( m_qCount == ARRAY_SIZE(g_arrCompare1) ); - STATIC_ASSERT ( m_qCount == ARRAY_SIZE(g_arrCompare2) ); + STATIC_ASSERT ( QUEUES_COUNT == ARRAY_SIZE(g_arrCompare1) ); + STATIC_ASSERT ( QUEUES_COUNT == ARRAY_SIZE(g_arrCompare2) ); - // Maximum result candidates count for each viewport/criteria. - size_t const PRE_RESULTS_COUNT = 200; - - for (size_t i = 0; i < m_qCount; ++i) + for (size_t i = 0; i < QUEUES_COUNT; ++i) { m_results[i] = QueueT(PRE_RESULTS_COUNT, QueueCompareT(g_arrCompare1[i])); m_results[i].reserve(PRE_RESULTS_COUNT); @@ -252,7 +251,7 @@ void Query::UpdateViewportOffsets(MWMVectorT const & mwmInfo, m2::RectD const & #endif } -void Query::Init() +void Query::Init(bool viewportPoints) { m_cancel = false; @@ -265,11 +264,22 @@ void Query::Init() #endif ClearQueues(); + + if (viewportPoints) + { + m_queuesCount = 1; + m_results[0] = QueueT(PRE_RESULTS_COUNT, QueueCompareT(&impl::PreResult1::LessPointsForViewport)); + } + else + { + m_results[0] = QueueT(PRE_RESULTS_COUNT, QueueCompareT(g_arrCompare1[0])); + m_queuesCount = QUEUES_COUNT; + } } void Query::ClearQueues() { - for (size_t i = 0; i < m_qCount; ++i) + for (size_t i = 0; i < QUEUES_COUNT; ++i) m_results[i].clear(); } @@ -348,8 +358,6 @@ void Query::SearchCoordinates(string const & query, Results & res) const void Query::Search(Results & res, size_t resCount) { - ClearQueues(); - if (m_cancel) return; if (m_tokens.empty()) SuggestStrings(res); @@ -388,7 +396,7 @@ namespace }; //@} - class IndexedValue : public search::IndexedValueBase + class IndexedValue : public search::IndexedValueBase { typedef impl::PreResult2 ValueT; @@ -581,18 +589,17 @@ namespace impl }; } -template void Query::MakePreResult2(vector & cont, vector & streets, int ind/* = -1*/) +template void Query::MakePreResult2(vector & cont, vector & streets) { // make unique set of PreResult1 typedef set PreResultSetT; PreResultSetT theSet; - for (size_t i = 0; i < m_qCount; ++i) - if (ind == -1 || i == ind) - { - theSet.insert(m_results[i].begin(), m_results[i].end()); - m_results[i].clear(); - } + for (size_t i = 0; i < m_queuesCount; ++i) + { + theSet.insert(m_results[i].begin(), m_results[i].end()); + m_results[i].clear(); + } // make PreResult2 vector impl::PreResult2Maker maker(*this); @@ -687,8 +694,6 @@ void Query::FlushResults(Results & res, bool allMWMs, size_t resCount) void Query::SearchViewportPoints(Results & res) { - ClearQueues(); - if (m_cancel) return; SearchAddress(res); @@ -698,7 +703,7 @@ void Query::SearchViewportPoints(Results & res) vector indV; vector streets; - MakePreResult2(indV, streets, 1); + MakePreResult2(indV, streets); if (indV.empty()) return; @@ -817,7 +822,7 @@ void Query::AddResultFromTrie(TrieValueT const & val, size_t mwmID, ViewportID v impl::PreResult1 res(FeatureID(mwmID, val.m_featureId), val.m_rank, val.m_pt, GetPosition(vID), GetViewport(vID), vID); - for (size_t i = 0; i < m_qCount; ++i) + for (size_t i = 0; i < m_queuesCount; ++i) { // here can be the duplicates because of different language match (for suggest token) if (m_results[i].end() == find_if(m_results[i].begin(), m_results[i].end(), EqualFeatureID(res))) diff --git a/search/search_query.hpp b/search/search_query.hpp index d78d12fa59..d7c93fe532 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -74,7 +74,7 @@ public: inline void SupportOldFormat(bool b) { m_supportOldFormat = b; } - void Init(); + void Init(bool viewportPoints); void SetViewport(m2::RectD viewport[], size_t count); @@ -171,7 +171,7 @@ private: void AddResultFromTrie(TrieValueT const & val, size_t mwmID, ViewportID vID = DEFAULT_V); - template void MakePreResult2(vector & cont, vector & streets, int ind = -1); + template void MakePreResult2(vector & cont, vector & streets); void FlushHouses(Results & res, bool allMWMs, vector const & streets); void FlushResults(Results & res, bool allMWMs, size_t resCount); @@ -269,13 +269,13 @@ private: typedef my::limited_priority_queue QueueT; public: - static const size_t m_qCount = 3; - + enum { QUEUES_COUNT = 3 }; private: // 0 - LessRank // 1 - LessViewportDistance // 2 - LessDistance - QueueT m_results[m_qCount]; + QueueT m_results[QUEUES_COUNT]; + size_t m_queuesCount; }; } // namespace search