summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorLester Solbakken <lesters@yahoo-inc.com>2017-08-17 14:36:44 +0000
committerLester Solbakken <lesters@yahoo-inc.com>2017-08-17 14:36:44 +0000
commitc5f38e1ffc92a056964ab83737a077616c07bf70 (patch)
treea9a47bfe3850b02bb58f8e6f1286914b16a93b72 /searchlib
parent0e52af6437ff9c62b55c77c175d11cdafe1cad81 (diff)
DRY refactor in buffered and raw computation
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/max_reduce_prod_join_feature.cpp41
1 files changed, 19 insertions, 22 deletions
diff --git a/searchlib/src/vespa/searchlib/features/max_reduce_prod_join_feature.cpp b/searchlib/src/vespa/searchlib/features/max_reduce_prod_join_feature.cpp
index 6974116784f..8805af5e4ce 100644
--- a/searchlib/src/vespa/searchlib/features/max_reduce_prod_join_feature.cpp
+++ b/searchlib/src/vespa/searchlib/features/max_reduce_prod_join_feature.cpp
@@ -49,6 +49,20 @@ RawExecutor<BaseType>::RawExecutor(const IAttributeVector *attribute,
_queryVector.syncMap();
}
+template <typename A, typename V>
+feature_t maxProduct(const A& array, size_t count, const V& query)
+{
+ feature_t val = -DBL_MAX;
+ for (size_t i = 0; i < count; ++i) {
+ typename IntegerVector::HashMap::const_iterator itr = query.getDimMap().find(array[i].value());
+ if (itr != query.getDimMap().end()) {
+ feature_t v = itr->second; // weight from attribute is assumed to be 1.0
+ if (v > val) val = v;
+ }
+ }
+ return val == -DBL_MAX ? 0.0 : val;
+}
+
template <typename BaseType>
void
RawExecutor<BaseType>::execute(uint32_t docId)
@@ -56,18 +70,7 @@ RawExecutor<BaseType>::execute(uint32_t docId)
const AT *values(nullptr);
const A *iattr = dynamic_cast<const A *>(_attribute);
size_t count = iattr->getRawValues(docId, values);
-
- feature_t val = -DBL_MAX;
- if (!_queryVector.getDimMap().empty()) {
- for (size_t i = 0; i < count; ++i) {
- typename IntegerVector::HashMap::const_iterator itr = _queryVector.getDimMap().find(values[i].value());
- if (itr != _queryVector.getDimMap().end()) {
- feature_t v = itr->second; // weight from attribute is assumed to be 1.0
- if (v > val) val = v;
- }
- }
- }
- outputs().set_number(0, val == -DBL_MAX ? 0.0 : val);
+ outputs().set_number(0, maxProduct(values, count, _queryVector));
}
/**
@@ -76,7 +79,7 @@ RawExecutor<BaseType>::execute(uint32_t docId)
template <typename BaseType>
class BufferedExecutor : public RawExecutor<BaseType> {
private:
- IntegerContent _buffer;
+ WeightedIntegerContent _buffer;
public:
BufferedExecutor(const IAttributeVector * attribute, const IntegerVector & queryVector);
@@ -90,20 +93,14 @@ BufferedExecutor<BaseType>::BufferedExecutor(const IAttributeVector *attribute,
{
}
+
template <typename BaseType>
void
BufferedExecutor<BaseType>::execute(uint32_t docId)
{
- feature_t val = -DBL_MAX;
_buffer.fill(*RawExecutor<BaseType>::_attribute, docId);
- for (size_t i = 0; i < _buffer.size(); ++i) {
- typename IntegerVector::HashMap::const_iterator itr = RawExecutor<BaseType>::_queryVector.getDimMap().find(_buffer[i]);
- if (itr != RawExecutor<BaseType>::_queryVector.getDimMap().end()) {
- feature_t v = itr->second; // weight from attribute is assumed to be 1.0
- if (v > val) val = v;
- }
- }
- RawExecutor<BaseType>::outputs().set_number(0, val == -DBL_MAX ? 0.0 : val);
+ feature_t val = maxProduct(_buffer, _buffer.size(), RawExecutor<BaseType>::_queryVector);
+ RawExecutor<BaseType>::outputs().set_number(0, val);
}
/**