summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-02-23 23:00:01 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-03-04 00:52:59 +0000
commit645dcde7f0971e3ccc4f6a3318e73d5f61d471a3 (patch)
tree87b9322ff92f13201edf24de4a17360011b5da16
parenta04b2e8aef9a9c5723b229a3143e39080958ae6c (diff)
And is a merge
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp19
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());
}
}