aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/sourceblender
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /searchlib/src/tests/queryeval/sourceblender
Publish
Diffstat (limited to 'searchlib/src/tests/queryeval/sourceblender')
-rw-r--r--searchlib/src/tests/queryeval/sourceblender/.gitignore4
-rw-r--r--searchlib/src/tests/queryeval/sourceblender/CMakeLists.txt9
-rw-r--r--searchlib/src/tests/queryeval/sourceblender/DESC1
-rw-r--r--searchlib/src/tests/queryeval/sourceblender/FILES1
-rw-r--r--searchlib/src/tests/queryeval/sourceblender/sourceblender.cpp169
5 files changed, 184 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/sourceblender/.gitignore b/searchlib/src/tests/queryeval/sourceblender/.gitignore
new file mode 100644
index 00000000000..e0d4b433d65
--- /dev/null
+++ b/searchlib/src/tests/queryeval/sourceblender/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+sourceblender_test
+searchlib_sourceblender_test_app
diff --git a/searchlib/src/tests/queryeval/sourceblender/CMakeLists.txt b/searchlib/src/tests/queryeval/sourceblender/CMakeLists.txt
new file mode 100644
index 00000000000..e566cb0fdf0
--- /dev/null
+++ b/searchlib/src/tests/queryeval/sourceblender/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_sourceblender_test_app
+ SOURCES
+ sourceblender.cpp
+ DEPENDS
+ searchlib
+ searchlib_test
+)
+vespa_add_test(NAME searchlib_sourceblender_test_app COMMAND searchlib_sourceblender_test_app)
diff --git a/searchlib/src/tests/queryeval/sourceblender/DESC b/searchlib/src/tests/queryeval/sourceblender/DESC
new file mode 100644
index 00000000000..437dd818eb7
--- /dev/null
+++ b/searchlib/src/tests/queryeval/sourceblender/DESC
@@ -0,0 +1 @@
+sourceblender test. Take a look at sourceblender.cpp for details.
diff --git a/searchlib/src/tests/queryeval/sourceblender/FILES b/searchlib/src/tests/queryeval/sourceblender/FILES
new file mode 100644
index 00000000000..97be7bcaf53
--- /dev/null
+++ b/searchlib/src/tests/queryeval/sourceblender/FILES
@@ -0,0 +1 @@
+sourceblender.cpp
diff --git a/searchlib/src/tests/queryeval/sourceblender/sourceblender.cpp b/searchlib/src/tests/queryeval/sourceblender/sourceblender.cpp
new file mode 100644
index 00000000000..2cfcf4e3f1d
--- /dev/null
+++ b/searchlib/src/tests/queryeval/sourceblender/sourceblender.cpp
@@ -0,0 +1,169 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("sourceblender_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchlib/queryeval/sourceblendersearch.h>
+#include <vespa/searchlib/queryeval/simplesearch.h>
+#include <vespa/searchlib/queryeval/simpleresult.h>
+#include <vespa/searchlib/queryeval/intermediate_blueprints.h>
+#include <vespa/searchlib/queryeval/leaf_blueprints.h>
+#include <vespa/searchlib/test/initrange.h>
+#include <vespa/searchlib/common/bitvectoriterator.h>
+#include <vespa/searchlib/attribute/fixedsourceselector.h>
+
+using namespace search::queryeval;
+using namespace search::fef;
+using namespace search;
+using std::make_unique;
+
+/**
+ * Proxy search used to verify unpack pattern
+ **/
+class UnpackChecker : public SearchIterator
+{
+private:
+ SearchIterator::UP _search;
+ SimpleResult _unpacked;
+
+protected:
+ virtual void doSeek(uint32_t docid) {
+ _search->seek(docid);
+ setDocId(_search->getDocId());
+ }
+ virtual void doUnpack(uint32_t docid) {
+ _unpacked.addHit(docid);
+ _search->unpack(docid);
+ }
+
+public:
+ UnpackChecker(SearchIterator *search) : _search(search), _unpacked() {}
+ const SimpleResult &getUnpacked() const { return _unpacked; }
+};
+
+class MySelector : public search::FixedSourceSelector
+{
+public:
+ MySelector(int defaultSource) : search::FixedSourceSelector(defaultSource, "fs") { }
+ MySelector & set(Source s, uint32_t docId) {
+ setSource(s, docId);
+ return *this;
+ }
+};
+
+//-----------------------------------------------------------------------------
+
+TEST("test strictness") {
+ MatchData::UP md(MatchData::makeTestInstance(0, 100, 10));
+ for (uint32_t i = 0; i < 2; ++i) {
+ bool strict = (i == 0);
+
+ SimpleResult a;
+ SimpleResult b;
+
+ a.addHit(2).addHit(5).addHit(6).addHit(8);
+ b.addHit(3).addHit(5).addHit(6).addHit(7);
+
+ MySelector *sel = new MySelector(5);
+ sel->set(2, 1).set(3, 2).set(5, 2).set(7, 1);
+
+ SourceBlenderBlueprint *blend_b = new SourceBlenderBlueprint(*sel);
+ Blueprint::UP a_b(new SimpleBlueprint(a));
+ Blueprint::UP b_b(new SimpleBlueprint(b));
+ a_b->setSourceId(1);
+ b_b->setSourceId(2);
+ blend_b->addChild(std::move(a_b));
+ blend_b->addChild(std::move(b_b));
+ Blueprint::UP bp(blend_b);
+ bp->fetchPostings(strict);
+ SearchIterator::UP search = bp->createSearch(*md, strict);
+ search->initFullRange();
+ SearchIterator &blend = *search;
+
+ EXPECT_TRUE(!blend.seek(1u));
+ if (strict) {
+ EXPECT_EQUAL(2u, blend.getDocId());
+ } else {
+ EXPECT_EQUAL(blend.beginId(), blend.getDocId());
+ }
+ EXPECT_TRUE(blend.seek(5));
+ EXPECT_EQUAL(5u, blend.getDocId());
+ EXPECT_TRUE(!blend.seek(6));
+ if (strict) {
+ EXPECT_TRUE(blend.isAtEnd());
+ } else {
+ EXPECT_EQUAL(5u, blend.getDocId());
+ }
+ delete sel;
+ }
+}
+
+TEST("test full sourceblender search") {
+ SimpleResult a;
+ SimpleResult b;
+ SimpleResult c;
+
+ a.addHit(2).addHit(11).addHit(21).addHit(34);
+ b.addHit(3).addHit(11).addHit(21).addHit(33);
+ c.addHit(4).addHit(11).addHit(21).addHit(32);
+
+ // these are all handed over to the blender
+ UnpackChecker *ua = new UnpackChecker(new SimpleSearch(a));
+ UnpackChecker *ub = new UnpackChecker(new SimpleSearch(b));
+ UnpackChecker *uc = new UnpackChecker(new SimpleSearch(c));
+ auto sel = make_unique<MySelector>(5);
+
+ sel->set(2, 1).set(3, 2).set(11, 2).set(21, 3).set(34, 1);
+ SourceBlenderSearch::Children abc;
+ abc.push_back(SourceBlenderSearch::Child(ua, 1));
+ abc.push_back(SourceBlenderSearch::Child(ub, 2));
+ abc.push_back(SourceBlenderSearch::Child(uc, 3));
+
+ SearchIterator::UP blend(SourceBlenderSearch::create(sel->createIterator(), abc, true));
+ SimpleResult result;
+ result.search(*blend);
+
+ SimpleResult expect_result;
+ expect_result.addHit(2).addHit(3).addHit(11).addHit(21).addHit(34);
+
+ SimpleResult expect_unpacked_a;
+ expect_unpacked_a.addHit(2).addHit(34);
+
+ SimpleResult expect_unpacked_b;
+ expect_unpacked_b.addHit(3).addHit(11);
+
+ SimpleResult expect_unpacked_c;
+ expect_unpacked_c.addHit(21);
+
+ EXPECT_EQUAL(expect_result, result);
+ EXPECT_EQUAL(expect_unpacked_a, ua->getUnpacked());
+ EXPECT_EQUAL(expect_unpacked_b, ub->getUnpacked());
+ EXPECT_EQUAL(expect_unpacked_c, uc->getUnpacked());
+}
+
+using search::test::InitRangeVerifier;
+
+SourceBlenderSearch::Children
+createChildren(const std::vector<InitRangeVerifier::DocIds> & indexes, const InitRangeVerifier & ir, bool strict) {
+ SourceBlenderSearch::Children children;
+ for (size_t index(0); index < indexes.size(); index++) {
+ children.emplace_back(ir.createIterator(indexes[index], strict).release(), index);
+ }
+ return children;
+}
+
+TEST("test init range") {
+ InitRangeVerifier ir;
+ std::vector<InitRangeVerifier::DocIds> indexes(3);
+ auto sel = make_unique<MySelector>(ir.getDocIdLimit());
+ for (uint32_t docId : ir.getExpectedDocIds()) {
+ const size_t indexId = docId%indexes.size();
+ sel->set(docId, indexId);
+ indexes[indexId].push_back(docId);
+ }
+ TermFieldMatchData tfmd;
+ TEST_DO(ir.verify(SourceBlenderSearch::create(sel->createIterator(), createChildren(indexes, ir, false), false)));
+ TEST_DO(ir.verify(SourceBlenderSearch::create(sel->createIterator(), createChildren(indexes, ir, true), true)));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }