[search] Stop query when a new one comes.

This commit is contained in:
Yury Melnichek 2011-06-04 22:21:53 +02:00 committed by Alex Zolotarev
parent 3bac5521d8
commit 99d2c20d49
3 changed files with 32 additions and 0 deletions

View file

@ -19,8 +19,22 @@ void Engine::Search(string const & queryText,
m2::RectD const & rect,
function<void (Result const &)> const & f)
{
{
threads::MutexGuard mutexGuard(m_mutex);
UNUSED_VALUE(mutexGuard);
if (m_pLastQuery)
m_pLastQuery->SetTerminateFlag();
}
impl::Query * pQuery = new impl::Query(queryText, rect, m_pIndex);
m_pRunner->Run(bind(&impl::Query::SearchAndDestroy, pQuery, f));
}
void Engine::OnQueryDelete()
{
threads::MutexGuard mutexGuard(m_mutex);
UNUSED_VALUE(mutexGuard);
m_pLastQuery = NULL;
}
} // namespace search

View file

@ -2,6 +2,7 @@
#include "../indexer/index.hpp"
#include "../geometry/rect2d.hpp"
#include "../base/base.hpp"
#include "../base/mutex.hpp"
#include "../base/runner.hpp"
#include "../std/function.hpp"
#include "../std/scoped_ptr.hpp"
@ -13,6 +14,7 @@ class FeatureType;
namespace search
{
namespace impl { class Query; }
class Result;
class Engine
@ -26,9 +28,13 @@ public:
m2::RectD const & rect,
function<void (Result const &)> const & f);
void OnQueryDelete();
private:
IndexType const * m_pIndex;
scoped_ptr<threads::IRunner> m_pRunner;
threads::Mutex m_mutex;
impl::Query * volatile m_pLastQuery;
};
} // namespace search

View file

@ -120,6 +120,9 @@ void Query::Search(function<void (Result const &)> const & f)
}
}
if (m_bTerminate)
return;
// Category matching.
if (!m_prefix.empty())
{
@ -134,12 +137,21 @@ void Query::Search(function<void (Result const &)> const & f)
}
}
if (m_bTerminate)
return;
// Feature matching.
FeatureProcessor featureProcessor(*this);
int const scale = scales::GetScaleLevel(m_viewport) + 1;
if (scale > scales::GetUpperWorldScale())
{
m_pIndex->ForEachInRect(featureProcessor, m_viewport, scales::GetUpperWorldScale());
if (m_bTerminate)
return;
}
m_pIndex->ForEachInRect(featureProcessor, m_viewport, min(scales::GetUpperScale(), scale));
if (m_bTerminate)
return;
vector<Result> results;
results.reserve(m_results.size());