From be9d13f61bac225210c560587526116c52232593 Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Mon, 16 Jul 2018 21:52:36 +0300 Subject: [PATCH] [search] Add helper for fast DiscoveryButton search --- search/utils.cpp | 39 +++++++++++++++++++++++++++++++++++++++ search/utils.hpp | 9 +++++++++ 2 files changed, 48 insertions(+) diff --git a/search/utils.cpp b/search/utils.cpp index c316995269..b8defe8f63 100644 --- a/search/utils.cpp +++ b/search/utils.cpp @@ -1,8 +1,14 @@ #include "search/utils.hpp" +#include "search/categories_cache.hpp" +#include "search/features_filter.hpp" +#include "search/geometry_cache.hpp" +#include "search/mwm_context.hpp" + #include "indexer/data_source.hpp" #include +#include using namespace std; @@ -63,4 +69,37 @@ MwmSet::MwmHandle FindWorld(DataSource const & dataSource) dataSource.GetMwmsInfo(infos); return FindWorld(dataSource, infos); } + +void ForEachOfTypesInRect(DataSource const & dataSource, set const & types, + m2::RectD const & pivot, FeatureIndexCallback const & fn) +{ + vector> infos; + dataSource.GetMwmsInfo(infos); + + CategoriesCache cache(types, {} /* cancellable */); + auto pivotRectsCache = PivotRectsCache(1 /* maxNumEntries */, {} /* cancellable */, + max(pivot.SizeX(), pivot.SizeY()) /* maxRadiusMeters */); + + for (auto const & info : infos) + { + if (!pivot.IsIntersect(info->m_bordersRect)) + continue; + + auto handle = dataSource.GetMwmHandleById(MwmSet::MwmId(info)); + auto & value = *handle.GetValue(); + if (!value.HasSearchIndex()) + continue; + + MwmContext const mwmContext(move(handle)); + auto features = cache.Get(mwmContext); + + auto const pivotFeatures = pivotRectsCache.Get(mwmContext, pivot, scales::GetUpperScale()); + ViewportFilter const filter(pivotFeatures, 0 /* threshold */); + features = filter.Filter(features); + MwmSet::MwmId mwmId(info); + features.ForEach([&fn, &mwmId](uint64_t bit) { + fn(FeatureID(mwmId, ::base::asserted_cast(bit))); + }); + } +} } // namespace search diff --git a/search/utils.hpp b/search/utils.hpp index 11d5cd97dd..390e30cd0e 100644 --- a/search/utils.hpp +++ b/search/utils.hpp @@ -5,11 +5,14 @@ #include "search/token_slice.hpp" #include "indexer/categories_holder.hpp" +#include "indexer/feature_decl.hpp" #include "indexer/mwm_set.hpp" #include "indexer/search_delimiters.hpp" #include "indexer/search_string_utils.hpp" #include "indexer/trie.hpp" +#include "geometry/rect2d.hpp" + #include "base/levenshtein_dfa.hpp" #include "base/stl_helpers.hpp" #include "base/string_utils.hpp" @@ -18,6 +21,7 @@ #include #include #include +#include #include class DataSource; @@ -117,4 +121,9 @@ bool FillCategories(QuerySliceOnRawStrings const & slice, Locales const & loc MwmSet::MwmHandle FindWorld(DataSource const & dataSource, std::vector> const & infos); MwmSet::MwmHandle FindWorld(DataSource const & dataSource); + +using FeatureIndexCallback = std::function; +// Applies |fn| to each feature index of type from |types| in |rect|. +void ForEachOfTypesInRect(DataSource const & dataSource, std::set const & types, + m2::RectD const & rect, FeatureIndexCallback const & fn); } // namespace search