summaryrefslogtreecommitdiffstats
path: root/searchlib/src
diff options
context:
space:
mode:
authorArne H Juul <arnej27959@users.noreply.github.com>2020-06-25 08:46:03 +0200
committerGitHub <noreply@github.com>2020-06-25 08:46:03 +0200
commit827f3af2193cf32741ecca20b70dc2e0cf798e05 (patch)
treef02436be395375e71f2655892ddfcf6c29490c6f /searchlib/src
parentd1cbff19dd37c79fe0dc24b24969f3a0eacee403 (diff)
parent619a965a2f450ce863ac0022ecdecd9e9b73a439 (diff)
Merge pull request #13686 from vespa-engine/arnej/unit-test-filter-wrapper
unit test FilterWrapper class
Diffstat (limited to 'searchlib/src')
-rw-r--r--searchlib/src/tests/queryeval/filter_wrapper/CMakeLists.txt10
-rw-r--r--searchlib/src/tests/queryeval/filter_wrapper/filter_wrapper_test.cpp124
2 files changed, 134 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/filter_wrapper/CMakeLists.txt b/searchlib/src/tests/queryeval/filter_wrapper/CMakeLists.txt
new file mode 100644
index 00000000000..bab956e73bb
--- /dev/null
+++ b/searchlib/src/tests/queryeval/filter_wrapper/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+vespa_add_executable(searchlib_filter_wrapper_test_app TEST
+ SOURCES
+ filter_wrapper_test.cpp
+ DEPENDS
+ searchlib
+ searchlib_test
+)
+vespa_add_test(NAME searchlib_filter_wrapper_test_app COMMAND searchlib_filter_wrapper_test_app)
diff --git a/searchlib/src/tests/queryeval/filter_wrapper/filter_wrapper_test.cpp b/searchlib/src/tests/queryeval/filter_wrapper/filter_wrapper_test.cpp
new file mode 100644
index 00000000000..707f51c551a
--- /dev/null
+++ b/searchlib/src/tests/queryeval/filter_wrapper/filter_wrapper_test.cpp
@@ -0,0 +1,124 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchlib/queryeval/filter_wrapper.h>
+#include <vespa/searchlib/fef/termfieldmatchdata.h>
+#include <vespa/searchlib/common/bitvectoriterator.h>
+#include <vespa/searchlib/test/searchiteratorverifier.h>
+
+using namespace search::fef;
+using namespace search::queryeval;
+using search::BitVector;
+using search::BitVectorIterator;
+
+struct DummyItr : public SearchIterator {
+ static uint32_t seekCnt;
+ static uint32_t unpackCnt;
+ static uint32_t dtorCnt;
+ static uint32_t _unpackedDocId;
+ TermFieldMatchData *match;
+
+ DummyItr(TermFieldMatchData *m) {
+ match = m;
+ }
+
+ ~DummyItr() {
+ ++dtorCnt;
+ }
+
+ void doSeek(uint32_t docid) override {
+ ++seekCnt;
+ if (docid <= 10) {
+ setDocId(10);
+ } else if (docid <= 20) {
+ setDocId(20);
+ } else {
+ setAtEnd();
+ }
+ }
+
+ void doUnpack(uint32_t docid) override {
+ ++unpackCnt;
+ if (match != 0) {
+ _unpackedDocId = docid;
+ }
+ }
+};
+uint32_t DummyItr::seekCnt = 0;
+uint32_t DummyItr::unpackCnt = 0;
+uint32_t DummyItr::dtorCnt = 0;
+uint32_t DummyItr::_unpackedDocId = 0;
+
+
+TEST("filter wrapper forwards as expected") {
+ EXPECT_EQUAL(DummyItr::seekCnt, 0u);
+ EXPECT_EQUAL(DummyItr::unpackCnt, 0u);
+ EXPECT_EQUAL(DummyItr::dtorCnt, 0u);
+ { // without wrapper
+ TermFieldMatchData match;
+ DummyItr::_unpackedDocId = 0;
+ SearchIterator::UP search(new DummyItr(&match));
+ search->initFullRange();
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 0u);
+ EXPECT_TRUE(!search->seek(1u));
+ EXPECT_EQUAL(search->getDocId(), 10u);
+ EXPECT_TRUE(search->seek(10));
+ search->unpack(10);
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 10u);
+ EXPECT_TRUE(!search->seek(15));
+ EXPECT_EQUAL(search->getDocId(), 20u);
+ EXPECT_TRUE(search->seek(20));
+ search->unpack(20);
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 20u);
+ EXPECT_TRUE(!search->seek(25));
+ EXPECT_TRUE(search->isAtEnd());
+ }
+ EXPECT_EQUAL(DummyItr::seekCnt, 3u);
+ EXPECT_EQUAL(DummyItr::unpackCnt, 2u);
+ EXPECT_EQUAL(DummyItr::dtorCnt, 1u);
+ { // with wrapper
+ TermFieldMatchData match;
+ TermFieldMatchDataArray tfmda;
+ tfmda.add(&match);
+ DummyItr::_unpackedDocId = 0;
+ auto search = std::make_unique<FilterWrapper>(1);
+ auto to_wrap = std::make_unique<DummyItr>(search->tfmda()[0]);
+ search->wrap(std::move(to_wrap));
+ search->initFullRange();
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 0u);
+ EXPECT_TRUE(!search->seek(1u));
+ EXPECT_EQUAL(search->getDocId(), 10u);
+ EXPECT_TRUE(search->seek(10));
+ search->unpack(10);
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 0u);
+ EXPECT_TRUE(!search->seek(15));
+ EXPECT_EQUAL(search->getDocId(), 20u);
+ EXPECT_TRUE(search->seek(20));
+ search->unpack(20);
+ EXPECT_EQUAL(DummyItr::_unpackedDocId, 0u);
+ EXPECT_TRUE(!search->seek(25));
+ EXPECT_TRUE(search->isAtEnd());
+ }
+ EXPECT_EQUAL(DummyItr::seekCnt, 6u);
+ EXPECT_EQUAL(DummyItr::unpackCnt, 2u);
+ EXPECT_EQUAL(DummyItr::dtorCnt, 2u);
+}
+
+class Verifier : public search::test::SearchIteratorVerifier {
+public:
+ ~Verifier();
+ SearchIterator::UP create(bool strict) const override {
+ auto search = std::make_unique<FilterWrapper>(1);
+ search->wrap(createIterator(getExpectedDocIds(), strict));
+ return search;
+ }
+};
+
+Verifier::~Verifier() {}
+
+TEST("Test that filter wrapper iterators adheres to SearchIterator requirements") {
+ Verifier searchIteratorVerifier;
+ searchIteratorVerifier.verify();
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }