diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp index 2b1f543179..1dcfd4a1ff 100644 --- a/search/intermediate_result.cpp +++ b/search/intermediate_result.cpp @@ -74,21 +74,33 @@ PreRankerResult::PreRankerResult(FeatureID const & id, PreRankingInfo const & in } // static -bool PreRankerResult::LessRankAndPopularity(PreRankerResult const & r1, PreRankerResult const & r2) +bool PreRankerResult::LessRankAndPopularity(PreRankerResult const & lhs, + PreRankerResult const & rhs) { - if (r1.m_info.m_rank != r2.m_info.m_rank) - return r1.m_info.m_rank > r2.m_info.m_rank; - if (r1.m_info.m_popularity != r2.m_info.m_popularity) - return r1.m_info.m_popularity > r2.m_info.m_popularity; - return r1.m_info.m_distanceToPivot < r2.m_info.m_distanceToPivot; + if (lhs.m_info.m_rank != rhs.m_info.m_rank) + return lhs.m_info.m_rank > rhs.m_info.m_rank; + if (lhs.m_info.m_popularity != rhs.m_info.m_popularity) + return lhs.m_info.m_popularity > rhs.m_info.m_popularity; + return lhs.m_info.m_distanceToPivot < rhs.m_info.m_distanceToPivot; } // static -bool PreRankerResult::LessDistance(PreRankerResult const & r1, PreRankerResult const & r2) +bool PreRankerResult::LessDistance(PreRankerResult const & lhs, PreRankerResult const & rhs) { - if (r1.m_info.m_distanceToPivot != r2.m_info.m_distanceToPivot) - return r1.m_info.m_distanceToPivot < r2.m_info.m_distanceToPivot; - return r1.m_info.m_rank > r2.m_info.m_rank; + if (lhs.m_info.m_distanceToPivot != rhs.m_info.m_distanceToPivot) + return lhs.m_info.m_distanceToPivot < rhs.m_info.m_distanceToPivot; + return lhs.m_info.m_rank > rhs.m_info.m_rank; +} + +// static +bool PreRankerResult::LessByExactMatch(PreRankerResult const & lhs, PreRankerResult const & rhs) +{ + auto const lhsScore = lhs.m_info.m_exactMatch && lhs.m_info.m_allTokensUsed; + auto const rhsScore = rhs.m_info.m_exactMatch && rhs.m_info.m_allTokensUsed; + if (lhsScore != rhsScore) + return lhsScore; + + return LessDistance(lhs, rhs); } bool PreRankerResult::CategoriesComparator::operator()(PreRankerResult const & lhs, diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index d3a094e8f2..bff743d275 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -34,8 +34,9 @@ public: PreRankerResult(FeatureID const & id, PreRankingInfo const & info, std::vector const & provenance); - static bool LessRankAndPopularity(PreRankerResult const & r1, PreRankerResult const & r2); - static bool LessDistance(PreRankerResult const & r1, PreRankerResult const & r2); + static bool LessRankAndPopularity(PreRankerResult const & lhs, PreRankerResult const & rhs); + static bool LessDistance(PreRankerResult const & lhs, PreRankerResult const & rhs); + static bool LessByExactMatch(PreRankerResult const & lhs, PreRankerResult const & rhs); struct CategoriesComparator { diff --git a/search/pre_ranker.cpp b/search/pre_ranker.cpp index 5d6c16b309..39880b3354 100644 --- a/search/pre_ranker.cpp +++ b/search/pre_ranker.cpp @@ -37,7 +37,8 @@ void SweepNearbyResults(double eps, set const & prevEmit, vector