diff options
author | Arne H Juul <arnej27959@users.noreply.github.com> | 2023-01-24 00:06:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-24 00:06:05 +0100 |
commit | 0c6c77b803e233d14667741baf10b6ae0deb532b (patch) | |
tree | 6ea59d4ca175490d9c1217bf03e11fe7163dce1b /searchlib/src/tests/common/bitvector/bitvector_test.cpp | |
parent | 0137c3fdae9171b370eae22c67e3ee4784b71f60 (diff) | |
parent | 4b6f692bed109678f01b591f1a737f6d74775058 (diff) |
Merge pull request #25688 from vespa-engine/balder/also-handle-non-overlapping-bitvectorsv8.115.24
Balder/also handle non overlapping bitvectors
Diffstat (limited to 'searchlib/src/tests/common/bitvector/bitvector_test.cpp')
-rw-r--r-- | searchlib/src/tests/common/bitvector/bitvector_test.cpp | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/searchlib/src/tests/common/bitvector/bitvector_test.cpp b/searchlib/src/tests/common/bitvector/bitvector_test.cpp index 7a26202682b..9afc4601801 100644 --- a/searchlib/src/tests/common/bitvector/bitvector_test.cpp +++ b/searchlib/src/tests/common/bitvector/bitvector_test.cpp @@ -10,6 +10,7 @@ #include <vespa/searchlib/fef/termfieldmatchdataarray.h> #include <vespa/vespalib/test/memory_allocator_observer.h> #include <vespa/vespalib/util/rand48.h> +#include <vespa/vespalib/util/exceptions.h> #include <algorithm> using namespace search; @@ -135,7 +136,7 @@ assertBV(const std::string & exp, const BitVector & act) bool res1 = EXPECT_EQUAL(exp, toString(act)); search::fef::TermFieldMatchData f; queryeval::SearchIterator::UP it(BitVectorIterator::create(&act, f, true)); - BitVectorIterator & b(dynamic_cast<BitVectorIterator &>(*it)); + auto & b(dynamic_cast<BitVectorIterator &>(*it)); bool res2 = EXPECT_EQUAL(exp, toString(b)); return res1 && res2; } @@ -295,6 +296,15 @@ TEST("requireThatSequentialOperationsOnPartialWorks") EXPECT_EQUAL(5u, p2.countTrueBits()); p2.orWith(full); EXPECT_EQUAL(202u, p2.countTrueBits()); + + AllocatedBitVector before(100); + before.setInterval(0, 100); + p2.orWith(before); + EXPECT_EQUAL(202u, p2.countTrueBits()); + + PartialBitVector after(1000, 1100); + after.setInterval(1000, 1100); + EXPECT_EQUAL(202u, p2.countTrueBits()); } TEST("requireThatInitRangeStaysWithinBounds") { @@ -342,7 +352,26 @@ verifyThatLongerWithShorterWorksAsZeroPadded(uint32_t offset, uint32_t sz1, uint func(*aLarger2, *bSmall); func(*aLarger3, *bEmpty); EXPECT_TRUE(*aLarger == *aLarger2); - //EXPECT_TRUE(*aLarger == *aLarger3); +} + +template<typename Func> +void +verifyNonOverlappingWorksAsZeroPadded(bool clear, Func func) { + constexpr size_t CNT = 34; + BitVector::UP left = createEveryNthBitSet(3, 1000, 100); + BitVector::UP right = createEveryNthBitSet(3, 2000, 100); + EXPECT_EQUAL(CNT, left->countTrueBits()); + EXPECT_EQUAL(CNT, right->countTrueBits()); + func(*left, *right); + EXPECT_EQUAL(clear ? 0 : CNT, left->countTrueBits()); + EXPECT_EQUAL(CNT, right->countTrueBits()); + left = createEveryNthBitSet(3, 1000, 100); + right = createEveryNthBitSet(3, 2000, 100); + EXPECT_EQUAL(CNT, left->countTrueBits()); + EXPECT_EQUAL(CNT, right->countTrueBits()); + func(*right, *left); + EXPECT_EQUAL(CNT, left->countTrueBits()); + EXPECT_EQUAL(clear ? 0 : CNT, right->countTrueBits()); } TEST("requireThatAndWorks") { @@ -351,6 +380,7 @@ TEST("requireThatAndWorks") { verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3, [](BitVector & a, const BitVector & b) { a.andWith(b); }); } + verifyNonOverlappingWorksAsZeroPadded(true, [](BitVector & a, const BitVector & b) { a.andWith(b); }); } TEST("requireThatOrWorks") { @@ -359,6 +389,7 @@ TEST("requireThatOrWorks") { verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3, [](BitVector & a, const BitVector & b) { a.orWith(b); }); } + verifyNonOverlappingWorksAsZeroPadded(false, [](BitVector & a, const BitVector & b) { a.orWith(b); }); } @@ -368,6 +399,7 @@ TEST("requireThatAndNotWorks") { verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3, [](BitVector & a, const BitVector & b) { a.andNotWith(b); }); } + verifyNonOverlappingWorksAsZeroPadded(false, [](BitVector & a, const BitVector & b) { a.andNotWith(b); }); } TEST("test that empty bitvectors does not crash") { |