summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-10-22 14:33:25 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-10-22 14:33:25 +0000
commit64e8c2a24b8d7e76e420ea52d5b764fbd2f22e4b (patch)
tree3780a1356ab1eb8e674019ea55151c0403301f74
parent5d17da853b36dd4d2798195de709438725e6351c (diff)
No need to reserve space for arith operand for strings.
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.h21
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.hpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/changevector.h16
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp2
8 files changed, 25 insertions, 26 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h
index bb88b168474..f5a79c3637e 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributevector.h
+++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h
@@ -357,23 +357,22 @@ protected:
static double round(double v, double & r) { return r = v; }
static largeint_t round(double v, largeint_t &r) { return r = static_cast<largeint_t>(::floor(v+0.5)); }
- template <typename BaseType, typename ChangeData>
+ template <typename BaseType, typename LargeType>
static BaseType
- applyArithmetic(const BaseType &value, const ChangeTemplate<ChangeData> & arithmetic)
+ applyArithmetic(const BaseType &value, double operand, ChangeBase::Type type)
{
- typedef typename ChangeData::DataType LargeType;
if (attribute::isUndefined(value)) {
return value;
- } else if (arithmetic._type == ChangeBase::ADD) {
- return value + static_cast<LargeType>(arithmetic._arithOperand);
- } else if (arithmetic._type == ChangeBase::SUB) {
- return value - static_cast<LargeType>(arithmetic._arithOperand);
- } else if (arithmetic._type == ChangeBase::MUL) {
+ } else if (type == ChangeBase::ADD) {
+ return value + static_cast<LargeType>(operand);
+ } else if (type == ChangeBase::SUB) {
+ return value - static_cast<LargeType>(operand);
+ } else if (type == ChangeBase::MUL) {
LargeType r;
- return round((static_cast<double>(value) * arithmetic._arithOperand), r);
- } else if (arithmetic._type == ChangeBase::DIV) {
+ return round((static_cast<double>(value) * operand), r);
+ } else if (type == ChangeBase::DIV) {
LargeType r;
- return round(static_cast<double>(value) / arithmetic._arithOperand, r);
+ return round(static_cast<double>(value) / operand, r);
}
return value;
}
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.hpp b/searchlib/src/vespa/searchlib/attribute/attributevector.hpp
index 25658401f21..623e10ef052 100644
--- a/searchlib/src/vespa/searchlib/attribute/attributevector.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/attributevector.hpp
@@ -116,7 +116,7 @@ AttributeVector::applyArithmetic(ChangeVectorT< ChangeTemplate<T> > & changes, D
_status.incNonIdempotentUpdates(diff);
_status.incUpdates(diff);
if (diff > 0) {
- changes.back()._arithOperand = aop;
+ changes.back()._data.setArithOperand(aop);
}
return true;
}
diff --git a/searchlib/src/vespa/searchlib/attribute/changevector.h b/searchlib/src/vespa/searchlib/attribute/changevector.h
index 12ac77febb9..f1fb58eb9d0 100644
--- a/searchlib/src/vespa/searchlib/attribute/changevector.h
+++ b/searchlib/src/vespa/searchlib/attribute/changevector.h
@@ -31,16 +31,14 @@ struct ChangeBase {
_type(NOOP),
_doc(0),
_weight(1),
- _enumScratchPad(UNSET_ENUM),
- _arithOperand(0)
+ _enumScratchPad(UNSET_ENUM)
{ }
ChangeBase(Type type, uint32_t d, int32_t w = 1) :
_type(type),
_doc(d),
_weight(w),
- _enumScratchPad(UNSET_ENUM),
- _arithOperand(0)
+ _enumScratchPad(UNSET_ENUM)
{ }
int cmp(const ChangeBase &b) const { int diff(_doc - b._doc); return diff; }
@@ -53,19 +51,21 @@ struct ChangeBase {
uint32_t _doc;
int32_t _weight;
mutable uint32_t _enumScratchPad;
- double _arithOperand;
};
template <typename T>
class NumericChangeData {
private:
- T _v;
+ double _arithOperand;
+ T _v;
public:
typedef T DataType;
- NumericChangeData(T v) : _v(v) { }
- NumericChangeData() : _v(T()) { }
+ NumericChangeData(T v) : _arithOperand(0), _v(v) { }
+ NumericChangeData() : _arithOperand(0), _v(T()) { }
+ double getArithOperand() const { return _arithOperand; }
+ void setArithOperand(double operand) { _arithOperand = operand; }
T get() const { return _v; }
T raw() const { return _v; }
operator T() const { return _v; }
diff --git a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
index 9a71248a53d..3fe7d147c1d 100644
--- a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp
@@ -66,7 +66,7 @@ SingleBoolAttribute::onCommit() {
setBit(change._doc, change._data != 0);
} else if ((change._type >= ChangeBase::ADD) && (change._type <= ChangeBase::DIV)) {
std::atomic_thread_fence(std::memory_order_release);
- int8_t val = applyArithmetic(getFast(change._doc), change);
+ int8_t val = applyArithmetic<int8_t, largeint_t>(getFast(change._doc), change._data.getArithOperand(), change._type);
setBit(change._doc, val != 0);
} else if (change._type == ChangeBase::CLEARDOC) {
std::atomic_thread_fence(std::memory_order_release);
diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
index 4f2be68683d..cbff4d0e361 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp
@@ -43,7 +43,7 @@ SingleValueNumericAttribute<B>::onCommit()
_data[change._doc] = change._data;
} else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) {
std::atomic_thread_fence(std::memory_order_release);
- _data[change._doc] = this->applyArithmetic(_data[change._doc], change);
+ _data[change._doc] = applyArithmetic<T, typename B::Change::DataType>(_data[change._doc], change._data.getArithOperand(), change._type);
} else if (change._type == ChangeBase::CLEARDOC) {
std::atomic_thread_fence(std::memory_order_release);
_data[change._doc] = this->_defaultValue._data;
diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp
index 55a82210a96..585b4514ba4 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp
@@ -34,7 +34,7 @@ SingleValueNumericEnumAttribute<B>::considerArithmeticAttributeChange(const Chan
oldValue = get(c._doc);
}
- T newValue = this->applyArithmetic(oldValue, c);
+ T newValue = applyArithmetic<T, typename Change::DataType>(oldValue, c._data.getArithOperand(), c._type);
EnumIndex idx;
if (!this->_enumStore.find_index(newValue, idx)) {
@@ -52,7 +52,7 @@ SingleValueNumericEnumAttribute<B>::applyArithmeticValueChange(const Change& c,
{
EnumIndex oldIdx = this->_enumIndices[c._doc];
EnumIndex newIdx;
- T newValue = this->applyArithmetic(get(c._doc), c);
+ T newValue = applyArithmetic<T, typename Change::DataType>(get(c._doc), c._data.getArithOperand(), c._type);
this->_enumStore.find_index(newValue, newIdx);
this->updateEnumRefCounts(c, newIdx, oldIdx, updater);
diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp
index 12138b0cfbc..5a610cc3da8 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp
@@ -102,7 +102,7 @@ SingleValueNumericPostingAttribute<B>::applyValueChanges(EnumStoreBatchUpdater&
} else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) {
if (oldIdx.valid()) {
T oldValue = enumStore.get_value(oldIdx);
- T newValue = this->applyArithmetic(oldValue, change);
+ T newValue = applyArithmetic<T, typename Change::DataType>(oldValue, change._data.getArithOperand(), change._type);
EnumIndex newIdx;
(void) dictionary.find_index(enumStore.make_comparator(newValue), newIdx);
currEnumIndices[change._doc] = newIdx;
diff --git a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
index 9346bc43370..24dec664547 100644
--- a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp
@@ -60,7 +60,7 @@ SingleValueSmallNumericAttribute::onCommit()
set(change._doc, change._data);
} else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) {
std::atomic_thread_fence(std::memory_order_release);
- set(change._doc, applyArithmetic(getFast(change._doc), change));
+ set(change._doc, applyArithmetic<T, typename Change::DataType>(getFast(change._doc), change._data.getArithOperand(), change._type));
} else if (change._type == ChangeBase::CLEARDOC) {
std::atomic_thread_fence(std::memory_order_release);
set(change._doc, 0u);