diff --git a/search/geocoder.cpp b/search/geocoder.cpp index 71dd4bfa92..e32fa6dfee 100644 --- a/search/geocoder.cpp +++ b/search/geocoder.cpp @@ -66,6 +66,7 @@ size_t constexpr kMaxNumCities = 5; size_t constexpr kMaxNumStates = 5; size_t constexpr kMaxNumVillages = 5; size_t constexpr kMaxNumCountries = 5; +double constexpr kMaxViewportRadiusM = 50.0 * 1000; // This constant limits number of localities that will be extracted // from World map. Villages are not counted here as they're not @@ -275,14 +276,14 @@ double GetDistanceMeters(m2::PointD const & pivot, m2::RectD const & rect) struct KeyedMwmInfo { - KeyedMwmInfo(shared_ptr const & info, m2::PointD const & position, + KeyedMwmInfo(shared_ptr const & info, boost::optional const & position, m2::RectD const & pivot, bool inViewport) : m_info(info) { auto const & rect = m_info->m_bordersRect; m_similarity = GetSimilarity(pivot, rect); m_distance = GetDistanceMeters(pivot.Center(), rect); - if (!inViewport && rect.IsPointInside(position)) + if (!inViewport && position && rect.IsPointInside(*position)) m_distance = 0.0; } @@ -302,8 +303,8 @@ struct KeyedMwmInfo // with pivot, suffix consists of all other maps ordered by minimum // distance from pivot. Returns number of maps in prefix. // In viewport search mode, prefers mwms that contain the user's position. -size_t OrderCountries(m2::PointD const & position, m2::RectD const & pivot, bool inViewport, - vector> & infos) +size_t OrderCountries(boost::optional const & position, m2::RectD const & pivot, + bool inViewport, vector> & infos) { // TODO (@y): remove this if crashes in this function // disappear. Otherwise, remove null infos and re-check MwmSet @@ -325,7 +326,7 @@ size_t OrderCountries(m2::PointD const & position, m2::RectD const & pivot, bool infos.emplace_back(info.m_info); auto intersects = [&](shared_ptr const & info) -> bool { - if (!inViewport && info->m_bordersRect.IsPointInside(position)) + if (!inViewport && position && info->m_bordersRect.IsPointInside(*position)) return true; return pivot.IsIntersect(info->m_bordersRect); }; @@ -350,7 +351,7 @@ Geocoder::Geocoder(DataSource const & dataSource, storage::CountryInfoGetter con , m_cuisineFilter(m_foodCache) , m_cancellable(cancellable) , m_citiesBoundaries(citiesBoundaries) - , m_pivotRectsCache(kPivotRectsCacheSize, m_cancellable, Processor::kMaxViewportRadiusM) + , m_pivotRectsCache(kPivotRectsCacheSize, m_cancellable, kMaxViewportRadiusM) , m_localityRectsCache(kLocalityRectsCacheSize, m_cancellable) , m_filter(nullptr) , m_matcher(nullptr) diff --git a/search/geocoder.hpp b/search/geocoder.hpp index 13d8aed98d..bae2219d5a 100644 --- a/search/geocoder.hpp +++ b/search/geocoder.hpp @@ -44,6 +44,8 @@ #include "std/unordered_map.hpp" #include "std/vector.hpp" +#include + class CategoriesHolder; class DataSource; class MwmValue; @@ -83,7 +85,7 @@ public: { Mode m_mode = Mode::Everywhere; m2::RectD m_pivot; - m2::PointD m_position; + boost::optional m_position; Locales m_categoryLocales; shared_ptr m_hotelsFilter; vector m_cuisineTypes; diff --git a/search/pre_ranker.cpp b/search/pre_ranker.cpp index 1d07bac79f..3eb0df01d7 100644 --- a/search/pre_ranker.cpp +++ b/search/pre_ranker.cpp @@ -205,7 +205,8 @@ void PreRanker::Filter(bool viewportSearch) { double const kPedestrianRadiusMeters = 2500.0; PreRankerResult::CategoriesComparator comparator; - comparator.m_positionIsInsideViewport = m_params.m_viewport.IsPointInside(m_params.m_position); + comparator.m_positionIsInsideViewport = + m_params.m_position && m_params.m_viewport.IsPointInside(*m_params.m_position); comparator.m_detailedScale = MercatorBounds::DistanceOnEarth( m_params.m_viewport.LeftTop(), m_params.m_viewport.RightBottom()) < 2 * kPedestrianRadiusMeters; diff --git a/search/pre_ranker.hpp b/search/pre_ranker.hpp index 5648286807..354a169b88 100644 --- a/search/pre_ranker.hpp +++ b/search/pre_ranker.hpp @@ -16,6 +16,8 @@ #include "std/utility.hpp" #include "std/vector.hpp" +#include + class DataSource; namespace search @@ -39,7 +41,7 @@ public: // compute the distance from a feature to the pivot. m2::PointD m_accuratePivotCenter; - m2::PointD m_position; + boost::optional m_position; m2::RectD m_viewport; int m_scale = 0; diff --git a/search/processor.cpp b/search/processor.cpp index 3fbde39168..bde8954509 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -69,18 +69,6 @@ enum LanguageTier LANGUAGE_TIER_COUNT }; -m2::RectD NormalizeViewport(m2::RectD viewport) -{ - m2::RectD minViewport = MercatorBounds::RectByCenterXYAndSizeInMeters( - viewport.Center(), Processor::kMinViewportRadiusM); - viewport.Add(minViewport); - - m2::RectD maxViewport = MercatorBounds::RectByCenterXYAndSizeInMeters( - viewport.Center(), Processor::kMaxViewportRadiusM); - VERIFY(viewport.Intersect(maxViewport), ()); - return viewport; -} - m2::RectD GetRectAroundPosition(m2::PointD const & position) { double constexpr kMaxPositionRadiusM = 50.0 * 1000; @@ -139,15 +127,12 @@ void RemoveStopWordsIfNeeded(QueryTokens & tokens, strings::UniString & prefix) // static size_t const Processor::kPreResultsCount = 200; -double const Processor::kMinViewportRadiusM = 5.0 * 1000; -double const Processor::kMaxViewportRadiusM = 50.0 * 1000; Processor::Processor(DataSource const & dataSource, CategoriesHolder const & categories, vector const & suggests, storage::CountryInfoGetter const & infoGetter) : m_categories(categories) , m_infoGetter(infoGetter) - , m_position(0, 0) , m_villagesCache(static_cast(*this)) , m_citiesBoundaries(dataSource) , m_keywordsScorer(LanguageTier::LANGUAGE_TIER_COUNT) @@ -302,22 +287,22 @@ void Processor::SetQuery(string const & query) m2::PointD Processor::GetPivotPoint(bool viewportSearch) const { auto const & viewport = GetViewport(); - if (viewportSearch || !viewport.IsPointInside(GetPosition())) + if (viewportSearch || !m_position || !viewport.IsPointInside(*m_position)) return viewport.Center(); - return GetPosition(); + + CHECK(m_position, ()); + return *m_position; } m2::RectD Processor::GetPivotRect(bool viewportSearch) const { auto const & viewport = GetViewport(); - if (viewportSearch) + if (viewportSearch || !m_position || !viewport.IsPointInside(*m_position)) return viewport; - if (viewport.IsPointInside(GetPosition())) - return GetRectAroundPosition(GetPosition()); - - return NormalizeViewport(viewport); + CHECK(m_position, ()); + return GetRectAroundPosition(*m_position); } m2::RectD const & Processor::GetViewport() const @@ -407,10 +392,7 @@ void Processor::Search(SearchParams const & params) auto const & viewport = params.m_viewport; ASSERT(viewport.IsValid(), ()); - if (params.m_position) - SetPosition(*params.m_position); - else - SetPosition(viewport.Center()); + m_position = params.m_position; SetInputLocale(params.m_inputLocale); @@ -483,9 +465,9 @@ void Processor::SearchPlusCode() } else if (openlocationcode::IsShort(query)) { - if (GetPosition().IsAlmostZero()) + if (!m_position) return; - ms::LatLon const latLon = MercatorBounds::ToLatLon(GetPosition()); + ms::LatLon const latLon = MercatorBounds::ToLatLon(*m_position); code = openlocationcode::RecoverNearest(query, {latLon.lat, latLon.lon}); } @@ -560,7 +542,7 @@ void Processor::InitGeocoder(Geocoder::Params & geocoderParams, SearchParams con geocoderParams.m_mode = searchParams.m_mode; geocoderParams.m_pivot = GetPivotRect(viewportSearch); - geocoderParams.m_position = GetPosition(); + geocoderParams.m_position = m_position; geocoderParams.m_categoryLocales = GetCategoryLocales(); geocoderParams.m_hotelsFilter = searchParams.m_hotelsFilter; geocoderParams.m_cuisineTypes = m_cuisineTypes; @@ -582,7 +564,7 @@ void Processor::InitPreRanker(Geocoder::Params const & geocoderParams, params.m_viewport = GetViewport(); params.m_accuratePivotCenter = GetPivotPoint(viewportSearch); - params.m_position = GetPosition(); + params.m_position = m_position; params.m_scale = geocoderParams.GetScale(); params.m_limit = max(kPreResultsCount, searchParams.m_maxNumResults); params.m_viewportSearch = viewportSearch; @@ -604,7 +586,7 @@ void Processor::InitRanker(Geocoder::Params const & geocoderParams, params.m_viewport = GetViewport(); params.m_limit = searchParams.m_maxNumResults; - params.m_position = GetPosition(); + params.m_pivot = m_position ? *m_position : GetViewport().Center(); params.m_pivotRegion = GetPivotRegion(); params.m_preferredTypes = m_preferredTypes; params.m_suggestsEnabled = searchParams.m_suggestsEnabled; diff --git a/search/processor.hpp b/search/processor.hpp index cfca896d3a..ff0f5680da 100644 --- a/search/processor.hpp +++ b/search/processor.hpp @@ -32,6 +32,8 @@ #include #include +#include + class FeatureType; class CategoriesHolder; class DataSource; @@ -59,9 +61,6 @@ public: // Maximum result candidates count for each viewport/criteria. static size_t const kPreResultsCount; - static double const kMinViewportRadiusM; - static double const kMaxViewportRadiusM; - Processor(DataSource const & dataSource, CategoriesHolder const & categories, std::vector const & suggests, storage::CountryInfoGetter const & infoGetter); @@ -69,9 +68,7 @@ public: void SetPreferredLocale(std::string const & locale); void SetInputLocale(std::string const & locale); void SetQuery(std::string const & query); - inline void SetPosition(m2::PointD const & position) { m_position = position; } inline std::string const & GetPivotRegion() const { return m_region; } - inline m2::PointD const & GetPosition() const { return m_position; } inline bool IsEmptyQuery() const { return m_prefix.empty() && m_tokens.empty(); } @@ -127,7 +124,7 @@ protected: std::vector m_cuisineTypes; m2::RectD m_viewport; - m2::PointD m_position; + boost::optional m_position; // Suggestions language code, not the same as we use in mwm data int8_t m_inputLocaleCode = StringUtf8Multilang::kUnsupportedLanguageCode; diff --git a/search/ranker.cpp b/search/ranker.cpp index 8733c2ccfd..6e4ea87bd6 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -379,7 +379,7 @@ public: if (!LoadFeature(preRankerResult.GetId(), ft, center, name, country)) return {}; - RankerResult r(ft, center, m_ranker.m_params.m_position /* pivot */, name, country); + RankerResult r(ft, center, m_ranker.m_params.m_pivot, name, country); search::RankingInfo info; InitRankingInfo(ft, center, preRankerResult, info); diff --git a/search/ranker.hpp b/search/ranker.hpp index 675864affa..bc3bf241ec 100644 --- a/search/ranker.hpp +++ b/search/ranker.hpp @@ -49,7 +49,7 @@ public: { int8_t m_currentLocaleCode = CategoriesHolder::kEnglishCode; m2::RectD m_viewport; - m2::PointD m_position; + m2::PointD m_pivot; string m_pivotRegion; std::vector m_preferredTypes; bool m_suggestsEnabled = false;