aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/attribute/enum_store_loaders.h
blob: 5b6f85a27c1b8abba008cb14ec1aa327f8fc9d23 (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
// 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 "loadedenumvalue.h"

namespace search { class IEnumStore; }

namespace search::enumstore {

/**
 * Base helper class used to load an enum store from enumerated save files.
 */
class EnumeratedLoaderBase {
protected:
    IEnumStore& _store;
    IndexVector _indexes;
    EnumVector  _enum_value_remapping; // Empty if saved unique values are sorted.

    void release_enum_indexes();
public:
    EnumeratedLoaderBase(IEnumStore& store);
    EnumeratedLoaderBase(const EnumeratedLoaderBase &) = delete;
    EnumeratedLoaderBase & operator =(const EnumeratedLoaderBase &) = delete;
    EnumeratedLoaderBase(EnumeratedLoaderBase &&) = delete;
    EnumeratedLoaderBase & operator =(EnumeratedLoaderBase &&) = delete;
    ~EnumeratedLoaderBase();
    const IndexVector& get_enum_indexes() const { return _indexes; }
    const EnumVector& get_enum_value_remapping() const noexcept { return _enum_value_remapping; }
    void load_unique_values(const void* src, size_t available);
    void build_enum_value_remapping();
    void free_enum_value_remapping();
    void free_unused_values();
};

/**
 * Helper class used to load an enum store from enumerated save files.
 */
class EnumeratedLoader : public EnumeratedLoaderBase {
private:
    EnumVector _enums_histogram;

public:
    EnumeratedLoader(IEnumStore& store);
    EnumeratedLoader(const EnumeratedLoader &) = delete;
    EnumeratedLoader & operator =(const EnumeratedLoader &) = delete;
    EnumeratedLoader(EnumeratedLoader &&) = delete;
    EnumeratedLoader & operator =(EnumeratedLoader &&) = delete;
    ~EnumeratedLoader();
    EnumVector& get_enums_histogram() { return _enums_histogram; }
    void allocate_enums_histogram() {
        EnumVector(_indexes.size(), 0).swap(_enums_histogram);
    }
    void set_ref_counts();
    void build_dictionary();
};

/**
 * Helper class used to load an enum store (with posting lists) from enumerated save files.
 */
class EnumeratedPostingsLoader : public EnumeratedLoaderBase {
private:
    using EntryRef = vespalib::datastore::EntryRef;
    using EntryRefVector = std::vector<EntryRef, vespalib::allocator_large<EntryRef>>;
    attribute::LoadedEnumAttributeVector _loaded_enums;
    EntryRefVector                       _posting_indexes;
    bool                                 _has_btree_dictionary;

public:
    EnumeratedPostingsLoader(IEnumStore& store);
    EnumeratedPostingsLoader(const EnumeratedPostingsLoader &) = delete;
    EnumeratedPostingsLoader & operator =(const EnumeratedPostingsLoader &) = delete;
    EnumeratedPostingsLoader(EnumeratedPostingsLoader &&) = delete;
    EnumeratedPostingsLoader & operator =(EnumeratedPostingsLoader &&) = delete;
    ~EnumeratedPostingsLoader();
    attribute::LoadedEnumAttributeVector& get_loaded_enums() { return _loaded_enums; }
    void reserve_loaded_enums(size_t num_values) {
        _loaded_enums.reserve(num_values);
    }
    void sort_loaded_enums() {
        attribute::sortLoadedByEnum(_loaded_enums);
    }
    bool is_folded_change(Index lhs, Index rhs) const;
    void set_ref_count(Index idx, uint32_t ref_count);
    vespalib::ArrayRef<EntryRef> initialize_empty_posting_indexes();
    void build_dictionary();
    void build_empty_dictionary();
};

}