summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-04-11 17:14:54 +0200
committerGitHub <noreply@github.com>2022-04-11 17:14:54 +0200
commit8bdf73a7529cfa8fec07a102bc39ac21dfe632ff (patch)
treed25e79543bcd76b0d4001f792590ffb86bf64b2a
parentb4b0f66ae734d665aa7cfa380b9932d9eda33448 (diff)
parent1386f7094eaf75a9ed77f081293960f708c1bb7a (diff)
Merge pull request #22089 from vespa-engine/toregge/remove-weight-from-multivalue-value
Remove weight() member function from multivalue::Value
-rw-r--r--searchcommon/src/vespa/searchcommon/attribute/multivalue.h25
-rw-r--r--searchlib/src/vespa/searchlib/attribute/load_utils.hpp5
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h3
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h3
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattribute.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattribute.hpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multistringattribute.h2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp14
-rw-r--r--searchlib/src/vespa/searchlib/attribute/postingchange.cpp6
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);