summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-05-15 12:58:04 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-05-15 12:58:04 +0000
commit531b988b87698a745f73f17773468e5710817ef7 (patch)
treec0fab207a4b3416181fe8953b450fc76b0cbaeb7 /searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
parent737f467373ce178c15c95fc0fe824fc14351eb62 (diff)
Extend test for unpack of multibitvector to cover all aspects variants for OR.
Diffstat (limited to 'searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp')
-rw-r--r--searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp b/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
index 12c38d3fe02..b767ce814cc 100644
--- a/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
+++ b/searchlib/src/tests/queryeval/multibitvectoriterator/multibitvectoriterator_test.cpp
@@ -34,6 +34,7 @@ public:
void testAndWith(bool invert);
void testEndGuard(bool invert);
void testIteratorConformance();
+ void testUnpackOfOr();
template<typename T>
void testThatOptimizePreservesUnpack();
template <typename T>
@@ -44,6 +45,7 @@ public:
void testSearch(bool strict, bool invert);
int Main() override;
private:
+ void verifyUnpackOfOr(const UnpackInfo & unpackInfo);
void verifySelectiveUnpack(SearchIterator & s, const TermFieldMatchData * tfmd);
void searchAndCompare(SearchIterator::UP s, uint32_t docIdLimit);
void setup();
@@ -253,6 +255,63 @@ Test::testThatOptimizePreservesUnpack()
fixup_bitvectors();
}
+void verifyOrUnpack(SearchIterator & s, const TermFieldMatchData * tfmd) {
+ s.initFullRange();
+ s.seek(1);
+ for (size_t i = 0; i < 3; i++) {
+ EXPECT_EQUAL(0u, tfmd[0].getDocId());
+ }
+ s.unpack(1);
+ EXPECT_EQUAL(0u, tfmd[0].getDocId());
+ EXPECT_EQUAL(1u, tfmd[1].getDocId());
+ EXPECT_EQUAL(0u, tfmd[2].getDocId());
+}
+
+void
+Test::testUnpackOfOr() {
+ _bvs[0]->clearBit(1);
+ _bvs[1]->setBit(1);
+ _bvs[2]->clearBit(1);
+ UnpackInfo all;
+ all.forceAll();
+ verifyUnpackOfOr(all);
+
+ UnpackInfo unpackInfo;
+ unpackInfo.add(1);
+ unpackInfo.add(2);
+ verifyUnpackOfOr(unpackInfo);
+
+ fixup_bitvectors();
+}
+
+void
+Test::verifyUnpackOfOr(const UnpackInfo &unpackInfo)
+{
+ TermFieldMatchData tfmdA[3];
+ MultiSearch::Children children;
+ children.push_back(createIter(0, false, tfmdA[0], false).release());
+ children.push_back(createIter(1, false, tfmdA[1], false).release());
+ children.push_back(createIter(2, false, tfmdA[2], false).release());
+ SearchIterator::UP s(OrSearch::create(children, false, unpackInfo));
+ verifyOrUnpack(*s, tfmdA);
+
+ for (auto & tfmd : tfmdA) {
+ tfmd.resetOnlyDocId(0);
+ }
+
+ const MultiSearch * ms = dynamic_cast<const MultiSearch *>(s.get());
+ EXPECT_TRUE(ms != nullptr);
+ EXPECT_EQUAL(3u, ms->getChildren().size());
+
+ s = MultiBitVectorIteratorBase::optimize(std::move(s));
+ s->initFullRange();
+ ms = dynamic_cast<const MultiSearch *>(s.get());
+ EXPECT_TRUE(ms != nullptr);
+ EXPECT_EQUAL(3u, ms->getChildren().size());
+ verifyOrUnpack(*s, tfmdA);
+
+}
+
void
Test::verifySelectiveUnpack(SearchIterator & s, const TermFieldMatchData * tfmd)
{
@@ -584,6 +643,8 @@ Test::Main()
testThatOptimizePreservesUnpack<OrSearch>();
testThatOptimizePreservesUnpack<AndSearch>();
TEST_FLUSH();
+ testUnpackOfOr();
+ TEST_FLUSH();
testEndGuard(false);
testEndGuard(true);
TEST_FLUSH();