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 Yahoo. 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
{
typedef GenericHeader::Tag 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(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
|