summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-02-23 23:52:59 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-03-04 00:53:00 +0000
commit82aeefe799d29710babcafacb7aadaffddfecff4 (patch)
tree6894e8babd778f240db9aa7bf0efdca7964f191d
parent645dcde7f0971e3ccc4f6a3318e73d5f61d471a3 (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.cpp15
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);