diff --git a/map/framework.hpp b/map/framework.hpp index 91c5cc2e81..52b1bbcc21 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -331,6 +331,8 @@ private: void FillSearchResultsMarks(search::Results const & results); public: + using TSearchRequest = search::QuerySaver::TSearchRequest; + m2::RectD GetCurrentViewport() const; void UpdateUserViewportChanged(); @@ -348,8 +350,9 @@ public: bool IsISActive() const { return !m_lastSearch.m_query.empty(); } void CancelInteractiveSearch(); - list const & GetLastSearchQueries() const { return m_searchQuerySaver.Get(); } - void SaveSearchQuery(string const & query) { m_searchQuerySaver.Add(query); } + list const & GetLastSearchQueries() const { return m_searchQuerySaver.Get(); } + void SaveSearchQuery(TSearchRequest const & query) { m_searchQuerySaver.Add(query); } + void ClearSearchHistory() { m_searchQuerySaver.Clear(); } /// Calculate distance and direction to POI for the given position. /// @param[in] point POI's position; diff --git a/search/query_saver.cpp b/search/query_saver.cpp index ca1135bea6..9c39f9d947 100644 --- a/search/query_saver.cpp +++ b/search/query_saver.cpp @@ -70,11 +70,8 @@ QuerySaver::QuerySaver() Load(); } -void QuerySaver::Add(string const & query) +void QuerySaver::Add(TSearchRequest const & query) { - if (query.empty()) - return; - // Remove items if needed. auto const it = find(m_topQueries.begin(), m_topQueries.end(), query); if (it != m_topQueries.end()) @@ -101,9 +98,12 @@ void QuerySaver::Serialize(string & data) const WriteToSink(writer, size); for (auto const & query : m_topQueries) { - size = query.size(); + size = query.first.size(); WriteToSink(writer, size); - writer.Write(query.c_str(), size); + writer.Write(query.first.c_str(), size); + size = query.second.size(); + WriteToSink(writer, size); + writer.Write(query.second.c_str(), size); } data = base64::Encode(string(rawData.begin(), rawData.end())); } @@ -119,10 +119,14 @@ void QuerySaver::Deserialize(string const & data) for (TLength i = 0; i < queriesCount; ++i) { + TLength localeLength = ReadPrimitiveFromSource(reader); + vector locale(localeLength); + reader.Read(&locale[0], localeLength); TLength stringLength = ReadPrimitiveFromSource(reader); vector str(stringLength); reader.Read(&str[0], stringLength); - m_topQueries.emplace_back(&str[0], stringLength); + m_topQueries.emplace_back(make_pair(string(&locale[0], localeLength), + string(&str[0], stringLength))); } } diff --git a/search/query_saver.hpp b/search/query_saver.hpp index fb7a2c7259..1d677309c5 100644 --- a/search/query_saver.hpp +++ b/search/query_saver.hpp @@ -1,6 +1,7 @@ #include "std/list.hpp" #include "std/string.hpp" #include "std/vector.hpp" +#include "std/utility.hpp" namespace search { @@ -8,11 +9,13 @@ namespace search class QuerySaver { public: + /// Search request . + using TSearchRequest = pair; QuerySaver(); - void Add(string const & query); + void Add(TSearchRequest const & query); /// Returns several last saved queries from newest to oldest query. /// @see kMaxSuggestCount in implementation file. - list const & Get() const { return m_topQueries; } + list const & Get() const { return m_topQueries; } /// Clear last queries storage. All data will be lost. void Clear(); @@ -25,6 +28,6 @@ private: void Save(); void Load(); - list m_topQueries; + list m_topQueries; }; } // namespace search diff --git a/search/search_tests/query_saver_tests.cpp b/search/search_tests/query_saver_tests.cpp index 513169a8c9..993fb4e0d8 100644 --- a/search/search_tests/query_saver_tests.cpp +++ b/search/search_tests/query_saver_tests.cpp @@ -7,8 +7,8 @@ namespace { -string const record1("test record1"); -string const record2("sometext"); +search::QuerySaver::TSearchRequest const record1("RU_ru" ,"test record1"); +search::QuerySaver::TSearchRequest const record2("En_us", "sometext"); } namespace search @@ -18,7 +18,7 @@ UNIT_TEST(QuerySaverFogTest) QuerySaver saver; saver.Clear(); saver.Add(record1); - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 1, ()); TEST_EQUAL(result.front(), record1, ()); saver.Clear(); @@ -41,14 +41,14 @@ UNIT_TEST(QuerySaverOrderingTest) saver.Add(record1); saver.Add(record2); { - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 2, ()); TEST_EQUAL(result.back(), record1, ()); TEST_EQUAL(result.front(), record2, ()); } saver.Add(record1); { - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 2, ()); TEST_EQUAL(result.front(), record1, ()); TEST_EQUAL(result.back(), record2, ()); @@ -69,7 +69,7 @@ UNIT_TEST(QuerySaverSerializerTest) TEST_EQUAL(saver.Get().size(), 0, ()); saver.Deserialize(data); - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 2, ()); TEST_EQUAL(result.back(), record1, ()); TEST_EQUAL(result.front(), record2, ()); @@ -88,7 +88,7 @@ UNIT_TEST(QuerySaverCorruptedStringTest) { exceptionThrown = true; } - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 0, ()); TEST(exceptionThrown, ()); } @@ -103,7 +103,7 @@ UNIT_TEST(QuerySaverPersistanceStore) } { QuerySaver saver; - list const & result = saver.Get(); + list const & result = saver.Get(); TEST_EQUAL(result.size(), 2, ()); TEST_EQUAL(result.back(), record1, ()); TEST_EQUAL(result.front(), record2, ());