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

#pragma once

#include "dociditerator.h"
#include "enumattribute.h"
#include "ipostinglistattributebase.h"
#include "numericbase.h"
#include "postingchange.h"
#include "postinglistsearchcontext.h"
#include "stringbase.h"
#include <vespa/searchlib/queryeval/searchiterator.h>
#include <vespa/vespalib/btree/btreestore.h>
#include <vespa/vespalib/datastore/entry_comparator.h>
#include <vespa/vespalib/datastore/entryref.h>
#include <map>

namespace search {

class EnumPostingPair
{
private:
    IEnumStore::Index _idx;
    const vespalib::datastore::EntryComparator *_cmp;
public:
    EnumPostingPair(IEnumStore::Index idx, const vespalib::datastore::EntryComparator *cmp)
        : _idx(idx),
          _cmp(cmp)
    { }

    bool operator<(const EnumPostingPair &rhs) const { return _cmp->less(_idx, rhs._idx); }
    IEnumStore::Index getEnumIdx() const { return _idx; }
};


template <typename P>
class PostingListAttributeBase : public attribute::IPostingListAttributeBase {
protected:
    using Posting = P;
    using DataType = typename Posting::DataType;

    using AggregationTraits = attribute::PostingListTraits<DataType>;
    using DocId = AttributeVector::DocId;
    using EntryRef = vespalib::datastore::EntryRef;
    using EnumIndex = IEnumStore::Index;
    using PostingList = typename AggregationTraits::PostingList;
    using PostingMap = std::map<EnumPostingPair, PostingChange<P> >;

    PostingList _postingList;
    AttributeVector &_attr;
    IEnumStoreDictionary& _dictionary;

    PostingListAttributeBase(AttributeVector &attr, IEnumStore &enumStore);
    ~PostingListAttributeBase() override;

    virtual void updatePostings(PostingMap & changePost) = 0;

    void updatePostings(PostingMap &changePost, const vespalib::datastore::EntryComparator &cmp);
    void clearAllPostings();
    void disableFreeLists() { _postingList.disableFreeLists(); }
    void disable_entry_hold_list() { _postingList.disable_entry_hold_list(); }
    void handle_load_posting_lists_and_update_enum_store(enumstore::EnumeratedPostingsLoader& loader);
    bool forwardedOnAddDoc(DocId doc, size_t wantSize, size_t wantCapacity);

    void clearPostings(attribute::IAttributeVector::EnumHandle eidx, uint32_t fromLid,
                       uint32_t toLid, const vespalib::datastore::EntryComparator &cmp);

    void forwardedShrinkLidSpace(uint32_t newSize) override;
    vespalib::MemoryUsage getMemoryUsage() const override;
    bool consider_compact_worst_btree_nodes(const CompactionStrategy& compaction_strategy) override;
    bool consider_compact_worst_buffers(const CompactionStrategy& compaction_strategy) override;

public:
    const PostingList & getPostingList() const { return _postingList; }
    PostingList & getPostingList()             { return _postingList; }
};

template <typename P, typename LoadedVector, typename LoadedValueType,
          typename EnumStoreType>
class PostingListAttributeSubBase : public PostingListAttributeBase<P> {
public:
    using Parent = PostingListAttributeBase<P>;

    using Dictionary = EnumPostingTree;
    using EntryRef = vespalib::datastore::EntryRef;
    using EnumIndex = IEnumStore::Index;
    using EnumStore = EnumStoreType;
    using ComparatorType = typename EnumStore::ComparatorType;
    using PostingList = typename Parent::PostingList;
    using PostingMap = typename Parent::PostingMap;

    using Parent::clearAllPostings;
    using Parent::updatePostings;
    using Parent::handle_load_posting_lists_and_update_enum_store;
    using Parent::clearPostings;
    using Parent::_postingList;
    using Parent::_attr;
    using Parent::_dictionary;

private:
    EnumStore &_es;

public:
    PostingListAttributeSubBase(AttributeVector &attr, EnumStore &enumStore);
    ~PostingListAttributeSubBase() override;

    void handle_load_posting_lists(LoadedVector &loaded);
    void updatePostings(PostingMap &changePost) override;
    void clearPostings(attribute::IAttributeVector::EnumHandle eidx, uint32_t fromLid, uint32_t toLid) override;
};

extern template class PostingListAttributeBase<AttributePosting>;
extern template class PostingListAttributeBase<AttributeWeightPosting>;

} // namespace search