diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-23 23:52:59 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-04 00:53:00 +0000 |
commit | 82aeefe799d29710babcafacb7aadaffddfecff4 (patch) | |
tree | 6894e8babd778f240db9aa7bf0efdca7964f191d | |
parent | 645dcde7f0971e3ccc4f6a3318e73d5f61d471a3 (diff) |
Start with the strict bitvector and ensure we advance the other one independent of strictness.
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp index fee63b23511..c7bc4289924 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp @@ -59,14 +59,23 @@ SearchIterator::or_hits_into(BitVector &result, uint32_t begin_id) void SearchIterator::and_hits_into(BitVector &result, uint32_t begin_id) { - uint32_t docidA = std::max(begin_id, getDocId()); + uint32_t docidA = begin_id - 1; uint32_t docidB = result.getNextTrueBit(begin_id); while (!isAtEnd(docidA) || !isAtEnd(docidB)) { if (docidA < docidB) { - docidA = (!isAtEnd(docidB)) ? seekNext(docidB) : docidB; + if (!isAtEnd(docidB)) { + if (seek(docidB)) { + docidA = docidB; + } else { + result.clearBit(docidB); + docidB = result.getNextTrueBit(docidB+1); + } + } else { + docidA = getEndId(); + } } else if (docidA > docidB) { result.clearInterval(docidB, docidA); - docidB = (! isAtEnd(docidA)) ? result.getNextTrueBit(docidA) : docidA; + docidB = (! isAtEnd(docidA)) ? result.getNextTrueBit(docidA) : getEndId(); } else { docidB = result.getNextTrueBit(docidB+1); docidA = seekNext(docidB); |