summaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/vsm/vsm/vsm-adapter.h
blob: d6c1f55d0921ec9e127776fa6804bb592e37e244 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#pragma once

#include <vespa/searchlib/query/base.h>
#include <vespa/vsm/config/vsm-cfif.h>
#include <vespa/config-summary.h>
#include <vespa/config-summarymap.h>
#include <vespa/searchlib/common/featureset.h>
#include <vespa/searchsummary/docsummary/docsumwriter.h>
#include <vespa/searchsummary/docsummary/docsumstate.h>
#include <vespa/searchsummary/docsummary/idocsumenvironment.h>
#include <vespa/juniper/rpinterface.h>

using search::docsummary::ResultConfig;
using search::docsummary::ResultClass;
using search::docsummary::IDocsumWriter;
using search::docsummary::DynamicDocsumWriter;
using search::docsummary::GetDocsumsState;
using search::docsummary::IDocsumEnvironment;
using search::docsummary::JuniperProperties;

using vespa::config::search::SummaryConfig;
using vespa::config::search::SummarymapConfig;
using vespa::config::search::summary::JuniperrcConfig;

namespace config { class ConfigSnapshot; }
namespace vsm {

class IMatchingElementsFiller;

class GetDocsumsStateCallback : public search::docsummary::GetDocsumsStateCallback
{
private:
    search::FeatureSet::SP _summaryFeatures;
    search::FeatureSet::SP _rankFeatures;
    std::unique_ptr<IMatchingElementsFiller> _matching_elements_filler;

public:
    GetDocsumsStateCallback();
    void FillSummaryFeatures(GetDocsumsState& state) override;
    void FillRankFeatures(GetDocsumsState& state) override;
    virtual void FillDocumentLocations(GetDocsumsState * state, IDocsumEnvironment * env);
    virtual std::unique_ptr<search::MatchingElements> fill_matching_elements(const search::MatchingElementsFields& fields) override;
    void setSummaryFeatures(const search::FeatureSet::SP & sf) { _summaryFeatures = sf; }
    void setRankFeatures(const search::FeatureSet::SP & rf) { _rankFeatures = rf; }
    void set_matching_elements_filler(std::unique_ptr<IMatchingElementsFiller> matching_elements_filler);
    ~GetDocsumsStateCallback();
};

class DocsumTools : public IDocsumEnvironment
{
public:
    class FieldSpec {
    private:
        vespalib::string                      _outputName;
        std::vector<vespalib::string>         _inputNames;
        VsmsummaryConfig::Fieldmap::Command   _command;

    public:
        FieldSpec();
        ~FieldSpec();
        const vespalib::string & getOutputName() const { return _outputName; }
        void setOutputName(const vespalib::string & name) { _outputName = name; }
        const std::vector<vespalib::string> & getInputNames() const { return _inputNames; }
        std::vector<vespalib::string> & getInputNames() { return _inputNames; }
        VsmsummaryConfig::Fieldmap::Command getCommand() const { return _command; }
        void setCommand(VsmsummaryConfig::Fieldmap::Command command) { _command = command; }
    };

private:
    std::unique_ptr<DynamicDocsumWriter>                  _writer;
    std::unique_ptr<juniper::Juniper>                     _juniper;
    const ResultClass                                   * _resultClass;
    std::vector<FieldSpec>                                _fieldSpecs;
    DocsumTools(const DocsumTools &);
    DocsumTools &operator=(const DocsumTools &);

public:
    DocsumTools();
    ~DocsumTools();
    void set_writer(std::unique_ptr<DynamicDocsumWriter> writer);
    void setJuniper(std::unique_ptr<juniper::Juniper> juniper) { _juniper = std::move(juniper); }
    const ResultConfig *getResultConfig() const { return _writer->GetResultConfig(); }
    DynamicDocsumWriter *getDocsumWriter() const { return _writer.get(); }
    const ResultClass *getResultClass() const { return _resultClass; }
    const std::vector<FieldSpec> & getFieldSpecs() const { return _fieldSpecs; }
    bool obtainFieldNames(const FastS_VsmsummaryHandle &cfg);

    // inherit doc from IDocsumEnvironment
    const search::IAttributeManager * getAttributeManager() const override { return nullptr; }
    vespalib::string lookupIndex(const vespalib::string&) const override { return ""; }
    const juniper::Juniper * getJuniper() const override { return _juniper.get(); }
};

typedef std::shared_ptr<DocsumTools> DocsumToolsPtr;

class VSMConfigSnapshot {
private:
    const vespalib::string _configId;
    std::unique_ptr<const config::ConfigSnapshot> _snapshot;
public:
    VSMConfigSnapshot(const vespalib::string & configId, const config::ConfigSnapshot & snapshot);
    ~VSMConfigSnapshot();
    template <typename ConfigType>
    std::unique_ptr<ConfigType> getConfig() const;
};

class VSMAdapter
{
public:
    VSMAdapter(const vespalib::string & highlightindexes, const vespalib::string & configId, Fast_WordFolder & wordFolder);
    virtual ~VSMAdapter();

    VsmfieldsHandle getFieldsConfig() const { return _fieldsCfg.get(); }
    DocsumToolsPtr getDocsumTools()   const { return _docsumTools.get(); }
    void configure(const VSMConfigSnapshot & snapshot);
private:
    vespalib::string                          _highlightindexes;
    const vespalib::string                    _configId;
    Fast_WordFolder                         & _wordFolder;
    vespalib::PtrHolder<VsmfieldsConfig>      _fieldsCfg;
    vespalib::PtrHolder<DocsumTools>          _docsumTools;
    std::unique_ptr<JuniperProperties>        _juniperProps;

    std::mutex                                _lock;

    VSMAdapter(const VSMAdapter &);
    VSMAdapter &operator=(const VSMAdapter &);
};

} // namespace vsm