From 431c5bd14dfc51cde778a2de68a5c046973fc7dc Mon Sep 17 00:00:00 2001 From: vng Date: Mon, 5 Mar 2012 23:03:21 +0300 Subject: [PATCH] [search] Do not add duplicating results after additional search. --- search/result.cpp | 13 +++++++++++++ search/result.hpp | 4 ++++ search/search_query.cpp | 8 ++++---- search/search_query.hpp | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/search/result.cpp b/search/result.cpp index a10f0be29b..661b3a6b4a 100644 --- a/search/result.cpp +++ b/search/result.cpp @@ -53,4 +53,17 @@ char const * Result::GetSuggestionString() const return m_suggestionStr.c_str(); } +bool Result::operator== (Result const & r) const +{ + return (m_str == r.m_str && m_region == r.m_region && m_featureType == r.m_featureType && + GetResultType() == r.GetResultType() && + my::AlmostEqual(m_distanceFromCenter, r.m_distanceFromCenter)); +} + +void Results::AddResultCheckExisting(Result const & r) +{ + if (find(m_vec.begin(), m_vec.end(), r) == m_vec.end()) + AddResult(r); +} + } // namespace search diff --git a/search/result.hpp b/search/result.hpp index 1c02d88f61..ba5ca7b82c 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -43,6 +43,8 @@ public: // String to write in the search box. char const * GetSuggestionString() const; + bool operator== (Result const & r) const; + private: string m_str, m_region, m_flag, m_type; m2::RectD m_featureRect; @@ -57,6 +59,8 @@ class Results public: inline void AddResult(Result const & r) { m_vec.push_back(r); } + void AddResultCheckExisting(Result const & r); + inline void Clear() { m_vec.clear(); } typedef vector::const_iterator IterT; diff --git a/search/search_query.cpp b/search/search_query.cpp index a04c9b9be3..ee65404f9c 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -262,7 +262,7 @@ void Query::Search(string const & query, Results & res, unsigned int resultsNeed SearchFeatures(); if (m_cancel) return; - FlushResults(res); + FlushResults(res, &Results::AddResult); } namespace @@ -453,7 +453,7 @@ namespace impl }; } -void Query::FlushResults(Results & res) +void Query::FlushResults(Results & res, void (Results::*pAddFn)(Result const &)) { vector indV; @@ -507,7 +507,7 @@ void Query::FlushResults(Results & res) LOG(LDEBUG, (indV[i])); - res.AddResult(MakeResult(*(indV[i]))); + (res.*pAddFn)(MakeResult(*(indV[i]))); } } @@ -916,7 +916,7 @@ void Query::SearchAdditional(Results & res) } } - FlushResults(res); + FlushResults(res, &Results::AddResultCheckExisting); } } diff --git a/search/search_query.hpp b/search/search_query.hpp index bbf4283cf3..50bfff4932 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -91,7 +91,7 @@ private: typedef trie::ValueReader::ValueType TrieValueT; void AddResultFromTrie(TrieValueT const & val, size_t mwmID); - void FlushResults(Results & res); + void FlushResults(Results & res, void (Results::*pAddFn)(Result const &)); struct Params {