diff options
author | Geir Storli <geirst@vespa.ai> | 2024-03-08 20:18:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-08 20:18:10 +0100 |
commit | 00995809694e8ca7762fcb074a9d5ec71d8caf20 (patch) | |
tree | 7ef32abee37f79885b920897d75ecec020243218 /searchlib | |
parent | 38b9aee6c4f5254ff5b144efefe512e6cf96a73c (diff) | |
parent | 94b6acd1108ebe6824f971f5f953cef54b5f3320 (diff) |
Merge pull request #30509 from vespa-engine/toregge/add-unit-test-for-interpolated-document-field-lookup-node
Add unit test for InterpolatedDocumentFieldLookupNode.
Diffstat (limited to 'searchlib')
3 files changed, 107 insertions, 0 deletions
diff --git a/searchlib/CMakeLists.txt b/searchlib/CMakeLists.txt index ffc6cf75ab0..a5453ac5273 100644 --- a/searchlib/CMakeLists.txt +++ b/searchlib/CMakeLists.txt @@ -131,6 +131,7 @@ vespa_define_module( src/tests/engine/proto_rpc_adapter src/tests/expression/attributenode src/tests/expression/current_index_setup + src/tests/expression/interpolated_document_field_lookup_node src/tests/features src/tests/features/beta src/tests/features/bm25 diff --git a/searchlib/src/tests/expression/interpolated_document_field_lookup_node/CMakeLists.txt b/searchlib/src/tests/expression/interpolated_document_field_lookup_node/CMakeLists.txt new file mode 100644 index 00000000000..267848d9468 --- /dev/null +++ b/searchlib/src/tests/expression/interpolated_document_field_lookup_node/CMakeLists.txt @@ -0,0 +1,8 @@ +# Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchlib_interpolated_document_field_lookup_node_test_app + SOURCES + interpolated_document_field_lookup_node_test.cpp + DEPENDS + searchlib_test +) +vespa_add_test(NAME searchlib_interpolated_document_field_lookup_node_test_app COMMAND searchlib_interpolated_document_field_lookup_node_test_app) diff --git a/searchlib/src/tests/expression/interpolated_document_field_lookup_node/interpolated_document_field_lookup_node_test.cpp b/searchlib/src/tests/expression/interpolated_document_field_lookup_node/interpolated_document_field_lookup_node_test.cpp new file mode 100644 index 00000000000..c131efcacb2 --- /dev/null +++ b/searchlib/src/tests/expression/interpolated_document_field_lookup_node/interpolated_document_field_lookup_node_test.cpp @@ -0,0 +1,98 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/document/fieldvalue/arrayfieldvalue.h> +#include <vespa/document/fieldvalue/document.h> +#include <vespa/document/fieldvalue/doublefieldvalue.h> +#include <vespa/document/repo/configbuilder.h> +#include <vespa/searchlib/expression/constantnode.h> +#include <vespa/searchlib/expression/floatresultnode.h> +#include <vespa/searchlib/expression/interpolated_document_field_lookup_node.h> +#include <vespa/searchlib/test/doc_builder.h> +#include <vespa/vespalib/gtest/gtest.h> + +using document::DataType; +using document::Document; +using document::DoubleFieldValue; +using search::expression::ConstantNode; +using search::expression::DocumentAccessorNode; +using search::expression::FloatResultNode; +using search::expression::InterpolatedDocumentFieldLookupNode; +using search::test::DocBuilder; + +const vespalib::string field_name("f"); + +struct Fixture { + DocBuilder _builder; + std::unique_ptr<Document> _doc; + std::unique_ptr<DocumentAccessorNode> _node; + + Fixture(); + ~Fixture(); + + Fixture& setup_doc(std::vector<double> field_value); + Fixture& setup_node(double lookup_value); + double evaluate(); +}; + +Fixture::Fixture() + : _builder([](auto& header) + { header.addField(field_name, document::config_builder::Array(DataType::T_DOUBLE)); }), + _doc(_builder.make_document("id:ns:searchdocument::0")), + _node() +{ +} + +Fixture::~Fixture() = default; + + +Fixture& +Fixture::setup_doc(std::vector<double> field_value) +{ + auto array = _builder.make_array(field_name); + for (auto& v : field_value) { + array.add(DoubleFieldValue(v)); + } + _doc->setValue(field_name, array); + return *this; +} + +Fixture& +Fixture::setup_node(double lookup_value) +{ + _node = std::make_unique<InterpolatedDocumentFieldLookupNode>(field_name, std::make_unique<ConstantNode>(std::make_unique<FloatResultNode>(lookup_value))); + _node->prepare(true); + _node->setDocType(_doc->getType()); + _node->setDoc(*_doc); + return *this; +} + +double +Fixture::evaluate() +{ + EXPECT_TRUE(_node->execute()); + return _node->getResult()->getFloat(); +} + + +class InterpolatedDocumentFieldLookupNodeTest : public Fixture, + public ::testing::Test +{ +protected: + InterpolatedDocumentFieldLookupNodeTest(); + ~InterpolatedDocumentFieldLookupNodeTest() override; +}; + +InterpolatedDocumentFieldLookupNodeTest::InterpolatedDocumentFieldLookupNodeTest() = default; +InterpolatedDocumentFieldLookupNodeTest::~InterpolatedDocumentFieldLookupNodeTest() = default; + +TEST_F(InterpolatedDocumentFieldLookupNodeTest, test_interpolated_lookup_in_document_field) +{ + EXPECT_EQ(0.0, setup_doc({ 2, 10 }).setup_node(1.0).evaluate()); + EXPECT_EQ(0.0, setup_node(2.0).evaluate()); + EXPECT_EQ(0.3125, setup_node(4.5).evaluate()); + EXPECT_EQ(1.0, setup_node(10).evaluate()); + EXPECT_EQ(1.0, setup_node(11).evaluate()); + EXPECT_EQ(2.5, setup_doc({1.5, 5.25, 8.0, 14.0 }).evaluate()); +} + +GTEST_MAIN_RUN_ALL_TESTS() |