summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-10-31 13:53:34 +0100
committerHenning Baldersheim <balder@oath.com>2018-10-31 13:53:37 +0100
commitb1cf0ff54bc2807b879f04949a691ff0000a78cc (patch)
tree5cc78fbb4996af12d16787252b9234e99ceda6b0 /searchlib
parent297ec0e50bff595cef9ca66077ede3ad8b6c8eaa (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.cpp22
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvectoriterator.h2
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;