diff options
author | Henning Baldersheim <balder@oath.com> | 2018-10-31 13:53:34 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@oath.com> | 2018-10-31 13:53:37 +0100 |
commit | b1cf0ff54bc2807b879f04949a691ff0000a78cc (patch) | |
tree | 5cc78fbb4996af12d16787252b9234e99ceda6b0 /searchlib | |
parent | 297ec0e50bff595cef9ca66077ede3ad8b6c8eaa (diff) |
Do not look for the first set bit when iterator is not strict.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp | 22 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvectoriterator.h | 2 |
2 files changed, 16 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp b/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp index 4bca8d7da03..07f9a245617 100644 --- a/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp @@ -26,13 +26,6 @@ BitVectorIterator::initRange(uint32_t begin, uint32_t end) SearchIterator::initRange(begin, end); if (begin >= _docIdLimit) { setAtEnd(); - } else { - uint32_t docId = _bv.getFirstTrueBit(begin); - if (docId >= _docIdLimit) { - setAtEnd(); - } else { - setDocId(docId); - } } } @@ -66,6 +59,7 @@ class BitVectorIteratorStrict : public BitVectorIterator public: BitVectorIteratorStrict(const BitVector & bv, uint32_t docIdLimit, TermFieldMatchData & matchData); private: + void initRange(uint32_t begin, uint32_t end) override; void doSeek(uint32_t docId) override; Trinary is_strict() const override { return Trinary::True; } }; @@ -91,6 +85,20 @@ BitVectorIteratorStrict::doSeek(uint32_t docId) } } +void +BitVectorIteratorStrict::initRange(uint32_t begin, uint32_t end) +{ + BitVectorIterator::initRange(begin, end); + if (!isAtEnd()) { + uint32_t docId = _bv.getFirstTrueBit(begin); + if (docId >= _docIdLimit) { + setAtEnd(); + } else { + setDocId(docId); + } + } +} + queryeval::SearchIterator::UP BitVectorIterator::create(const BitVector *const bv, const TermFieldMatchDataArray &matchData, bool strict) { assert(matchData.size() == 1); diff --git a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h index d34a3354891..f21a983b3a3 100644 --- a/searchlib/src/vespa/searchlib/common/bitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/common/bitvectoriterator.h @@ -14,11 +14,11 @@ class BitVectorIterator : public queryeval::SearchIterator { protected: BitVectorIterator(const BitVector & other, uint32_t docIdLimit, fef::TermFieldMatchData &matchData); + void initRange(uint32_t begin, uint32_t end) override; uint32_t _docIdLimit; const BitVector & _bv; private: - void initRange(uint32_t begin, uint32_t end) override; void visitMembers(vespalib::ObjectVisitor &visitor) const override; void doSeek(uint32_t docId) override; void doUnpack(uint32_t docId) override; |