diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-23 23:00:01 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-03-04 00:52:59 +0000 |
commit | 645dcde7f0971e3ccc4f6a3318e73d5f61d471a3 (patch) | |
tree | 87b9322ff92f13201edf24de4a17360011b5da16 | |
parent | a04b2e8aef9a9c5723b229a3143e39080958ae6c (diff) |
And is a merge
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp index 9682b7bc3c8..fee63b23511 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp @@ -49,7 +49,7 @@ SearchIterator::or_hits_into(BitVector &result, uint32_t begin_id) uint32_t docid = std::max(begin_id, getDocId()); while (!isAtEnd(docid)) { docid = result.getNextFalseBit(docid); - if (!isAtEnd() && seek(docid)) { + if (!isAtEnd(docid) && seek(docid)) { result.setBit(docid); } docid = std::max(docid + 1, getDocId()); @@ -59,13 +59,18 @@ SearchIterator::or_hits_into(BitVector &result, uint32_t begin_id) void SearchIterator::and_hits_into(BitVector &result, uint32_t begin_id) { - uint32_t docid = std::max(begin_id, getDocId()); - while (!isAtEnd(docid)) { - docid = result.getNextTrueBit(docid); - if (!isAtEnd() && !seek(docid)) { - result.clearBit(docid); + uint32_t docidA = std::max(begin_id, getDocId()); + uint32_t docidB = result.getNextTrueBit(begin_id); + while (!isAtEnd(docidA) || !isAtEnd(docidB)) { + if (docidA < docidB) { + docidA = (!isAtEnd(docidB)) ? seekNext(docidB) : docidB; + } else if (docidA > docidB) { + result.clearInterval(docidB, docidA); + docidB = (! isAtEnd(docidA)) ? result.getNextTrueBit(docidA) : docidA; + } else { + docidB = result.getNextTrueBit(docidB+1); + docidA = seekNext(docidB); } - docid = std::max(docid + 1, getDocId()); } } |