From 86b5bfa93ba08bc333ece45c03ea146f1c9cb916 Mon Sep 17 00:00:00 2001 From: Yury Melnichek Date: Sat, 18 Jun 2011 18:14:43 +0200 Subject: [PATCH] [search] Send latlon and category results early. --- search/query.cpp | 13 +++++++++++-- search/query.hpp | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/search/query.cpp b/search/query.cpp index fe9d6fe215..c889425bb6 100644 --- a/search/query.cpp +++ b/search/query.cpp @@ -99,6 +99,7 @@ Query::Query(string const & query, m2::RectD const & viewport, IndexType const * Engine * pEngine, CategoriesHolder * pCategories) : m_queryText(query), m_viewport(viewport), m_pCategories(pCategories), m_pIndex(pIndex ? new IndexType(*pIndex) : NULL), + m_resultsRemaining(10), m_pEngine(pEngine), m_bTerminate(false) { search::Delimiters delims; @@ -174,6 +175,8 @@ void Query::Search(function const & f) if (m_bTerminate) return; + FlushResults(f); + // Feature matching. FeatureProcessor featureProcessor(*this); int const scale = scales::GetScaleLevel(m_viewport) + 1; @@ -207,6 +210,12 @@ void Query::Search(function const & f) if (m_bTerminate) return; + FlushResults(f); + f(Result(string(), string())); // Send last search result marker. +} + +void Query::FlushResults(const function &f) +{ vector results; results.reserve(m_results.size()); while (!m_results.empty()) @@ -216,7 +225,7 @@ void Query::Search(function const & f) } for (vector::const_reverse_iterator it = results.rbegin(); it != results.rend(); ++it) f(*it); - f(Result(string(), string())); // Send last search result marker. + m_resultsRemaining = max(0, m_resultsRemaining - static_cast(results.size())); } void Query::SearchAndDestroy(function const & f) @@ -228,7 +237,7 @@ void Query::SearchAndDestroy(function const & f) void Query::AddResult(IntermediateResult const & result) { - if (m_results.size() < 10) + if (m_results.size() < m_resultsRemaining) m_results.push(result); else if (result < m_results.top()) { diff --git a/search/query.hpp b/search/query.hpp index d19bd3b444..9419ecac26 100644 --- a/search/query.hpp +++ b/search/query.hpp @@ -38,6 +38,9 @@ public: // Add result for scoring. void AddResult(IntermediateResult const & result); + // Send all accumulated results to f(). + void FlushResults(function const & f); + // Set a flag that query is not active any more and should terminate. void SetTerminateFlag() volatile { m_bTerminate = true; } bool GetTerminateFlag() const { return m_bTerminate; } @@ -60,6 +63,7 @@ private: IndexType::Query m_indexQuery; priority_queue m_results; + int m_resultsRemaining; Engine * m_pEngine; bool volatile m_bTerminate;