diff --git a/search/search_query.cpp b/search/search_query.cpp index 9d5511bd83..a3c82623db 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -87,25 +87,25 @@ void Query::UpdateViewportOffsets() if (MwmValue * pMwm = mwmLock.GetValue()) { feature::DataHeader const & header = pMwm->GetHeader(); - if (header.GetType() == feature::DataHeader::worldcoasts) - continue; - - pair const scaleR = header.GetScaleRange(); - int const scale = min(max(viewScale + 7, scaleR.first), scaleR.second); - - covering::IntervalsT const & interval = cov.Get(header.GetLastScale()); - - ScaleIndex index(pMwm->m_cont.GetReader(INDEX_FILE_TAG), - pMwm->m_factory); - - for (size_t i = 0; i < interval.size(); ++i) + if (header.GetType() == feature::DataHeader::country) { - index.ForEachInIntervalAndScale(MakeBackInsertFunctor(m_offsetsInViewport[mwmId]), - interval[i].first, interval[i].second, - scale); - } + pair const scaleR = header.GetScaleRange(); + int const scale = min(max(viewScale + 7, scaleR.first), scaleR.second); - sort(m_offsetsInViewport[mwmId].begin(), m_offsetsInViewport[mwmId].end()); + covering::IntervalsT const & interval = cov.Get(header.GetLastScale()); + + ScaleIndex index(pMwm->m_cont.GetReader(INDEX_FILE_TAG), + pMwm->m_factory); + + for (size_t i = 0; i < interval.size(); ++i) + { + index.ForEachInIntervalAndScale(MakeBackInsertFunctor(m_offsetsInViewport[mwmId]), + interval[i].first, interval[i].second, + scale); + } + + sort(m_offsetsInViewport[mwmId].begin(), m_offsetsInViewport[mwmId].end()); + } } } } @@ -399,6 +399,8 @@ struct FeatureLoader m_featuresVector.Get(offset, feature); m_query.AddFeatureResult(feature, m_fName); } + + void Reset() { m_count = 0; } }; } // namespace search::impl @@ -443,12 +445,16 @@ namespace class FeaturesFilter { vector const & m_offsets; + bool m_alwaysTrue; public: - FeaturesFilter(vector const & offsets) : m_offsets(offsets) {} + FeaturesFilter(vector const & offsets, bool alwaysTrue) + : m_offsets(offsets), m_alwaysTrue(alwaysTrue) + { + } bool operator() (uint32_t offset) const { - return binary_search(m_offsets.begin(), m_offsets.end(), offset); + return (m_alwaysTrue || binary_search(m_offsets.begin(), m_offsets.end(), offset)); } }; } @@ -475,30 +481,32 @@ void Query::SearchFeatures(vector > const & tokens, ::search::trie::EdgeValueReader())); if (pTrieRoot) { + feature::DataHeader const & header = pMwm->GetHeader(); + bool const isWorld = (header.GetType() == feature::DataHeader::world); + + FeaturesVector featuresVector(pMwm->m_cont, header); + impl::FeatureLoader emitter(featuresVector, *this, isWorld ? "" : mwmLock.GetCountryName()); + for (size_t i = 0; i < pTrieRoot->m_edge.size(); ++i) { TrieIterator::Edge::EdgeStrT const & edge = pTrieRoot->m_edge[i].m_str; ASSERT_GREATER_OR_EQUAL(edge.size(), 1, ()); + if (edge.size() >= 1 && edge[0] < 128 && langs.count(static_cast(edge[0]))) { scoped_ptr pLangRoot(pTrieRoot->GoToEdge(i)); - feature::DataHeader const & h = pMwm->GetHeader(); - FeaturesVector featuresVector(pMwm->m_cont, h); - impl::FeatureLoader f( - featuresVector, - *this, - (h.GetType() == feature::DataHeader::world) ? "" : mwmLock.GetCountryName()); - MatchFeaturesInTrie(tokens, m_prefix, *pLangRoot, edge.size() == 1 ? NULL : &edge[1], edge.size() - 1, - FeaturesFilter(m_offsetsInViewport[mwmId]), f, + FeaturesFilter(m_offsetsInViewport[mwmId], isWorld), emitter, m_results[0].max_size() * 10); LOG(LDEBUG, ("Lang:", StringUtf8Multilang::GetLangByCode(static_cast(edge[0])), "Matched: ", - f.m_count)); + emitter.m_count)); + + emitter.Reset(); } } }