[search] Removed multiple viewports.

This commit is contained in:
Yuri Gorshenin 2017-10-27 15:49:44 +03:00 committed by Vladimir Byko-Ianko
parent a6ccd8ba2e
commit eda43f1837
3 changed files with 35 additions and 93 deletions

View file

@ -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

View file

@ -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<shared_ptr<MwmInfo>>;
using TOffsetsVector = map<MwmSet::MwmId, vector<uint32_t>>;
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<uint32_t> m_preferredTypes;
m2::RectD m_viewport[COUNT_V];
m2::RectD m_viewport;
m2::PointD m_pivot;
m2::PointD m_position;
double m_minDistanceOnMapBetweenResults;

View file

@ -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<EditorDelegate>(m_engine));
SetViewport(m2::RectD(MercatorBounds::minX, MercatorBounds::minY,
MercatorBounds::maxX, MercatorBounds::maxY));
}
SearchTest::~SearchTest()