From bc01869e14a642f858784cf388880104689d4a9a Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Mon, 25 Dec 2017 16:04:52 +0300 Subject: [PATCH] [search] Bookmarks are exposed to search::Processor. --- map/framework.cpp | 12 ++-- map/search_api.cpp | 65 ++++++++++++++++++- map/search_api.hpp | 10 +++ search/CMakeLists.txt | 1 + search/bookmarks/data.cpp | 21 ++++++ search/bookmarks/data.hpp | 2 + search/bookmarks/processor.cpp | 6 +- search/bookmarks/processor.hpp | 5 +- search/engine.cpp | 18 +++++ search/engine.hpp | 13 +++- search/processor.cpp | 15 +++++ search/processor.hpp | 6 ++ .../processor_test.cpp | 2 +- .../bookmarks_processor_tests.cpp | 3 - 14 files changed, 158 insertions(+), 21 deletions(-) create mode 100644 search/bookmarks/data.cpp diff --git a/map/framework.cpp b/map/framework.cpp index bcf791a541..a19d056c2f 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -433,17 +433,17 @@ Framework::Framework(FrameworkParams const & params) m_bmManager = make_unique(BookmarkManager::Callbacks( [this]() -> StringsBundle const & { return m_stringsBundle; }, - [](std::vector> const & marks) + [this](std::vector> const & marks) { - // TODO: Add processing of the created marks. + GetSearchAPI().OnBookmarksCreated(marks); }, - [](std::vector> const & marks) + [this](std::vector> const & marks) { - // TODO: Add processing of the updated marks. + GetSearchAPI().OnBookmarksUpdated(marks); }, - [](std::vector const & marks) + [this](std::vector const & marks) { - // TODO: Add processing of the deleted marks. + GetSearchAPI().OnBookmarksDeleted(marks); })); m_ParsedMapApi.SetBookmarkManager(m_bmManager.get()); diff --git a/map/search_api.cpp b/map/search_api.cpp index 6611decf99..ca383b71f1 100644 --- a/map/search_api.cpp +++ b/map/search_api.cpp @@ -5,6 +5,7 @@ #include "search/geometry_utils.hpp" #include "search/hotels_filter.hpp" +#include "search/bookmarks/processor.hpp" #include "storage/downloader_search_params.hpp" @@ -14,14 +15,18 @@ #include "base/string_utils.hpp" +#include +#include #include -#include +#include using namespace search; using namespace std; namespace { +using BookmarkIdDoc = pair; + double const kDistEqualQueryMeters = 100.0; // Cancels search query by |handle|. @@ -38,6 +43,39 @@ bool IsCianMode(string query) strings::AsciiToLower(query); return query == "cian"; } + +bookmarks::Id MarkIDToBookmarkId(df::MarkID id) +{ + static_assert(is_integral::value, ""); + static_assert(is_integral::value, ""); + + static_assert(is_unsigned::value, ""); + static_assert(is_unsigned::value, ""); + + static_assert(sizeof(bookmarks::Id) >= sizeof(df::MarkID), ""); + + return static_cast(id); +} + +void AppendBookmarkIdDocs(vector> const & marks, + vector & result) +{ + result.reserve(result.size() + marks.size()); + + for (auto const & mark : marks) + { + auto const & id = mark.first; + auto const & data = mark.second; + result.emplace_back(MarkIDToBookmarkId(id), + bookmarks::Doc(data.GetName(), data.GetDescription(), data.GetType())); + } +} + +void AppendBookmarkIds(vector const & marks, vector & result) +{ + result.reserve(result.size() + marks.size()); + transform(marks.begin(), marks.end(), back_inserter(result), MarkIDToBookmarkId); +} } // namespace SearchAPI::SearchAPI(Index & index, storage::Storage const & storage, @@ -204,7 +242,7 @@ void SearchAPI::CancelAllSearches() CancelSearch(static_cast(i)); } -void SearchAPI::RunUITask(std::function fn) { return m_delegate.RunUITask(fn); } +void SearchAPI::RunUITask(function fn) { return m_delegate.RunUITask(fn); } void SearchAPI::SetHotelDisplacementMode() { @@ -227,6 +265,27 @@ bool SearchAPI::IsLocalAdsCustomer(Result const & result) const return m_delegate.IsLocalAdsCustomer(result); } +void SearchAPI::OnBookmarksCreated(vector> const & marks) +{ + vector data; + AppendBookmarkIdDocs(marks, data); + m_engine.OnBookmarksCreated(data); +} + +void SearchAPI::OnBookmarksUpdated(vector> const & marks) +{ + vector data; + AppendBookmarkIdDocs(marks, data); + m_engine.OnBookmarksUpdated(data); +} + +void SearchAPI::OnBookmarksDeleted(vector const & marks) +{ + vector data; + AppendBookmarkIds(marks, data); + m_engine.OnBookmarksDeleted(data); +} + bool SearchAPI::Search(SearchParams const & params, bool forceSearch) { if (m_delegate.ParseSearchQueryCommand(params)) @@ -300,7 +359,7 @@ bool SearchAPI::QueryMayBeSkipped(SearchParams const & prevParams, return true; } -void SearchAPI::UpdateSponsoredMode(std::string const & query, +void SearchAPI::UpdateSponsoredMode(string const & query, booking::filter::availability::Params const & params) { m_sponsoredMode = SponsoredMode::None; diff --git a/map/search_api.hpp b/map/search_api.hpp index fd334196c6..89dadbd61c 100644 --- a/map/search_api.hpp +++ b/map/search_api.hpp @@ -1,5 +1,7 @@ #pragma once +#include "map/bookmark.hpp" + #include "search/downloader_search_callback.hpp" #include "search/engine.hpp" #include "search/everywhere_search_callback.hpp" @@ -8,6 +10,8 @@ #include "search/search_params.hpp" #include "search/viewport_search_callback.hpp" +#include "drape_frontend/user_marks_provider.hpp" + #include "geometry/point2d.hpp" #include "geometry/rect2d.hpp" @@ -15,6 +19,8 @@ #include #include #include +#include +#include #include @@ -132,6 +138,10 @@ public: search::Results::ConstIter end) override; bool IsLocalAdsCustomer(search::Result const & result) const override; + void OnBookmarksCreated(std::vector> const & marks); + void OnBookmarksUpdated(std::vector> const & marks); + void OnBookmarksDeleted(std::vector const & marks); + private: struct SearchIntent { diff --git a/search/CMakeLists.txt b/search/CMakeLists.txt index 9698072856..3832eb9be1 100644 --- a/search/CMakeLists.txt +++ b/search/CMakeLists.txt @@ -7,6 +7,7 @@ set( approximate_string_match.hpp base/inverted_list.hpp base/mem_search_index.hpp + bookmarks/data.cpp bookmarks/data.hpp bookmarks/processor.cpp bookmarks/processor.hpp diff --git a/search/bookmarks/data.cpp b/search/bookmarks/data.cpp new file mode 100644 index 0000000000..4f1d291c79 --- /dev/null +++ b/search/bookmarks/data.cpp @@ -0,0 +1,21 @@ +#include "search/bookmarks/data.hpp" + +#include + +using namespace std; + +namespace search +{ +namespace bookmarks +{ +string DebugPrint(Data const & data) +{ + ostringstream os; + os << "Data ["; + os << "name: " << data.m_name << ", "; + os << "description: " << data.m_description << ", "; + os << "type: " << data.m_type << "]"; + return os.str(); +} +} // namespace bookmarks +} // namespace search diff --git a/search/bookmarks/data.hpp b/search/bookmarks/data.hpp index aca415e66f..e34bf4e558 100644 --- a/search/bookmarks/data.hpp +++ b/search/bookmarks/data.hpp @@ -38,5 +38,7 @@ struct Data std::string m_description; std::string m_type; }; + +std::string DebugPrint(Data const & data); } // namespace bookmarks } // namespace search diff --git a/search/bookmarks/processor.cpp b/search/bookmarks/processor.cpp index db4aa8de87..076a721558 100644 --- a/search/bookmarks/processor.cpp +++ b/search/bookmarks/processor.cpp @@ -37,7 +37,7 @@ struct RankingInfo struct IdInfoPair { - IdInfoPair(Processor::Id const & id, RankingInfo const & info) : m_id(id), m_info(info) {} + IdInfoPair(Id const & id, RankingInfo const & info) : m_id(id), m_info(info) {} bool operator<(IdInfoPair const & rhs) const { @@ -46,7 +46,7 @@ struct IdInfoPair return m_id < rhs.m_id; } - Processor::Id m_id; + Id m_id; RankingInfo m_info; }; @@ -76,7 +76,7 @@ void Processor::Erase(Id const & id, Doc const & doc) m_docs.erase(id); } -vector Processor::Search(QueryParams const & params) const +vector Processor::Search(QueryParams const & params) const { set ids; auto insertId = MakeInsertFunctor(ids); diff --git a/search/bookmarks/processor.hpp b/search/bookmarks/processor.hpp index dbe0b50b99..5e94498c3d 100644 --- a/search/bookmarks/processor.hpp +++ b/search/bookmarks/processor.hpp @@ -17,11 +17,12 @@ namespace search { namespace bookmarks { +using Id = uint64_t; +using Doc = Data; + class Processor : public IdfMap::Delegate { public: - using Id = uint64_t; - using Doc = Data; using Index = base::MemSearchIndex; ~Processor() override = default; diff --git a/search/engine.cpp b/search/engine.cpp index 0c360a264c..50f5dd1413 100644 --- a/search/engine.cpp +++ b/search/engine.cpp @@ -157,6 +157,24 @@ void Engine::LoadCitiesBoundaries() [this](Processor & processor) { processor.LoadCitiesBoundaries(); }); } +void Engine::OnBookmarksCreated(vector> const & marks) +{ + PostMessage(Message::TYPE_BROADCAST, + [this, marks](Processor & processor) { processor.OnBookmarksCreated(marks); }); +} + +void Engine::OnBookmarksUpdated(vector> const & marks) +{ + PostMessage(Message::TYPE_BROADCAST, + [this, marks](Processor & processor) { processor.OnBookmarksUpdated(marks); }); +} + +void Engine::OnBookmarksDeleted(vector const & marks) +{ + PostMessage(Message::TYPE_BROADCAST, + [this, marks](Processor & processor) { processor.OnBookmarksDeleted(marks); }); +} + void Engine::MainLoop(Context & context) { while (true) diff --git a/search/engine.hpp b/search/engine.hpp index a274a11baf..37d43f6362 100644 --- a/search/engine.hpp +++ b/search/engine.hpp @@ -1,5 +1,6 @@ #pragma once +#include "search/bookmarks/processor.hpp" #include "search/result.hpp" #include "search/search_params.hpp" #include "search/suggest.hpp" @@ -19,6 +20,7 @@ #include "std/shared_ptr.hpp" #include "std/string.hpp" #include "std/unique_ptr.hpp" +#include "std/utility.hpp" #include "std/vector.hpp" #include "std/weak_ptr.hpp" @@ -105,10 +107,14 @@ public: // Posts request to reload cities boundaries tables. void LoadCitiesBoundaries(); + void OnBookmarksCreated(vector> const & marks); + void OnBookmarksUpdated(vector> const & marks); + void OnBookmarksDeleted(vector const & marks); + private: struct Message { - using TFn = function; + using Fn = function; enum Type { @@ -116,12 +122,13 @@ private: TYPE_BROADCAST }; - Message(Type type, TFn && fn) : m_type(type), m_fn(move(fn)) {} + template + Message(Type type, Gn && gn) : m_type(type), m_fn(forward(gn)) {} void operator()(Processor & processor) { m_fn(processor); } Type m_type; - TFn m_fn; + Fn m_fn; }; // alignas() is used here to prevent false-sharing between different diff --git a/search/processor.cpp b/search/processor.cpp index ca066ded7c..571099fd30 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -317,6 +317,21 @@ void Processor::LoadCitiesBoundaries() LOG(LWARNING, ("Can't load cities boundaries")); } +void Processor::OnBookmarksCreated(vector> const & /* marks */) +{ + // TODO(@y): do something useful with marks. +} + +void Processor::OnBookmarksUpdated(vector> const & /* marks */) +{ + // TODO(@y): do something useful with marks. +} + +void Processor::OnBookmarksDeleted(vector const & /* marks */) +{ + // TODO(@y): do something useful with marks. +} + Locales Processor::GetCategoryLocales() const { static int8_t const enLocaleCode = CategoriesHolder::MapLocaleToInteger("en"); diff --git a/search/processor.hpp b/search/processor.hpp index 83a3ea6067..7b04db3694 100644 --- a/search/processor.hpp +++ b/search/processor.hpp @@ -1,5 +1,6 @@ #pragma once +#include "search/bookmarks/processor.hpp" #include "search/categories_cache.hpp" #include "search/categories_set.hpp" #include "search/cities_boundaries_table.hpp" @@ -27,6 +28,7 @@ #include "std/cstdint.hpp" #include "std/string.hpp" +#include "std/utility.hpp" #include "std/vector.hpp" class FeatureType; @@ -90,6 +92,10 @@ public: void ClearCaches(); void LoadCitiesBoundaries(); + void OnBookmarksCreated(vector> const & marks); + void OnBookmarksUpdated(vector> const & marks); + void OnBookmarksDeleted(vector const & marks); + protected: Locales GetCategoryLocales() const; diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp index d6cc9d7dfa..dbf8137d3a 100644 --- a/search/search_integration_tests/processor_test.cpp +++ b/search/search_integration_tests/processor_test.cpp @@ -585,7 +585,7 @@ UNIT_CLASS_TEST(ProcessorTest, TestPostcodes) Index::FeaturesLoaderGuard loader(m_index, countryId); FeatureType ft; - TEST(loader.GetFeatureByIndex(base::checked_cast(index), ft), ()); + TEST(loader.GetFeatureByIndex(::base::checked_cast(index), ft), ()); auto rule = ExactMatch(countryId, building31); TEST(rule->Matches(ft), ()); diff --git a/search/search_tests/bookmarks_processor_tests.cpp b/search/search_tests/bookmarks_processor_tests.cpp index 604c83c1e2..22455b33fa 100644 --- a/search/search_tests/bookmarks_processor_tests.cpp +++ b/search/search_tests/bookmarks_processor_tests.cpp @@ -18,9 +18,6 @@ namespace class BookmarksProcessorTest { public: - using Id = Processor::Id; - using Doc = Processor::Doc; - void Add(Id const & id, Doc const & doc) { m_processor.Add(id, doc); } void Erase(Id const & id, Doc const & doc) { m_processor.Erase(id, doc); }