diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | client/js/app/yarn.lock | 28 | ||||
-rw-r--r-- | dependency-versions/pom.xml | 6 | ||||
-rw-r--r-- | dist/vespa.spec | 1 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/aggr.cpp | 14 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/tensor_nodes.cpp | 171 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/tensor_nodes.h | 159 | ||||
-rw-r--r-- | eval/src/vespa/eval/instruction/generic_reduce.cpp | 8 | ||||
-rw-r--r-- | lucene-linguistics/CMakeLists.txt | 1 | ||||
-rw-r--r-- | searchlib/src/tests/attribute/bitvector/bitvector_test.cpp | 143 | ||||
-rw-r--r-- | searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp | 290 | ||||
-rw-r--r-- | searchlib/src/tests/features/bm25/bm25_test.cpp | 8 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp | 6 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/test/ft_test_app_base.h | 20 |
15 files changed, 411 insertions, 446 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7902f9a017e..f077dd87b9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,6 +143,7 @@ add_subdirectory(jdisc-security-filters) add_subdirectory(jrt_test) add_subdirectory(linguistics) add_subdirectory(linguistics-components) +add_subdirectory(lucene-linguistics) add_subdirectory(logd) add_subdirectory(logforwarder) add_subdirectory(logserver) diff --git a/client/js/app/yarn.lock b/client/js/app/yarn.lock index 250397736f7..b6e91dc433b 100644 --- a/client/js/app/yarn.lock +++ b/client/js/app/yarn.lock @@ -1306,10 +1306,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@remix-run/router@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2" - integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ== +"@remix-run/router@1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.1.tgz#221fd31a65186b9bc027b74573485fb3226dff7f" + integrity sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w== "@rollup/rollup-android-arm-eabi@4.12.0": version "4.12.0" @@ -4643,19 +4643,19 @@ react-refresh@^0.14.0: integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== react-router-dom@^6: - version "6.22.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.0.tgz#177c8bd27146decbb991eafb5df159f7a9f70035" - integrity sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag== + version "6.22.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.1.tgz#cfa109d4b6b0a4d00bac179bc0ad2a6469455282" + integrity sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw== dependencies: - "@remix-run/router" "1.15.0" - react-router "6.22.0" + "@remix-run/router" "1.15.1" + react-router "6.22.1" -react-router@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.0.tgz#a22b44851a79dafc6b944cb418db3e80622b9be1" - integrity sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg== +react-router@6.22.1: + version "6.22.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.1.tgz#a5ff849bfe709438f7e139421bb28138209662c7" + integrity sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ== dependencies: - "@remix-run/router" "1.15.0" + "@remix-run/router" "1.15.1" react-textarea-autosize@8.3.4: version "8.3.4" diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml index f8058277392..c0ccb299167 100644 --- a/dependency-versions/pom.xml +++ b/dependency-versions/pom.xml @@ -33,7 +33,7 @@ <!-- DO NOT UPGRADE THESE TO A NEW MAJOR VERSION WITHOUT CHECKING FOR BINARY COMPATIBILITY --> <aopalliance.vespa.version>1.0</aopalliance.vespa.version> - <error-prone-annotations.vespa.version>2.24.1</error-prone-annotations.vespa.version> + <error-prone-annotations.vespa.version>2.25.0</error-prone-annotations.vespa.version> <guava.vespa.version>33.0.0-jre</guava.vespa.version> <guice.vespa.version>6.0.0</guice.vespa.version> <jackson2.vespa.version>2.16.1</jackson2.vespa.version> @@ -65,7 +65,7 @@ <assertj.vespa.version>3.25.3</assertj.vespa.version> <!-- Athenz dependencies. Make sure these dependencies match those in Vespa's internal repositories --> - <aws-sdk.vespa.version>1.12.660</aws-sdk.vespa.version> + <aws-sdk.vespa.version>1.12.661</aws-sdk.vespa.version> <athenz.vespa.version>1.11.51</athenz.vespa.version> <!-- Athenz END --> @@ -137,7 +137,7 @@ <surefire.vespa.version>3.2.5</surefire.vespa.version> <velocity.vespa.version>2.3</velocity.vespa.version> <velocity.tools.vespa.version>3.1</velocity.tools.vespa.version> - <wiremock.vespa.version>3.3.1</wiremock.vespa.version> + <wiremock.vespa.version>3.4.0</wiremock.vespa.version> <xerces.vespa.version>2.12.2</xerces.vespa.version> <zero-allocation-hashing.vespa.version>0.16</zero-allocation-hashing.vespa.version> <zookeeper.client.vespa.version>3.9.1</zookeeper.client.vespa.version> diff --git a/dist/vespa.spec b/dist/vespa.spec index 350db684a02..4424cfd0f8e 100644 --- a/dist/vespa.spec +++ b/dist/vespa.spec @@ -640,6 +640,7 @@ fi %{_prefix}/lib/jars/jdisc-security-filters-jar-with-dependencies.jar %{_prefix}/lib/jars/jna-*.jar %{_prefix}/lib/jars/linguistics-components-jar-with-dependencies.jar +%{_prefix}/lib/jars/lucene-linguistics-jar-with-dependencies.jar %{_prefix}/lib/jars/model-evaluation-jar-with-dependencies.jar %{_prefix}/lib/jars/model-integration-jar-with-dependencies.jar %{_prefix}/lib/jars/security-utils.jar diff --git a/eval/src/vespa/eval/eval/aggr.cpp b/eval/src/vespa/eval/eval/aggr.cpp index a43341dac30..ebb8ab4d6b1 100644 --- a/eval/src/vespa/eval/eval/aggr.cpp +++ b/eval/src/vespa/eval/eval/aggr.cpp @@ -12,12 +12,12 @@ namespace eval { namespace { template <typename T> -struct Wrapper : Aggregator { +struct Wrapper final : Aggregator { T aggr; - virtual void first(double value) final override { aggr = T{value}; } - virtual void next(double value) final override { aggr.sample(value); } - virtual double result() const final override { return aggr.result(); } - virtual Aggr enum_value() const final override { return T::enum_value(); } + void first(double value) override { aggr = T{value}; } + void next(double value) override { aggr.sample(value); } + double result() const override { return aggr.result(); } + Aggr enum_value() const override { return T::enum_value(); } }; } // namespace vespalib::eval::<unnamed> @@ -66,9 +66,7 @@ AggrNames::from_name(const vespalib::string &name) return &(result->second); } -Aggregator::~Aggregator() -{ -} +Aggregator::~Aggregator() = default; Aggregator & Aggregator::create(Aggr aggr, Stash &stash) diff --git a/eval/src/vespa/eval/eval/tensor_nodes.cpp b/eval/src/vespa/eval/eval/tensor_nodes.cpp index ef2718234b2..1143f182f34 100644 --- a/eval/src/vespa/eval/eval/tensor_nodes.cpp +++ b/eval/src/vespa/eval/eval/tensor_nodes.cpp @@ -17,4 +17,175 @@ void TensorCreate ::accept(NodeVisitor &visitor) const { visitor.visit(*thi void TensorLambda ::accept(NodeVisitor &visitor) const { visitor.visit(*this); } void TensorPeek ::accept(NodeVisitor &visitor) const { visitor.visit(*this); } +vespalib::string +TensorMap::dump(DumpContext &ctx) const { + vespalib::string str; + str += "map("; + str += _child->dump(ctx); + str += ","; + str += _lambda->dump_as_lambda(); + str += ")"; + return str; +} + +vespalib::string +TensorMapSubspaces::dump(DumpContext &ctx) const { + vespalib::string str; + str += "map_subspaces("; + str += _child->dump(ctx); + str += ","; + str += _lambda->dump_as_lambda(); + str += ")"; + return str; +} + +vespalib::string +TensorJoin::dump(DumpContext &ctx) const { + vespalib::string str; + str += "join("; + str += _lhs->dump(ctx); + str += ","; + str += _rhs->dump(ctx); + str += ","; + str += _lambda->dump_as_lambda(); + str += ")"; + return str; +} + +vespalib::string +TensorMerge::dump(DumpContext &ctx) const { + vespalib::string str; + str += "join("; + str += _lhs->dump(ctx); + str += ","; + str += _rhs->dump(ctx); + str += ","; + str += _lambda->dump_as_lambda(); + str += ")"; + return str; +} + +vespalib::string +TensorReduce::dump(DumpContext &ctx) const { + vespalib::string str; + str += "reduce("; + str += _child->dump(ctx); + str += ","; + str += *AggrNames::name_of(_aggr); + for (const auto &dimension: _dimensions) { + str += ","; + str += dimension; + } + str += ")"; + return str; +} + +vespalib::string +TensorRename::dump(DumpContext &ctx) const { + vespalib::string str; + str += "rename("; + str += _child->dump(ctx); + str += ","; + str += flatten(_from); + str += ","; + str += flatten(_to); + str += ")"; + return str; +} + +vespalib::string +TensorRename::flatten(const std::vector<vespalib::string> &list) { + if (list.size() == 1) { + return list[0]; + } + vespalib::string str = "("; + for (size_t i = 0; i < list.size(); ++i) { + if (i > 0) { + str += ","; + } + str += list[i]; + } + str += ")"; + return str; +} + +vespalib::string +TensorConcat::dump(DumpContext &ctx) const { + vespalib::string str; + str += "concat("; + str += _lhs->dump(ctx); + str += ","; + str += _rhs->dump(ctx); + str += ","; + str += _dimension; + str += ")"; + return str; +} + +vespalib::string +TensorCellCast::dump(DumpContext &ctx) const { + vespalib::string str; + str += "cell_cast("; + str += _child->dump(ctx); + str += ","; + str += value_type::cell_type_to_name(_cell_type); + str += ")"; + return str; +} + +vespalib::string +TensorCreate::dump(DumpContext &ctx) const { + vespalib::string str = _type.to_spec(); + str += ":{"; + CommaTracker child_list; + for (const Child &child: _cells) { + child_list.maybe_add_comma(str); + str += as_string(child.first); + str += ":"; + str += child.second->dump(ctx); + } + str += "}"; + return str; +} + +vespalib::string +TensorLambda::dump(DumpContext &) const { + vespalib::string str = _type.to_spec(); + vespalib::string expr = _lambda->dump(); + if (starts_with(expr, "(")) { + str += expr; + } else { + str += "("; + str += expr; + str += ")"; + } + return str; +} + +vespalib::string +TensorPeek::dump(DumpContext &ctx) const { + vespalib::string str = _param->dump(ctx); + str += "{"; + CommaTracker dim_list; + for (const auto &dim : _dim_list) { + dim_list.maybe_add_comma(str); + str += dim.first; + str += ":"; + if (dim.second.is_expr()) { + vespalib::string expr = dim.second.expr->dump(ctx); + if (starts_with(expr, "(")) { + str += expr; + } else { + str += "("; + str += expr; + str += ")"; + } + } else { + str += as_quoted_string(dim.second.label); + } + } + str += "}"; + return str; +} + } diff --git a/eval/src/vespa/eval/eval/tensor_nodes.h b/eval/src/vespa/eval/eval/tensor_nodes.h index 6ed19e81712..5de2e4bc80d 100644 --- a/eval/src/vespa/eval/eval/tensor_nodes.h +++ b/eval/src/vespa/eval/eval/tensor_nodes.h @@ -23,15 +23,7 @@ public: : _child(std::move(child)), _lambda(std::move(lambda)) {} const Node &child() const { return *_child; } const Function &lambda() const { return *_lambda; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "map("; - str += _child->dump(ctx); - str += ","; - str += _lambda->dump_as_lambda(); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 1; } const Node &get_child(size_t idx) const override { @@ -53,15 +45,7 @@ public: : _child(std::move(child)), _lambda(std::move(lambda)) {} const Node &child() const { return *_child; } const Function &lambda() const { return *_lambda; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "map_subspaces("; - str += _child->dump(ctx); - str += ","; - str += _lambda->dump_as_lambda(); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 1; } const Node &get_child(size_t idx) const override { @@ -85,17 +69,7 @@ public: const Node &lhs() const { return *_lhs; } const Node &rhs() const { return *_rhs; } const Function &lambda() const { return *_lambda; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "join("; - str += _lhs->dump(ctx); - str += ","; - str += _rhs->dump(ctx); - str += ","; - str += _lambda->dump_as_lambda(); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 2; } const Node &get_child(size_t idx) const override { @@ -119,17 +93,7 @@ public: const Node &lhs() const { return *_lhs; } const Node &rhs() const { return *_rhs; } const Function &lambda() const { return *_lambda; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "join("; - str += _lhs->dump(ctx); - str += ","; - str += _rhs->dump(ctx); - str += ","; - str += _lambda->dump_as_lambda(); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 2; } const Node &get_child(size_t idx) const override { @@ -153,19 +117,7 @@ public: const Node &child() const { return *_child; } Aggr aggr() const { return _aggr; } const std::vector<vespalib::string> &dimensions() const { return _dimensions; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "reduce("; - str += _child->dump(ctx); - str += ","; - str += *AggrNames::name_of(_aggr); - for (const auto &dimension: _dimensions) { - str += ","; - str += dimension; - } - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 1; } const Node &get_child(size_t idx) const override { @@ -188,17 +140,7 @@ public: const Node &child() const { return *_child; } const std::vector<vespalib::string> &from() const { return _from; } const std::vector<vespalib::string> &to() const { return _to; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "rename("; - str += _child->dump(ctx); - str += ","; - str += flatten(_from); - str += ","; - str += flatten(_to); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 1; } const Node &get_child(size_t idx) const override { @@ -208,20 +150,7 @@ public: void detach_children(NodeHandler &handler) override { handler.handle(std::move(_child)); } - static vespalib::string flatten(const std::vector<vespalib::string> &list) { - if (list.size() == 1) { - return list[0]; - } - vespalib::string str = "("; - for (size_t i = 0; i < list.size(); ++i) { - if (i > 0) { - str += ","; - } - str += list[i]; - } - str += ")"; - return str; - } + static vespalib::string flatten(const std::vector<vespalib::string> &list); }; class TensorConcat : public Node { @@ -235,17 +164,7 @@ public: const Node &lhs() const { return *_lhs; } const Node &rhs() const { return *_rhs; } const vespalib::string &dimension() const { return _dimension; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "concat("; - str += _lhs->dump(ctx); - str += ","; - str += _rhs->dump(ctx); - str += ","; - str += _dimension; - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 2; } const Node &get_child(size_t idx) const override { @@ -267,15 +186,7 @@ public: : _child(std::move(child)), _cell_type(cell_type) {} const Node &child() const { return *_child; } CellType cell_type() const { return _cell_type; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str; - str += "cell_cast("; - str += _child->dump(ctx); - str += ","; - str += value_type::cell_type_to_name(_cell_type); - str += ")"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 1; } const Node &get_child(size_t idx) const override { @@ -305,19 +216,7 @@ public: } } const ValueType &type() const { return _type; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str = _type.to_spec(); - str += ":{"; - CommaTracker child_list; - for (const Child &child: _cells) { - child_list.maybe_add_comma(str); - str += as_string(child.first); - str += ":"; - str += child.second->dump(ctx); - } - str += "}"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return _cells.size(); } const Node &get_child(size_t idx) const override { @@ -350,18 +249,7 @@ public: const ValueType &type() const { return _type; } const std::vector<size_t> &bindings() const { return _bindings; } const Function &lambda() const { return *_lambda; } - vespalib::string dump(DumpContext &) const override { - vespalib::string str = _type.to_spec(); - vespalib::string expr = _lambda->dump(); - if (starts_with(expr, "(")) { - str += expr; - } else { - str += "("; - str += expr; - str += ")"; - } - return str; - } + vespalib::string dump(DumpContext &) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return 0; } const Node &get_child(size_t) const override { abort(); } @@ -400,30 +288,7 @@ public: } const Node ¶m() const { return *_param; } const DimList &dim_list() const { return _dim_list; } - vespalib::string dump(DumpContext &ctx) const override { - vespalib::string str = _param->dump(ctx); - str += "{"; - CommaTracker dim_list; - for (const auto &dim: _dim_list) { - dim_list.maybe_add_comma(str); - str += dim.first; - str += ":"; - if (dim.second.is_expr()) { - vespalib::string expr = dim.second.expr->dump(ctx); - if (starts_with(expr, "(")) { - str += expr; - } else { - str += "("; - str += expr; - str += ")"; - } - } else { - str += as_quoted_string(dim.second.label); - } - } - str += "}"; - return str; - } + vespalib::string dump(DumpContext &ctx) const override; void accept(NodeVisitor &visitor) const override; size_t num_children() const override { return (1 + _expr_dims.size()); } const Node &get_child(size_t idx) const override { diff --git a/eval/src/vespa/eval/instruction/generic_reduce.cpp b/eval/src/vespa/eval/instruction/generic_reduce.cpp index 6d845557496..dac8a5ceece 100644 --- a/eval/src/vespa/eval/instruction/generic_reduce.cpp +++ b/eval/src/vespa/eval/instruction/generic_reduce.cpp @@ -8,7 +8,6 @@ #include <vespa/vespalib/util/typify.h> #include <vespa/vespalib/util/overload.h> #include <vespa/vespalib/util/visit_ranges.h> -#include <algorithm> #include <cassert> #include <array> @@ -51,7 +50,7 @@ struct SparseReduceState { SmallVector<string_id*> keep_address; size_t subspace; - SparseReduceState(const SparseReducePlan &plan) + explicit SparseReduceState(const SparseReducePlan &plan) : full_address(plan.keep_dims.size() + plan.num_reduce_dims), fetch_address(full_address.size(), nullptr), keep_address(plan.keep_dims.size(), nullptr), @@ -97,7 +96,8 @@ generic_reduce(const Value &value, const ReduceParam ¶m) { auto zero = builder->add_subspace(); std::fill(zero.begin(), zero.end(), OCT{}); } - return builder->build(std::move(builder)); + auto & builder_ref = *builder; + return builder_ref.build(std::move(builder)); } template <typename ICT, typename OCT, typename AGGR> @@ -311,7 +311,7 @@ GenericReduce::make_instruction(const ValueType &result_type, assert(result_type == param.res_type); assert(result_type.cell_meta().eq(input_type.cell_meta().reduce(result_type.is_double()))); auto fun = typify_invoke<3,ReduceTypify,SelectGenericReduceOp>(input_type.cell_meta(), result_type.cell_meta().is_scalar, aggr, param); - return Instruction(fun, wrap_param<ReduceParam>(param)); + return {fun, wrap_param<ReduceParam>(param)}; } } // namespace diff --git a/lucene-linguistics/CMakeLists.txt b/lucene-linguistics/CMakeLists.txt index efe20451e0f..10ea606798a 100644 --- a/lucene-linguistics/CMakeLists.txt +++ b/lucene-linguistics/CMakeLists.txt @@ -1,2 +1,3 @@ # Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. install_config_definitions() +install_jar(lucene-linguistics-jar-with-dependencies.jar) diff --git a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp index 6e479e1d9db..2532c120226 100644 --- a/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp +++ b/searchlib/src/tests/attribute/bitvector/bitvector_test.cpp @@ -9,15 +9,13 @@ #include <vespa/searchlib/parsequery/parse.h> #include <vespa/searchlib/queryeval/docid_with_weight_search_iterator.h> #include <vespa/searchlib/queryeval/executeinfo.h> +#define ENABLE_GTEST_MIGRATION #include <vespa/searchlib/test/searchiteratorverifier.h> #include <vespa/searchlib/util/randomgenerator.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/stllike/asciistream.h> -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/util/compress.h> -#include <vespa/log/log.h> -LOG_SETUP("bitvector_test"); - using search::AttributeFactory; using search::AttributeVector; using search::BitVector; @@ -37,12 +35,25 @@ using search::queryeval::SearchIterator; using SearchContextPtr = std::unique_ptr<SearchContext>; using SearchBasePtr = std::unique_ptr<search::queryeval::SearchIterator>; -struct BitVectorTest +std::string +param_as_string(const testing::TestParamInfo<std::tuple<BasicType, CollectionType, bool, bool>>& info) +{ + std::ostringstream os; + auto& param = info.param; + os << std::get<0>(param).asString() << "_"; + os << std::get<1>(param).asString(); + os << (std::get<2>(param) ? "_fs" : ""); + os << (std::get<3>(param) ? "_filter" : ""); + return os.str(); +} + +class BitVectorTest : public ::testing::TestWithParam<std::tuple<BasicType, CollectionType, bool, bool>> { +public: using AttributePtr = AttributeVector::SP; BitVectorTest(); - ~BitVectorTest(); + ~BitVectorTest() override; template <typename VectorType> VectorType & as(AttributePtr &v); @@ -90,13 +101,9 @@ struct BitVectorTest bool weights, bool checkStride); - template <typename VectorType, typename BufferType> + template <typename VectorType> void test(BasicType bt, CollectionType ct, const vespalib::string &pref, bool fastSearch, bool filter); - - template <typename VectorType, typename BufferType> - void - test(BasicType bt, CollectionType ct, const vespalib::string &pref); }; BitVectorTest::BitVectorTest() = default; @@ -371,29 +378,29 @@ BitVectorTest::checkSearch(AttributePtr v, uint32_t docId = sb->getDocId(); uint32_t lastDocId = 0; uint32_t docFreq = 0; - EXPECT_EQUAL(expFirstDocId, docId); + EXPECT_EQ(expFirstDocId, docId); while (docId != search::endDocId) { lastDocId = docId; ++docFreq, assert(!checkStride || (docId % 5) == 2u); sb->unpack(docId); - EXPECT_EQUAL(md.getDocId(), docId); + EXPECT_EQ(md.getDocId(), docId); if (v->getCollectionType() == CollectionType::SINGLE || !weights) { - EXPECT_EQUAL(1, md.getWeight()); + EXPECT_EQ(1, md.getWeight()); } else if (v->getCollectionType() == CollectionType::ARRAY) { - EXPECT_EQUAL(2, md.getWeight()); + EXPECT_EQ(2, md.getWeight()); } else { if (v->getBasicType() == BasicType::STRING) { - EXPECT_EQUAL(24, md.getWeight()); + EXPECT_EQ(24, md.getWeight()); } else { - EXPECT_EQUAL(-3, md.getWeight()); + EXPECT_EQ(-3, md.getWeight()); } } sb->seek(docId + 1); docId = sb->getDocId(); } - EXPECT_EQUAL(expLastDocId, lastDocId); - EXPECT_EQUAL(expDocFreq, docFreq); + EXPECT_EQ(expLastDocId, lastDocId); + EXPECT_EQ(expDocFreq, docFreq); } @@ -415,7 +422,7 @@ BitVectorTest::checkSearch(AttributePtr v, } -template <typename VectorType, typename BufferType> +template <typename VectorType> void BitVectorTest::test(BasicType bt, CollectionType ct, const vespalib::string &pref, bool fastSearch, bool filter) { @@ -437,7 +444,8 @@ BitVectorTest::test(BasicType bt, CollectionType ct, const vespalib::string &pre TermFieldMatchData md; auto dwsi = std::make_unique<DWSI>(md, *dww, lres); if (!filter) { - TEST_DO(checkSearch(v, std::move(dwsi), md, 2, 1022, 205, !filter, true)); + SCOPED_TRACE("dww without filter"); + checkSearch(v, std::move(dwsi), md, 2, 1022, 205, !filter, true); } else { dwsi->initRange(1, v->getCommittedDocIdLimit()); EXPECT_TRUE(dwsi->isAtEnd()); @@ -457,73 +465,33 @@ BitVectorTest::test(BasicType bt, CollectionType ct, const vespalib::string &pre checkSearch(v, std::move(sc), 2, 14999, 14992, !fastSearch && !filter, false); } - -template <typename VectorType, typename BufferType> -void -BitVectorTest::test(BasicType bt, CollectionType ct, const vespalib::string &pref) -{ - LOG(info, "test run, pref is %s", pref.c_str()); - test<VectorType, BufferType>(bt, ct, pref, false, false); - test<VectorType, BufferType>(bt, ct, pref, false, true); - test<VectorType, BufferType>(bt, ct, pref, true, false); - test<VectorType, BufferType>(bt, ct, pref, true, true); -} - - -TEST_F("Test bitvectors with single value int32", BitVectorTest) -{ - f.template test<IntegerAttribute, - IntegerAttribute::largeint_t>(BasicType::INT32, CollectionType::SINGLE, "int32_sv"); -} - -TEST_F("Test bitvectors with array value int32", BitVectorTest) -{ - f.template test<IntegerAttribute, - IntegerAttribute::largeint_t>(BasicType::INT32, CollectionType::ARRAY, "int32_a"); -} - -TEST_F("Test bitvectors with weighted set value int32", BitVectorTest) -{ - f.template test<IntegerAttribute, - IntegerAttribute::WeightedInt>(BasicType::INT32, CollectionType::WSET, "int32_sv"); -} - -TEST_F("Test bitvectors with single value double", BitVectorTest) -{ - f.template test<FloatingPointAttribute, - double>(BasicType::DOUBLE, CollectionType::SINGLE, "double_sv"); -} - -TEST_F("Test bitvectors with array value double", BitVectorTest) -{ - f.template test<FloatingPointAttribute, - double>(BasicType::DOUBLE, CollectionType::ARRAY, "double_a"); -} - -TEST_F("Test bitvectors with weighted set value double", BitVectorTest) -{ - f.template test<FloatingPointAttribute, - FloatingPointAttribute::WeightedFloat>(BasicType::DOUBLE, CollectionType::WSET, "double_ws"); -} - -TEST_F("Test bitvectors with single value string", BitVectorTest) -{ - f.template test<StringAttribute, - vespalib::string>(BasicType::STRING, CollectionType::SINGLE, "string_sv"); -} - -TEST_F("Test bitvectors with array value string", BitVectorTest) -{ - f.template test<StringAttribute, - vespalib::string>(BasicType::STRING, CollectionType::ARRAY, "string_a"); +TEST_P(BitVectorTest, test_bitvectors) +{ + const auto& param = GetParam(); + auto bt = std::get<0>(param); + auto ct = std::get<1>(param); + auto fast_search = std::get<2>(param); + auto filter = std::get<3>(param); + vespalib::asciistream pref; + pref << bt.asString() << "_" << ct.asString(); + switch (bt.type()) { + case BasicType::INT32: + test<IntegerAttribute>(bt, ct, pref.str(), fast_search, filter); + break; + case BasicType::DOUBLE: + test<FloatingPointAttribute>(bt, ct, pref.str(), fast_search, filter); + break; + case BasicType::STRING: + test<StringAttribute>(bt, ct, pref.str(), fast_search, filter); + break; + default: + FAIL() << "Cannot handle basic type " << bt.asString(); + } } -TEST_F("Test bitvectors with weighted set value string", BitVectorTest) -{ - f.template test<StringAttribute, - StringAttribute::WeightedString>(BasicType::STRING, CollectionType::WSET, "string_ws"); -} +auto test_values = testing::Combine(testing::Values(BasicType::INT32, BasicType::DOUBLE, BasicType::STRING), testing::Values(CollectionType::SINGLE, CollectionType::ARRAY, CollectionType::WSET),testing::Bool(), testing::Bool()); +INSTANTIATE_TEST_SUITE_P(Attributes, BitVectorTest, test_values, param_as_string); class Verifier : public search::test::SearchIteratorVerifier { public: @@ -557,7 +525,8 @@ Verifier::Verifier(bool inverted) } Verifier::~Verifier() = default; -TEST("Test that bitvector iterators adheres to SearchIterator requirements") { +TEST(BitVectorVerifierTest, test_that_bitvector_iterators_adheres_to_SearchIterator_requirements) +{ { Verifier searchIteratorVerifier(false); searchIteratorVerifier.verify(); @@ -568,4 +537,4 @@ TEST("Test that bitvector iterators adheres to SearchIterator requirements") { } } -TEST_MAIN() { TEST_RUN_ALL(); } +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp b/searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp index 85b13c20f88..77acbe046ca 100644 --- a/searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp +++ b/searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp @@ -18,9 +18,10 @@ #include <vespa/searchlib/queryeval/hitcollector.h> #include <vespa/searchlib/queryeval/simpleresult.h> #include <vespa/searchlib/test/attribute_builder.h> +#define ENABLE_GTEST_MIGRATION #include <vespa/searchlib/test/searchiteratorverifier.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/stllike/asciistream.h> -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/util/compress.h> #include <vespa/vespalib/util/simple_thread_bundle.h> #include <vespa/vespalib/util/stringfmt.h> @@ -142,7 +143,7 @@ public: DocRange(uint32_t start_, uint32_t end_) : start(start_), end(end_) {} }; -class SearchContextTest : public vespalib::TestApp +class SearchContextTest : public ::testing::Test { public: // helper functions @@ -150,7 +151,7 @@ public: static void addDocs(AttributeVector & ptr, uint32_t numDocs); template <typename V, typename T> static SearchContextPtr getSearch(const V & vec, const T & term, TermType termType=TermType::WORD); -private: +protected: using ConfigMap = std::map<vespalib::string, Config>; // Map of all config objects ConfigMap _integerCfg; @@ -185,7 +186,6 @@ private: template<typename T, typename A> void testSearchIterator(const std::vector<T> & keys, const vespalib::string &keyAsString, const ConfigMap &cfgs); - void testSearchIteratorConformance(); // test search functionality template <typename V, typename T> void testFind(const PostingList<V, T> & first, bool verify_hit_estimate); @@ -198,7 +198,6 @@ private: void testMultiValueSearchHelper(V & vec, const std::vector<T> & values); template <typename V, typename T> void testMultiValueSearch(V& attr, uint32_t num_docs, const std::vector<T> & values); - void testSearch(); class IteratorTester { public: @@ -237,7 +236,6 @@ private: void testNonStrictSearchIterator(SearchContext & threeHits, SearchContext & noHits, const IteratorTester & typeTester); AttributePtr fillForSearchIteratorTest(const vespalib::string& name, const Config& cfg); AttributePtr fillForSemiNibbleSearchIteratorTest(const vespalib::string& name, const Config& cfg); - void testSearchIterator(); // test search iterator unpacking @@ -250,7 +248,6 @@ private: } void testSearchIteratorUnpacking(const AttributePtr & ptr, SearchContext & sc, bool extra, bool strict, bool withElementId); - void testSearchIteratorUnpacking(); // test range search @@ -258,58 +255,41 @@ private: void performRangeSearch(const VectorType & vec, const vespalib::string & term, const DocSet & expected); template <typename VectorType, typename ValueType> void testRangeSearch(const AttributePtr & ptr, uint32_t numDocs, std::vector<ValueType> values); - void testRangeSearch(); - void testRangeSearchLimited(); - void testRangeSearchLimitedHugeDictionary(); // test case insensitive search void performCaseInsensitiveSearch(const StringAttribute & vec, const vespalib::string & term, const DocSet & expected); void testCaseInsensitiveSearch(const AttributePtr & ptr); - void testCaseInsensitiveSearch(); void testRegexSearch(const vespalib::string& name, const Config& cfg); - void testRegexSearch(); // test prefix search void testPrefixSearch(const vespalib::string& name, const Config& cfg); - void testPrefixSearch(); // test fuzzy search void testFuzzySearch(const vespalib::string& name, const Config& cfg); - void testFuzzySearch(); // test that search is working after clear doc template <typename VectorType, typename ValueType> void requireThatSearchIsWorkingAfterClearDoc(const vespalib::string & name, const Config & cfg, ValueType startValue, const vespalib::string & term); - void requireThatSearchIsWorkingAfterClearDoc(); // test that search is working after load and clear doc template <typename VectorType, typename ValueType> void requireThatSearchIsWorkingAfterLoadAndClearDoc(const vespalib::string & name, const Config & cfg, ValueType startValue, ValueType defaultValue, const vespalib::string & term); - void requireThatSearchIsWorkingAfterLoadAndClearDoc(); template <typename VectorType, typename ValueType> void requireThatSearchIsWorkingAfterUpdates(const vespalib::string & name, const Config & cfg, ValueType value1, ValueType value2); - void requireThatSearchIsWorkingAfterUpdates(); - void requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded(); template <typename VectorType, typename ValueType> void requireThatInvalidSearchTermGivesZeroHits(const vespalib::string & name, const Config & cfg, ValueType value); - void requireThatInvalidSearchTermGivesZeroHits(); - void requireThatFlagAttributeHandlesTheByteRange(); void requireThatOutOfBoundsSearchTermGivesZeroHits(const vespalib::string &name, const Config &cfg, int32_t maxValue); - void requireThatOutOfBoundsSearchTermGivesZeroHits(); - - void single_bool_attribute_search_context_handles_true_and_false_queries(); - void single_bool_attribute_search_iterator_handles_true_and_false_queries(); // init maps with config objects void initIntegerConfig(); @@ -319,7 +299,6 @@ private: public: SearchContextTest(); ~SearchContextTest() override; - int Main() override; }; @@ -337,7 +316,7 @@ SearchContextTest::addDocs(AttributeVector & ptr, uint32_t numDocs) addReservedDoc(ptr); for (uint32_t i = 1; i <= numDocs; ++i) { ptr.addDoc(docId); - EXPECT_EQUAL(docId, i); + EXPECT_EQ(docId, i); } ASSERT_TRUE(ptr.getNumDocs() == numDocs + 1); } @@ -531,7 +510,7 @@ SearchContextTest::performSearch(const V & vec, const vespalib::string & term, void SearchContextTest::checkResultSet(const ResultSet & rs, const DocSet & expected, bool bitVector) { - EXPECT_EQUAL(rs.getNumHits(), expected.size()); + EXPECT_EQ(rs.getNumHits(), expected.size()); if (bitVector) { const BitVector * vec = rs.getBitOverflow(); if ( ! expected.empty()) { @@ -546,7 +525,7 @@ SearchContextTest::checkResultSet(const ResultSet & rs, const DocSet & expected, ASSERT_TRUE(array != nullptr); uint32_t i = 0; for (auto iter = expected.begin(); iter != expected.end(); ++iter, ++i) { - EXPECT_EQUAL(array[i].getDocId(), *iter); + EXPECT_EQ(array[i].getDocId(), *iter); } } } @@ -565,8 +544,8 @@ SearchContextTest::testFind(const PostingList<V, T> & pl, bool verify_hit_estima if (verify_hit_estimate) { auto act_est = sc->calc_hit_estimate(); auto exp_est = pl.expected_hit_estimate(); - EXPECT_EQUAL(exp_est.est_hits(), act_est.est_hits()); - EXPECT_EQUAL(exp_est.is_unknown(), act_est.is_unknown()); + EXPECT_EQ(exp_est.est_hits(), act_est.est_hits()); + EXPECT_EQ(exp_est.is_unknown(), act_est.is_unknown()); } sc->fetchPostings(queryeval::ExecuteInfo::TRUE); TermFieldMatchData dummy; @@ -721,7 +700,7 @@ Verifier<T, A>::Verifier(const std::vector<T> & keys, const vespalib::string & k } _attribute->commit(true); _sc = SearchContextTest::getSearch(*_attribute, keyAsString); - ASSERT_TRUE(_sc->valid()); + EXPECT_TRUE(_sc->valid()); } template<typename T, typename A> @@ -743,15 +722,15 @@ void SearchContextTest::testSearchIterator(const std::vector<T> & keys, const ve } } -void SearchContextTest::testSearchIteratorConformance() { +TEST_F(SearchContextTest, test_search_iterator_conformance) +{ testSearchIterator<AttributeVector::largeint_t, IntegerAttribute>({42,45,46}, "[0;100]", _integerCfg); testSearchIterator<AttributeVector::largeint_t, IntegerAttribute>({42}, "42", _integerCfg); testSearchIterator<double, FloatingPointAttribute>({42.42}, "42.42", _floatCfg); testSearchIterator<vespalib::string, StringAttribute>({"any-key"}, "any-key", _stringCfg); } -void -SearchContextTest::testSearch() +TEST_F(SearchContextTest, test_search) { const uint32_t numDocs = 100; const uint32_t numUniques = 20; @@ -812,15 +791,15 @@ SearchContextTest::testStrictSearchIterator(SearchContext & threeHits, EXPECT_TRUE(sb->getDocId() == sb->beginId() || sb->getDocId() == 1u); EXPECT_TRUE(sb->seek(1)); - EXPECT_EQUAL(sb->getDocId(), 1u); + EXPECT_EQ(sb->getDocId(), 1u); EXPECT_TRUE(!sb->seek(2)); - EXPECT_EQUAL(sb->getDocId(), 3u); + EXPECT_EQ(sb->getDocId(), 3u); EXPECT_TRUE(sb->seek(3)); - EXPECT_EQUAL(sb->getDocId(), 3u); + EXPECT_EQ(sb->getDocId(), 3u); EXPECT_TRUE(!sb->seek(4)); - EXPECT_EQUAL(sb->getDocId(), 5u); + EXPECT_EQ(sb->getDocId(), 5u); EXPECT_TRUE(sb->seek(5)); - EXPECT_EQUAL(sb->getDocId(), 5u); + EXPECT_EQ(sb->getDocId(), 5u); EXPECT_TRUE(!sb->seek(6)); EXPECT_TRUE(sb->isAtEnd()); } @@ -849,15 +828,15 @@ SearchContextTest::testNonStrictSearchIterator(SearchContext & threeHits, sb->initRange(1, threeHits.attribute().getCommittedDocIdLimit()); EXPECT_TRUE(typeTester.matches(*sb)); EXPECT_TRUE(sb->seek(1)); - EXPECT_EQUAL(sb->getDocId(), 1u); + EXPECT_EQ(sb->getDocId(), 1u); EXPECT_TRUE(!sb->seek(2)); - EXPECT_EQUAL(sb->getDocId(), 1u); + EXPECT_EQ(sb->getDocId(), 1u); EXPECT_TRUE(sb->seek(3)); - EXPECT_EQUAL(sb->getDocId(), 3u); + EXPECT_EQ(sb->getDocId(), 3u); EXPECT_TRUE(!sb->seek(4)); - EXPECT_EQUAL(sb->getDocId(), 3u); + EXPECT_EQ(sb->getDocId(), 3u); EXPECT_TRUE(sb->seek(5)); - EXPECT_EQUAL(sb->getDocId(), 5u); + EXPECT_EQ(sb->getDocId(), 5u); EXPECT_TRUE(!sb->seek(6)); EXPECT_TRUE(sb->getDocId() == 5u || sb->isAtEnd()); } @@ -870,9 +849,9 @@ SearchContextTest::testNonStrictSearchIterator(SearchContext & threeHits, EXPECT_TRUE(sb->getDocId() == sb->beginId() || sb->isAtEnd()); EXPECT_TRUE(!sb->seek(1)); - EXPECT_NOT_EQUAL(sb->getDocId(), 1u); + EXPECT_NE(sb->getDocId(), 1u); EXPECT_TRUE(!sb->seek(6)); - EXPECT_NOT_EQUAL(sb->getDocId(), 6u); + EXPECT_NE(sb->getDocId(), 6u); } } @@ -888,8 +867,7 @@ SearchContextTest::fillForSemiNibbleSearchIteratorTest(const vespalib::string& n return AttributeBuilder(name, cfg).fill({1, 2, 1, 2, 1}).get(); } -void -SearchContextTest::testSearchIterator() +TEST_F(SearchContextTest, test_search_iterator) { { Config cfg(BasicType::INT32, CollectionType::SINGLE); @@ -1031,46 +1009,45 @@ SearchContextTest::testSearchIteratorUnpacking(const AttributePtr & attr, Search // unpack and check weights search.unpack(1); - EXPECT_EQUAL(search.getDocId(), 1u); - EXPECT_EQUAL(md.getDocId(), 1u); - EXPECT_EQUAL(md.getWeight(), weights[0]); + EXPECT_EQ(search.getDocId(), 1u); + EXPECT_EQ(md.getDocId(), 1u); + EXPECT_EQ(md.getWeight(), weights[0]); search.unpack(2); - EXPECT_EQUAL(search.getDocId(), 2u); - EXPECT_EQUAL(md.getDocId(), 2u); + EXPECT_EQ(search.getDocId(), 2u); + EXPECT_EQ(md.getDocId(), 2u); if (withElementId && attr->hasMultiValue() && !attr->hasWeightedSetType()) { std::vector<uint32_t> elems; elemIt->getElementIds(2, elems); - ASSERT_EQUAL(2u, elems.size()); - EXPECT_EQUAL(0u,elems[0]); - EXPECT_EQUAL(1u,elems[1]); + ASSERT_EQ(2u, elems.size()); + EXPECT_EQ(0u,elems[0]); + EXPECT_EQ(1u,elems[1]); } else { - EXPECT_EQUAL(md.getWeight(), weights[1]); + EXPECT_EQ(md.getWeight(), weights[1]); } search.unpack(3); - EXPECT_EQUAL(search.getDocId(), 3u); - EXPECT_EQUAL(md.getDocId(), 3u); + EXPECT_EQ(search.getDocId(), 3u); + EXPECT_EQ(md.getDocId(), 3u); if (withElementId && attr->hasMultiValue() && !attr->hasWeightedSetType()) { std::vector<uint32_t> elems; elemIt->getElementIds(3, elems); - ASSERT_EQUAL(3u, elems.size()); - EXPECT_EQUAL(0u,elems[0]); - EXPECT_EQUAL(1u,elems[1]); - EXPECT_EQUAL(2u,elems[2]); + ASSERT_EQ(3u, elems.size()); + EXPECT_EQ(0u,elems[0]); + EXPECT_EQ(1u,elems[1]); + EXPECT_EQ(2u,elems[2]); } else { - EXPECT_EQUAL(md.getWeight(), weights[2]); + EXPECT_EQ(md.getWeight(), weights[2]); } if (extra) { search.unpack(4); - EXPECT_EQUAL(search.getDocId(), 4u); - EXPECT_EQUAL(md.getDocId(), 4u); - EXPECT_EQUAL(md.getWeight(), 1); + EXPECT_EQ(search.getDocId(), 4u); + EXPECT_EQ(md.getDocId(), 4u); + EXPECT_EQ(md.getWeight(), 1); } } -void -SearchContextTest::testSearchIteratorUnpacking() +TEST_F(SearchContextTest, test_search_iterator_unpacking) { std::vector<std::pair<vespalib::string, Config> > config; @@ -1242,8 +1219,8 @@ createDocs(uint32_t from, int32_t count) { return docs; } -void -SearchContextTest::testRangeSearchLimitedHugeDictionary() { +TEST_F(SearchContextTest, test_range_search_limited_huge_dictionary) +{ Config cfg(BasicType::INT32, CollectionType::SINGLE); cfg.setFastSearch(true); std::vector<int32_t> v; @@ -1263,8 +1240,7 @@ SearchContextTest::testRangeSearchLimitedHugeDictionary() { performRangeSearch(vec, "[1;3009;-1200]", createDocs(2000, -1200)); } -void -SearchContextTest::testRangeSearchLimited() +TEST_F(SearchContextTest, test_range_search_limited) { Config cfg(BasicType::INT32, CollectionType::SINGLE); cfg.setFastSearch(true); @@ -1317,8 +1293,7 @@ SearchContextTest::testRangeSearchLimited() performRangeSearch(vec, "[;;-1]", expected); } -void -SearchContextTest::testRangeSearch() +TEST_F(SearchContextTest, test_range_search) { const uint32_t numDocs = 100; const uint32_t numValues = 20; @@ -1412,8 +1387,8 @@ SearchContextTest::testCaseInsensitiveSearch(const AttributePtr & ptr) doc = 1; for (uint32_t j = 0; j < 5; ++j) { for (uint32_t i = 0; i < 5; ++i) { - EXPECT_EQUAL(ptr->get(doc++, buffer, 1), uint32_t(1)); - EXPECT_EQUAL(vespalib::string(buffer[0]), vespalib::string(terms[i][j])); + EXPECT_EQ(ptr->get(doc++, buffer, 1), uint32_t(1)); + EXPECT_EQ(vespalib::string(buffer[0]), vespalib::string(terms[i][j])); } } @@ -1462,16 +1437,14 @@ SearchContextTest::testRegexSearch(const vespalib::string& name, const Config& c } -void -SearchContextTest::testCaseInsensitiveSearch() +TEST_F(SearchContextTest, test_case_insensitive_search) { for (const auto & cfg : _stringCfg) { testCaseInsensitiveSearch(AttributeFactory::createAttribute(cfg.first, cfg.second)); } } -void -SearchContextTest::testRegexSearch() +TEST_F(SearchContextTest, test_regex_search) { for (const auto & cfg : _stringCfg) { testRegexSearch(cfg.first, cfg.second); @@ -1534,8 +1507,7 @@ SearchContextTest::testPrefixSearch(const vespalib::string& name, const Config& } -void -SearchContextTest::testPrefixSearch() +TEST_F(SearchContextTest, test_prefix_search) { for (const auto & cfg : _stringCfg) { testPrefixSearch(cfg.first, cfg.second); @@ -1570,8 +1542,7 @@ SearchContextTest::testFuzzySearch(const vespalib::string& name, const Config& c } } -void -SearchContextTest::testFuzzySearch() +TEST_F(SearchContextTest, test_fuzzy_search) { for (const auto & cfg : _stringCfg) { testFuzzySearch(cfg.first, cfg.second); @@ -1595,28 +1566,27 @@ SearchContextTest::requireThatSearchIsWorkingAfterClearDoc(const vespalib::strin resetAttribute(v, startValue); { ResultSetPtr rs = performSearch(v, term); - EXPECT_EQUAL(4u, rs->getNumHits()); + EXPECT_EQ(4u, rs->getNumHits()); ASSERT_TRUE(4u == rs->getNumHits()); const RankedHit * array = rs->getArray(); - EXPECT_EQUAL(1u, array[0].getDocId()); - EXPECT_EQUAL(2u, array[1].getDocId()); - EXPECT_EQUAL(3u, array[2].getDocId()); - EXPECT_EQUAL(4u, array[3].getDocId()); + EXPECT_EQ(1u, array[0].getDocId()); + EXPECT_EQ(2u, array[1].getDocId()); + EXPECT_EQ(3u, array[2].getDocId()); + EXPECT_EQ(4u, array[3].getDocId()); } a->clearDoc(1); a->clearDoc(3); a->commit(true); { ResultSetPtr rs = performSearch(v, term); - EXPECT_EQUAL(2u, rs->getNumHits()); + EXPECT_EQ(2u, rs->getNumHits()); const RankedHit * array = rs->getArray(); - EXPECT_EQUAL(2u, array[0].getDocId()); - EXPECT_EQUAL(4u, array[1].getDocId()); + EXPECT_EQ(2u, array[0].getDocId()); + EXPECT_EQ(4u, array[1].getDocId()); } } -void -SearchContextTest::requireThatSearchIsWorkingAfterClearDoc() +TEST_F(SearchContextTest, require_that_search_is_working_after_clear_doc) { for (const auto & cfg : _integerCfg) { requireThatSearchIsWorkingAfterClearDoc<IntegerAttribute>(cfg.first, cfg.second, 10, "10"); @@ -1655,26 +1625,25 @@ SearchContextTest::requireThatSearchIsWorkingAfterLoadAndClearDoc(const vespalib b->commit(true); { ResultSetPtr rs = performSearch(dynamic_cast<VectorType &>(*b), term); - EXPECT_EQUAL(14u, rs->getNumHits()); + EXPECT_EQ(14u, rs->getNumHits()); const RankedHit * array = rs->getArray(); for (uint32_t i = 0; i < 14; ++i) { if (i < 5) { - EXPECT_EQUAL(i + 1, array[i].getDocId()); + EXPECT_EQ(i + 1, array[i].getDocId()); } else - EXPECT_EQUAL(i + 2, array[i].getDocId()); + EXPECT_EQ(i + 2, array[i].getDocId()); } } ValueType buf; if (cfg.collectionType().isMultiValue()) { - EXPECT_EQUAL(0u, b->get(6, &buf, 1)); + EXPECT_EQ(0u, b->get(6, &buf, 1)); } else { - EXPECT_EQUAL(1u, b->get(6, &buf, 1)); - EXPECT_EQUAL(defaultValue, buf); + EXPECT_EQ(1u, b->get(6, &buf, 1)); + EXPECT_EQ(defaultValue, buf); } } -void -SearchContextTest::requireThatSearchIsWorkingAfterLoadAndClearDoc() +TEST_F(SearchContextTest, require_that_search_is_working_after_load_and_clear_doc) { { int64_t value = 10; @@ -1713,16 +1682,15 @@ SearchContextTest::requireThatSearchIsWorkingAfterUpdates(const vespalib::string va.commit(true); { ResultSetPtr rs = performSearch(va, value1); - EXPECT_EQUAL(1u, rs->getNumHits()); // doc 1 should not have this value + EXPECT_EQ(1u, rs->getNumHits()); // doc 1 should not have this value } { ResultSetPtr rs = performSearch(va, value2); - EXPECT_EQUAL(1u, rs->getNumHits()); + EXPECT_EQ(1u, rs->getNumHits()); } } -void -SearchContextTest::requireThatSearchIsWorkingAfterUpdates() +TEST_F(SearchContextTest, require_that_search_is_working_after_updates) { for (const auto & cfg : _integerCfg) { requireThatSearchIsWorkingAfterUpdates<IntegerAttribute>(cfg.first, cfg.second, 10, 20); @@ -1733,8 +1701,7 @@ SearchContextTest::requireThatSearchIsWorkingAfterUpdates() } } -void -SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded() +TEST_F(SearchContextTest, require_that_flag_attribute_is_working_when_new_docs_are_added) { LOG(info, "requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded()"); Config cfg(BasicType::INT8, CollectionType::ARRAY); @@ -1746,16 +1713,16 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded() fill_array({IL{10, 24}, {20, 24}, {30, 26}, {40, 24}}).get(); { ResultSetPtr rs = performSearch(*a, "<24"); - EXPECT_EQUAL(2u, rs->getNumHits()); - EXPECT_EQUAL(1u, rs->getArray()[0].getDocId()); - EXPECT_EQUAL(2u, rs->getArray()[1].getDocId()); + EXPECT_EQ(2u, rs->getNumHits()); + EXPECT_EQ(1u, rs->getArray()[0].getDocId()); + EXPECT_EQ(2u, rs->getArray()[1].getDocId()); } { ResultSetPtr rs = performSearch(*a, "24"); - EXPECT_EQUAL(3u, rs->getNumHits()); - EXPECT_EQUAL(1u, rs->getArray()[0].getDocId()); - EXPECT_EQUAL(2u, rs->getArray()[1].getDocId()); - EXPECT_EQUAL(4u, rs->getArray()[2].getDocId()); + EXPECT_EQ(3u, rs->getNumHits()); + EXPECT_EQ(1u, rs->getArray()[0].getDocId()); + EXPECT_EQ(2u, rs->getArray()[1].getDocId()); + EXPECT_EQ(4u, rs->getArray()[2].getDocId()); } } { @@ -1779,18 +1746,18 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded() { ResultSetPtr rs1 = performSearch(fa, "50"); ResultSetPtr rs2 = performSearch(fa, "<51"); - EXPECT_EQUAL(exp50.size(), rs1->getNumHits()); - EXPECT_EQUAL(exp50.size(), rs2->getNumHits()); + EXPECT_EQ(exp50.size(), rs1->getNumHits()); + EXPECT_EQ(exp50.size(), rs2->getNumHits()); for (size_t j = 0; j < exp50.size(); ++j) { - EXPECT_EQUAL(exp50[j], rs1->getArray()[j].getDocId()); - EXPECT_EQUAL(exp50[j], rs2->getArray()[j].getDocId()); + EXPECT_EQ(exp50[j], rs1->getArray()[j].getDocId()); + EXPECT_EQ(exp50[j], rs2->getArray()[j].getDocId()); } } { ResultSetPtr rs = performSearch(fa, "60"); - EXPECT_EQUAL(exp60.size(), rs->getNumHits()); + EXPECT_EQ(exp60.size(), rs->getNumHits()); for (size_t j = 0; j < exp60.size(); ++j) { - EXPECT_EQUAL(exp60[j], rs->getArray()[j].getDocId()); + EXPECT_EQ(exp60[j], rs->getArray()[j].getDocId()); } } } @@ -1806,11 +1773,10 @@ SearchContextTest::requireThatInvalidSearchTermGivesZeroHits(const vespalib::str auto a = AttributeBuilder(name, cfg).fill({value}).get(); LOG(info, "requireThatInvalidSearchTermGivesZeroHits: vector '%s'", a->getName().c_str()); ResultSetPtr rs = performSearch(*a, "foo"); - EXPECT_EQUAL(0u, rs->getNumHits()); + EXPECT_EQ(0u, rs->getNumHits()); } -void -SearchContextTest::requireThatInvalidSearchTermGivesZeroHits() +TEST_F(SearchContextTest, require_that_invalid_search_term_gives_zero_hits) { for (const auto & cfg : _integerCfg) { requireThatInvalidSearchTermGivesZeroHits<IntegerAttribute, int32_t>(cfg.first, cfg.second, 10); @@ -1820,8 +1786,7 @@ SearchContextTest::requireThatInvalidSearchTermGivesZeroHits() } } -void -SearchContextTest::requireThatFlagAttributeHandlesTheByteRange() +TEST_F(SearchContextTest, require_that_flag_attribute_handles_the_byte_range) { LOG(info, "requireThatFlagAttributeHandlesTheByteRange()"); Config cfg(BasicType::INT8, CollectionType::ARRAY); @@ -1850,11 +1815,10 @@ SearchContextTest::requireThatOutOfBoundsSearchTermGivesZeroHits(const vespalib: vespalib::string term = vespalib::make_string("%" PRIu64 "", (int64_t) maxValue + 1); LOG(info, "requireThatOutOfBoundsSearchTermGivesZeroHits: vector '%s', term '%s'", a->getName().c_str(), term.c_str()); ResultSetPtr rs = performSearch(*a, term); - EXPECT_EQUAL(0u, rs->getNumHits()); + EXPECT_EQ(0u, rs->getNumHits()); } -void -SearchContextTest::requireThatOutOfBoundsSearchTermGivesZeroHits() +TEST_F(SearchContextTest, require_that_out_of_bounds_search_term_gives_zero_hits) { for (const auto & cfg : _integerCfg) { int32_t maxValue = std::numeric_limits<int32_t>::max(); @@ -1894,8 +1858,8 @@ public: for (uint32_t docid = 1; docid < _attr.getNumDocs(); ++docid) { bool match_1 = search_ctx->matches(docid); bool match_2 = search_ctx->matches(docid, weight); - EXPECT_EQUAL(match_1, match_2); - EXPECT_EQUAL(match_2 ? 1 : 0, weight); + EXPECT_EQ(match_1, match_2); + EXPECT_EQ(match_2 ? 1 : 0, weight); if (match_1) { result.addHit(docid); } @@ -1917,36 +1881,34 @@ public: } }; -void -SearchContextTest::single_bool_attribute_search_context_handles_true_and_false_queries() +TEST_F(SearchContextTest, single_bool_attribute_search_context_handles_true_and_false_queries) { BoolAttributeFixture f(SimpleResult().addHit(3).addHit(5).addHit(7), 9); auto true_exp = SimpleResult().addHit(3).addHit(5).addHit(7); - EXPECT_EQUAL(true_exp, f.search_context("true")); - EXPECT_EQUAL(true_exp, f.search_context("1")); + EXPECT_EQ(true_exp, f.search_context("true")); + EXPECT_EQ(true_exp, f.search_context("1")); auto false_exp = SimpleResult().addHit(1).addHit(2).addHit(4).addHit(6).addHit(8); - EXPECT_EQUAL(false_exp, f.search_context("false")); - EXPECT_EQUAL(false_exp, f.search_context("0")); + EXPECT_EQ(false_exp, f.search_context("false")); + EXPECT_EQ(false_exp, f.search_context("0")); } -void -SearchContextTest::single_bool_attribute_search_iterator_handles_true_and_false_queries() +TEST_F(SearchContextTest, single_bool_attribute_search_iterator_handles_true_and_false_queries) { BoolAttributeFixture f(SimpleResult().addHit(3).addHit(5).addHit(7), 9); auto true_exp = SimpleResult().addHit(3).addHit(5).addHit(7); - EXPECT_EQUAL(true_exp, f.search_iterator("true", false)); - EXPECT_EQUAL(true_exp, f.search_iterator("1", false)); - EXPECT_EQUAL(true_exp, f.search_iterator("true", true)); - EXPECT_EQUAL(true_exp, f.search_iterator("1", true)); + EXPECT_EQ(true_exp, f.search_iterator("true", false)); + EXPECT_EQ(true_exp, f.search_iterator("1", false)); + EXPECT_EQ(true_exp, f.search_iterator("true", true)); + EXPECT_EQ(true_exp, f.search_iterator("1", true)); auto false_exp = SimpleResult().addHit(1).addHit(2).addHit(4).addHit(6).addHit(8); - EXPECT_EQUAL(false_exp, f.search_iterator("false", false)); - EXPECT_EQUAL(false_exp, f.search_iterator("0", false)); - EXPECT_EQUAL(false_exp, f.search_iterator("false", true)); - EXPECT_EQUAL(false_exp, f.search_iterator("0", true)); + EXPECT_EQ(false_exp, f.search_iterator("false", false)); + EXPECT_EQ(false_exp, f.search_iterator("0", false)); + EXPECT_EQ(false_exp, f.search_iterator("false", true)); + EXPECT_EQ(false_exp, f.search_iterator("0", true)); } void @@ -2057,36 +2019,6 @@ SearchContextTest::SearchContextTest() : SearchContextTest::~SearchContextTest() = default; -int -SearchContextTest::Main() -{ - TEST_INIT("searchcontext_test"); - EXPECT_TRUE(true); - - testSearch(); - testSearchIterator(); - testRangeSearch(); - testRangeSearchLimited(); - testRangeSearchLimitedHugeDictionary(); - testCaseInsensitiveSearch(); - testRegexSearch(); - testPrefixSearch(); - testSearchIteratorConformance(); - testSearchIteratorUnpacking(); - testFuzzySearch(); - TEST_DO(requireThatSearchIsWorkingAfterClearDoc()); - TEST_DO(requireThatSearchIsWorkingAfterLoadAndClearDoc()); - TEST_DO(requireThatSearchIsWorkingAfterUpdates()); - TEST_DO(requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded()); - TEST_DO(requireThatInvalidSearchTermGivesZeroHits()); - TEST_DO(requireThatFlagAttributeHandlesTheByteRange()); - TEST_DO(requireThatOutOfBoundsSearchTermGivesZeroHits()); - TEST_DO(single_bool_attribute_search_context_handles_true_and_false_queries()); - TEST_DO(single_bool_attribute_search_iterator_handles_true_and_false_queries()); - - TEST_DONE(); -} - } -TEST_APPHOOK(search::SearchContextTest); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/tests/features/bm25/bm25_test.cpp b/searchlib/src/tests/features/bm25/bm25_test.cpp index 233c0ec09f3..f175d21c001 100644 --- a/searchlib/src/tests/features/bm25/bm25_test.cpp +++ b/searchlib/src/tests/features/bm25/bm25_test.cpp @@ -6,8 +6,10 @@ #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> #include <vespa/searchlib/fef/test/indexenvironment.h> #include <vespa/searchlib/fef/test/indexenvironmentbuilder.h> -#include <vespa/searchlib/test/ft_test_app.h> +#define ENABLE_GTEST_MIGRATION +#include <vespa/searchlib/test/ft_test_app_base.h> #include <vespa/vespalib/gtest/gtest.h> +#include <cmath> using namespace search::features; using namespace search::fef; @@ -102,8 +104,8 @@ TEST_F(Bm25BlueprintTest, blueprint_can_prepare_shared_state_with_average_field_ TEST_F(Bm25BlueprintTest, dump_features_for_all_index_fields) { - FtTestApp::FT_DUMP(factory, "bm25", index_env, - StringList().add("bm25(is)").add("bm25(ia)").add("bm25(iws)")); + FtTestAppBase::FT_DUMP(factory, "bm25", index_env, + StringList().add("bm25(is)").add("bm25(ia)").add("bm25(iws)")); } struct Scorer { diff --git a/searchlib/src/vespa/searchlib/test/CMakeLists.txt b/searchlib/src/vespa/searchlib/test/CMakeLists.txt index a4db57a44cd..c43f4eb0cef 100644 --- a/searchlib/src/vespa/searchlib/test/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/test/CMakeLists.txt @@ -27,6 +27,7 @@ vespa_add_library(searchlib_test vespa_add_library(searchlib_test_gtest_migration OBJECT SOURCES + ft_test_app_base.cpp initrange.cpp searchiteratorverifier.cpp ) diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp b/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp index eee5631dcc5..1b60ca2cd33 100644 --- a/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp +++ b/searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp @@ -1,12 +1,16 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include "ft_test_app.h" +#include "ft_test_app_base.h" #include <vespa/searchlib/fef/test/dummy_dependency_handler.h> #include <vespa/vespalib/util/stringfmt.h> #include <vespa/log/log.h> LOG_SETUP(".ft_test_app_base"); +#ifdef ENABLE_GTEST_MIGRATION +#define EXPECT_EQUAL EXPECT_EQ +#endif + namespace fieldmatch = search::features::fieldmatch; using search::fef::test::DummyDependencyHandler; using search::fef::FieldInfo; diff --git a/searchlib/src/vespa/searchlib/test/ft_test_app_base.h b/searchlib/src/vespa/searchlib/test/ft_test_app_base.h index 329d93e4c47..f4fc1c11b76 100644 --- a/searchlib/src/vespa/searchlib/test/ft_test_app_base.h +++ b/searchlib/src/vespa/searchlib/test/ft_test_app_base.h @@ -4,7 +4,15 @@ #include <vespa/searchlib/features/fieldmatch/params.h> #include <vespa/searchlib/fef/test/ftlib.h> +#ifdef ENABLE_GTEST_MIGRATION +#include <vespa/vespalib/gtest/gtest.h> +#else #include <vespa/vespalib/testkit/test_macros.h> +#endif + +#ifdef ENABLE_GTEST_MIGRATION +#define FtTestAppBase FtTestAppBaseForGTest +#endif /* * Base class for test application used by feature unit tests. @@ -54,8 +62,20 @@ struct FtTestAppBase { template <typename T> static bool assertCreateInstance(const T & prototype, const vespalib::string & baseName) { search::fef::Blueprint::UP bp = prototype.createInstance(); +#ifdef ENABLE_GTEST_MIGRATION + bool failed = false; + EXPECT_TRUE(dynamic_cast<T*>(bp.get()) != NULL) << (failed = true, ""); + if (failed) { + return false; + } + EXPECT_EQ(bp->getBaseName(), baseName) << (failed = true, ""); + if (failed) { + return false; + } +#else if (!EXPECT_TRUE(dynamic_cast<T*>(bp.get()) != NULL)) return false; if (!EXPECT_EQUAL(bp->getBaseName(), baseName)) return false; +#endif return true; } }; |