aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h
blob: c75bace1cc76fc520114253a65fbe628462d05d8 (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
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once

#include <vespa/vsm/common/document.h>
#include <vespa/vsm/config/vsm-cfif.h>

namespace search::docsummary { class SlimeFillerFilter; }

namespace vsm {

/**
 * This class contains the specifications for how to generate a summary field.
 **/
class DocsumFieldSpec {
public:
    using FieldPath = document::FieldPath;
    /**
     * This class contains a field id and a field path (to navigate a field value).
     **/
    class FieldIdentifier {
    private:
        FieldIdT  _id;
        FieldPath _path;

    public:
        FieldIdentifier();
        FieldIdentifier(FieldIdT id, FieldPath path);
        FieldIdentifier(FieldIdentifier &&) noexcept;
        FieldIdentifier & operator=(FieldIdentifier &&) noexcept;
        FieldIdentifier(const FieldIdentifier &) = delete;
        FieldIdentifier & operator=(const FieldIdentifier &) = delete;
        ~FieldIdentifier();
        FieldIdT getId() const { return _id; }
        const FieldPath & getPath() const { return _path; }
    };

    using FieldIdentifierVector = std::vector<FieldIdentifier>;

private:
    bool                        _struct_or_multivalue; // property of the output field
    VsmsummaryConfig::Fieldmap::Command  _command;
    FieldIdentifier             _outputField;
    FieldIdentifierVector       _inputFields;
    std::unique_ptr<search::docsummary::SlimeFillerFilter> _filter;

public:
    DocsumFieldSpec();
    DocsumFieldSpec(VsmsummaryConfig::Fieldmap::Command command);
    DocsumFieldSpec(DocsumFieldSpec&&) noexcept;
    ~DocsumFieldSpec();

    bool is_struct_or_multivalue() const noexcept { return _struct_or_multivalue; }
    void set_struct_or_multivalue(bool struct_or_multivalue) { _struct_or_multivalue = struct_or_multivalue; }

    /**
     * Returns the command specifying how to transform input fields into output summary field.
     **/
    VsmsummaryConfig::Fieldmap::Command getCommand() const { return _command; }

    /**
     * Returns whether the input field and output field are identical.
     **/
    bool hasIdentityMapping() const {
        return _inputFields.size() == 1 && _outputField.getId() == _inputFields[0].getId();
    }

    const FieldIdentifier & getOutputField() const { return _outputField; }
    void setOutputField(FieldIdentifier outputField) { _outputField = std::move(outputField); }
    const FieldIdentifierVector & getInputFields() const { return _inputFields; }
    FieldIdentifierVector & getInputFields() { return _inputFields; }
    void set_filter(std::unique_ptr<search::docsummary::SlimeFillerFilter> filter);
    const search::docsummary::SlimeFillerFilter *get_filter() const noexcept;
};

}