summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-02-21 17:04:43 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2017-02-21 18:07:56 +0000
commit8e4adfc19e9a4e5a32590c79324b6d5f4312507f (patch)
treefdde644342e30f50b716af08a6404042944ce4ce
parent6b0183b1e942e23d97f70cd9ae6491772a08291f (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.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributeiterators.hpp13
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>