diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-21 17:04:43 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-21 18:07:56 +0000 |
commit | 8e4adfc19e9a4e5a32590c79324b6d5f4312507f (patch) | |
tree | fdde644342e30f50b716af08a6404042944ce4ce | |
parent | 6b0183b1e942e23d97f70cd9ae6491772a08291f (diff) |
Ensure that we do not claim docs we passed to be hits, and the we obey both docidLimit and getEndId()
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributeiterators.h | 2 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp | 13 |
2 files changed, 9 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h index 613c666b673..28165829ed6 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.h +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.h @@ -26,7 +26,7 @@ protected: template <typename SC> void or_hits_into(const SC & sc, BitVector & result, uint32_t begin_id) const; template <typename SC> - std::unique_ptr<BitVector> get_hits(const SC & sc, uint32_t begin_id) const; + std::unique_ptr<BitVector> get_hits(const SC & sc, uint32_t begin_id, uint32_t end_id) const; void visitMembers(vespalib::ObjectVisitor &visitor) const override; fef::TermFieldMatchData * _matchData; fef::TermFieldMatchDataPosition * _matchPosition; diff --git a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp index 6d5f69e9594..71064ad8354 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp +++ b/searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp @@ -27,9 +27,9 @@ AttributeIteratorBase::or_hits_into(const SC & sc, BitVector & result, uint32_t template <typename SC> std::unique_ptr<BitVector> -AttributeIteratorBase::get_hits(const SC & sc, uint32_t begin_id) const { - BitVector::UP result = BitVector::create(begin_id, getEndId()); - for (uint32_t docId(begin_id); docId < getEndId(); docId++) { +AttributeIteratorBase::get_hits(const SC & sc, uint32_t begin_id, uint32_t end_id) const { + BitVector::UP result = BitVector::create(begin_id, end_id); + for (uint32_t docId(std::max(begin_id, getDocId())); docId < end_id; docId++) { if (sc.cmp(docId)) { result->setBit(docId); } @@ -283,7 +283,10 @@ FlagAttributeIteratorT<SC>::get_hits(uint32_t begin_id) { } if (!result) { result = BitVector::create(begin_id, getEndId()); + } else if (begin_id < getDocId()) { + result->clearInterval(begin_id, std::min(getDocId(), getEndId())); } + return result; } @@ -351,14 +354,14 @@ FilterAttributeIteratorT<SC>::or_hits_into(BitVector & result, uint32_t begin_id template <typename SC> BitVector::UP AttributeIteratorT<SC>::get_hits(uint32_t begin_id) { - return AttributeIteratorBase::get_hits(_searchContext, begin_id); + return AttributeIteratorBase::get_hits(_searchContext, begin_id, std::min(_docIdLimit, getEndId())); } template <typename SC> BitVector::UP FilterAttributeIteratorT<SC>::get_hits(uint32_t begin_id) { - return AttributeIteratorBase::get_hits(_searchContext, begin_id); + return AttributeIteratorBase::get_hits(_searchContext, begin_id, std::min(_docIdLimit, getEndId())); } template <typename SC> |