blob: faf63f54af3147a390fd520a3d90e64481545933 (
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
|
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "multisearch.h"
#include <vespa/vespalib/objects/visit.hpp>
#include <cassert>
namespace search::queryeval {
void
MultiSearch::insert(size_t index, SearchIterator::UP search)
{
assert(index <= _children.size());
_children.insert(_children.begin()+index, std::move(search));
onInsert(index);
}
SearchIterator::UP
MultiSearch::remove(size_t index)
{
assert(index < _children.size());
SearchIterator::UP search = std::move(_children[index]);
_children.erase(_children.begin() + index);
onRemove(index);
return search;
}
void
MultiSearch::doUnpack(uint32_t docid)
{
for (auto &child: _children) {
if (__builtin_expect(child->getDocId() < docid, false)) {
child->doSeek(docid);
}
if (__builtin_expect(child->getDocId() == docid, false)) {
child->doUnpack(docid);
}
}
}
MultiSearch::MultiSearch(Children children)
: _children(std::move(children))
{
}
MultiSearch::MultiSearch() = default;
MultiSearch::~MultiSearch() = default;
void
MultiSearch::initRange(uint32_t beginid, uint32_t endid)
{
SearchIterator::initRange(beginid, endid);
for (auto & child : _children) {
child->initRange(beginid, endid);
}
}
void
MultiSearch::disclose_children(std::vector<UP*> &dst)
{
for (auto &child: _children) {
dst.push_back(&child);
}
}
void
MultiSearch::visitMembers(vespalib::ObjectVisitor &visitor) const
{
visit(visitor, "children", _children);
}
}
|