diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-04-11 11:31:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-11 11:31:10 +0200 |
commit | e5b9d3a634e2d8a1ecf783ff69c129e48732afad (patch) | |
tree | fdb657851b89cfd81c6b86d35b3da024b376b46a | |
parent | 65dc21685f2286a30c82c7d14c9fe5fe5c42d412 (diff) | |
parent | fafb7ede33f4ea448057d6d4d6a0e3ae412be80a (diff) |
Merge pull request #22073 from vespa-engine/toregge/trim-down-multivalue-value-and-multivalue-weighted-value
Trim down search::multivalue::Value and search::multivalue::WeightedValue.
12 files changed, 64 insertions, 29 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/multi_value_traits.h b/searchcommon/src/vespa/searchcommon/attribute/multi_value_traits.h new file mode 100644 index 00000000000..fcb3f1bd33a --- /dev/null +++ b/searchcommon/src/vespa/searchcommon/attribute/multi_value_traits.h @@ -0,0 +1,42 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <type_traits> + +namespace search::multivalue { + +template <typename T> class Value; +template <typename T> class WeightedValue; + +/* + * Check for the presence of a weight. + */ +template <typename T> +struct is_WeightedValue; + +template <typename T> +struct is_WeightedValue<Value<T>> : std::false_type {}; + +template <typename T> +struct is_WeightedValue<WeightedValue<T>> : std::true_type {}; + +template <typename T> +inline constexpr bool is_WeightedValue_v = is_WeightedValue<T>::value; + +/* + * Extract inner type. + */ +template <typename T> +struct ValueType; + +template <typename T> +struct ValueType<Value<T>> { using type = T; }; + +template <typename T> +struct ValueType<WeightedValue<T>> { using type = T; }; + +template <typename T> +using ValueType_t = typename ValueType<T>::type; + +} diff --git a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h index 780e8627b91..b9e85480d2d 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h +++ b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h @@ -9,7 +9,6 @@ namespace search::multivalue { template <typename T> class Value { public: - typedef T ValueType; Value() noexcept : _v() {} Value(T v) noexcept : _v(v) { } Value(T v, int32_t w) noexcept : _v(v) { (void) w; } @@ -19,14 +18,9 @@ public: operator T () const { return _v; } operator T & () { return _v; } int32_t weight() const { return 1; } - void setWeight(int32_t w) { (void) w; } - void incWeight(int32_t w) { (void) w; } bool operator ==(const Value<T> & rhs) const { return _v == rhs._v; } bool operator <(const Value<T> & rhs) const { return _v < rhs._v; } bool operator >(const Value<T> & rhs) const { return _v > rhs._v; } - static bool hasWeight() { return false; } - - static constexpr bool _hasWeight = false; private: T _v; }; @@ -34,7 +28,6 @@ private: template <typename T> class WeightedValue { public: - typedef T ValueType; WeightedValue() noexcept : _v(), _w(1) { } WeightedValue(T v, int32_t w) noexcept : _v(v), _w(w) { } T value() const { return _v; } @@ -43,15 +36,10 @@ public: operator T () const { return _v; } operator T & () { return _v; } int32_t weight() const { return _w; } - void setWeight(int32_t w) { _w = w; } - void incWeight(int32_t w) { _w += w; } bool operator==(const WeightedValue<T> & rhs) const { return _v == rhs._v; } bool operator <(const WeightedValue<T> & rhs) const { return _v < rhs._v; } bool operator >(const WeightedValue<T> & rhs) const { return _v > rhs._v; } - static bool hasWeight() { return true; } - - static constexpr bool _hasWeight = true; private: T _v; int32_t _w; diff --git a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp index 17a898765d3..9a331295fd0 100644 --- a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp @@ -73,7 +73,7 @@ template <typename B> bool FlagAttributeT<B>::onLoadEnumerated(ReaderBase &attrReader) { - typedef typename B::WType::ValueType TT; + using TT = multivalue::ValueType_t<typename B::WType>; uint32_t numDocs = attrReader.getNumIdx() - 1; uint64_t numValues = attrReader.getNumValues(); @@ -133,7 +133,7 @@ void FlagAttributeT<B>::setNewValues(DocId doc, const std::vector<typename B::WT template <typename B> void -FlagAttributeT<B>::setNewBVValue(DocId doc, typename B::WType::ValueType value) +FlagAttributeT<B>::setNewBVValue(DocId doc, multivalue::ValueType_t<typename B::WType> value) { uint32_t offset = getOffset(value); BitVector * bv = _bitVectors[offset]; diff --git a/searchlib/src/vespa/searchlib/attribute/flagattribute.h b/searchlib/src/vespa/searchlib/attribute/flagattribute.h index 24bec517eb0..e47045f87d8 100644 --- a/searchlib/src/vespa/searchlib/attribute/flagattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/flagattribute.h @@ -22,7 +22,7 @@ private: void setNewValues(DocId doc, const std::vector<typename B::WType> & values) override; public: - void setNewBVValue(DocId doc, typename B::WType::ValueType value); + void setNewBVValue(DocId doc, multivalue::ValueType_t<typename B::WType> value); private: bool onAddDoc(DocId doc) override; diff --git a/searchlib/src/vespa/searchlib/attribute/load_utils.h b/searchlib/src/vespa/searchlib/attribute/load_utils.h index ec4f4862ae1..8801b0fe5a4 100644 --- a/searchlib/src/vespa/searchlib/attribute/load_utils.h +++ b/searchlib/src/vespa/searchlib/attribute/load_utils.h @@ -6,6 +6,7 @@ #include "attributevector.h" #include "readerbase.h" #include <vespa/vespalib/util/arrayref.h> +#include <vespa/searchcommon/attribute/multi_value_traits.h> namespace vespalib::datastore { @@ -46,7 +47,7 @@ template <class MvMapping, class Saver> uint32_t loadFromEnumeratedMultiValue(MvMapping &mapping, ReaderBase &attrReader, - vespalib::ConstArrayRef<atomic_utils::NonAtomicValue_t<typename MvMapping::MultiValueType::ValueType>> enumValueToValueMap, + vespalib::ConstArrayRef<atomic_utils::NonAtomicValue_t<multivalue::ValueType_t<typename MvMapping::MultiValueType>>> enumValueToValueMap, vespalib::ConstArrayRef<uint32_t> enum_value_remapping, Saver saver) __attribute((noinline)); diff --git a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp index 76b19f40ced..b8d84944369 100644 --- a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp +++ b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp @@ -11,13 +11,13 @@ template <class MvMapping, class Saver> uint32_t loadFromEnumeratedMultiValue(MvMapping & mapping, ReaderBase & attrReader, - vespalib::ConstArrayRef<atomic_utils::NonAtomicValue_t<typename MvMapping::MultiValueType::ValueType>> enumValueToValueMap, + vespalib::ConstArrayRef<atomic_utils::NonAtomicValue_t<multivalue::ValueType_t<typename MvMapping::MultiValueType>>> enumValueToValueMap, vespalib::ConstArrayRef<uint32_t> enum_value_remapping, Saver saver) { mapping.prepareLoadFromMultiValue(); using MultiValueType = typename MvMapping::MultiValueType; - using ValueType = typename MultiValueType::ValueType; + using ValueType = multivalue::ValueType_t<MultiValueType>; using NonAtomicValueType = atomic_utils::NonAtomicValue_t<ValueType>; std::vector<MultiValueType> indices; uint32_t numDocs = attrReader.getNumIdx() - 1; @@ -36,7 +36,7 @@ loadFromEnumeratedMultiValue(MvMapping & mapping, if (!enum_value_remapping.empty()) { enumValue = enum_value_remapping[enumValue]; } - int32_t weight = MultiValueType::_hasWeight ? attrReader.getNextWeight() : 1; + int32_t weight = multivalue::is_WeightedValue_v<MultiValueType> ? attrReader.getNextWeight() : 1; if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { indices.emplace_back(enumValueToValueMap[enumValue], weight); } else { diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp index 6e35a352b75..d48e119a544 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp @@ -107,7 +107,7 @@ onSave(IAttributeSaveTarget &saveTarget) { bool compaction_broke_save = false; CountWriter countWriter(saveTarget); - WeightWriter<MultiValueType::_hasWeight> weightWriter(saveTarget); + WeightWriter<multivalue::is_WeightedValue_v<MultiValueType>> weightWriter(saveTarget); DatWriter datWriter(saveTarget, _enumSaver.get_enumerator(), [this]() { return compaction_interferred(); }); _enumSaver.writeUdat(saveTarget); diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.h b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.h index 7d635cfa755..137fcd24794 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.h +++ b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.h @@ -4,6 +4,7 @@ #include "multivalueattributesaver.h" #include "enumattributesaver.h" +#include <vespa/searchcommon/attribute/multi_value_traits.h> namespace search { @@ -18,7 +19,7 @@ class MultiValueEnumAttributeSaver : public MultiValueAttributeSaver { using Parent = MultiValueAttributeSaver; using MultiValueType = MultiValueT; - using ValueType = typename MultiValueType::ValueType; + using ValueType = multivalue::ValueType_t<MultiValueType>; using GenerationHandler = vespalib::GenerationHandler; using Parent::_frozenIndices; using MultiValueMapping = attribute::MultiValueMapping<MultiValueType>; diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp index c458cb2d1cc..eada6484a0d 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.cpp @@ -31,8 +31,9 @@ public: void writeValues(vespalib::ConstArrayRef<MultiValueT> values) { for (const MultiValueT &valueRef : values) { - typename MultiValueT::ValueType value(valueRef); - _datWriter->write(&value, sizeof(typename MultiValueT::ValueType)); + using ValueType = multivalue::ValueType_t<MultiValueT>; + ValueType value(valueRef); + _datWriter->write(&value, sizeof(ValueType)); } } }; @@ -63,7 +64,7 @@ MultiValueNumericAttributeSaver<MultiValueT>:: onSave(IAttributeSaveTarget &saveTarget) { CountWriter countWriter(saveTarget); - WeightWriter<MultiValueType::_hasWeight> weightWriter(saveTarget); + WeightWriter<multivalue::is_WeightedValue_v<MultiValueType>> weightWriter(saveTarget); DatWriter datWriter(saveTarget); for (uint32_t docId = 0; docId < _frozenIndices.size(); ++docId) { diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h index 8000de97940..df188d5ca65 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattributesaver.h @@ -3,6 +3,7 @@ #pragma once #include "multivalueattributesaver.h" +#include <vespa/searchcommon/attribute/multi_value_traits.h> namespace search { @@ -17,7 +18,7 @@ class MultiValueNumericAttributeSaver : public MultiValueAttributeSaver { using Parent = MultiValueAttributeSaver; using MultiValueType = MultiValueT; - using ValueType = typename MultiValueType::ValueType; + using ValueType = multivalue::ValueType_t<MultiValueType>; using GenerationHandler = vespalib::GenerationHandler; using Parent::_frozenIndices; using MultiValueMapping = attribute::MultiValueMapping<MultiValueType>; diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h index 848d5547672..9eb1a06d042 100644 --- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h @@ -7,6 +7,7 @@ #include "multi_value_mapping.h" #include <vespa/searchcommon/attribute/i_multi_value_attribute.h> #include <vespa/searchcommon/attribute/i_multi_value_read_view.h> +#include <vespa/searchcommon/attribute/multi_value_traits.h> namespace search { @@ -28,7 +29,7 @@ protected: using MultiValueType = M; using MultiValueMapping = attribute::MultiValueMapping<MultiValueType>; - typedef typename MultiValueType::ValueType ValueType; + using ValueType = multivalue::ValueType_t<MultiValueType>; typedef std::vector<MultiValueType> ValueVector; using MultiValueArrayRef = vespalib::ConstArrayRef<MultiValueType>; typedef typename ValueVector::iterator ValueVectorIterator; diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp index 06e6e9157ae..b18c6687561 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp @@ -274,9 +274,9 @@ template <typename BaseType> void DotProductExecutorBase<BaseType>::execute(uint32_t docId) { auto values = getAttributeValues(docId); size_t commonRange = std::min(values.size(), _queryVector.size()); - static_assert(std::is_same<typename AT::ValueType, BaseType>::value); + static_assert(std::is_same_v<multivalue::ValueType_t<AT>, BaseType>); outputs().set_number(0, _multiplier.dotProduct( - &_queryVector[0], reinterpret_cast<const typename AT::ValueType *>(values.data()), commonRange)); + &_queryVector[0], reinterpret_cast<const multivalue::ValueType_t<AT> *>(values.data()), commonRange)); } template <typename A> @@ -396,7 +396,7 @@ constexpr void sanity_check_reinterpret_cast_compatibility() { static_assert(IsNonWeightedType<AttributeValueType>::value); static_assert(sizeof(BaseType) == sizeof(AttributeValueType)); static_assert(sizeof(BaseType) == sizeof(FillerValueType)); - static_assert(std::is_same<BaseType, typename AttributeValueType::ValueType>::value); + static_assert(std::is_same_v<BaseType, multivalue::ValueType_t<AttributeValueType>>); } } |