aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/attribute/sourceselector.cpp
blob: 907d54467c15c4a26bb0ddc8e2e4d2b29aab3b25 (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "sourceselector.h"
#include <vespa/fastlib/io/bufferedfile.h>
#include <vespa/searchlib/common/fileheadercontext.h>
#include <vespa/searchlib/util/file_settings.h>
#include <vespa/vespalib/util/size_literals.h>

using search::queryeval::Source;
using vespalib::FileHeader;
using vespalib::GenericHeader;
using search::common::FileHeaderContext;

namespace search {

namespace {

const vespalib::string defaultSourceTag = "Default source";
const vespalib::string baseIdTag = "Base id";
const vespalib::string docIdLimitTag = "Doc id limit";

class AddMyHeaderTags : public FileHeaderContext
{
    const SourceSelector::HeaderInfo &_hi;
    const FileHeaderContext &_parent;

public:
    AddMyHeaderTags(const SourceSelector::HeaderInfo &hi, const FileHeaderContext &parent)
        : _hi(hi),
          _parent(parent)
    { }

    virtual void
    addTags(GenericHeader &header, const vespalib::string &name) const override
    {
        using Tag = GenericHeader::Tag;
        _parent.addTags(header, name);
        header.putTag(Tag(defaultSourceTag, _hi._defaultSource));
        header.putTag(Tag(baseIdTag, _hi._baseId));
        header.putTag(Tag(docIdLimitTag, _hi._docIdLimit));
    }
};

}  // namespace

SourceSelector::HeaderInfo::HeaderInfo(const vespalib::string & baseFileName,
                                       Source defaultSource,
                                       uint32_t baseId,
                                       uint32_t docIdLimit) :
    _baseFileName(baseFileName),
    _defaultSource(defaultSource),
    _baseId(baseId),
    _docIdLimit(docIdLimit)
{ }

SourceSelector::SaveInfo::SaveInfo(const vespalib::string & baseFileName,
                                   Source defaultSource,
                                   uint32_t baseId,
                                   uint32_t docIdLimit,
                                   AttributeVector & sourceStore)
    : _header(baseFileName, defaultSource, baseId, docIdLimit),
      _memSaver()
{
    sourceStore.save(_memSaver, _header._baseFileName);
}

SourceSelector::SaveInfo::~SaveInfo() = default;
bool
SourceSelector::SaveInfo::save(const TuneFileAttributes &tuneFileAttributes,
                               const FileHeaderContext &fileHeaderContext)
{
    AddMyHeaderTags fh(_header, fileHeaderContext);
    return _memSaver.writeToFile(tuneFileAttributes, fh);
}

SourceSelector::LoadInfo::LoadInfo(const vespalib::string &baseFileName)
    : _header(baseFileName, 0, 0, 0)
{ }

void
SourceSelector::LoadInfo::load()
{
    const vespalib::string fileName = _header._baseFileName + ".dat";
    Fast_BufferedFile file;
    // XXX no checking for success
    file.ReadOpen(fileName.c_str());

    FileHeader fileHeader(FileSettings::DIRECTIO_ALIGNMENT);
    fileHeader.readFile(file);
    if (fileHeader.hasTag(defaultSourceTag)) {
        _header._defaultSource = fileHeader.getTag(defaultSourceTag).asInteger();
    }
    if (fileHeader.hasTag(baseIdTag)) {
        _header._baseId = fileHeader.getTag(baseIdTag).asInteger();
    }
    if (fileHeader.hasTag(docIdLimitTag)) {
        _header._docIdLimit = fileHeader.getTag(docIdLimitTag).asInteger();
    }
}

SourceSelector::SourceSelector(Source defaultSource, AttributeVector::SP realSource) :
    ISourceSelector(defaultSource),
    _realSource(std::move(realSource))
{ }

SourceSelector::SaveInfo::UP
SourceSelector::extractSaveInfo(const vespalib::string & baseFileName)
{
    return std::make_unique<SaveInfo>(baseFileName, getDefaultSource(), getBaseId(),
                                      getDocIdLimit(), *_realSource);
}

SourceSelector::LoadInfo::UP
SourceSelector::extractLoadInfo(const vespalib::string & baseFileName)
{
    return std::make_unique<LoadInfo>(baseFileName);
}

SourceSelector::Histogram SourceSelector::getDistribution() const
{
    Histogram h;
    auto it = createIterator();
    for (size_t i(0), m(getDocIdLimit()); i < m; i++) {
        h.inc(it->getSource(i));
    }
    return h;
}

} // namespace search