diff --git a/indexer/categories_holder.cpp b/indexer/categories_holder.cpp index 69fa7670ef..5714359ba2 100644 --- a/indexer/categories_holder.cpp +++ b/indexer/categories_holder.cpp @@ -129,7 +129,7 @@ void CategoriesHolder::LoadFromStream(istream & s) name.m_name = name.m_name.substr(1); } else - name.m_prefixLengthToSuggest = 10; + name.m_prefixLengthToSuggest = Category::EMPTY_PREFIX_LENGTH; cat.m_synonyms.push_back(name); } diff --git a/indexer/categories_holder.hpp b/indexer/categories_holder.hpp index 71f96452dc..0bbddf6c63 100644 --- a/indexer/categories_holder.hpp +++ b/indexer/categories_holder.hpp @@ -15,6 +15,8 @@ class CategoriesHolder public: struct Category { + static const uint8_t EMPTY_PREFIX_LENGTH = 10; + struct Name { string m_name; diff --git a/search/search_engine.cpp b/search/search_engine.cpp index 232777d41b..df7734a4a8 100644 --- a/search/search_engine.cpp +++ b/search/search_engine.cpp @@ -24,7 +24,7 @@ namespace search { -typedef vector > SuggestsContainerT; +typedef vector SuggestsContainerT; class EngineData { @@ -44,21 +44,28 @@ namespace class InitSuggestions { - map m_suggests; + // Key - is a string with language. + typedef map, uint8_t> SuggestMapT; + SuggestMapT m_suggests; public: void operator() (CategoriesHolder::Category::Name const & name) { - strings::UniString const uniName = NormalizeAndSimplifyString(name.m_name); + if (name.m_prefixLengthToSuggest != CategoriesHolder::Category::EMPTY_PREFIX_LENGTH) + { + strings::UniString const uniName = NormalizeAndSimplifyString(name.m_name); - uint8_t & score = m_suggests[uniName]; - if (score == 0 || score > name.m_prefixLengthToSuggest) - score = name.m_prefixLengthToSuggest; + uint8_t & score = m_suggests[make_pair(uniName, name.m_lang)]; + if (score == 0 || score > name.m_prefixLengthToSuggest) + score = name.m_prefixLengthToSuggest; + } } void GetSuggests(SuggestsContainerT & cont) const { - cont.assign(m_suggests.begin(), m_suggests.end()); + cont.reserve(m_suggests.size()); + for (SuggestMapT::const_iterator i = m_suggests.begin(); i != m_suggests.end(); ++i) + cont.push_back(Query::SuggestT(i->first.first, i->second, i->first.second)); } }; diff --git a/search/search_query.cpp b/search/search_query.cpp index ee65404f9c..3c1b206468 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -808,12 +808,13 @@ void Query::MatchForSuggestions(strings::UniString const & token, Results & res) StringsToSuggestVectorT::const_iterator it = m_pStringsToSuggest->begin(); for (; it != m_pStringsToSuggest->end(); ++it) { - strings::UniString const & s = it->first; - if ((it->second <= token.size()) && - (token != s) && // do not push suggestion if it already equals to token + strings::UniString const & s = it->m_name; + if ((it->m_prefixLength <= token.size()) && + (token != s) && // do not push suggestion if it already equals to token + (it->m_lang == m_inputLang) && // push suggestions only for input language StartsWith(s.begin(), s.end(), token.begin(), token.end())) { - res.AddResult(MakeResult(impl::PreResult2(strings::ToUtf8(s), it->second))); + res.AddResult(MakeResult(impl::PreResult2(strings::ToUtf8(s), it->m_prefixLength))); } } } diff --git a/search/search_query.hpp b/search/search_query.hpp index 50bfff4932..b16baebf76 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -41,8 +41,20 @@ class Query public: static int const m_scaleDepthSearch = 7; - // Vector of pairs (string_to_suggest, min_prefix_length_to_suggest). - typedef vector > StringsToSuggestVectorT; + struct SuggestT + { + strings::UniString m_name; + uint8_t m_prefixLength; + int8_t m_lang; + + SuggestT(strings::UniString const & name, uint8_t len, int8_t lang) + : m_name(name), m_prefixLength(len), m_lang(lang) + { + } + }; + + // Vector of suggests. + typedef vector StringsToSuggestVectorT; Query(Index const * pIndex, CategoriesHolder const * pCategories,