From 19827587324ba715310a8fb7f0c5bf7a1149530f Mon Sep 17 00:00:00 2001 From: Yury Melnichek Date: Sat, 28 May 2011 19:27:28 +0200 Subject: [PATCH] [search] Introduce IntermediateResult. --- map/framework.cpp | 2 +- search/intermediate_result.cpp | 31 +++++++++++++++++++++++++++++++ search/intermediate_result.hpp | 26 ++++++++++++++++++++++++++ search/query.cpp | 13 ++++--------- search/query.hpp | 10 +++------- search/result.cpp | 14 ++------------ search/result.hpp | 4 +--- search/search.pro | 2 ++ 8 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 search/intermediate_result.cpp create mode 100644 search/intermediate_result.hpp diff --git a/map/framework.cpp b/map/framework.cpp index e5d9ba768f..a917fe0826 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1098,7 +1098,7 @@ void FrameWork::AddRedrawCommandSure() engine.Search(text, m_navigator.Screen().GlobalRect(), callback); // Empty name indicates last element. - callback(search::Result(string(), m2::RectD(), 0)); + callback(search::Result(string(), m2::RectD())); } template class FrameWork; diff --git a/search/intermediate_result.cpp b/search/intermediate_result.cpp new file mode 100644 index 0000000000..259420a699 --- /dev/null +++ b/search/intermediate_result.cpp @@ -0,0 +1,31 @@ +#include "intermediate_result.hpp" +#include "../base/string_utils.hpp" + +namespace search +{ +namespace impl +{ + +IntermediateResult::IntermediateResult(FeatureType const & feature, + string const & displayName, + int matchPenalty) + : m_str(displayName), m_rect(feature.GetLimitRect(-1)), m_matchPenalty(matchPenalty) +{ +} + +bool IntermediateResult::operator < (IntermediateResult const & o) const +{ + return m_matchPenalty < o.m_matchPenalty; +} + +Result IntermediateResult::GenerateFinalResult() const +{ +#ifdef DEBUG + return Result(m_str + ' ' + strings::to_string(m_matchPenalty), m_rect); +#else + return Result(m_str, m_rect); +#endif +} + +} // namespace search::impl +} // namespace search diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp new file mode 100644 index 0000000000..f653cf02e5 --- /dev/null +++ b/search/intermediate_result.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "result.hpp" +#include "../indexer/feature.hpp" + +namespace search +{ +namespace impl +{ + +class IntermediateResult +{ +public: + IntermediateResult(FeatureType const & feature, string const & displayName, int matchPenalty); + + bool operator < (IntermediateResult const & o) const; + + Result GenerateFinalResult() const; + +private: + string m_str; + m2::RectD m_rect; + int m_matchPenalty; +}; + +} // namespace search::impl +} // namespace search diff --git a/search/query.cpp b/search/query.cpp index b3c1b3e31f..3ff720a3ad 100644 --- a/search/query.cpp +++ b/search/query.cpp @@ -48,8 +48,8 @@ struct FeatureProcessor 512, 256 * max(0, int(m_query.m_prefix.size()) - 1), &KeywordMatch, &PrefixMatch); feature.ForEachNameRef(matcher); - m_query.AddResult(Result(matcher.GetBestPrefixMatch(), feature.GetLimitRect(-1), - matcher.GetMatchScore())); + m_query.AddResult(IntermediateResult( + feature, matcher.GetBestPrefixMatch(), matcher.GetMatchScore())); } }; @@ -63,24 +63,19 @@ void Query::Search(function const & f) results.reserve(m_resuts.size()); while (!m_resuts.empty()) { - results.push_back(m_resuts.top()); + results.push_back(m_resuts.top().GenerateFinalResult()); m_resuts.pop(); } for (vector::const_reverse_iterator it = results.rbegin(); it != results.rend(); ++it) f(*it); } -void Query::AddResult(Result const & result) +void Query::AddResult(IntermediateResult const & result) { m_resuts.push(result); while (m_resuts.size() > 10) m_resuts.pop(); } -bool Query::ResultBetter::operator ()(Result const & r1, Result const & r2) const -{ - return r1.GetPenalty() < r2.GetPenalty(); -} - } // namespace search::impl } // namespace search diff --git a/search/query.hpp b/search/query.hpp index 1d58f05aa9..c7b3b40bb4 100644 --- a/search/query.hpp +++ b/search/query.hpp @@ -1,6 +1,7 @@ #pragma once #include "engine.hpp" +#include "intermediate_result.hpp" #include "result.hpp" #include "../geometry/rect2d.hpp" #include "../base/string_utils.hpp" @@ -25,12 +26,7 @@ public: void Search(function const & f); // Add result for scoring. - void AddResult(Result const & result); - - struct ResultBetter - { - bool operator() (Result const & r1, Result const & r2) const; - }; + void AddResult(IntermediateResult const & result); string m_queryText; vector m_keywords; @@ -41,7 +37,7 @@ public: IndexType const * m_pIndex; IndexType::Query m_indexQuery; - priority_queue, ResultBetter> m_resuts; + priority_queue m_resuts; }; } // namespace search::impl diff --git a/search/result.cpp b/search/result.cpp index 2a2af69caa..df94b11b5f 100644 --- a/search/result.cpp +++ b/search/result.cpp @@ -1,21 +1,11 @@ #include "result.hpp" -#include "../base/base.hpp" -#include "../base/string_utils.hpp" namespace search { -Result::Result(string const & str, m2::RectD const & rect, int penalty) - : m_str(str), m_rect(rect), m_penalty(penalty) +Result::Result(string const & str, m2::RectD const & rect) + : m_str(str), m_rect(rect) { -#ifdef DEBUG - if (!str.empty()) - { - m_str.push_back(' '); - m_str += strings::to_string(penalty); - } -#endif } - } // namespace search diff --git a/search/result.hpp b/search/result.hpp index 44bb7957fe..645c4ca3a8 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -9,16 +9,14 @@ namespace search class Result { public: - Result(string const & str, m2::RectD const & rect, int penalty); + Result(string const & str, m2::RectD const & rect); string GetString() const { return m_str; } m2::RectD GetRect() const { return m_rect; } - int GetPenalty() const { return m_penalty; } private: string m_str; m2::RectD m_rect; - int m_penalty; }; } diff --git a/search/search.pro b/search/search.pro index bf08be26fa..c82a87cedf 100644 --- a/search/search.pro +++ b/search/search.pro @@ -12,6 +12,7 @@ include($$ROOT_DIR/common.pri) HEADERS += \ delimiters.hpp \ engine.hpp \ + intermediate_result.hpp \ keyword_matcher.hpp \ query.hpp \ result.hpp \ @@ -20,6 +21,7 @@ HEADERS += \ SOURCES += \ delimiters.cpp \ engine.cpp \ + intermediate_result.cpp \ keyword_matcher.cpp \ query.cpp \ result.cpp \