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
|