diff options
Diffstat (limited to 'searchlib/src/tests')
-rw-r--r-- | searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp | 4 | ||||
-rw-r--r-- | searchlib/src/tests/attribute/document_weight_or_filter_search/CMakeLists.txt | 10 | ||||
-rw-r--r-- | searchlib/src/tests/attribute/multi_term_or_filter_search/CMakeLists.txt | 10 | ||||
-rw-r--r-- | searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp (renamed from searchlib/src/tests/attribute/document_weight_or_filter_search/document_weight_or_filter_search_test.cpp) | 44 | ||||
-rw-r--r-- | searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp | 4 | ||||
-rw-r--r-- | searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp | 84 | ||||
-rw-r--r-- | searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp | 2 |
7 files changed, 119 insertions, 39 deletions
diff --git a/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp b/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp index 0245af828dd..67b73f459c9 100644 --- a/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp +++ b/searchlib/src/tests/attribute/direct_multi_term_blueprint/direct_multi_term_blueprint_test.cpp @@ -300,7 +300,7 @@ TEST_P(DirectMultiTermBlueprintTest, filter_iterator_used_for_filter_field_and_r add_term(1); add_term(3); auto itr = create_leaf_search(); - EXPECT_THAT(itr->asString(), StartsWith("search::attribute::DocumentWeightOrFilterSearchImpl")); + EXPECT_THAT(itr->asString(), StartsWith("search::attribute::MultiTermOrFilterSearchImpl")); expect_hits({10, 30, 31}, *itr); } @@ -315,7 +315,7 @@ TEST_P(DirectMultiTermBlueprintTest, bitvectors_and_filter_iterator_used_for_fil expect_or_iterator(*itr, 3); expect_or_child(*itr, 0, "search::BitVectorIteratorStrictT"); expect_or_child(*itr, 1, "search::BitVectorIteratorStrictT"); - expect_or_child(*itr, 2, "search::attribute::DocumentWeightOrFilterSearchImpl"); + expect_or_child(*itr, 2, "search::attribute::MultiTermOrFilterSearchImpl"); expect_hits(concat({10, 30, 31}, concat(range(100, 128), range(300, 128))), *itr); } diff --git a/searchlib/src/tests/attribute/document_weight_or_filter_search/CMakeLists.txt b/searchlib/src/tests/attribute/document_weight_or_filter_search/CMakeLists.txt deleted file mode 100644 index b2f86a9ddec..00000000000 --- a/searchlib/src/tests/attribute/document_weight_or_filter_search/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -vespa_add_executable(searchlib_document_weight_or_filter_search_test_app TEST - SOURCES - document_weight_or_filter_search_test.cpp - DEPENDS - searchlib - searchlib_test - GTest::GTest -) -vespa_add_test(NAME searchlib_document_weight_or_filter_search_test_app COMMAND searchlib_document_weight_or_filter_search_test_app) diff --git a/searchlib/src/tests/attribute/multi_term_or_filter_search/CMakeLists.txt b/searchlib/src/tests/attribute/multi_term_or_filter_search/CMakeLists.txt new file mode 100644 index 00000000000..4ec5d849ad3 --- /dev/null +++ b/searchlib/src/tests/attribute/multi_term_or_filter_search/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchlib_multi_term_or_filter_search_test_app TEST + SOURCES + multi_term_or_filter_search_test.cpp + DEPENDS + searchlib + searchlib_test + GTest::GTest +) +vespa_add_test(NAME searchlib_multi_term_or_filter_search_test_app COMMAND searchlib_multi_term_or_filter_search_test_app) diff --git a/searchlib/src/tests/attribute/document_weight_or_filter_search/document_weight_or_filter_search_test.cpp b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp index ae4812b5437..dea2702ef0d 100644 --- a/searchlib/src/tests/attribute/document_weight_or_filter_search/document_weight_or_filter_search_test.cpp +++ b/searchlib/src/tests/attribute/multi_term_or_filter_search/multi_term_or_filter_search_test.cpp @@ -1,10 +1,10 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/gtest/gtest.h> #include <vespa/searchlib/attribute/i_direct_posting_store.h> -#include <vespa/searchlib/attribute/document_weight_or_filter_search.h> -#include <vespa/searchlib/queryeval/searchiterator.h> +#include <vespa/searchlib/attribute/multi_term_or_filter_search.h> #include <vespa/searchlib/common/bitvector.h> +#include <vespa/searchlib/queryeval/searchiterator.h> +#include <vespa/vespalib/gtest/gtest.h> #define ENABLE_GTEST_MIGRATION #include <vespa/searchlib/test/searchiteratorverifier.h> @@ -12,19 +12,19 @@ using PostingList = search::attribute::PostingListTraits<int32_t>::PostingStoreB using Iterator = search::attribute::PostingListTraits<int32_t>::const_iterator; using KeyData = PostingList::KeyDataType; using search::BitVector; -using search::attribute::DocumentWeightOrFilterSearch; +using search::attribute::MultiTermOrFilterSearch; using search::queryeval::SearchIterator; using vespalib::datastore::EntryRef; -class DocumentWeightOrFilterSearchTest : public ::testing::Test { +class MultiTermOrFilterSearchTest : public ::testing::Test { PostingList _postings; vespalib::GenerationHandler _gens; std::vector<EntryRef> _trees; uint32_t _range_start; uint32_t _range_end; public: - DocumentWeightOrFilterSearchTest(); - ~DocumentWeightOrFilterSearchTest() override; + MultiTermOrFilterSearchTest(); + ~MultiTermOrFilterSearchTest() override; void inc_generation(); size_t num_trees() const { return _trees.size(); } Iterator get_tree(size_t idx) const { @@ -62,7 +62,7 @@ public: for (size_t i = 0; i < num_trees(); ++i) { iterators.emplace_back(get_tree(i)); } - auto result = DocumentWeightOrFilterSearch::create(std::move(iterators)); + auto result = MultiTermOrFilterSearch::create(std::move(iterators)); result->initRange(_range_start, _range_end); return result; }; @@ -121,7 +121,7 @@ public: } }; -DocumentWeightOrFilterSearchTest::DocumentWeightOrFilterSearchTest() +MultiTermOrFilterSearchTest::MultiTermOrFilterSearchTest() : _postings(true), _gens(), _range_start(1), @@ -129,7 +129,7 @@ DocumentWeightOrFilterSearchTest::DocumentWeightOrFilterSearchTest() { } -DocumentWeightOrFilterSearchTest::~DocumentWeightOrFilterSearchTest() +MultiTermOrFilterSearchTest::~MultiTermOrFilterSearchTest() { for (auto& tree : _trees) { _postings.clear(tree); @@ -140,7 +140,7 @@ DocumentWeightOrFilterSearchTest::~DocumentWeightOrFilterSearchTest() } void -DocumentWeightOrFilterSearchTest::inc_generation() +MultiTermOrFilterSearchTest::inc_generation() { _postings.freeze(); _postings.assign_generation(_gens.getCurrentGeneration()); @@ -148,19 +148,19 @@ DocumentWeightOrFilterSearchTest::inc_generation() _postings.reclaim_memory(_gens.get_oldest_used_generation()); } -TEST_F(DocumentWeightOrFilterSearchTest, daat_or) +TEST_F(MultiTermOrFilterSearchTest, daat_or) { make_sample_data(); expect_result(eval_daat(*make_iterator()), { 3, 10, 11, 14, 17, 20 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_get_hits) +TEST_F(MultiTermOrFilterSearchTest, taat_get_hits) { make_sample_data(); expect_result(frombv(*make_iterator()->get_hits(get_range_start())), { 3, 10, 11, 14, 17, 20 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_or_hits_into) +TEST_F(MultiTermOrFilterSearchTest, taat_or_hits_into) { make_sample_data(); auto bv = tobv({13, 14}); @@ -168,7 +168,7 @@ TEST_F(DocumentWeightOrFilterSearchTest, taat_or_hits_into) expect_result(frombv(*bv), { 3, 10, 11, 13, 14, 17, 20 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_and_hits_into) +TEST_F(MultiTermOrFilterSearchTest, taat_and_hits_into) { make_sample_data(); auto bv = tobv({13, 14}); @@ -176,21 +176,21 @@ TEST_F(DocumentWeightOrFilterSearchTest, taat_and_hits_into) expect_result(frombv(*bv), { 14 }); } -TEST_F(DocumentWeightOrFilterSearchTest, daat_or_ranged) +TEST_F(MultiTermOrFilterSearchTest, daat_or_ranged) { make_sample_data(); set_range(4, 15); expect_result(eval_daat(*make_iterator()), {10, 11, 14 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_get_hits_ranged) +TEST_F(MultiTermOrFilterSearchTest, taat_get_hits_ranged) { make_sample_data(); set_range(4, 15); expect_result(frombv(*make_iterator()->get_hits(get_range_start())), { 10, 11, 14 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_or_hits_into_ranged) +TEST_F(MultiTermOrFilterSearchTest, taat_or_hits_into_ranged) { make_sample_data(); set_range(4, 15); @@ -199,7 +199,7 @@ TEST_F(DocumentWeightOrFilterSearchTest, taat_or_hits_into_ranged) expect_result(frombv(*bv), { 10, 11, 13, 14 }); } -TEST_F(DocumentWeightOrFilterSearchTest, taat_and_hits_into_ranged) +TEST_F(MultiTermOrFilterSearchTest, taat_and_hits_into_ranged) { make_sample_data(); set_range(4, 15); @@ -211,9 +211,9 @@ TEST_F(DocumentWeightOrFilterSearchTest, taat_and_hits_into_ranged) namespace { class Verifier : public search::test::SearchIteratorVerifier { - DocumentWeightOrFilterSearchTest &_test; + MultiTermOrFilterSearchTest &_test; public: - Verifier(DocumentWeightOrFilterSearchTest &test, int num_trees) + Verifier(MultiTermOrFilterSearchTest &test, int num_trees) : _test(test) { std::vector<std::vector<uint32_t>> trees(num_trees); @@ -239,7 +239,7 @@ public: }; -TEST_F(DocumentWeightOrFilterSearchTest, iterator_conformance) +TEST_F(MultiTermOrFilterSearchTest, iterator_conformance) { { Verifier verifier(*this, 1); diff --git a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp index 20cf2008e4b..eefca5c82e9 100644 --- a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp +++ b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp @@ -646,6 +646,7 @@ getExpectedBlueprint() " tree_size: 2\n" " allow_termwise_eval: false\n" " }\n" + " cost: 1\n" " sourceId: 4294967295\n" " docid_limit: 0\n" " children: std::vector {\n" @@ -666,6 +667,7 @@ getExpectedBlueprint() " tree_size: 1\n" " allow_termwise_eval: true\n" " }\n" + " cost: 1\n" " sourceId: 4294967295\n" " docid_limit: 0\n" " }\n" @@ -696,6 +698,7 @@ getExpectedSlimeBlueprint() { " tree_size: 2," " allow_termwise_eval: false" " }," + " cost: 1.0," " sourceId: 4294967295," " docid_limit: 0," " children: {" @@ -721,6 +724,7 @@ getExpectedSlimeBlueprint() { " tree_size: 1," " allow_termwise_eval: true" " }," + " cost: 1.0," " sourceId: 4294967295," " docid_limit: 0" " }" diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp index e24e91c2f1d..234ff5a9d19 100644 --- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp +++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp @@ -14,6 +14,10 @@ #include <vespa/searchlib/test/diskindex/testdiskindex.h> #include <vespa/searchlib/query/tree/simplequery.h> #include <vespa/searchlib/common/bitvectoriterator.h> +#include <vespa/vespalib/util/overload.h> +#include <vespa/vespalib/data/simple_buffer.h> +#include <vespa/vespalib/data/slime/slime.h> +#include <vespa/vespalib/data/slime/inserter.h> #include <filesystem> #include <vespa/log/log.h> @@ -24,6 +28,11 @@ using namespace search::fef; using namespace search::query; using search::BitVector; using BlueprintVector = std::vector<std::unique_ptr<Blueprint>>; +using vespalib::Slime; +using vespalib::slime::Inspector; +using vespalib::slime::SlimeInserter; +using vespalib::make_string_short::fmt; +using Path = std::vector<std::variant<size_t,vespalib::stringref>>; struct InvalidSelector : ISourceSelector { InvalidSelector() : ISourceSelector(Source()) {} @@ -480,13 +489,62 @@ struct SourceBlenderTestFixture { void addChildrenForSimpleSBTest(IntermediateBlueprint & parent); }; +vespalib::string path_to_str(const Path &path) { + size_t cnt = 0; + vespalib::string str("["); + for (const auto &item: path) { + if (cnt++ > 0) { + str.append(","); + } + std::visit(vespalib::overload{ + [&str](size_t value)noexcept{ str.append(fmt("%zu", value)); }, + [&str](vespalib::stringref value)noexcept{ str.append(value); }}, item); + } + str.append("]"); + return str; +} + +vespalib::string to_str(const Inspector &value) { + if (!value.valid()) { + return "<missing>"; + } + vespalib::SimpleBuffer buf; + vespalib::slime::JsonFormat::encode(value, buf, true); + return buf.get().make_string(); +} + +void compare(const Blueprint &bp1, const Blueprint &bp2, bool expect_eq) { + auto ignore_cost = [expect_eq](const auto &path, const auto &a, const auto &b) { + if (!path.empty() && std::holds_alternative<vespalib::stringref>(path.back())) { + vespalib::stringref field = std::get<vespalib::stringref>(path.back()); + if (field == "cost") { + return true; + } + } + if (expect_eq) { + fprintf(stderr, " mismatch at %s: %s vs %s\n", path_to_str(path).c_str(), + to_str(a).c_str(), to_str(b).c_str()); + } + return false; + }; + Slime a; + Slime b; + bp1.asSlime(SlimeInserter(a)); + bp2.asSlime(SlimeInserter(b)); + if (expect_eq) { + EXPECT_TRUE(vespalib::slime::are_equal(a.get(), b.get(), ignore_cost)); + } else { + EXPECT_FALSE(vespalib::slime::are_equal(a.get(), b.get(), ignore_cost)); + } +} + void optimize_and_compare(Blueprint::UP top, Blueprint::UP expect) { - EXPECT_NOT_EQUAL(expect->asString(), top->asString()); + TEST_DO(compare(*top, *expect, false)); top = Blueprint::optimize(std::move(top)); - EXPECT_EQUAL(expect->asString(), top->asString()); + TEST_DO(compare(*top, *expect, true)); expect = Blueprint::optimize(std::move(expect)); - EXPECT_EQUAL(expect->asString(), top->asString()); + TEST_DO(compare(*expect, *top, true)); } void SourceBlenderTestFixture::addChildrenForSBTest(IntermediateBlueprint & parent) { @@ -716,6 +774,22 @@ TEST("AND_NOT AND AND_NOT collapsing") { optimize_and_compare(std::move(top), std::move(expect)); } +TEST("AND_NOT AND AND_NOT AND nested collapsing") { + Blueprint::UP top = make::ANDNOT() + .add(make::AND() + .add(make::ANDNOT() + .add(make::AND().leafs({1,2})) + .leafs({5,6})) + .add(make::ANDNOT() + .add(make::AND().leafs({3,4})) + .leafs({8,9}))) + .leaf(7); + Blueprint::UP expect = make::ANDNOT() + .add(make::AND().leafs({1,2,3,4})) + .leafs({9,8,7,6,5}); + optimize_and_compare(std::move(top), std::move(expect)); +} + TEST("AND_NOT AND AND_NOT collapsing into full source blender optimization") { InvalidSelector sel; Blueprint::UP top = @@ -1104,7 +1178,7 @@ TEST("require that children of near are not optimized") { addChild(addLeafs(std::make_unique<OrBlueprint>(), {20, {0, true}})). addChild(addLeafs(std::make_unique<OrBlueprint>(), {{0, true}, 30}))); top_up = Blueprint::optimize(std::move(top_up)); - EXPECT_EQUAL(expect_up->asString(), top_up->asString()); + TEST_DO(compare(*top_up, *expect_up, true)); } TEST("require that children of onear are not optimized") { @@ -1115,7 +1189,7 @@ TEST("require that children of onear are not optimized") { addChild(addLeafs(std::make_unique<OrBlueprint>(), {20, {0, true}})). addChild(addLeafs(std::make_unique<OrBlueprint>(), {{0, true}, 30}))); top_up = Blueprint::optimize(std::move(top_up)); - EXPECT_EQUAL(expect_up->asString(), top_up->asString()); + TEST_DO(compare(*top_up, *expect_up, true)); } TEST("require that ANDNOT without children is optimized to empty search") { diff --git a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp index 2a59a578ec9..fa12b453d8c 100644 --- a/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp +++ b/searchlib/src/tests/queryeval/parallel_weak_and/parallel_weak_and_test.cpp @@ -599,6 +599,7 @@ TEST_F("require that asString() on blueprint works", BlueprintAsStringFixture) " tree_size: 2\n" " allow_termwise_eval: false\n" " }\n" + " cost: 1\n" " sourceId: 4294967295\n" " docid_limit: 0\n" " _weights: std::vector {\n" @@ -622,6 +623,7 @@ TEST_F("require that asString() on blueprint works", BlueprintAsStringFixture) " tree_size: 1\n" " allow_termwise_eval: true\n" " }\n" + " cost: 1\n" " sourceId: 4294967295\n" " docid_limit: 0\n" " }\n" |