diff options
-rw-r--r-- | searchlib/src/tests/attribute/comparator/comparator_test.cpp | 2 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/enumcomparator.h | 18 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp | 171 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/enumstorebase.h | 127 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/CMakeLists.txt | 1 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/unique_store.hpp | 16 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h | 17 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.hpp (renamed from vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.cpp) | 67 |
8 files changed, 188 insertions, 231 deletions
diff --git a/searchlib/src/tests/attribute/comparator/comparator_test.cpp b/searchlib/src/tests/attribute/comparator/comparator_test.cpp index 6f16cbbe391..6ad2a7ebe3b 100644 --- a/searchlib/src/tests/attribute/comparator/comparator_test.cpp +++ b/searchlib/src/tests/attribute/comparator/comparator_test.cpp @@ -28,7 +28,7 @@ typedef EnumStoreBase::Index EnumIndex; typedef BTreeRoot<EnumIndex, BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper> TreeType; + const datastore::EntryComparatorWrapper> TreeType; typedef TreeType::NodeAllocatorType NodeAllocator; class Test : public vespalib::TestApp { diff --git a/searchlib/src/vespa/searchlib/attribute/enumcomparator.h b/searchlib/src/vespa/searchlib/attribute/enumcomparator.h index 255d0bead9f..a9e76082a34 100644 --- a/searchlib/src/vespa/searchlib/attribute/enumcomparator.h +++ b/searchlib/src/vespa/searchlib/attribute/enumcomparator.h @@ -10,14 +10,17 @@ namespace search { * Template comparator class for the various entry types. **/ template <typename EntryType> -class EnumStoreComparatorT : public EnumStoreComparator { +class EnumStoreComparatorT : public datastore::EntryComparator { public: - typedef EnumStoreT<EntryType> EnumStoreType; + using EnumStoreType = EnumStoreT<EntryType>; protected: - typedef typename EntryType::Type EntryValue; + using EntryValue = typename EntryType::Type; + using EnumIndex = typename EnumStoreType::Index; + const EnumStoreType & _enumStore; EntryValue _value; - EntryValue getValue(const EnumIndex & idx) const { + EntryValue getValue(const datastore::EntryRef ref) const { + EnumIndex idx(ref); if (idx.valid()) { return _enumStore.getValue(idx); } @@ -48,7 +51,7 @@ public: } return 1; } - bool operator() (const EnumIndex & lhs, const EnumIndex & rhs) const override { + bool operator() (const datastore::EntryRef lhs, const datastore::EntryRef rhs) const override { return compare(getValue(lhs), getValue(rhs)) < 0; } }; @@ -87,10 +90,11 @@ public: return ParentType::compare(lhs, rhs); } - bool operator() (const EnumIndex & lhs, const EnumIndex & rhs) const override { - if (getUsePrefix()) + bool operator() (const datastore::EntryRef lhs, const datastore::EntryRef rhs) const override { + if (getUsePrefix()) { return compareFoldedPrefix(getValue(lhs), getValue(rhs), _prefixLen) < 0; + } return compareFolded(getValue(lhs), getValue(rhs)) < 0; } }; diff --git a/searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp b/searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp index 5d2523c9875..5825bdd7e58 100644 --- a/searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp +++ b/searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp @@ -8,11 +8,12 @@ #include <vespa/vespalib/btree/btreenodeallocator.hpp> #include <vespa/vespalib/btree/btreeroot.hpp> #include <vespa/vespalib/datastore/datastore.hpp> +#include <vespa/vespalib/datastore/unique_store_dictionary.hpp> +#include <vespa/vespalib/stllike/asciistream.h> +#include <vespa/vespalib/stllike/hash_map.hpp> #include <vespa/vespalib/util/bufferwriter.h> #include <vespa/vespalib/util/exceptions.h> #include <vespa/vespalib/util/rcuvector.hpp> -#include <vespa/vespalib/stllike/asciistream.h> -#include <vespa/vespalib/stllike/hash_map.hpp> #include <vespa/log/log.h> @@ -302,61 +303,42 @@ EnumStoreDictBase::EnumStoreDictBase(EnumStoreBase &enumStore) { } - EnumStoreDictBase::~EnumStoreDictBase() = default; - template <typename Dictionary> EnumStoreDict<Dictionary>::EnumStoreDict(EnumStoreBase &enumStore) : EnumStoreDictBase(enumStore), - _dict() + ParentUniqueStoreDictionary() { } template <typename Dictionary> EnumStoreDict<Dictionary>::~EnumStoreDict() = default; - -template <typename Dictionary> -void -EnumStoreDict<Dictionary>::freezeTree() -{ - _dict.getAllocator().freeze(); -} - template <typename Dictionary> uint32_t EnumStoreDict<Dictionary>::getNumUniques() const { - return _dict.size(); -} - - -template <typename Dictionary> -vespalib::MemoryUsage -EnumStoreDict<Dictionary>::getTreeMemoryUsage() const -{ - return _dict.getMemoryUsage(); + return this->_dict.size(); } template <typename Dictionary> void EnumStoreDict<Dictionary>::reEnumerate() { - _enumStore.reEnumerate(_dict); + _enumStore.reEnumerate(this->_dict); } - template <typename Dictionary> void EnumStoreDict<Dictionary>:: writeAllValues(BufferWriter &writer, - btree::BTreeNode::Ref rootRef) const + btree::BTreeNode::Ref rootRef) const { constexpr size_t BATCHSIZE = 1000; std::vector<Index> idxs; idxs.reserve(BATCHSIZE); - typename Dictionary::Iterator it(rootRef, _dict.getAllocator()); + typename Dictionary::Iterator it(rootRef, this->_dict.getAllocator()); while (it.valid()) { if (idxs.size() >= idxs.capacity()) { _enumStore.writeValues(writer, &idxs[0], idxs.size()); @@ -370,69 +352,67 @@ writeAllValues(BufferWriter &writer, } } - template <typename Dictionary> ssize_t EnumStoreDict<Dictionary>::deserialize(const void *src, - size_t available, - IndexVector &idx) + size_t available, + IndexVector &idx) { - return _enumStore.deserialize(src, available, idx, _dict); + return _enumStore.deserialize(src, available, idx, this->_dict); } - template <typename Dictionary> void EnumStoreDict<Dictionary>::fixupRefCounts(const EnumVector & hist) { - _enumStore.fixupRefCounts(hist, _dict); + _enumStore.fixupRefCounts(hist, this->_dict); } - template <typename Dictionary> void EnumStoreDict<Dictionary>::removeUnusedEnums(const IndexSet &unused, - const EnumStoreComparator &cmp, - const EnumStoreComparator *fcmp) + const datastore::EntryComparator &cmp, + const datastore::EntryComparator *fcmp) { typedef typename Dictionary::Iterator Iterator; if (unused.empty()) return; - Iterator it(BTreeNode::Ref(), _dict.getAllocator()); - for (IndexSet::const_iterator iter(unused.begin()), mt(unused.end()); - iter != mt; ++iter) { - it.lower_bound(_dict.getRoot(), *iter, cmp); - assert(it.valid() && !cmp(*iter, it.getKey())); + Iterator it(BTreeNode::Ref(), this->_dict.getAllocator()); + for (const auto& idx : unused) { + it.lower_bound(this->_dict.getRoot(), idx, cmp); + assert(it.valid() && !cmp(idx, it.getKey())); if (Iterator::hasData() && fcmp != nullptr) { typename Dictionary::DataType pidx(it.getData()); - _dict.remove(it); - if (!it.valid() || (*fcmp)(*iter, it.getKey())) + this->_dict.remove(it); + if (!it.valid() || (*fcmp)(idx, it.getKey())) { continue; // Next entry does not use same posting list + } --it; - if (it.valid() && !(*fcmp)(it.getKey(), *iter)) + if (it.valid() && !(*fcmp)(it.getKey(), idx)) { continue; // Previous entry uses same posting list - if (it.valid()) + } + if (it.valid()) { ++it; - else + } else { it.begin(); - _dict.thaw(it); + } + this->_dict.thaw(it); it.writeData(pidx); } else { - _dict.remove(it); + this->_dict.remove(it); } } } template <typename Dictionary> void -EnumStoreDict<Dictionary>::freeUnusedEnums(const EnumStoreComparator &cmp, - const EnumStoreComparator *fcmp) +EnumStoreDict<Dictionary>::freeUnusedEnums(const datastore::EntryComparator &cmp, + const datastore::EntryComparator *fcmp) { IndexSet unused; // find unused enums - for (typename Dictionary::Iterator iter(_dict.begin()); iter.valid(); - ++iter) { + for (auto iter = this->_dict.begin(); iter.valid(); ++iter) { _enumStore.freeUnusedEnum(iter.getKey(), unused); } removeUnusedEnums(unused, cmp, fcmp); @@ -441,8 +421,8 @@ EnumStoreDict<Dictionary>::freeUnusedEnums(const EnumStoreComparator &cmp, template <typename Dictionary> void EnumStoreDict<Dictionary>::freeUnusedEnums(const IndexSet& toRemove, - const EnumStoreComparator& cmp, - const EnumStoreComparator* fcmp) + const datastore::EntryComparator& cmp, + const datastore::EntryComparator* fcmp) { IndexSet unused; for (const auto& index : toRemove) { @@ -451,13 +431,12 @@ EnumStoreDict<Dictionary>::freeUnusedEnums(const IndexSet& toRemove, removeUnusedEnums(unused, cmp, fcmp); } - template <typename Dictionary> bool -EnumStoreDict<Dictionary>::findIndex(const EnumStoreComparator &cmp, +EnumStoreDict<Dictionary>::findIndex(const datastore::EntryComparator &cmp, Index &idx) const { - typename Dictionary::Iterator itr = _dict.find(Index(), cmp); + auto itr = this->_dict.find(Index(), cmp); if (!itr.valid()) { return false; } @@ -465,14 +444,12 @@ EnumStoreDict<Dictionary>::findIndex(const EnumStoreComparator &cmp, return true; } - template <typename Dictionary> bool -EnumStoreDict<Dictionary>::findFrozenIndex(const EnumStoreComparator &cmp, +EnumStoreDict<Dictionary>::findFrozenIndex(const datastore::EntryComparator &cmp, Index &idx) const { - typename Dictionary::ConstIterator itr = - _dict.getFrozenView().find(Index(), cmp); + auto itr = this->_dict.getFrozenView().find(Index(), cmp); if (!itr.valid()) { return false; } @@ -480,14 +457,12 @@ EnumStoreDict<Dictionary>::findFrozenIndex(const EnumStoreComparator &cmp, return true; } - template <typename Dictionary> std::vector<EnumStoreBase::EnumHandle> -EnumStoreDict<Dictionary>::findMatchingEnums(const EnumStoreComparator &cmp) const +EnumStoreDict<Dictionary>::findMatchingEnums(const datastore::EntryComparator &cmp) const { std::vector<EnumStoreBase::EnumHandle> result; - typename Dictionary::ConstIterator itr = - _dict.getFrozenView().find(Index(), cmp); + auto itr = this->_dict.getFrozenView().find(Index(), cmp); while (itr.valid() && !cmp(Index(), itr.getKey())) { result.push_back(itr.getKey().ref()); ++itr; @@ -499,42 +474,16 @@ template <typename Dictionary> void EnumStoreDict<Dictionary>::onReset() { - _dict.clear(); -} - - -template <typename Dictionary> -void -EnumStoreDict<Dictionary>::onTransferHoldLists(generation_t generation) -{ - _dict.getAllocator().transferHoldLists(generation); + this->_dict.clear(); } - -template <typename Dictionary> -void -EnumStoreDict<Dictionary>::onTrimHoldLists(generation_t firstUsed) -{ - _dict.getAllocator().trimHoldLists(firstUsed); -} - - -template <typename Dictionary> -BTreeNode::Ref -EnumStoreDict<Dictionary>::getFrozenRootRef() const -{ - return _dict.getFrozenView().getRoot(); -} - - template <typename Dictionary> uint32_t -EnumStoreDict<Dictionary>:: -lookupFrozenTerm(BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &comp) const +EnumStoreDict<Dictionary>::lookupFrozenTerm(BTreeNode::Ref frozenRootRef, + const datastore::EntryComparator &comp) const { typename Dictionary::ConstIterator itr(BTreeNode::Ref(), - _dict.getAllocator()); + this->_dict.getAllocator()); itr.lower_bound(frozenRootRef, Index(), comp); if (itr.valid() && !comp(Index(), itr.getKey())) { return 1u; @@ -542,20 +491,20 @@ lookupFrozenTerm(BTreeNode::Ref frozenRootRef, return 0u; } - template <typename Dictionary> uint32_t EnumStoreDict<Dictionary>:: lookupFrozenRange(BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &low, - const EnumStoreComparator &high) const + const datastore::EntryComparator &low, + const datastore::EntryComparator &high) const { typename Dictionary::ConstIterator lowerDictItr(BTreeNode::Ref(), - _dict.getAllocator()); + this->_dict.getAllocator()); lowerDictItr.lower_bound(frozenRootRef, Index(), low); - typename Dictionary::ConstIterator upperDictItr = lowerDictItr; - if (upperDictItr.valid() && !high(Index(), upperDictItr.getKey())) + auto upperDictItr = lowerDictItr; + if (upperDictItr.valid() && !high(Index(), upperDictItr.getKey())) { upperDictItr.seekPast(Index(), high); + } return upperDictItr - lowerDictItr; } @@ -665,19 +614,19 @@ class btree::BTreeNodeStore<EnumStoreBase::Index, datastore::EntryRef, btree::No template class btree::BTreeRoot<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeRoot<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeRootT<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeRootT<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeRootBase<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, @@ -702,23 +651,25 @@ template class btree::BTreeIteratorBase<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, EnumTreeTraits::INTERNAL_SLOTS, EnumTreeTraits::LEAF_SLOTS, EnumTreeTraits::PATH_SIZE>; -template class btree::BTreeConstIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, const EnumStoreComparatorWrapper, EnumTreeTraits>; +template class btree::BTreeConstIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, + const datastore::EntryComparatorWrapper, EnumTreeTraits>; -template class btree::BTreeConstIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, const EnumStoreComparatorWrapper, EnumTreeTraits>; +template class btree::BTreeConstIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTreeIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTree<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; template class btree::BTree<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; } diff --git a/searchlib/src/vespa/searchlib/attribute/enumstorebase.h b/searchlib/src/vespa/searchlib/attribute/enumstorebase.h index 3316db534fa..ea6ace1438a 100644 --- a/searchlib/src/vespa/searchlib/attribute/enumstorebase.h +++ b/searchlib/src/vespa/searchlib/attribute/enumstorebase.h @@ -5,10 +5,13 @@ #include <vespa/searchcommon/attribute/iattributevector.h> #include <vespa/vespalib/btree/btree.h> #include <vespa/vespalib/datastore/datastore.h> +#include <vespa/vespalib/datastore/entry_comparator_wrapper.h> +#include <vespa/vespalib/datastore/entryref.h> +#include <vespa/vespalib/datastore/unique_store_dictionary.h> +#include <vespa/vespalib/stllike/hash_map.h> #include <vespa/vespalib/util/address_space.h> #include <vespa/vespalib/util/array.h> #include <vespa/vespalib/util/memoryusage.h> -#include <vespa/vespalib/stllike/hash_map.h> #include <atomic> #include <set> @@ -20,9 +23,8 @@ class BufferWriter; namespace attribute { class Status; } class EnumStoreBase; -class EnumStoreComparator; -class EnumStoreComparatorWrapper; +using EnumStoreComparator = datastore::EntryComparator; using EnumStoreDataStoreType = datastore::DataStoreT<datastore::AlignedEntryRefT<31, 4> >; using EnumStoreIndex = EnumStoreDataStoreType::RefType; using EnumStoreIndexVector = vespalib::Array<EnumStoreIndex>; @@ -32,11 +34,11 @@ typedef btree::BTreeTraits<16, 16, 10, true> EnumTreeTraits; typedef btree::BTree<EnumStoreIndex, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, + const datastore::EntryComparatorWrapper, EnumTreeTraits> EnumTree; typedef btree::BTree<EnumStoreIndex, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, + const datastore::EntryComparatorWrapper, EnumTreeTraits> EnumPostingTree; struct CompareEnumIndex @@ -72,15 +74,15 @@ public: virtual ssize_t deserialize(const void *src, size_t available, IndexVector &idx) = 0; virtual void fixupRefCounts(const EnumVector &hist) = 0; - virtual void freeUnusedEnums(const EnumStoreComparator &cmp, - const EnumStoreComparator *fcmp) = 0; + virtual void freeUnusedEnums(const datastore::EntryComparator &cmp, + const datastore::EntryComparator *fcmp) = 0; virtual void freeUnusedEnums(const IndexSet& toRemove, - const EnumStoreComparator& cmp, - const EnumStoreComparator* fcmp) = 0; - virtual bool findIndex(const EnumStoreComparator &cmp, Index &idx) const = 0; - virtual bool findFrozenIndex(const EnumStoreComparator &cmp, Index &idx) const = 0; + const datastore::EntryComparator& cmp, + const datastore::EntryComparator* fcmp) = 0; + virtual bool findIndex(const datastore::EntryComparator &cmp, Index &idx) const = 0; + virtual bool findFrozenIndex(const datastore::EntryComparator &cmp, Index &idx) const = 0; virtual std::vector<attribute::IAttributeVector::EnumHandle> - findMatchingEnums(const EnumStoreComparator &cmp) const = 0; + findMatchingEnums(const datastore::EntryComparator &cmp) const = 0; virtual void onReset() = 0; virtual void onTransferHoldLists(generation_t generation) = 0; @@ -88,11 +90,11 @@ public: virtual btree::BTreeNode::Ref getFrozenRootRef() const = 0; virtual uint32_t lookupFrozenTerm(btree::BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &comp) const = 0; + const datastore::EntryComparator &comp) const = 0; virtual uint32_t lookupFrozenRange(btree::BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &low, - const EnumStoreComparator &high) const = 0; + const datastore::EntryComparator &low, + const datastore::EntryComparator &high) const = 0; virtual EnumPostingTree &getPostingDictionary() = 0; virtual const EnumPostingTree &getPostingDictionary() const = 0; @@ -101,54 +103,55 @@ public: template <typename Dictionary> -class EnumStoreDict : public EnumStoreDictBase +class EnumStoreDict : public EnumStoreDictBase, + search::datastore::UniqueStoreDictionary<Dictionary> { -protected: - Dictionary _dict; +private: + using ParentUniqueStoreDictionary = search::datastore::UniqueStoreDictionary<Dictionary>; public: EnumStoreDict(EnumStoreBase &enumStore); ~EnumStoreDict() override; - const Dictionary &getDictionary() const { return _dict; } - Dictionary &getDictionary() { return _dict; } + const Dictionary &getDictionary() const { return this->_dict; } + Dictionary &getDictionary() { return this->_dict; } - void freezeTree() override; + void freezeTree() override { this->freeze(); } uint32_t getNumUniques() const override; - vespalib::MemoryUsage getTreeMemoryUsage() const override; + vespalib::MemoryUsage getTreeMemoryUsage() const override { return this->get_memory_usage(); } void reEnumerate() override; void writeAllValues(BufferWriter &writer, btree::BTreeNode::Ref rootRef) const override; ssize_t deserialize(const void *src, size_t available, IndexVector &idx) override; void fixupRefCounts(const EnumVector &hist) override; void removeUnusedEnums(const IndexSet &unused, - const EnumStoreComparator &cmp, - const EnumStoreComparator *fcmp); + const datastore::EntryComparator &cmp, + const datastore::EntryComparator *fcmp); - void freeUnusedEnums(const EnumStoreComparator &cmp, - const EnumStoreComparator *fcmp) override; + void freeUnusedEnums(const datastore::EntryComparator &cmp, + const datastore::EntryComparator *fcmp) override; void freeUnusedEnums(const IndexSet& toRemove, - const EnumStoreComparator& cmp, - const EnumStoreComparator* fcmp) override; + const datastore::EntryComparator& cmp, + const datastore::EntryComparator* fcmp) override; - bool findIndex(const EnumStoreComparator &cmp, Index &idx) const override; - bool findFrozenIndex(const EnumStoreComparator &cmp, Index &idx) const override; + bool findIndex(const datastore::EntryComparator &cmp, Index &idx) const override; + bool findFrozenIndex(const datastore::EntryComparator &cmp, Index &idx) const override; std::vector<attribute::IAttributeVector::EnumHandle> - findMatchingEnums(const EnumStoreComparator &cmp) const override; + findMatchingEnums(const datastore::EntryComparator &cmp) const override; void onReset() override; - void onTransferHoldLists(generation_t generation) override; - void onTrimHoldLists(generation_t firstUsed) override; - btree::BTreeNode::Ref getFrozenRootRef() const override; + void onTransferHoldLists(generation_t generation) override { this->transfer_hold_lists(generation); } + void onTrimHoldLists(generation_t firstUsed) override { this->trim_hold_lists(firstUsed); } + btree::BTreeNode::Ref getFrozenRootRef() const override { return this->get_frozen_root(); } uint32_t lookupFrozenTerm(btree::BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &comp) const override; + const datastore::EntryComparator &comp) const override; uint32_t lookupFrozenRange(btree::BTreeNode::Ref frozenRootRef, - const EnumStoreComparator &low, - const EnumStoreComparator &high) const override; + const datastore::EntryComparator &low, + const datastore::EntryComparator &high) const override; EnumPostingTree & getPostingDictionary() override; const EnumPostingTree & getPostingDictionary() const override; @@ -359,34 +362,6 @@ public: vespalib::asciistream & operator << (vespalib::asciistream & os, const EnumStoreBase::Index & idx); -/** - * Base comparator class needed by the btree. - **/ -class EnumStoreComparator { -public: - typedef EnumStoreBase::Index EnumIndex; - virtual ~EnumStoreComparator() {} - /** - * Compare the values represented by the given enum indexes. - * Uses the enum store to map from enum index to actual value. - **/ - virtual bool operator() (const EnumIndex & lhs, const EnumIndex & rhs) const = 0; -}; - - -class EnumStoreComparatorWrapper -{ - const EnumStoreComparator &_comp; -public: - typedef EnumStoreBase::Index EnumIndex; - EnumStoreComparatorWrapper(const EnumStoreComparator &comp) - : _comp(comp) - { } - - bool operator()(const EnumIndex &lhs, const EnumIndex &rhs) const { - return _comp(lhs, rhs); - } -}; extern template class datastore::DataStoreT<datastore::AlignedEntryRefT<31, 4> >; @@ -425,19 +400,19 @@ class btree::BTreeNodeStore<EnumStoreBase::Index, datastore::EntryRef, btree::No extern template class btree::BTreeRoot<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeRoot<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeRootT<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeRootT<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeRootBase<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, @@ -463,22 +438,24 @@ extern template class btree::BTreeIteratorBase<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, EnumTreeTraits::INTERNAL_SLOTS, EnumTreeTraits::LEAF_SLOTS, EnumTreeTraits::PATH_SIZE>; -extern template class btree::BTreeConstIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, const EnumStoreComparatorWrapper, EnumTreeTraits>; +extern template class btree::BTreeConstIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, + const datastore::EntryComparatorWrapper, EnumTreeTraits>; -extern template class btree::BTreeConstIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, const EnumStoreComparatorWrapper, EnumTreeTraits>; +extern template class btree::BTreeConstIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeIterator<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTreeIterator<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTree<EnumStoreBase::Index, btree::BTreeNoLeafData, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; extern template class btree::BTree<EnumStoreBase::Index, datastore::EntryRef, btree::NoAggregated, - const EnumStoreComparatorWrapper, EnumTreeTraits>; + const datastore::EntryComparatorWrapper, EnumTreeTraits>; } diff --git a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt index 6f647a78a39..b8c9dae7174 100644 --- a/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt +++ b/vespalib/src/vespa/vespalib/datastore/CMakeLists.txt @@ -7,7 +7,6 @@ vespa_add_library(vespalib_vespalib_datastore OBJECT datastore.cpp datastorebase.cpp entryref.cpp - unique_store_dictionary.cpp unique_store_string_allocator.cpp DEPENDS ) diff --git a/vespalib/src/vespa/vespalib/datastore/unique_store.hpp b/vespalib/src/vespa/vespalib/datastore/unique_store.hpp index e149f470bdf..ae7f82a6e52 100644 --- a/vespalib/src/vespa/vespalib/datastore/unique_store.hpp +++ b/vespalib/src/vespa/vespalib/datastore/unique_store.hpp @@ -5,20 +5,32 @@ #include "unique_store.h" #include "unique_store_dictionary.h" #include "datastore.hpp" -#include <vespa/vespalib/util/bufferwriter.h> #include "unique_store_allocator.hpp" #include "unique_store_builder.hpp" +#include "unique_store_dictionary.hpp" #include "unique_store_saver.hpp" +#include <vespa/vespalib/util/bufferwriter.h> #include <atomic> #include <algorithm> namespace search::datastore { +namespace uniquestore { + +using DefaultDictionaryTraits = btree::BTreeTraits<32, 32, 7, true>; +using DefaultDictionary = btree::BTree<EntryRef, btree::BTreeNoLeafData, + btree::NoAggregated, + EntryComparatorWrapper, + DefaultDictionaryTraits>; +using DefaultUniqueStoreDictionary = UniqueStoreDictionary<DefaultDictionary>; + +} + template <typename EntryT, typename RefT, typename Compare, typename Allocator> UniqueStore<EntryT, RefT, Compare, Allocator>::UniqueStore() : _allocator(), _store(_allocator.get_data_store()), - _dict(std::make_unique<UniqueStoreDictionary>()) + _dict(std::make_unique<uniquestore::DefaultUniqueStoreDictionary>()) { } diff --git a/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h b/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h index a870d759ce3..4191b5d26a6 100644 --- a/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h +++ b/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h @@ -9,20 +9,17 @@ namespace search::datastore { class EntryComparatorWrapper; -/* +/** * A dictionary for unique store. Mostly accessed via base class. */ +template <typename DictionaryT> class UniqueStoreDictionary : public UniqueStoreDictionaryBase { -public: - using DictionaryTraits = btree::BTreeTraits<32, 32, 7, true>; - using Dictionary = btree::BTree<EntryRef, btree::BTreeNoLeafData, - btree::NoAggregated, - EntryComparatorWrapper, - DictionaryTraits>; - -private: - Dictionary _dict; +protected: + using DictionaryType = DictionaryT; + using DataType = typename DictionaryType::DataType; + + DictionaryType _dict; public: UniqueStoreDictionary(); diff --git a/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.cpp b/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.hpp index be28f8f7358..51968f0042b 100644 --- a/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.cpp +++ b/vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.hpp @@ -1,48 +1,56 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include "unique_store_dictionary.h" -#include "unique_store_add_result.h" +#pragma once + +#include "datastore.hpp" #include "entry_comparator_wrapper.h" #include "i_compactable.h" -#include "datastore.hpp" +#include "unique_store_add_result.h" +#include "unique_store_dictionary.h" #include <vespa/vespalib/btree/btree.hpp> #include <vespa/vespalib/btree/btreebuilder.hpp> -#include <vespa/vespalib/btree/btreeroot.hpp> -#include <vespa/vespalib/btree/btreenodeallocator.hpp> #include <vespa/vespalib/btree/btreeiterator.hpp> #include <vespa/vespalib/btree/btreenode.hpp> +#include <vespa/vespalib/btree/btreenodeallocator.hpp> +#include <vespa/vespalib/btree/btreeroot.hpp> namespace search::datastore { -UniqueStoreDictionary::UniqueStoreDictionary() +template <typename DictionaryT> +UniqueStoreDictionary<DictionaryT>::UniqueStoreDictionary() : UniqueStoreDictionaryBase(), _dict() { } -UniqueStoreDictionary::~UniqueStoreDictionary() = default; +template <typename DictionaryT> +UniqueStoreDictionary<DictionaryT>::~UniqueStoreDictionary() = default; +template <typename DictionaryT> void -UniqueStoreDictionary::freeze() +UniqueStoreDictionary<DictionaryT>::freeze() { _dict.getAllocator().freeze(); } +template <typename DictionaryT> void -UniqueStoreDictionary::transfer_hold_lists(generation_t generation) +UniqueStoreDictionary<DictionaryT>::transfer_hold_lists(generation_t generation) { _dict.getAllocator().transferHoldLists(generation); } - + +template <typename DictionaryT> void -UniqueStoreDictionary::trim_hold_lists(generation_t firstUsed) +UniqueStoreDictionary<DictionaryT>::trim_hold_lists(generation_t firstUsed) { _dict.getAllocator().trimHoldLists(firstUsed); } +template <typename DictionaryT> UniqueStoreAddResult -UniqueStoreDictionary::add(const EntryComparator &comp, - std::function<EntryRef(void)> insertEntry) +UniqueStoreDictionary<DictionaryT>::add(const EntryComparator &comp, + std::function<EntryRef(void)> insertEntry) { auto itr = _dict.lowerBound(EntryRef(), comp); if (itr.valid() && !comp(EntryRef(), itr.getKey())) { @@ -50,13 +58,14 @@ UniqueStoreDictionary::add(const EntryComparator &comp, } else { EntryRef newRef = insertEntry(); - _dict.insert(itr, newRef, btree::BTreeNoLeafData()); + _dict.insert(itr, newRef, DataType()); return UniqueStoreAddResult(newRef, true); } } +template <typename DictionaryT> EntryRef -UniqueStoreDictionary::find(const EntryComparator &comp) +UniqueStoreDictionary<DictionaryT>::find(const EntryComparator &comp) { auto itr = _dict.lowerBound(EntryRef(), comp); if (itr.valid() && !comp(EntryRef(), itr.getKey())) { @@ -66,8 +75,9 @@ UniqueStoreDictionary::find(const EntryComparator &comp) } } +template <typename DictionaryT> void -UniqueStoreDictionary::remove(const EntryComparator &comp, EntryRef ref) +UniqueStoreDictionary<DictionaryT>::remove(const EntryComparator &comp, EntryRef ref) { assert(ref.valid()); auto itr = _dict.lowerBound(ref, comp); @@ -75,8 +85,9 @@ UniqueStoreDictionary::remove(const EntryComparator &comp, EntryRef ref) _dict.remove(itr); } +template <typename DictionaryT> void -UniqueStoreDictionary::move_entries(ICompactable &compactable) +UniqueStoreDictionary<DictionaryT>::move_entries(ICompactable &compactable) { auto itr = _dict.begin(); while (itr.valid()) { @@ -90,27 +101,32 @@ UniqueStoreDictionary::move_entries(ICompactable &compactable) } } +template <typename DictionaryT> uint32_t -UniqueStoreDictionary::get_num_uniques() const +UniqueStoreDictionary<DictionaryT>::get_num_uniques() const { return _dict.getFrozenView().size(); } +template <typename DictionaryT> vespalib::MemoryUsage -UniqueStoreDictionary::get_memory_usage() const +UniqueStoreDictionary<DictionaryT>::get_memory_usage() const { return _dict.getMemoryUsage(); } +template <typename DictionaryT> void -UniqueStoreDictionary::build(const std::vector<EntryRef> &refs, const std::vector<uint32_t> &ref_counts, std::function<void(EntryRef)> hold) +UniqueStoreDictionary<DictionaryT>::build(const std::vector<EntryRef> &refs, + const std::vector<uint32_t> &ref_counts, + std::function<void(EntryRef)> hold) { assert(refs.size() == ref_counts.size()); assert(!refs.empty()); - typename Dictionary::Builder builder(_dict.getAllocator()); + typename DictionaryType::Builder builder(_dict.getAllocator()); for (size_t i = 1; i < refs.size(); ++i) { if (ref_counts[i] != 0u) { - builder.insert(refs[i], btree::BTreeNoLeafData()); + builder.insert(refs[i], DataType()); } else { hold(refs[i]); } @@ -118,16 +134,17 @@ UniqueStoreDictionary::build(const std::vector<EntryRef> &refs, const std::vecto _dict.assign(builder); } +template <typename DictionaryT> EntryRef -UniqueStoreDictionary::get_frozen_root() const +UniqueStoreDictionary<DictionaryT>::get_frozen_root() const { return _dict.getFrozenView().getRoot(); } +template <typename DictionaryT> void -UniqueStoreDictionary::foreach_key(EntryRef root, std::function<void(EntryRef)> callback) const +UniqueStoreDictionary<DictionaryT>::foreach_key(EntryRef root, std::function<void(EntryRef)> callback) const { - _dict.getAllocator().getNodeStore().foreach_key(root, callback); } |