diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2022-04-11 16:18:26 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahooinc.com> | 2022-04-11 16:42:19 +0200 |
commit | 1386f7094eaf75a9ed77f081293960f708c1bb7a (patch) | |
tree | 7d2e2fac94d4388da0cb9268ac643521d88f37ac | |
parent | a6f0ef3e995ce8ef0d34a533f37910c6e7c0934a (diff) |
Remove weight() member function from multivalue::Value
12 files changed, 45 insertions, 23 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h index b9e85480d2d..b5799b9f3d2 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h +++ b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h @@ -11,13 +11,11 @@ class Value { public: Value() noexcept : _v() {} Value(T v) noexcept : _v(v) { } - Value(T v, int32_t w) noexcept : _v(v) { (void) w; } T value() const { return _v; } const T& value_ref() const { return _v; } T& value_ref() { return _v; } operator T () const { return _v; } operator T & () { return _v; } - int32_t weight() const { return 1; } 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; } @@ -35,7 +33,7 @@ public: T& value_ref() { return _v; } operator T () const { return _v; } operator T & () { return _v; } - int32_t weight() const { return _w; } + int32_t weight() const noexcept { return _w; } bool operator==(const WeightedValue<T> & rhs) const { return _v == rhs._v; } bool operator <(const WeightedValue<T> & rhs) const { return _v < rhs._v; } @@ -45,4 +43,25 @@ private: int32_t _w; }; +template <typename T> +inline int32_t get_weight(const Value<T>&) noexcept { return 1; } + +template <typename T> +inline int32_t get_weight(const WeightedValue<T>& value) noexcept { return value.weight(); } + +template <typename M> +struct ValueBuilder; + +template <typename T> +struct ValueBuilder<Value<T>> +{ + static Value<T> build(T value, int32_t) noexcept { return Value<T>(value); } +}; + +template <typename T> +struct ValueBuilder<WeightedValue<T>> +{ + static WeightedValue<T> build(T value, int32_t weight) noexcept { return WeightedValue<T>(value, weight); } +}; + } diff --git a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp index b8d84944369..47839f4af98 100644 --- a/searchlib/src/vespa/searchlib/attribute/load_utils.hpp +++ b/searchlib/src/vespa/searchlib/attribute/load_utils.hpp @@ -3,6 +3,7 @@ #pragma once #include "load_utils.h" +#include <vespa/searchcommon/attribute/multivalue.h> namespace search { namespace attribute { @@ -38,9 +39,9 @@ loadFromEnumeratedMultiValue(MvMapping & mapping, } 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); + indices.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(enumValueToValueMap[enumValue], weight)); } else { - indices.emplace_back(ValueType(enumValueToValueMap[enumValue]), weight); + indices.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(ValueType(enumValueToValueMap[enumValue]), weight)); } saver.save(enumValue, doc, weight); } diff --git a/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h b/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h index b88a10652a7..64e4586021f 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h @@ -5,6 +5,7 @@ #include "numeric_search_context.h" #include "enumstore.h" #include "multi_value_mapping_read_view.h" +#include <vespa/searchcommon/attribute/multivalue.h> namespace search::attribute { @@ -37,7 +38,7 @@ public: for (uint32_t i(elemId); i < indices.size(); i++) { T v = _enum_store.get_value(indices[i].value_ref().load_acquire()); if (this->match(v)) { - weight = indices[i].weight(); + weight = multivalue::get_weight(indices[i]); return i; } } diff --git a/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h b/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h index 3649b542e87..8ad70a4242d 100644 --- a/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h @@ -5,6 +5,7 @@ #include "numeric_search_context.h" #include "multi_value_mapping_read_view.h" #include "numeric_range_matcher.h" +#include <vespa/searchcommon/attribute/multivalue.h> namespace search::attribute { @@ -33,7 +34,7 @@ public: auto values(_mv_mapping_read_view.get(doc)); for (uint32_t i(elemId); i < values.size(); i++) { if (this->match(values[i].value())) { - weight = values[i].weight(); + weight = multivalue::get_weight(values[i]); return i; } } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h index 48c870e5aa7..063d6e5f88d 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h @@ -108,7 +108,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - e[i] = WeightedEnum(indices[i].value_ref().load_acquire().ref(), indices[i].weight()); + e[i] = WeightedEnum(indices[i].value_ref().load_acquire().ref(), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp index bb1e4712c2d..c4a0b387d4c 100644 --- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp @@ -80,7 +80,7 @@ MultiValueEnumAttribute<B, M>::fillValues(LoadedVector & loaded) this->_mvMapping.prepareLoadFromMultiValue(); for (DocId doc = 0; doc < numDocs; ++doc) { for(const auto* v = & loaded.read();(count < numValues) && (v->_docId == doc); count++, loaded.next(), v = & loaded.read()) { - indices.push_back(WeightedIndex(AtomicEntryRef(v->getEidx()), v->getWeight())); + indices.push_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(v->getEidx()), v->getWeight())); } this->checkSetMaxValueCount(indices.size()); this->_mvMapping.set(doc, indices); diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h index 90345c50742..8c9d65e578e 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h @@ -144,7 +144,7 @@ public: uint32_t ret = handle.size(); for(size_t i(0), m(std::min(sz, ret)); i < m; i++) { buffer[i] = WeightedType(static_cast<ValueType>(handle[i].value()), - handle[i].weight()); + multivalue::get_weight(handle[i])); } return ret; } diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp index 39e4f6866fb..0946994f8ec 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp @@ -153,7 +153,7 @@ MultiValueNumericAttribute<B, M>::onLoad(vespalib::Executor *) const uint32_t valueCount(attrReader.getNextValueCount()); for (uint32_t i(0); i < valueCount; i++) { MValueType currData = attrReader.getNextData(); - values.emplace_back(currData, hasWeight ? attrReader.getNextWeight() : 1); + values.emplace_back(multivalue::ValueBuilder<M>::build(currData, hasWeight ? attrReader.getNextWeight() : 1)); } this->checkSetMaxValueCount(valueCount); setNewValues(doc, values); diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h index d981ba2015e..2bee7498126 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h @@ -92,7 +92,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - buffer[i] = WeightedType(static_cast<ValueType>(this->_enumStore.get_value(indices[i].value_ref().load_acquire())), indices[i].weight()); + buffer[i] = WeightedType(static_cast<ValueType>(this->_enumStore.get_value(indices[i].value_ref().load_acquire())), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multistringattribute.h b/searchlib/src/vespa/searchlib/attribute/multistringattribute.h index cf4169138fe..1cd2e98d4b3 100644 --- a/searchlib/src/vespa/searchlib/attribute/multistringattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multistringattribute.h @@ -92,7 +92,7 @@ public: WeightedIndexArrayRef indices(this->_mvMapping.get(doc)); uint32_t valueCount = indices.size(); for (uint32_t i = 0, m = std::min(sz, valueCount); i < m; ++i) { - buffer[i] = WeightedType(this->_enumStore.get_value(indices[i].value_ref().load_acquire()), indices[i].weight()); + buffer[i] = WeightedType(this->_enumStore.get_value(indices[i].value_ref().load_acquire()), multivalue::get_weight(indices[i])); } return valueCount; } diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp index 3b270f32f4b..7cd68afbf0e 100644 --- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp @@ -39,7 +39,7 @@ template <typename B, typename M> int32_t MultiValueAttribute<B, M>::getWeight(DocId doc, uint32_t idx) const { MultiValueArrayRef values(this->_mvMapping.get(doc)); - return ((idx < values.size()) ? values[idx].weight() : 1); + return ((idx < values.size()) ? multivalue::get_weight(values[idx]) : 1); } namespace { @@ -111,9 +111,9 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_array(DocumentValues& docV } if (current->_type == ChangeBase::APPEND) { if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { - new_values.emplace_back(data, current->_weight); + new_values.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(data, current->_weight)); } else { - new_values.emplace_back(ValueType(data), current->_weight); + new_values.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(ValueType(data), current->_weight)); } } else if (current->_type == ChangeBase::REMOVE) { // Defer all removals to the very end by tracking when, during value vector build time, @@ -173,9 +173,9 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_wset(DocumentValues& docVa wset_inserted.resize((old_values.size() + max_elems_inserted) * 2); for (const auto& e : old_values) { if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { - wset_inserted[e.value()] = e.weight(); + wset_inserted[e.value()] = multivalue::get_weight(e); } else { - wset_inserted[e.value_ref().load_relaxed()] = e.weight(); + wset_inserted[e.value_ref().load_relaxed()] = multivalue::get_weight(e); } } // iterate through all changes for this document @@ -211,9 +211,9 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_wset(DocumentValues& docVa std::vector<MultiValueType> new_values; new_values.reserve(wset_inserted.size()); if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) { - wset_inserted.for_each([&new_values](const auto& e){ new_values.emplace_back(e.first, e.second); }); + wset_inserted.for_each([&new_values](const auto& e){ new_values.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(e.first, e.second)); }); } else { - wset_inserted.for_each([&new_values](const auto& e){ new_values.emplace_back(ValueType(e.first), e.second); }); + wset_inserted.for_each([&new_values](const auto& e){ new_values.emplace_back(multivalue::ValueBuilder<MultiValueType>::build(ValueType(e.first), e.second)); }); } this->checkSetMaxValueCount(new_values.size()); diff --git a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp index 85e801fa045..312ae56fa2d 100644 --- a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp +++ b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp @@ -178,7 +178,7 @@ private: { const WeightedIndex *srce = src + sz; for (const WeightedIndex *i = src; i < srce; ++i) { - dst.emplace_back(AtomicEntryRef(mapEnumIndex(i->value_ref().load_relaxed())), i->weight()); + dst.emplace_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(mapEnumIndex(i->value_ref().load_relaxed())), multivalue::get_weight(*i))); } } @@ -206,11 +206,11 @@ class MergeDupIterator { bool _valid; void merge() { EnumIndex idx = _cur->value_ref().load_relaxed(); - int32_t weight = _cur->weight(); + int32_t weight = multivalue::get_weight(*_cur); ++_cur; while (_cur != _end && _cur->value_ref().load_relaxed() == idx) { // sum weights together. Overflow is not handled. - weight += _cur->weight(); + weight += multivalue::get_weight(*_cur); ++_cur; } _entry = Entry(AtomicEntryRef(idx), weight); |