diff options
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp | 28 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/searchiterator.h | 2 |
2 files changed, 27 insertions, 3 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp index 58e4de08bb8..0423a946058 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp @@ -57,16 +57,28 @@ SearchIterator::or_hits_into(BitVector &result, uint32_t begin_id) } void -SearchIterator::and_hits_into(BitVector &result, uint32_t begin_id) +SearchIterator::and_hits_into_non_strict(BitVector &result, uint32_t begin_id) +{ + for (uint32_t hit = result.getNextTrueBit(begin_id); !isAtEnd(hit); hit = result.getNextTrueBit(hit+1)) { + if ( !seek(hit) ) { + result.clearBit(hit); + } + } + result.invalidateCachedCount(); +} + +void +SearchIterator::and_hits_into_strict(BitVector &result, uint32_t begin_id) { - uint32_t docidA = begin_id - 1; + seek(begin_id); + uint32_t docidA = getDocId(); uint32_t docidB = result.getNextTrueBit(begin_id); while (!isAtEnd(docidB) && !isAtEnd(docidA)) { if (docidA < docidB) { if (seek(docidB)) { docidA = docidB; } else { - docidA = std::max(docidB+1, getDocId()); + docidA = getDocId(); } } else if (docidA > docidB) { result.clearInterval(docidB, docidA); @@ -78,6 +90,16 @@ SearchIterator::and_hits_into(BitVector &result, uint32_t begin_id) result.clearInterval(docidB, result.size()); } +void +SearchIterator::and_hits_into(BitVector &result, uint32_t begin_id) +{ + if (is_strict() == vespalib::Trinary::True) { + and_hits_into_strict(result, begin_id); + } else { + and_hits_into_non_strict(result, begin_id); + } +} + vespalib::string SearchIterator::asString() const { diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h index 901b8538279..1c3f5a9513c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h @@ -43,6 +43,8 @@ private: */ uint32_t _endid; + void and_hits_into_strict(BitVector &result, uint32_t begin_id); + void and_hits_into_non_strict(BitVector &result, uint32_t begin_id); protected: /** * This method is used by the @ref doSeek method to indicate that |