aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/blueprint
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests/queryeval/blueprint')
-rw-r--r--searchlib/src/tests/queryeval/blueprint/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp50
-rw-r--r--searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp12
-rw-r--r--searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp73
4 files changed, 67 insertions, 69 deletions
diff --git a/searchlib/src/tests/queryeval/blueprint/CMakeLists.txt b/searchlib/src/tests/queryeval/blueprint/CMakeLists.txt
index e46ad1085e3..ef8d974151a 100644
--- a/searchlib/src/tests/queryeval/blueprint/CMakeLists.txt
+++ b/searchlib/src/tests/queryeval/blueprint/CMakeLists.txt
@@ -11,6 +11,7 @@ vespa_add_executable(searchlib_leaf_blueprints_test_app TEST
leaf_blueprints_test.cpp
DEPENDS
searchlib
+ GTest::gtest
)
vespa_add_test(NAME searchlib_leaf_blueprints_test_app COMMAND searchlib_leaf_blueprints_test_app || diff -u lhs.out rhs.out)
vespa_add_executable(searchlib_intermediate_blueprints_test_app TEST
diff --git a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
index 485410e0eba..f7745da174c 100644
--- a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
@@ -13,7 +13,7 @@
LOG_SETUP("blueprint_test");
using namespace search::queryeval;
-using namespace search::fef;
+using MatchData = search::fef::MatchData;
namespace {
@@ -44,9 +44,7 @@ public:
}
SearchIterator::UP
- createIntermediateSearch(MultiSearch::Children subSearches,
- MatchData &md) const override
- {
+ createIntermediateSearch(MultiSearch::Children subSearches, MatchData &md) const override {
return std::make_unique<MySearch>("or", std::move(subSearches), &md, strict());
}
SearchIteratorUP createFilterSearch(FilterConstraint constraint) const override {
@@ -63,9 +61,7 @@ class OtherOr : public OrBlueprint
private:
public:
SearchIterator::UP
- createIntermediateSearch(MultiSearch::Children subSearches,
- MatchData &md) const override
- {
+ createIntermediateSearch(MultiSearch::Children subSearches, MatchData &md) const override {
return std::make_unique<MySearch>("or", std::move(subSearches), &md, strict());
}
@@ -89,9 +85,7 @@ public:
}
SearchIterator::UP
- createIntermediateSearch(MultiSearch::Children subSearches,
- MatchData &md) const override
- {
+ createIntermediateSearch(MultiSearch::Children subSearches, MatchData &md) const override {
return std::make_unique<MySearch>("and", std::move(subSearches), &md, strict());
}
@@ -106,9 +100,7 @@ class OtherAnd : public AndBlueprint
private:
public:
SearchIterator::UP
- createIntermediateSearch(MultiSearch::Children subSearches,
- MatchData &md) const override
- {
+ createIntermediateSearch(MultiSearch::Children subSearches, MatchData &md) const override {
return std::make_unique<MySearch>("and", std::move(subSearches), &md, strict());
}
@@ -121,9 +113,7 @@ class OtherAndNot : public AndNotBlueprint
{
public:
SearchIterator::UP
- createIntermediateSearch(MultiSearch::Children subSearches,
- MatchData &md) const override
- {
+ createIntermediateSearch(MultiSearch::Children subSearches, MatchData &md) const override {
return std::make_unique<MySearch>("andnot", std::move(subSearches), &md, strict());
}
@@ -658,6 +648,7 @@ getExpectedBlueprint()
" strict_cost: 0\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
+ " id: 0\n"
" strict: false\n"
" children: std::vector {\n"
" [0]: (anonymous namespace)::MyTerm {\n"
@@ -681,6 +672,7 @@ getExpectedBlueprint()
" strict_cost: 0\n"
" sourceId: 4294967295\n"
" docid_limit: 0\n"
+ " id: 0\n"
" strict: false\n"
" }\n"
" }\n"
@@ -714,6 +706,7 @@ getExpectedSlimeBlueprint() {
" strict_cost: 0.0,"
" sourceId: 4294967295,"
" docid_limit: 0,"
+ " id: 0,"
" strict: false,"
" children: {"
" '[type]': 'std::vector',"
@@ -742,6 +735,7 @@ getExpectedSlimeBlueprint() {
" strict_cost: 0.0,"
" sourceId: 4294967295,"
" docid_limit: 0,"
+ " id: 0,"
" strict: false"
" }"
" }"
@@ -852,6 +846,30 @@ TEST("self strict resolving during sort") {
}
}
+void check_ids(Blueprint &bp, const std::vector<uint32_t> &expect) {
+ std::vector<uint32_t> actual;
+ bp.each_node_post_order([&](auto &node){ actual.push_back(node.id()); });
+ ASSERT_EQUAL(actual.size(), expect.size());
+ for (size_t i = 0; i < actual.size(); ++i) {
+ EXPECT_EQUAL(actual[i], expect[i]);
+ }
+}
+
+TEST("blueprint node enumeration") {
+ auto a = std::make_unique<AndBlueprint>();
+ a->addChild(std::make_unique<MyLeaf>());
+ a->addChild(std::make_unique<MyLeaf>());
+ auto b = std::make_unique<AndBlueprint>();
+ b->addChild(std::make_unique<MyLeaf>());
+ b->addChild(std::make_unique<MyLeaf>());
+ auto root = std::make_unique<OrBlueprint>();
+ root->addChild(std::move(a));
+ root->addChild(std::move(b));
+ TEST_DO(check_ids(*root, {0,0,0,0,0,0,0}));
+ root->enumerate(1);
+ TEST_DO(check_ids(*root, {3,4,2,6,7,5,1}));
+}
+
TEST_MAIN() {
TEST_DEBUG("lhs.out", "rhs.out");
TEST_RUN_ALL();
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
index bddc9f92111..490f221d1d8 100644
--- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
@@ -27,8 +27,9 @@
LOG_SETUP("blueprint_test");
using namespace search::queryeval;
-using namespace search::fef;
using namespace search::query;
+using search::fef::MatchData;
+using search::queryeval::Blueprint;
using search::BitVector;
using BlueprintVector = std::vector<std::unique_ptr<Blueprint>>;
using vespalib::Slime;
@@ -575,7 +576,9 @@ void compare(const Blueprint &bp1, const Blueprint &bp2, bool expect_eq) {
bp1.asSlime(SlimeInserter(a));
bp2.asSlime(SlimeInserter(b));
if (expect_eq) {
- EXPECT_TRUE(vespalib::slime::are_equal(a.get(), b.get(), cmp_hook));
+ if(!EXPECT_TRUE(vespalib::slime::are_equal(a.get(), b.get(), cmp_hook))) {
+ fprintf(stderr, "a: %s\n\nb: %s\n\n", bp1.asString().c_str(), bp2.asString().c_str());
+ }
} else {
EXPECT_FALSE(vespalib::slime::are_equal(a.get(), b.get(), cmp_hook));
}
@@ -613,7 +616,6 @@ TEST_F("test SourceBlender below AND partial optimization", SourceBlenderTestFix
auto expect = std::make_unique<AndBlueprint>();
addLeafs(*expect, {1,2,3});
- expect->addChild(addLeafsWithSourceId(std::make_unique<SourceBlenderBlueprint>(f.selector_2), {{10, 1}, {20, 2}}));
auto blender = std::make_unique<SourceBlenderBlueprint>(f.selector_1);
blender->addChild(addLeafsWithSourceId(3, std::make_unique<AndBlueprint>(), {{30, 3}, {300, 3}}));
@@ -621,6 +623,8 @@ TEST_F("test SourceBlender below AND partial optimization", SourceBlenderTestFix
blender->addChild(addLeafsWithSourceId(1, std::make_unique<AndBlueprint>(), {{10, 1}, {100, 1}, {1000, 1}}));
expect->addChild(std::move(blender));
+ expect->addChild(addLeafsWithSourceId(std::make_unique<SourceBlenderBlueprint>(f.selector_2), {{10, 1}, {20, 2}}));
+
optimize_and_compare(std::move(top), std::move(expect));
}
@@ -1401,7 +1405,7 @@ TEST("cost for ANDNOT") {
TEST("cost for SB") {
InvalidSelector sel;
- verify_cost(make::SB(sel), 1.3, 1.3); // max
+ verify_cost(make::SB(sel), 1.3+1.0, 1.3+(1.0-0.8*0.7*0.5)); // max, non_strict+1.0, strict+est
}
TEST("cost for NEAR") {
diff --git a/searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp
index cb5473babbd..ea7f3d8fdc9 100644
--- a/searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp
@@ -1,33 +1,20 @@
// Copyright Vespa.ai. 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/blueprint.h>
#include <vespa/searchlib/queryeval/leaf_blueprints.h>
#include <vespa/searchlib/fef/matchdata.h>
-
-#include <vespa/log/log.h>
-LOG_SETUP("blueprint_test");
+#include <vespa/vespalib/gtest/gtest.h>
using namespace search::queryeval;
using namespace search::fef;
-class Test : public vespalib::TestApp
-{
-public:
- void testEmptyBlueprint();
- void testSimpleBlueprint();
- void testFakeBlueprint();
- int Main() override;
-};
-
-void
-Test::testEmptyBlueprint()
+TEST(LeafBlueprintsTest, empty_blueprint)
{
MatchData::UP md(MatchData::makeTestInstance(100, 10));
EmptyBlueprint empty(FieldSpecBase(1, 11));
ASSERT_TRUE(empty.getState().numFields() == 1u);
- EXPECT_EQUAL(1u, empty.getState().field(0).getFieldId());
- EXPECT_EQUAL(11u, empty.getState().field(0).getHandle());
+ EXPECT_EQ(1u, empty.getState().field(0).getFieldId());
+ EXPECT_EQ(11u, empty.getState().field(0).getHandle());
empty.basic_plan(true, 100);
empty.fetchPostings(ExecuteInfo::FULL);
@@ -36,18 +23,17 @@ Test::testEmptyBlueprint()
SimpleResult res;
res.search(*search);
SimpleResult expect; // empty
- EXPECT_EQUAL(res, expect);
+ EXPECT_EQ(res, expect);
}
-void
-Test::testSimpleBlueprint()
+TEST(LeafBlueprintsTest, simple_blueprint)
{
MatchData::UP md(MatchData::makeTestInstance(100, 10));
SimpleResult a;
a.addHit(3).addHit(5).addHit(7);
SimpleBlueprint simple(a);
simple.tag("tag");
- EXPECT_EQUAL("tag", simple.tag());
+ EXPECT_EQ("tag", simple.tag());
simple.basic_plan(true, 100);
simple.fetchPostings(ExecuteInfo::FULL);
SearchIterator::UP search = simple.createSearch(*md);
@@ -56,11 +42,10 @@ Test::testSimpleBlueprint()
res.search(*search);
SimpleResult expect;
expect.addHit(3).addHit(5).addHit(7);
- EXPECT_EQUAL(res, expect);
+ EXPECT_EQ(res, expect);
}
-void
-Test::testFakeBlueprint()
+TEST(LeafBlueprintsTest, fake_blueprint)
{
MatchData::UP md(MatchData::makeTestInstance(100, 10));
FakeResult fake;
@@ -76,36 +61,36 @@ Test::testFakeBlueprint()
SearchIterator::UP search = orig.createSearch(*md);
search->initFullRange();
EXPECT_TRUE(!search->seek(1u));
- EXPECT_EQUAL(10u, search->getDocId());
+ EXPECT_EQ(10u, search->getDocId());
{
search->unpack(10u);
TermFieldMatchData &data = *md->resolveTermField(handle);
- EXPECT_EQUAL(fieldId, data.getFieldId());
- EXPECT_EQUAL(10u, data.getDocId());
- EXPECT_EQUAL(10u, data.getDocId());
+ EXPECT_EQ(fieldId, data.getFieldId());
+ EXPECT_EQ(10u, data.getDocId());
+ EXPECT_EQ(10u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(50u, itr.getFieldLength());
- EXPECT_EQUAL(2u, itr.size());
+ EXPECT_EQ(50u, itr.getFieldLength());
+ EXPECT_EQ(2u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(2u, itr.getPosition());
+ EXPECT_EQ(2u, itr.getPosition());
itr.next();
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(3u, itr.getPosition());
+ EXPECT_EQ(3u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
EXPECT_TRUE(search->seek(25));
- EXPECT_EQUAL(25u, search->getDocId());
+ EXPECT_EQ(25u, search->getDocId());
{
search->unpack(25u);
TermFieldMatchData &data = *md->resolveTermField(handle);
- EXPECT_EQUAL(fieldId, data.getFieldId());
- EXPECT_EQUAL(25u, data.getDocId());
+ EXPECT_EQ(fieldId, data.getFieldId());
+ EXPECT_EQ(25u, data.getDocId());
FieldPositionsIterator itr = data.getIterator();
- EXPECT_EQUAL(10u, itr.getFieldLength());
- EXPECT_EQUAL(1u, itr.size());
+ EXPECT_EQ(10u, itr.getFieldLength());
+ EXPECT_EQ(1u, itr.size());
ASSERT_TRUE(itr.valid());
- EXPECT_EQUAL(5u, itr.getPosition());
+ EXPECT_EQ(5u, itr.getPosition());
itr.next();
EXPECT_TRUE(!itr.valid());
}
@@ -113,14 +98,4 @@ Test::testFakeBlueprint()
EXPECT_TRUE(search->isAtEnd());
}
-int
-Test::Main()
-{
- TEST_INIT("leaf_blueprints_test");
- testEmptyBlueprint();
- testSimpleBlueprint();
- testFakeBlueprint();
- TEST_DONE();
-}
-
-TEST_APPHOOK(Test);
+GTEST_MAIN_RUN_ALL_TESTS()