summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/equiv
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/equiv
Publish
Diffstat (limited to 'searchlib/src/tests/queryeval/equiv')
-rw-r--r--searchlib/src/tests/queryeval/equiv/.cvsignore3
-rw-r--r--searchlib/src/tests/queryeval/equiv/.gitignore4
-rw-r--r--searchlib/src/tests/queryeval/equiv/CMakeLists.txt8
-rw-r--r--searchlib/src/tests/queryeval/equiv/DESC1
-rw-r--r--searchlib/src/tests/queryeval/equiv/FILES1
-rw-r--r--searchlib/src/tests/queryeval/equiv/equiv_test.cpp130
6 files changed, 147 insertions, 0 deletions
diff --git a/searchlib/src/tests/queryeval/equiv/.cvsignore b/searchlib/src/tests/queryeval/equiv/.cvsignore
new file mode 100644
index 00000000000..1f159f55125
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/.cvsignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+equiv_test
diff --git a/searchlib/src/tests/queryeval/equiv/.gitignore b/searchlib/src/tests/queryeval/equiv/.gitignore
new file mode 100644
index 00000000000..d28d4650b98
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/.gitignore
@@ -0,0 +1,4 @@
+*_test
+.depend
+Makefile
+searchlib_equiv_test_app
diff --git a/searchlib/src/tests/queryeval/equiv/CMakeLists.txt b/searchlib/src/tests/queryeval/equiv/CMakeLists.txt
new file mode 100644
index 00000000000..695e9b87121
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchlib_equiv_test_app
+ SOURCES
+ equiv_test.cpp
+ DEPENDS
+ searchlib
+)
+vespa_add_test(NAME searchlib_equiv_test_app COMMAND searchlib_equiv_test_app)
diff --git a/searchlib/src/tests/queryeval/equiv/DESC b/searchlib/src/tests/queryeval/equiv/DESC
new file mode 100644
index 00000000000..e294d10cb23
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/DESC
@@ -0,0 +1 @@
+equiv test. Take a look at equiv_test.cpp for details.
diff --git a/searchlib/src/tests/queryeval/equiv/FILES b/searchlib/src/tests/queryeval/equiv/FILES
new file mode 100644
index 00000000000..79adf32c1d5
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/FILES
@@ -0,0 +1 @@
+equiv_test.cpp
diff --git a/searchlib/src/tests/queryeval/equiv/equiv_test.cpp b/searchlib/src/tests/queryeval/equiv/equiv_test.cpp
new file mode 100644
index 00000000000..3d97d05995f
--- /dev/null
+++ b/searchlib/src/tests/queryeval/equiv/equiv_test.cpp
@@ -0,0 +1,130 @@
+// 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("equiv_test");
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchlib/queryeval/leaf_blueprints.h>
+#include <vespa/searchlib/queryeval/intermediate_blueprints.h>
+#include <vespa/searchlib/queryeval/equiv_blueprint.h>
+#include <vespa/searchlib/fef/matchdatalayout.h>
+
+using namespace search::queryeval;
+using search::fef::MatchData;
+using search::fef::MatchDataLayout;
+using search::fef::TermFieldHandle;
+using search::fef::TermFieldMatchData;
+using search::fef::FieldPositionsIterator;
+
+class Test : public vespalib::TestApp {
+public:
+ void testEquiv();
+ int Main();
+};
+
+void
+Test::testEquiv()
+{
+ FakeResult a;
+ FakeResult b;
+ FakeResult c;
+
+ a.doc(5).pos(1);
+ b.doc(5).pos(2);
+ c.doc(5).pos(3).doc(10).pos(4);
+
+ MatchDataLayout subLayout;
+ TermFieldHandle fbh11 = subLayout.allocTermField(1);
+ TermFieldHandle fbh21 = subLayout.allocTermField(2);
+ TermFieldHandle fbh22 = subLayout.allocTermField(2);
+
+ FieldSpecBaseList fields;
+ fields.add(FieldSpecBase(1, 1));
+ fields.add(FieldSpecBase(2, 2));
+ EquivBlueprint *eq_b = new EquivBlueprint(fields, subLayout);
+
+ eq_b->addTerm(Blueprint::UP(new FakeBlueprint(FieldSpec("foo", 1, fbh11), a)), 1.0);
+ eq_b->addTerm(Blueprint::UP(new FakeBlueprint(FieldSpec("bar", 2, fbh21), b)), 1.0);
+ eq_b->addTerm(Blueprint::UP(new FakeBlueprint(FieldSpec("bar", 2, fbh22), c)), 1.0);
+
+ Blueprint::UP bp(eq_b);
+ for (int i = 0; i <= 1; ++i) {
+ bool strict = (i == 0);
+ TEST_STATE(strict ? "strict" : "non-strict");
+ MatchData::UP md = MatchData::makeTestInstance(0, 100, 10);
+ bp->fetchPostings(strict);
+ SearchIterator::UP search = bp->createSearch(*md, strict);
+ search->initFullRange();
+
+ EXPECT_TRUE(!search->seek(3));
+ if (!strict) {
+ EXPECT_EQUAL(SearchIterator::beginId(), search->getDocId());
+ EXPECT_TRUE(search->seek(5u));
+ }
+ EXPECT_EQUAL(5u, search->getDocId());
+ { // test doc 5 results
+ search->unpack(5u);
+ {
+ TermFieldMatchData &data = *md->resolveTermField(1);
+ EXPECT_EQUAL(1u, data.getFieldId());
+ EXPECT_EQUAL(5u, data.getDocId());
+ FieldPositionsIterator itr = data.getIterator();
+ EXPECT_EQUAL(1u, itr.size());
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQUAL(1u, itr.getPosition());
+ itr.next();
+ EXPECT_TRUE(!itr.valid());
+ }
+ {
+ TermFieldMatchData &data = *md->resolveTermField(2);
+ EXPECT_EQUAL(2u, data.getFieldId());
+ EXPECT_EQUAL(5u, data.getDocId());
+ FieldPositionsIterator itr = data.getIterator();
+ EXPECT_EQUAL(2u, itr.size());
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQUAL(2u, itr.getPosition());
+ itr.next();
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQUAL(3u, itr.getPosition());
+ itr.next();
+ EXPECT_TRUE(!itr.valid());
+ }
+ }
+ EXPECT_TRUE(!search->seek(7));
+ if (!strict) {
+ EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_TRUE(search->seek(10u));
+ }
+ EXPECT_EQUAL(10u, search->getDocId());
+ { // test doc 10 results
+ search->unpack(10u);
+ EXPECT_EQUAL(5u, md->resolveTermField(1)->getDocId()); // no match
+ {
+ TermFieldMatchData &data = *md->resolveTermField(2);
+ EXPECT_EQUAL(2u, data.getFieldId());
+ EXPECT_EQUAL(10u, data.getDocId());
+ FieldPositionsIterator itr = data.getIterator();
+ EXPECT_EQUAL(1u, itr.size());
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQUAL(4u, itr.getPosition());
+ itr.next();
+ EXPECT_TRUE(!itr.valid());
+ }
+ }
+ EXPECT_TRUE(!search->seek(13));
+ if (strict) {
+ EXPECT_TRUE(search->isAtEnd());
+ } else {
+ EXPECT_EQUAL(10u, search->getDocId());
+ }
+ }
+}
+
+int
+Test::Main()
+{
+ TEST_INIT("equiv_test");
+ testEquiv();
+ TEST_DONE();
+}
+
+TEST_APPHOOK(Test);