aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-06-24 07:28:34 +0000
committerArne Juul <arnej@verizonmedia.com>2020-06-24 07:29:24 +0000
commit619a965a2f450ce863ac0022ecdecd9e9b73a439 (patch)
treecd12eb5665aa7deb494cf67f54b8c300c7edd1e2
parent89f32d0653be2c00126578b83fc0282661364c25 (diff)
unit test FilterWrapper class
-rw-r--r--searchlib/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/queryeval/filter_wrapper/CMakeLists.txt10
-rw-r--r--searchlib/src/tests/queryeval/filter_wrapper/filter_wrapper_test.cpp124
3 files changed, 135 insertions, 0 deletions
diff --git a/searchlib/CMakeLists.txt b/searchlib/CMakeLists.txt
index c5dd468e4fd..f6e8d35459e 100644
--- a/searchlib/CMakeLists.txt
+++ b/searchlib/CMakeLists.txt
@@ -190,6 +190,7 @@ vespa_define_module(
src/tests/queryeval/dot_product
src/tests/queryeval/equiv
src/tests/queryeval/fake_searchable
+ src/tests/queryeval/filter_wrapper
src/tests/queryeval/getnodeweight
src/tests/queryeval/monitoring_search_iterator
src/tests/queryeval/multibitvectoriterator
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(); }