summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-03-07 16:53:44 +0100
committerTor Egge <Tor.Egge@online.no>2024-03-07 16:53:44 +0100
commitf437b280fe1d143ebd3d2fe5b4ef26b6598cb6dd (patch)
tree542cc3cde9d262fe8cf927b9db06cb1af7936d9b /searchlib
parent38a38c0e7bbd14cb6197477c127089b6dced6e83 (diff)
Add unit test for InterpolatedDocumentFieldLookupNode.
Diffstat (limited to 'searchlib')
-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..5ab8d4bef0c
--- /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, hello_world)
+{
+ 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()