summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/fake_searchable
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests/queryeval/fake_searchable')
-rw-r--r--searchlib/src/tests/queryeval/fake_searchable/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp273
2 files changed, 142 insertions, 132 deletions
diff --git a/searchlib/src/tests/queryeval/fake_searchable/CMakeLists.txt b/searchlib/src/tests/queryeval/fake_searchable/CMakeLists.txt
index e5f5e6aadf3..c98306aa179 100644
--- a/searchlib/src/tests/queryeval/fake_searchable/CMakeLists.txt
+++ b/searchlib/src/tests/queryeval/fake_searchable/CMakeLists.txt
@@ -4,5 +4,6 @@ vespa_add_executable(searchlib_fake_searchable_test_app TEST
fake_searchable_test.cpp
DEPENDS
searchlib
+ gtest
)
vespa_add_test(NAME searchlib_fake_searchable_test_app COMMAND searchlib_fake_searchable_test_app)
diff --git a/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp b/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
index 661ca9c2ba3..6cef4479439 100644
--- a/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
+++ b/searchlib/src/tests/queryeval/fake_searchable/fake_searchable_test.cpp
@@ -1,5 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/vespalib/gtest/gtest.h>
#include <vespa/searchlib/queryeval/fake_searchable.h>
#include <vespa/searchlib/queryeval/fake_requestcontext.h>
@@ -8,76 +9,58 @@
#include <vespa/searchlib/query/tree/simplequery.h>
#include <vespa/searchlib/fef/matchdata.h>
-#include <vespa/log/log.h>
-LOG_SETUP("fake_searchable_test");
-
using namespace search::queryeval;
using namespace search::query;
using namespace search::fef;
-class Test : public vespalib::TestApp {
-public:
- ~Test();
- int Main() override;
- void testTestFakeResult();
- void testTerm();
- void testPhrase();
- void testWeightedSet();
- void testMultiField();
- void testPhraseWithEmptyChild();
-private:
- FakeRequestContext _requestContext;
+struct FakeSearchableTest : ::testing::Test {
+ Weight w;
+ FakeRequestContext req_ctx;
+ FakeSearchable source;
+ FakeSearchableTest() : w(100), req_ctx(), source() {}
};
-Test::~Test() {}
-void
-Test::testTestFakeResult()
-{
- EXPECT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6).elem(6).doc(6),
- FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6).elem(6).doc(6));
+TEST(FakeResultTest, require_that_fake_result_works) {
+ EXPECT_EQ(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6).elem(6).doc(6),
+ FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6).elem(6).doc(6));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(1).elem(5).len(15).weight(5).pos(5));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(1).elem(5).len(15).weight(5).pos(5));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(1).len(15).weight(5).pos(5));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(1).len(15).weight(5).pos(5));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(19).weight(5).pos(5));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(19).weight(5).pos(5));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(15).weight(1).pos(5));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(15).weight(1).pos(5));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(15).weight(5).pos(1));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(15).weight(5).pos(1));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).doc(6));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).doc(6));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).elem(6));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).elem(6));
- EXPECT_NOT_EQUAL(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5),
- FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6));
+ EXPECT_FALSE(FakeResult().doc(5).elem(5).len(15).weight(5).pos(5) ==
+ FakeResult().doc(5).elem(5).len(15).weight(5).pos(5).pos(6));
}
-void
-Test::testTerm()
-{
- Weight w(100);
-
- FakeSearchable source;
+TEST_F(FakeSearchableTest, require_that_term_search_works) {
source.addResult("fieldfoo", "word1",
- FakeResult().doc(5).pos(3));
+ FakeResult().doc(5).elem(2).pos(3).elem(4).pos(5));
SimpleStringTerm termNode("word1", "viewfoo", 1, w);
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
- Blueprint::UP bp = source.createBlueprint(_requestContext, fields, termNode);
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, termNode);
for (int i = 0; i <= 1; ++i) {
bool strict = (i == 0);
- TEST_STATE(strict ? "strict" : "non-strict");
+ SCOPED_TRACE(strict ? "strict" : "non-strict");
MatchData::UP md = MatchData::makeTestInstance(100, 10);
bp->fetchPostings(strict);
SearchIterator::UP search = bp->createSearch(*md, strict);
@@ -85,21 +68,26 @@ Test::testTerm()
EXPECT_TRUE(!search->seek(3));
if (strict) {
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(5u, search->getDocId());
} else {
EXPECT_TRUE(search->seek(5u));
}
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(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());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(5u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(2u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(3u, itr.getPosition());
+ EXPECT_EQ(2u, itr.getElementId());
+ EXPECT_EQ(3u, itr.getPosition());
+ itr.next();
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQ(4u, itr.getElementId());
+ EXPECT_EQ(5u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -111,12 +99,7 @@ Test::testTerm()
}
}
-void
-Test::testPhrase()
-{
- Weight w(100);
-
- FakeSearchable source;
+TEST_F(FakeSearchableTest, require_that_phrase_search_works) {
source.addResult("fieldfoo", "word1",
FakeResult().doc(3).pos(7).doc(5).pos(3));
source.addResult("fieldfoo", "word2",
@@ -128,10 +111,10 @@ Test::testPhrase()
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
- Blueprint::UP bp = source.createBlueprint(_requestContext, fields, phraseNode);
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, phraseNode);
for (int i = 0; i <= 1; ++i) {
bool strict = (i == 0);
- TEST_STATE(strict ? "strict" : "non-strict");
+ SCOPED_TRACE(strict ? "strict" : "non-strict");
MatchData::UP md = MatchData::makeTestInstance(100, 10);
bp->fetchPostings(strict);
SearchIterator::UP search = bp->createSearch(*md, strict);
@@ -139,21 +122,21 @@ Test::testPhrase()
EXPECT_TRUE(!search->seek(3));
if (strict) {
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(5u, search->getDocId());
} else {
EXPECT_TRUE(search->seek(5u));
}
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(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());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(5u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(3u, itr.getPosition());
+ EXPECT_EQ(3u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -165,12 +148,7 @@ Test::testPhrase()
}
}
-void
-Test::testWeightedSet()
-{
- Weight w(100);
-
- FakeSearchable source;
+TEST_F(FakeSearchableTest, require_that_weigheted_set_search_works) {
source.addResult("fieldfoo", "friend1",
FakeResult().doc(3).doc(5).doc(7).doc(9));
source.addResult("fieldfoo", "friend2",
@@ -184,10 +162,10 @@ Test::testWeightedSet()
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
- Blueprint::UP bp = source.createBlueprint(_requestContext, fields, weightedSet);
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, weightedSet);
for (int i = 0; i <= 1; ++i) {
bool strict = (i == 0);
- TEST_STATE(strict ? "strict" : "non-strict");
+ SCOPED_TRACE(strict ? "strict" : "non-strict");
MatchData::UP md = MatchData::makeTestInstance(100, 10);
bp->fetchPostings(strict);
SearchIterator::UP search = bp->createSearch(*md, strict);
@@ -195,24 +173,24 @@ Test::testWeightedSet()
EXPECT_TRUE(!search->seek(2));
if (strict) {
- EXPECT_EQUAL(3u, search->getDocId());
+ EXPECT_EQ(3u, search->getDocId());
} else {
EXPECT_TRUE(search->seek(3u));
}
- EXPECT_EQUAL(3u, search->getDocId());
+ EXPECT_EQ(3u, search->getDocId());
{ // test doc 3 results
search->unpack(3u);
{
TermFieldMatchData &data = *md->resolveTermField(1);
- EXPECT_EQUAL(1u, data.getFieldId());
- EXPECT_EQUAL(3u, data.getDocId());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(3u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(2u, itr.size());
+ EXPECT_EQ(2u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(2, itr.getElementWeight());
+ EXPECT_EQ(2, itr.getElementWeight());
itr.next();
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(1, itr.getElementWeight());
+ EXPECT_EQ(1, itr.getElementWeight());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -227,12 +205,12 @@ Test::testWeightedSet()
search->unpack(9u);
{
TermFieldMatchData &data = *md->resolveTermField(1);
- EXPECT_EQUAL(1u, data.getFieldId());
- EXPECT_EQUAL(9u, data.getDocId());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(9u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(1, itr.getElementWeight());
+ EXPECT_EQ(1, itr.getElementWeight());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -244,12 +222,7 @@ Test::testWeightedSet()
}
}
-void
-Test::testMultiField()
-{
- Weight w(100);
-
- FakeSearchable source;
+TEST_F(FakeSearchableTest, require_that_multi_field_search_works) {
source.addResult("fieldfoo", "word1",
FakeResult().doc(5).pos(3));
source.addResult("fieldbar", "word1",
@@ -260,10 +233,10 @@ Test::testMultiField()
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
fields.add(FieldSpec("fieldbar", 2, 2));
- Blueprint::UP bp = source.createBlueprint(_requestContext, fields, termNode);
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, termNode);
for (int i = 0; i <= 1; ++i) {
bool strict = (i == 0);
- TEST_STATE(strict ? "strict" : "non-strict");
+ SCOPED_TRACE(strict ? "strict" : "non-strict");
MatchData::UP md = MatchData::makeTestInstance(100, 10);
bp->fetchPostings(strict);
SearchIterator::UP search = bp->createSearch(*md, strict);
@@ -271,58 +244,58 @@ Test::testMultiField()
EXPECT_TRUE(!search->seek(3));
if (strict) {
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(5u, search->getDocId());
} else {
EXPECT_TRUE(search->seek(5u));
}
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(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());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(5u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(3u, itr.getPosition());
+ EXPECT_EQ(3u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
{
TermFieldMatchData &data = *md->resolveTermField(2);
- EXPECT_EQUAL(2u, data.getFieldId());
- EXPECT_EQUAL(5u, data.getDocId());
+ EXPECT_EQ(2u, data.getFieldId());
+ EXPECT_EQ(5u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(7u, itr.getPosition());
+ EXPECT_EQ(7u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
}
EXPECT_TRUE(!search->seek(7));
if (strict) {
- EXPECT_EQUAL(10u, search->getDocId());
+ EXPECT_EQ(10u, search->getDocId());
} else {
EXPECT_TRUE(search->seek(10u));
}
- EXPECT_EQUAL(10u, search->getDocId());
+ EXPECT_EQ(10u, search->getDocId());
{ // test doc 10 results
search->unpack(10u);
{
TermFieldMatchData &data = *md->resolveTermField(1);
- EXPECT_EQUAL(1u, data.getFieldId());
- EXPECT_NOT_EQUAL(10u, data.getDocId());
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_NE(10u, data.getDocId());
}
{
TermFieldMatchData &data = *md->resolveTermField(2);
- EXPECT_EQUAL(2u, data.getFieldId());
- EXPECT_EQUAL(10u, data.getDocId());
+ EXPECT_EQ(2u, data.getFieldId());
+ EXPECT_EQ(10u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(2u, itr.getPosition());
+ EXPECT_EQ(2u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -334,12 +307,7 @@ Test::testMultiField()
}
}
-void
-Test::testPhraseWithEmptyChild()
-{
- Weight w(100);
-
- FakeSearchable source;
+TEST_F(FakeSearchableTest, require_that_phrase_with_empty_child_works) {
source.addResult("fieldfoo", "word1",
FakeResult().doc(3).pos(7).doc(5).pos(3));
@@ -349,10 +317,10 @@ Test::testPhraseWithEmptyChild()
FieldSpecList fields;
fields.add(FieldSpec("fieldfoo", 1, 1));
- Blueprint::UP bp = source.createBlueprint(_requestContext, fields, phraseNode);
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, phraseNode);
for (int i = 0; i <= 1; ++i) {
bool strict = (i == 0);
- TEST_STATE(strict ? "strict" : "non-strict");
+ SCOPED_TRACE(strict ? "strict" : "non-strict");
MatchData::UP md = MatchData::makeTestInstance(100, 10);
bp->fetchPostings(strict);
SearchIterator::UP search = bp->createSearch(*md, strict);
@@ -365,17 +333,58 @@ Test::testPhraseWithEmptyChild()
}
}
-int
-Test::Main()
-{
- TEST_INIT("fake_searchable_test");
- testTestFakeResult();
- testTerm();
- testPhrase();
- testWeightedSet();
- testMultiField();
- testPhraseWithEmptyChild();
- TEST_DONE();
+TEST_F(FakeSearchableTest, require_that_match_data_is_compressed_for_attributes) {
+ source.is_attr(true);
+ source.addResult("attrfoo", "word1",
+ FakeResult().doc(5).elem(2).weight(6).pos(3).elem(4).weight(8).pos(5));
+ SimpleStringTerm termNode("word1", "viewfoo", 1, w);
+ FieldSpecList fields;
+ fields.add(FieldSpec("attrfoo", 1, 1));
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, termNode);
+ MatchData::UP md = MatchData::makeTestInstance(100, 10);
+ bp->fetchPostings(false);
+ SearchIterator::UP search = bp->createSearch(*md, false);
+ search->initFullRange();
+ EXPECT_TRUE(search->seek(5));
+ search->unpack(5u);
+ {
+ TermFieldMatchData &data = *md->resolveTermField(1);
+ EXPECT_EQ(1u, data.getFieldId());
+ EXPECT_EQ(5u, data.getDocId());
+ FieldPositionsIterator itr = data.getIterator();
+ EXPECT_EQ(1u, itr.size());
+ ASSERT_TRUE(itr.valid());
+ EXPECT_EQ(14u, itr.getElementWeight()); // 6 + 8
+ itr.next();
+ EXPECT_TRUE(!itr.valid());
+ }
+}
+
+TEST_F(FakeSearchableTest, require_that_relevant_data_can_be_obtained_from_fake_attribute_search_context) {
+ source.is_attr(true);
+ source.addResult("attrfoo", "word1",
+ FakeResult().doc(5).elem(2).weight(6).pos(3).elem(4).weight(8).pos(5));
+ SimpleStringTerm termNode("word1", "viewfoo", 1, w);
+ FieldSpecList fields;
+ fields.add(FieldSpec("attrfoo", 1, 1));
+ Blueprint::UP bp = source.createBlueprint(req_ctx, fields, termNode);
+ MatchData::UP md = MatchData::makeTestInstance(100, 10);
+ bp->fetchPostings(false);
+ SearchIterator::UP search = bp->createSearch(*md, false);
+ EXPECT_EQ(bp->get_attribute_search_context(), search->getAttributeSearchContext());
+ const auto *attr_ctx = bp->get_attribute_search_context();
+ ASSERT_TRUE(attr_ctx);
+ EXPECT_EQ(attr_ctx->attributeName(), "attrfoo");
+ int32_t elem_weight = 0;
+ EXPECT_EQ(attr_ctx->find(4, 0, elem_weight), -1);
+ int32_t elem_id = attr_ctx->find(5, 0, elem_weight);
+ EXPECT_EQ(elem_id, 2);
+ EXPECT_EQ(elem_weight, 6);
+ elem_id = attr_ctx->find(5, 3, elem_weight);
+ EXPECT_EQ(elem_id, 4);
+ EXPECT_EQ(elem_weight, 8);
+ EXPECT_EQ(attr_ctx->find(5, 5, elem_weight), -1);
+ EXPECT_EQ(attr_ctx->find(6, 0, elem_weight), -1);
}
-TEST_APPHOOK(Test);
+GTEST_MAIN_RUN_ALL_TESTS()