summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-08-02 19:02:12 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-08-02 19:02:12 +0200
commit13abb216a0cb5de33a5bd6fafb3a1a0d5395d70a (patch)
tree40bbe5d5140e1636330bf09a90f2b5fc3de6233f /searchlib/src
parent5feb06390d8aee181bbb1add269b793424580285 (diff)
Split and_not_hits into strict/non-strict version and fix failure.
Diffstat (limited to 'searchlib/src')
-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