summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp28
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h2
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