summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/tests/attribute/comparator/comparator_test.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/enumcomparator.h18
-rw-r--r--searchlib/src/vespa/searchlib/attribute/enumstorebase.cpp171
-rw-r--r--searchlib/src/vespa/searchlib/attribute/enumstorebase.h127
-rw-r--r--vespalib/src/vespa/vespalib/datastore/CMakeLists.txt1
-rw-r--r--vespalib/src/vespa/vespalib/datastore/unique_store.hpp16
-rw-r--r--vespalib/src/vespa/vespalib/datastore/unique_store_dictionary.h17
-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);
}