aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/queryeval/multisearch.cpp
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);
}

}