diff options
-rw-r--r-- | searchlib/src/vespa/searchlib/features/dotproductfeature.cpp | 13 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/features/dotproductfeature.h | 7 |
2 files changed, 14 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp index cbc8a5158a2..89e7e53e2f2 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp @@ -30,15 +30,22 @@ VectorBase<DimensionVType, DimensionHType, ComponentType, HashMapComparator>::Ve template <typename DimensionVType, typename DimensionHType, typename ComponentType, typename HashMapComparator> VectorBase<DimensionVType, DimensionHType, ComponentType, HashMapComparator>::~VectorBase() { } +template <typename V> +V copyAndSync(const V & v) { + V tmp(v); + tmp.syncMap(); + return tmp; +} + template <typename Vector, typename Buffer> DotProductExecutor<Vector, Buffer>::DotProductExecutor(const IAttributeVector * attribute, const Vector & queryVector) : FeatureExecutor(), _attribute(attribute), - _queryVector(queryVector), + _queryVector(copyAndSync(queryVector)), + _end(_queryVector.getDimMap().end()), _buffer() { _buffer.allocate(_attribute->getMaxValueCount()); - _queryVector.syncMap(); } template <typename Vector, typename Buffer> @@ -50,7 +57,7 @@ DotProductExecutor<Vector, Buffer>::execute(uint32_t docId) _buffer.fill(*_attribute, docId); for (size_t i = 0; i < _buffer.size(); ++i) { typename Vector::HashMap::const_iterator itr = _queryVector.getDimMap().find(_buffer[i].getValue()); - if (itr != _queryVector.getDimMap().end()) { + if (itr != _end) { val += _buffer[i].getWeight() * itr->second; } } diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.h b/searchlib/src/vespa/searchlib/features/dotproductfeature.h index 724a68e5268..27e96c26538 100644 --- a/searchlib/src/vespa/searchlib/features/dotproductfeature.h +++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.h @@ -113,9 +113,10 @@ public: template <typename Vector, typename Buffer> class DotProductExecutor : public fef::FeatureExecutor { private: - const search::attribute::IAttributeVector * _attribute; - Vector _queryVector; - Buffer _buffer; + const attribute::IAttributeVector * _attribute; + const Vector _queryVector; + const typename Vector::HashMap::const_iterator _end; + Buffer _buffer; public: DotProductExecutor(const search::attribute::IAttributeVector * attribute, const Vector & queryVector); |