blob: ff6340406fcd8812395a0a1aa281468494ef790d (
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
|
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
#include "enum_store_types.h"
#include <vespa/vespalib/datastore/atomic_entry_ref.h>
#include <memory>
namespace vespalib {
class AddressSpace;
class MemoryUsage;
}
namespace vespalib::datastore {
class CompactionSpec;
class CompactionStrategy;
class DataStoreBase;
class EntryComparator;
template <typename> class UniqueStoreRemapper;
template <typename> class UniqueStoreEnumerator;
}
namespace search::enumstore {
class EnumeratedLoader;
class EnumeratedPostingsLoader;
}
namespace search {
class BufferWriter;
class IEnumStoreDictionary;
/**
* Interface for an enum store that is independent of the data type stored.
*/
class IEnumStore {
public:
using AtomicIndex = enumstore::AtomicIndex;
using Index = enumstore::Index;
using InternalIndex = enumstore::InternalIndex;
using IndexVector = enumstore::IndexVector;
using CompactionSpec = vespalib::datastore::CompactionSpec;
using CompactionStrategy = vespalib::datastore::CompactionStrategy;
using EnumHandle = enumstore::EnumHandle;
using EnumVector = enumstore::EnumVector;
using EnumIndexRemapper = vespalib::datastore::UniqueStoreRemapper<InternalIndex>;
using Enumerator = vespalib::datastore::UniqueStoreEnumerator<InternalIndex>;
using IndexList = std::vector<Index>;
virtual ~IEnumStore() = default;
virtual void write_value(BufferWriter& writer, Index idx) const = 0;
virtual ssize_t load_unique_values(const void* src, size_t available, IndexVector& idx) = 0;
virtual void set_ref_count(Index idx, uint32_t ref_count) = 0;
virtual void free_value_if_unused(Index idx, IndexList& unused) = 0;
virtual void free_unused_values() = 0;
virtual bool is_folded_change(Index idx1, Index idx2) const = 0;
virtual IEnumStoreDictionary& get_dictionary() = 0;
virtual const IEnumStoreDictionary& get_dictionary() const = 0;
virtual uint32_t get_num_uniques() const = 0;
virtual vespalib::MemoryUsage get_values_memory_usage() const = 0;
virtual vespalib::AddressSpace get_values_address_space_usage() const = 0;
virtual vespalib::MemoryUsage get_dictionary_memory_usage() const = 0;
virtual vespalib::MemoryUsage update_stat(const CompactionStrategy& compaction_strategy) = 0;
virtual std::unique_ptr<EnumIndexRemapper> consider_compact_values(const CompactionStrategy& compaction_strategy) = 0;
virtual std::unique_ptr<EnumIndexRemapper> compact_worst_values(CompactionSpec compaction_spec, const CompactionStrategy& compaction_strategy) = 0;
virtual bool consider_compact_dictionary(const CompactionStrategy& compaction_strategy) = 0;
virtual uint64_t get_compaction_count() const = 0;
// Should only be used by unit tests.
virtual void inc_compaction_count() = 0;
enumstore::EnumeratedLoader make_enumerated_loader();
enumstore::EnumeratedPostingsLoader make_enumerated_postings_loader();
virtual std::unique_ptr<Enumerator> make_enumerator() = 0;
virtual std::unique_ptr<vespalib::datastore::EntryComparator> allocate_comparator() const = 0;
virtual void clear_default_value_ref() = 0;
virtual void setup_default_value_ref() = 0;
};
}
|