diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-02 19:02:12 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-02 19:02:12 +0200 |
commit | 13abb216a0cb5de33a5bd6fafb3a1a0d5395d70a (patch) | |
tree | 40bbe5d5140e1636330bf09a90f2b5fc3de6233f /searchlib | |
parent | 5feb06390d8aee181bbb1add269b793424580285 (diff) |
Split and_not_hits into strict/non-strict version and fix failure.
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 |