aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/expression/interpolated_document_field_lookup_node/interpolated_document_field_lookup_node_test.cpp
blob: c131efcacb2286bc0de88f804cb7dc567cde31b9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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()