summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-12-18 21:34:13 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2018-12-18 21:34:13 +0000
commit267c8909dedff7dd4beb2b8cd5867f639582d6d1 (patch)
treec4a4659b7fe7c03447404f80b043b31bb5040185 /searchlib/src
parentf3c9e8af1ef5086057f929342528ef4f793ecf31 (diff)
Add test for inverted bitvector iterator.
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/tests/attribute/bitvector/bitvector_test.cpp33
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp6
2 files changed, 28 insertions, 11 deletions
diff --git a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
index c00ab1270e3..abc9d3aa975 100644
--- a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
+++ b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp
@@ -612,30 +612,47 @@ TEST_F("Test bitvectors with weighted set value string", BitVectorTest)
class Verifier : public search::test::SearchIteratorVerifier {
public:
- Verifier();
+ Verifier(bool inverted);
~Verifier();
SearchIterator::UP create(bool strict) const override {
- return BitVectorIterator::create(_bv.get(), getDocIdLimit(), _tfmd, strict);
+ return _inverted
+ ? BitVectorIterator::createInverse(_bv.get(), getDocIdLimit(), _tfmd, strict)
+ : BitVectorIterator::create(_bv.get(), getDocIdLimit(), _tfmd, strict);
}
private:
+ bool _inverted;
mutable TermFieldMatchData _tfmd;
BitVector::UP _bv;
};
-Verifier::Verifier()
- : _bv(BitVector::create(getDocIdLimit()))
+Verifier::Verifier(bool inverted)
+ : _inverted(inverted),
+ _bv(BitVector::create(getDocIdLimit()))
{
+ if (inverted) {
+ _bv->setInterval(0, getDocIdLimit());
+ }
for (uint32_t docId: getExpectedDocIds()) {
- _bv->setBit(docId);
+ if (inverted) {
+ _bv->clearBit(docId);
+ } else {
+ _bv->setBit(docId);
+ }
}
}
-Verifier::~Verifier() {}
+Verifier::~Verifier() = default;
TEST("Test that bitvector iterators adheres to SearchIterator requirements") {
- Verifier searchIteratorVerifier;
- searchIteratorVerifier.verify();
+ {
+ Verifier searchIteratorVerifier(false);
+ searchIteratorVerifier.verify();
+ }
+ {
+ Verifier searchIteratorVerifier(true);
+ searchIteratorVerifier.verify();
+ }
}
diff --git a/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp b/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp
index 6471b0f5c33..ef2916d3870 100644
--- a/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp
+++ b/searchlib/src/vespa/searchlib/common/bitvectoriterator.cpp
@@ -61,7 +61,7 @@ private:
template<bool inverse>
BitVectorIteratorT<inverse>::BitVectorIteratorT(const BitVector & bv, uint32_t docIdLimit, TermFieldMatchData & matchData) :
- BitVectorIterator(bv, docIdLimit, matchData)
+ BitVectorIterator(bv, docIdLimit, matchData)
{
}
@@ -86,10 +86,10 @@ private:
void doSeek(uint32_t docId) override;
Trinary is_strict() const override { return Trinary::True; }
uint32_t getNextBit(uint32_t docId) const {
- return inverse ? ! this->_bv.getNextFalseBit(docId) : this->_bv.getNextTrueBit(docId);
+ return inverse ? this->_bv.getNextFalseBit(docId) : this->_bv.getNextTrueBit(docId);
}
uint32_t getFirstBit(uint32_t docId) const {
- return inverse ? ! this->_bv.getFirstFalseBit(docId) : this->_bv.getFirstTrueBit(docId);
+ return inverse ? this->_bv.getFirstFalseBit(docId) : this->_bv.getFirstTrueBit(docId);
}
};