diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-02 23:28:33 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-02-03 14:51:09 +0100 |
commit | cf2b1e1cc4e7729ed805388ef95794417eb74bfe (patch) | |
tree | f36f615dd2e8803799f87c4b1815956c058b0b45 /searchlib/src | |
parent | 3d9705732586af5cf9364b254566517d1aea5d77 (diff) |
Use the iterator verifier and factor out common code for dotproduct and weighted set.
Diffstat (limited to 'searchlib/src')
5 files changed, 127 insertions, 116 deletions
diff --git a/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp b/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp index fbe62f80843..fcc22671a19 100644 --- a/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp +++ b/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp @@ -22,8 +22,7 @@ #include <vespa/searchlib/query/tree/location.h> #include <vespa/searchlib/query/tree/point.h> #include <vespa/searchlib/query/tree/simplequery.h> -#include <vespa/searchlib/query/weight.h> -#include <vespa/searchlib/test/initrange.h> +#include <vespa/searchlib/test/searchiteratorverifier.h> #include <vespa/searchlib/queryeval/document_weight_search_iterator.h> using namespace search; @@ -168,22 +167,33 @@ TEST_F("require that string iterators are created correctly", StringFixture) { verify_posting(*f1.api, "foo"); } -TEST("verify init range for document weight search iterator") { - search::test::InitRangeVerifier ir; - AttributeVector::SP attr(make_attribute(BasicType::INT64, CollectionType::WSET, true)); - add_docs(attr, ir.getDocIdLimit()); - auto docids = ir.getExpectedDocIds(); - IntegerAttribute *int_attr = static_cast<IntegerAttribute *>(attr.get()); - for (auto docid: docids) { - set_doc(int_attr, docid, int64_t(123), 1); +class Verifier : public search::test::SearchIteratorVerifier { +public: + Verifier() : + _attr(make_attribute(BasicType::INT64, CollectionType::WSET, true)) + { + add_docs(_attr, getDocIdLimit()); + auto docids = getExpectedDocIds(); + IntegerAttribute *int_attr = static_cast<IntegerAttribute *>(_attr.get()); + for (auto docid: docids) { + set_doc(int_attr, docid, int64_t(123), 1); + } } - const IDocumentWeightAttribute *api(attr->asDocumentWeightAttribute()); - ASSERT_TRUE(api != nullptr); - auto dict_entry = api->lookup("123"); - ASSERT_TRUE(dict_entry.posting_idx.valid()); - fef::TermFieldMatchData tfmd; - queryeval::DocumentWeightSearchIterator itr(tfmd, *api, dict_entry); - ir.verify(itr); + SearchIterator::UP create(bool strict) const override { + (void) strict; + const IDocumentWeightAttribute *api(_attr->asDocumentWeightAttribute()); + ASSERT_TRUE(api != nullptr); + auto dict_entry = api->lookup("123"); + ASSERT_TRUE(dict_entry.posting_idx.valid()); + return std::make_unique<queryeval::DocumentWeightSearchIterator>(_tfmd, *api, dict_entry); + } +private: + mutable fef::TermFieldMatchData _tfmd; + AttributeVector::SP _attr; +}; +TEST("verify init range for document weight search iterator") { + Verifier verifier; + verifier.verify(); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp b/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp index 04d773caa43..a31b01c5875 100644 --- a/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp +++ b/searchlib/src/tests/queryeval/dot_product/dot_product_test.cpp @@ -9,8 +9,7 @@ #include <vespa/searchlib/queryeval/fake_result.h> #include <vespa/searchlib/queryeval/fake_searchable.h> #include <vespa/searchlib/queryeval/fake_requestcontext.h> -#include <vespa/searchlib/test/searchiteratorverifier.h> -#include <vespa/searchlib/test/document_weight_attribute_helper.h> +#include <vespa/searchlib/test/searchiteratorverifiers.h> using namespace search; using namespace search::query; @@ -166,66 +165,20 @@ TEST_F("test Eager Matching Child", MockFixture(5)) { EXPECT_EQUAL(1, mock->seekCnt); } -class Verifier : public SearchIteratorVerifier { -public: - Verifier() : - _weights(_num_children, 1) - { } - -protected: - static constexpr size_t _num_children = 7; - mutable TermFieldMatchData _tfmd; - std::vector<int32_t> _weights; -}; - -class IteratorChildrenVerifier : public Verifier { -public: - IteratorChildrenVerifier() : - Verifier(), - _split_lists(_num_children) - { - auto full_list = getExpectedDocIds(); - for (size_t i = 0; i < full_list.size(); ++i) { - _split_lists[i % _num_children].push_back(full_list[i]); - } - } - SearchIterator::UP create(bool strict) const override { - (void) strict; - std::vector<SearchIterator*> children; - for (size_t i = 0; i < _num_children; ++i) { - children.push_back(createIterator(_split_lists[i], true).release()); - } +class IteratorChildrenVerifier : public search::test::IteratorChildrenVerifier { +private: + SearchIterator::UP create(const std::vector<SearchIterator*> &children) const override { std::vector<fef::TermFieldMatchData*> no_child_match; MatchData::UP no_match_data; return DotProductSearch::create(children, _tfmd, no_child_match, _weights, std::move(no_match_data)); } -private: - std::vector<DocIds> _split_lists; }; -class WeightIteratorChildrenVerifier : public Verifier { -public: - WeightIteratorChildrenVerifier() : - Verifier(), - _helper() - { - _helper.add_docs(getDocIdLimit()); - auto full_list = getExpectedDocIds(); - for (size_t i = 0; i < full_list.size(); ++i) { - _helper.set_doc(full_list[i], i % _num_children, 1); - } - } - SearchIterator::UP create(bool strict) const override { - (void) strict; - std::vector<DocumentWeightIterator> children; - for (size_t i = 0; i < _num_children; ++i) { - auto dict_entry = _helper.dwa().lookup(vespalib::make_string("%zu", i).c_str()); - _helper.dwa().create(dict_entry.posting_idx, children); - } +class WeightIteratorChildrenVerifier : public search::test::WeightIteratorChildrenVerifier { +private: + SearchIterator::UP create(std::vector<DocumentWeightIterator> && children) const override { return SearchIterator::UP(DotProductSearch::create(_tfmd, _weights, std::move(children))); } -private: - DocumentWeightAttributeHelper _helper; }; TEST("verify initRange with search iterator children") { diff --git a/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp b/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp index 79d6524fe5b..561f48df8d7 100644 --- a/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp +++ b/searchlib/src/tests/queryeval/termwise_eval/termwise_eval_test.cpp @@ -632,7 +632,7 @@ TEST("require that termwise blueprint helper calculates unpack info correctly") class Verifier : public search::test::SearchIteratorVerifier { public: - SearchIterator::UP create(bool strict) const { + SearchIterator::UP create(bool strict) const override { return make_termwise(createIterator(getExpectedDocIds(), strict), strict); } }; diff --git a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp index 7436913b642..1e432f89747 100644 --- a/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp +++ b/searchlib/src/tests/queryeval/weighted_set_term/weighted_set_term_test.cpp @@ -1,30 +1,22 @@ // 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("weighted_set_term_test"); + #include <vespa/vespalib/testkit/testapp.h> #include <vespa/searchlib/queryeval/weighted_set_term_search.h> #include <vespa/searchlib/fef/fef.h> #include <vespa/searchlib/query/tree/simplequery.h> #include <vespa/searchlib/queryeval/field_spec.h> -#include <vespa/searchlib/queryeval/searchiterator.h> #include <vespa/searchlib/queryeval/blueprint.h> #include <vespa/searchlib/queryeval/fake_result.h> #include <vespa/searchlib/queryeval/fake_searchable.h> #include <vespa/searchlib/queryeval/fake_requestcontext.h> -#include <vespa/searchlib/queryeval/weighted_set_term_search.h> -#include <vespa/searchlib/test/initrange.h> -#include <vespa/searchlib/test/document_weight_attribute_helper.h> -#include <memory> -#include <string> -#include <map> +#include <vespa/searchlib/test/searchiteratorverifiers.h> using namespace search; using namespace search::query; using namespace search::fef; using namespace search::queryeval; -using search::test::InitRangeVerifier; +using search::test::SearchIteratorVerifier; using search::test::DocumentWeightAttributeHelper; namespace { @@ -197,44 +189,28 @@ TEST_F("test Eager Matching Child", MockFixture(5)) { EXPECT_EQUAL(1, mock->seekCnt); } -TEST("verify initRange with search iterator children") { - const size_t num_children = 7; - InitRangeVerifier ir; - using DocIds = InitRangeVerifier::DocIds; - std::vector<DocIds> split_lists(num_children); - auto full_list = ir.getExpectedDocIds(); - for (size_t i = 0; i < full_list.size(); ++i) { - split_lists[i % num_children].push_back(full_list[i]); +class IteratorChildrenVerifier : public search::test::IteratorChildrenVerifier { +private: + SearchIterator::UP create(const std::vector<SearchIterator*> &children) const override { + return SearchIterator::UP(WeightedSetTermSearch::create(children, _tfmd, _weights)); } - bool strict = true; - std::vector<SearchIterator*> children; - for (size_t i = 0; i < num_children; ++i) { - children.push_back(ir.createIterator(split_lists[i], strict).release()); +}; + +class WeightIteratorChildrenVerifier : public search::test::WeightIteratorChildrenVerifier { +private: + SearchIterator::UP create(std::vector<DocumentWeightIterator> && children) const override { + return SearchIterator::UP(WeightedSetTermSearch::create(_tfmd, _weights, std::move(children))); } - TermFieldMatchData tfmd; - std::vector<int32_t> weights(num_children, 1); - SearchIterator::UP itr(WeightedSetTermSearch::create(children, tfmd, weights)); - ir.verify(*itr); +}; + +TEST("verify initRange with search iterator children") { + IteratorChildrenVerifier verifier; + verifier.verify(); } TEST("verify initRange with document weight iterator children") { - const size_t num_children = 7; - InitRangeVerifier ir; - DocumentWeightAttributeHelper helper; - helper.add_docs(ir.getDocIdLimit()); - auto full_list = ir.getExpectedDocIds(); - for (size_t i = 0; i < full_list.size(); ++i) { - helper.set_doc(full_list[i], i % num_children, 1); - } - TermFieldMatchData tfmd; - std::vector<int32_t> weights(num_children, 1); - std::vector<DocumentWeightIterator> children; - for (size_t i = 0; i < num_children; ++i) { - auto dict_entry = helper.dwa().lookup(vespalib::make_string("%zu", i).c_str()); - helper.dwa().create(dict_entry.posting_idx, children); - } - SearchIterator::UP itr(WeightedSetTermSearch::create(tfmd, weights, std::move(children))); - ir.verify(*itr); + WeightIteratorChildrenVerifier verifier; + verifier.verify(); } TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/vespa/searchlib/test/searchiteratorverifiers.h b/searchlib/src/vespa/searchlib/test/searchiteratorverifiers.h new file mode 100644 index 00000000000..05906c023c7 --- /dev/null +++ b/searchlib/src/vespa/searchlib/test/searchiteratorverifiers.h @@ -0,0 +1,72 @@ +#pragma once + +#include "searchiteratorverifier.h" +#include "document_weight_attribute_helper.h" + +namespace search { +namespace test { + +class Verifier : public SearchIteratorVerifier { +public: + Verifier() : + _weights(_num_children, 1) + { } + +protected: + static constexpr size_t _num_children = 7; + mutable fef::TermFieldMatchData _tfmd; + std::vector<int32_t> _weights; +}; + +class IteratorChildrenVerifier : public Verifier { +public: + IteratorChildrenVerifier() : + Verifier(), + _split_lists(_num_children) + { + auto full_list = getExpectedDocIds(); + for (size_t i = 0; i < full_list.size(); ++i) { + _split_lists[i % _num_children].push_back(full_list[i]); + } + } + SearchIterator::UP create(bool strict) const override { + (void) strict; + std::vector<SearchIterator*> children; + for (size_t i = 0; i < _num_children; ++i) { + children.push_back(createIterator(_split_lists[i], true).release()); + } + return create(children); + } +private: + virtual SearchIterator::UP create(const std::vector<SearchIterator*> &children) const = 0; + std::vector<DocIds> _split_lists; +}; + +class WeightIteratorChildrenVerifier : public Verifier { +public: + WeightIteratorChildrenVerifier() : + Verifier(), + _helper() + { + _helper.add_docs(getDocIdLimit()); + auto full_list = getExpectedDocIds(); + for (size_t i = 0; i < full_list.size(); ++i) { + _helper.set_doc(full_list[i], i % _num_children, 1); + } + } + SearchIterator::UP create(bool strict) const override { + (void) strict; + std::vector<DocumentWeightIterator> children; + for (size_t i = 0; i < _num_children; ++i) { + auto dict_entry = _helper.dwa().lookup(vespalib::make_string("%zu", i).c_str()); + _helper.dwa().create(dict_entry.posting_idx, children); + } + return create(std::move(children)); + } +private: + virtual SearchIterator::UP create(std::vector<DocumentWeightIterator> && children) const = 0; + DocumentWeightAttributeHelper _helper; +}; + +} +} |