diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index 3bb6141878..1c69bc42f7 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -260,6 +260,7 @@ public: template void ForEachValue(size_t index, ToDo && toDo) const { + ASSERT_LESS(index, m_holder.size(), ()); for (auto const & value : m_holder[index]) toDo(value); } @@ -385,10 +386,7 @@ void MatchFeaturesInTrie(SearchQueryParams const & params, trie::DefaultIterator TFilter const & filter, ToDo && toDo) { TrieValuesHolder categoriesHolder(filter); - if (!MatchCategoriesInTrie(params, trieRoot, categoriesHolder)) { - LOG(LERROR, ("Can't find categories.")); - return; - } + bool const categoriesMatched = MatchCategoriesInTrie(params, trieRoot, categoriesHolder); impl::OffsetIntersecter intersecter(filter); for (size_t i = 0; i < params.m_tokens.size(); ++i) @@ -397,7 +395,8 @@ void MatchFeaturesInTrie(SearchQueryParams const & params, trie::DefaultIterator { MatchTokenInTrie(params.m_tokens[i], langRoot, intersecter); }); - categoriesHolder.ForEachValue(i, intersecter); + if (categoriesMatched) + categoriesHolder.ForEachValue(i, intersecter); intersecter.NextStep(); } @@ -407,7 +406,8 @@ void MatchFeaturesInTrie(SearchQueryParams const & params, trie::DefaultIterator { MatchTokenPrefixInTrie(params.m_prefixTokens, langRoot, intersecter); }); - categoriesHolder.ForEachValue(params.m_tokens.size(), intersecter); + if (categoriesMatched) + categoriesHolder.ForEachValue(params.m_tokens.size(), intersecter); intersecter.NextStep(); }