summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@vespa.ai>2024-03-08 20:18:10 +0100
committerGitHub <noreply@github.com>2024-03-08 20:18:10 +0100
commit00995809694e8ca7762fcb074a9d5ec71d8caf20 (patch)
tree7ef32abee37f79885b920897d75ecec020243218
parent38b9aee6c4f5254ff5b144efefe512e6cf96a73c (diff)
parent94b6acd1108ebe6824f971f5f953cef54b5f3320 (diff)
Merge pull request #30509 from vespa-engine/toregge/add-unit-test-for-interpolated-document-field-lookup-node
Add unit test for InterpolatedDocumentFieldLookupNode.
-rw-r--r--searchlib/CMakeLists.txt1
-rw-r--r--searchlib/src/tests/expression/interpolated_document_field_lookup_node/CMakeLists.txt8
-rw-r--r--searchlib/src/tests/expression/interpolated_document_field_lookup_node/interpolated_document_field_lookup_node_test.cpp98
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()