diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 68df7ed3ea..55412da569 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -57,6 +57,10 @@ void ProcessMetadata(FeatureType const & ft, Result::Metadata & meta) namespace impl { +PreResult1::PreResult1(): PreResult1(0 /* priority */) {} + +PreResult1::PreResult1(double priority) : m_priority(priority) {} + PreResult1::PreResult1(FeatureID const & fID, double priority, int8_t viewportID, v2::PreRankingInfo const & info) : m_id(fID), m_priority(priority), m_viewportID(viewportID), m_info(info) @@ -64,8 +68,6 @@ PreResult1::PreResult1(FeatureID const & fID, double priority, int8_t viewportID ASSERT(m_id.IsValid(), ()); } -PreResult1::PreResult1(double priority) : m_priority(priority) {} - // static bool PreResult1::LessRank(PreResult1 const & r1, PreResult1 const & r2) { diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index 8322eb7b41..b2dd6f11fd 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -33,11 +33,13 @@ class PreResult1 v2::PreRankingInfo m_info; public: - PreResult1(FeatureID const & fID, double priority, int8_t viewportID, - v2::PreRankingInfo const & info); + PreResult1(); explicit PreResult1(double priority); + PreResult1(FeatureID const & fID, double priority, int8_t viewportID, + v2::PreRankingInfo const & info); + static bool LessRank(PreResult1 const & r1, PreResult1 const & r2); static bool LessPriority(PreResult1 const & r1, PreResult1 const & r2); diff --git a/search/search.pro b/search/search.pro index b24dcac6c4..eafe41860a 100644 --- a/search/search.pro +++ b/search/search.pro @@ -98,6 +98,7 @@ SOURCES += \ v2/locality_scorer.cpp \ v2/mwm_context.cpp \ v2/nested_rects_cache.cpp \ + v2/pre_ranking_info.cpp \ v2/rank_table_cache.cpp \ v2/ranking_info.cpp \ v2/ranking_utils.cpp \ diff --git a/search/search_query.cpp b/search/search_query.cpp index 32f469725e..0b20cccb4f 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -565,6 +565,34 @@ public: bool operator()(ValueT const & r) const { return (m_val.GetID() == r.GetID()); } }; +void RemoveDuplicatingPreResults1(vector & results) +{ + sort(results.begin(), results.end(), LessFeatureID()); + size_t i = 0; + size_t k = 0; + while (i != results.size()) + { + size_t j = i; + size_t b = i; + while (j != results.size() && results[j].GetID() == results[i].GetID()) + { + auto const & curr = results[j].GetInfo(); + auto const & best = results[b].GetInfo(); + if (curr.GetNumTokens() > best.GetNumTokens() || + (curr.GetNumTokens() == best.GetNumTokens() && curr.m_startToken < best.m_startToken)) + { + b = j; + } + ++j; + } + + swap(results[k], results[b]); + ++k; + i = j; + } + results.resize(k); +} + bool IsResultExists(impl::PreResult2 const & p, vector const & indV) { impl::PreResult2::StrictEqualF equalCmp(p); @@ -696,6 +724,8 @@ void Query::MakePreResult2(v2::Geocoder::Params const & params, vector & cont using TPreResultSet = set; TPreResultSet theSet; + RemoveDuplicatingPreResults1(m_results); + sort(m_results.begin(), m_results.end(), &impl::PreResult1::LessPriority); if (kPreResultsCount != 0 && m_results.size() > kPreResultsCount) { diff --git a/search/v2/pre_ranking_info.cpp b/search/v2/pre_ranking_info.cpp new file mode 100644 index 0000000000..d8b84d9fac --- /dev/null +++ b/search/v2/pre_ranking_info.cpp @@ -0,0 +1,22 @@ +#include "search/v2/ranking_info.hpp" + +#include "std/sstream.hpp" + +namespace search +{ +namespace v2 +{ +string DebugPrint(PreRankingInfo const & info) +{ + ostringstream os; + os << "PreRankingInfo ["; + os << "m_distanceToPivot:" << info.m_distanceToPivot << ","; + os << "m_startToken:" << info.m_startToken << ","; + os << "m_endToken:" << info.m_endToken << ","; + os << "m_rank:" << info.m_rank << ","; + os << "m_searchType:" << info.m_searchType; + os << "]"; + return os.str(); +} +} // namespace v2 +} // namespace search diff --git a/search/v2/pre_ranking_info.hpp b/search/v2/pre_ranking_info.hpp index b08bef09ac..5459e4c285 100644 --- a/search/v2/pre_ranking_info.hpp +++ b/search/v2/pre_ranking_info.hpp @@ -10,6 +10,8 @@ namespace v2 { struct PreRankingInfo { + inline size_t GetNumTokens() const { return m_endToken - m_startToken; } + // An abstract distance from the feature to the pivot. Measurement // units do not matter here. double m_distanceToPivot = 0; @@ -25,5 +27,7 @@ struct PreRankingInfo // Search type for the feature. SearchModel::SearchType m_searchType = SearchModel::SEARCH_TYPE_COUNT; }; + +string DebugPrint(PreRankingInfo const & info); } // namespace v2 } // namespace search diff --git a/search/v2/ranking_info.cpp b/search/v2/ranking_info.cpp index f612e6be87..ffc6779b4a 100644 --- a/search/v2/ranking_info.cpp +++ b/search/v2/ranking_info.cpp @@ -2,6 +2,7 @@ #include "std/cmath.hpp" #include "std/limits.hpp" +#include "std/sstream.hpp" namespace search {