summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--client/js/app/yarn.lock28
-rw-r--r--dependency-versions/pom.xml6
-rw-r--r--dist/vespa.spec1
-rw-r--r--eval/src/vespa/eval/eval/aggr.cpp14
-rw-r--r--eval/src/vespa/eval/eval/tensor_nodes.cpp171
-rw-r--r--eval/src/vespa/eval/eval/tensor_nodes.h159
-rw-r--r--eval/src/vespa/eval/instruction/generic_reduce.cpp8
-rw-r--r--lucene-linguistics/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/attribute/bitvector/bitvector_test.cpp143
-rw-r--r--searchlib/src/tests/attribute/searchcontext/searchcontext_test.cpp290
-rw-r--r--searchlib/src/tests/features/bm25/bm25_test.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/test/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app_base.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/test/ft_test_app_base.h20
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 &param() 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 &param) {
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;
}
};