aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-04-11 20:22:03 +0200
committerGitHub <noreply@github.com>2022-04-11 20:22:03 +0200
commitefb1d9c7cee11fa19b088eb8db185016dee471db (patch)
tree63f8ea153030697e721d36d84a3836bfe5f8130c
parent80c2856a671ca70f1862a99e23bc3e117fca7591 (diff)
parentfa6c98bfbc89611664d3754a9820b08cfb9e1fc6 (diff)
Merge pull request #22094 from vespa-engine/toregge/use-wrapper-functions-for-access-to-multivalue-value
Use wrapper functions for access to multivalue::Value.
-rw-r--r--searchcommon/src/vespa/searchcommon/attribute/multivalue.h40
-rw-r--r--searchlib/src/vespa/searchlib/attribute/flagattribute.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.h6
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp4
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericattribute.h10
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h6
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multistringattribute.h6
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp8
-rw-r--r--searchlib/src/vespa/searchlib/attribute/postingchange.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/features/attributefeature.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp12
15 files changed, 73 insertions, 45 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h
index b5799b9f3d2..091bf78a4dd 100644
--- a/searchcommon/src/vespa/searchcommon/attribute/multivalue.h
+++ b/searchcommon/src/vespa/searchcommon/attribute/multivalue.h
@@ -11,11 +11,11 @@ class Value {
public:
Value() noexcept : _v() {}
Value(T v) noexcept : _v(v) { }
- 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; }
+ T value() const noexcept { return _v; }
+ const T& value_ref() const noexcept { return _v; }
+ T& value_ref() noexcept { return _v; }
+ operator T () const noexcept { return _v; }
+ operator T & () noexcept { return _v; }
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; }
@@ -28,12 +28,12 @@ class WeightedValue {
public:
WeightedValue() noexcept : _v(), _w(1) { }
WeightedValue(T v, int32_t w) noexcept : _v(v), _w(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 noexcept { return _w; }
+ T value() const noexcept { return _v; }
+ const T& value_ref() const noexcept { return _v; }
+ T& value_ref() noexcept { return _v; }
+ operator T () const noexcept { return _v; }
+ operator T & () noexcept { return _v; }
+ 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; }
@@ -49,6 +49,24 @@ 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 T>
+inline T get_value(const Value<T> &value) noexcept { return value.value(); }
+
+template <typename T>
+inline T get_value(const WeightedValue<T>& value) noexcept { return value.value(); }
+
+template <typename T>
+inline const T& get_value_ref(const Value<T> &value) noexcept { return value.value_ref(); }
+
+template <typename T>
+inline const T& get_value_ref(const WeightedValue<T>& value) noexcept { return value.value_ref(); }
+
+template <typename T>
+inline T& get_value_ref(Value<T> &value) noexcept { return value.value_ref(); }
+
+template <typename T>
+inline T& get_value_ref(WeightedValue<T>& value) noexcept { return value.value_ref(); }
+
template <typename M>
struct ValueBuilder;
diff --git a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp
index 9a331295fd0..8d137530dd0 100644
--- a/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/flagattribute.cpp
@@ -62,7 +62,7 @@ void FlagAttributeT<B>::clearOldValues(DocId doc)
{
const typename B::WType * values(nullptr);
for (uint32_t i(0), m(this->get(doc, values)); i < m; i++) {
- BitVector * bv = _bitVectors[getOffset(values[i].value())];
+ BitVector * bv = _bitVectors[getOffset(multivalue::get_value(values[i]))];
if (bv != nullptr) {
bv->clearBitAndMaintainCount(doc);
}
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 64e4586021f..5b393d8bdb2 100644
--- a/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h
+++ b/searchlib/src/vespa/searchlib/attribute/multi_enum_search_context.h
@@ -36,7 +36,7 @@ public:
int32_t find(DocId doc, int32_t elemId, int32_t & weight) const {
auto indices(_mv_mapping_read_view.get(doc));
for (uint32_t i(elemId); i < indices.size(); i++) {
- T v = _enum_store.get_value(indices[i].value_ref().load_acquire());
+ T v = _enum_store.get_value(multivalue::get_value_ref(indices[i]).load_acquire());
if (this->match(v)) {
weight = multivalue::get_weight(indices[i]);
return i;
@@ -49,7 +49,7 @@ public:
int32_t find(DocId doc, int32_t elemId) const {
auto indices(_mv_mapping_read_view.get(doc));
for (uint32_t i(elemId); i < indices.size(); i++) {
- T v = _enum_store.get_value(indices[i].value_ref().load_acquire());
+ T v = _enum_store.get_value(multivalue::get_value_ref(indices[i]).load_acquire());
if (this->match(v)) {
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 8ad70a4242d..b2c76a120f9 100644
--- a/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h
+++ b/searchlib/src/vespa/searchlib/attribute/multi_numeric_search_context.h
@@ -33,7 +33,7 @@ public:
int32_t find(DocId doc, int32_t elemId, int32_t & weight) const {
auto values(_mv_mapping_read_view.get(doc));
for (uint32_t i(elemId); i < values.size(); i++) {
- if (this->match(values[i].value())) {
+ if (this->match(multivalue::get_value(values[i]))) {
weight = multivalue::get_weight(values[i]);
return i;
}
@@ -45,7 +45,7 @@ public:
int32_t find(DocId doc, int32_t elemId) const {
auto values(_mv_mapping_read_view.get(doc));
for (uint32_t i(elemId); i < values.size(); i++) {
- if (this->match(values[i].value())) {
+ if (this->match(multivalue::get_value(values[i]))) {
return i;
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
index a781fd54534..b0761db7e5d 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.cpp
@@ -24,10 +24,10 @@ remap_enum_store_refs(const EnumIndexRemapper& remapper, AttributeVector& v, att
for (uint32_t doc = 0; doc < v.getNumDocs(); ++doc) {
vespalib::ArrayRef<WeightedIndex> indices(multi_value_mapping.get_writable(doc));
for (auto& entry : indices) {
- EnumIndex ref = entry.value_ref().load_relaxed();
+ EnumIndex ref = multivalue::get_value_ref(entry).load_relaxed();
if (ref.valid() && filter.has(ref)) {
ref = remapper.remap(ref);
- entry.value_ref().store_release(ref);
+ multivalue::get_value_ref(entry).store_release(ref);
}
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h
index 5bfc326ad94..ee8f3181fd9 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.h
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.h
@@ -74,7 +74,7 @@ public:
if (indices.size() == 0) {
return std::numeric_limits<uint32_t>::max();
} else {
- return indices[0].value_ref().load_acquire().ref();
+ return multivalue::get_value_ref(indices[0]).load_acquire().ref();
}
}
@@ -82,7 +82,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] = indices[i].value_ref().load_acquire().ref();
+ e[i] = multivalue::get_value_ref(indices[i]).load_acquire().ref();
}
return valueCount;
}
@@ -90,7 +90,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(), multivalue::get_weight(indices[i]));
+ e[i] = WeightedEnum(multivalue::get_value_ref(indices[i]).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 34c46ac994e..c1cb6b1f75b 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattribute.hpp
@@ -60,10 +60,10 @@ MultiValueEnumAttribute<B, M>::applyValueChanges(const DocIndices& docIndices, E
uint32_t valueCount = oldIndices.size();
this->_mvMapping.set(doc_values.first, doc_values.second);
for (uint32_t i = 0; i < doc_values.second.size(); ++i) {
- updater.inc_ref_count(doc_values.second[i].value_ref().load_relaxed());
+ updater.inc_ref_count(multivalue::get_value_ref(doc_values.second[i]).load_relaxed());
}
for (uint32_t i = 0; i < valueCount; ++i) {
- updater.dec_ref_count(oldIndices[i].value_ref().load_relaxed());
+ updater.dec_ref_count(multivalue::get_value_ref(oldIndices[i]).load_relaxed());
}
}
}
diff --git a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp
index d48e119a544..64358e15a3c 100644
--- a/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/multienumattributesaver.cpp
@@ -68,7 +68,7 @@ public:
if (_indexes.size() >= _indexes.capacity()) {
flush();
}
- _indexes.push_back(valueRef.value_ref().load_acquire());
+ _indexes.push_back(multivalue::get_value_ref(valueRef).load_acquire());
}
}
};
diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h
index b2530db0054..e07498d9ca4 100644
--- a/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h
+++ b/searchlib/src/vespa/searchlib/attribute/multinumericattribute.h
@@ -77,15 +77,15 @@ public:
//-------------------------------------------------------------------------
T get(DocId doc) const override {
MultiValueArrayRef values(this->_mvMapping.get(doc));
- return ((values.size() > 0) ? values[0].value() : T());
+ return ((values.size() > 0) ? multivalue::get_value(values[0]) : T());
}
largeint_t getInt(DocId doc) const override {
MultiValueArrayRef values(this->_mvMapping.get(doc));
- return static_cast<largeint_t>((values.size() > 0) ? values[0].value() : T());
+ return static_cast<largeint_t>((values.size() > 0) ? multivalue::get_value(values[0]) : T());
}
double getFloat(DocId doc) const override {
MultiValueArrayRef values(this->_mvMapping.get(doc));
- return static_cast<double>((values.size() > 0) ? values[0].value() : T());
+ return static_cast<double>((values.size() > 0) ? multivalue::get_value(values[0]) : T());
}
EnumHandle getEnum(DocId doc) const override {
(void) doc;
@@ -105,7 +105,7 @@ public:
MultiValueArrayRef handle(this->_mvMapping.get(doc));
uint32_t ret = handle.size();
for(size_t i(0), m(std::min(sz, ret)); i < m; i++) {
- buffer[i] = static_cast<BufferType>(handle[i].value());
+ buffer[i] = static_cast<BufferType>(multivalue::get_value(handle[i]));
}
return ret;
}
@@ -139,7 +139,7 @@ public:
MultiValueArrayRef handle(this->_mvMapping.get(doc));
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()),
+ buffer[i] = WeightedType(static_cast<ValueType>(multivalue::get_value(handle[i])),
multivalue::get_weight(handle[i]));
}
return ret;
diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h
index 2bee7498126..1786429af8e 100644
--- a/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h
+++ b/searchlib/src/vespa/searchlib/attribute/multinumericenumattribute.h
@@ -58,7 +58,7 @@ public:
if (indices.size() == 0) {
return T();
} else {
- return this->_enumStore.get_value(indices[0].value_ref().load_acquire());
+ return this->_enumStore.get_value(multivalue::get_value_ref(indices[0]).load_acquire());
}
}
largeint_t getInt(DocId doc) const override {
@@ -73,7 +73,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] = static_cast<BufferType>(this->_enumStore.get_value(indices[i].value_ref().load_acquire()));
+ buffer[i] = static_cast<BufferType>(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire()));
}
return valueCount;
}
@@ -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())), multivalue::get_weight(indices[i]));
+ buffer[i] = WeightedType(static_cast<ValueType>(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).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 1cd2e98d4b3..82c3bebbf76 100644
--- a/searchlib/src/vespa/searchlib/attribute/multistringattribute.h
+++ b/searchlib/src/vespa/searchlib/attribute/multistringattribute.h
@@ -59,7 +59,7 @@ public:
if (indices.size() == 0) {
return NULL;
} else {
- return this->_enumStore.get_value(indices[0].value_ref().load_acquire());
+ return this->_enumStore.get_value(multivalue::get_value_ref(indices[0]).load_acquire());
}
}
@@ -75,7 +75,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] = this->_enumStore.get_value(indices[i].value_ref().load_acquire());
+ buffer[i] = this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).load_acquire());
}
return valueCount;
}
@@ -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()), multivalue::get_weight(indices[i]));
+ buffer[i] = WeightedType(this->_enumStore.get_value(multivalue::get_value_ref(indices[i]).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 7cd68afbf0e..8cf86f66236 100644
--- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp
+++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp
@@ -127,14 +127,14 @@ MultiValueAttribute<B, M>::apply_attribute_changes_to_array(DocumentValues& docV
culled.reserve(new_values.size());
if constexpr (std::is_same_v<ValueType, NonAtomicValueType>) {
for (size_t i = 0; i < new_values.size(); ++i) {
- auto iter = tombstones.find(new_values[i].value());
+ auto iter = tombstones.find(multivalue::get_value(new_values[i]));
if (iter == tombstones.end() || (iter->second <= i)) {
culled.emplace_back(new_values[i]);
}
}
} else {
for (size_t i = 0; i < new_values.size(); ++i) {
- auto iter = tombstones.find(new_values[i].value_ref().load_relaxed());
+ auto iter = tombstones.find(multivalue::get_value_ref(new_values[i]).load_relaxed());
if (iter == tombstones.end() || (iter->second <= i)) {
culled.emplace_back(new_values[i]);
}
@@ -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()] = multivalue::get_weight(e);
+ wset_inserted[multivalue::get_value(e)] = multivalue::get_weight(e);
} else {
- wset_inserted[e.value_ref().load_relaxed()] = multivalue::get_weight(e);
+ wset_inserted[multivalue::get_value_ref(e).load_relaxed()] = multivalue::get_weight(e);
}
}
// iterate through all changes for this document
diff --git a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp
index 312ae56fa2d..62d6e3364a2 100644
--- a/searchlib/src/vespa/searchlib/attribute/postingchange.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/postingchange.cpp
@@ -18,7 +18,7 @@ template <typename WeightedIndex>
struct CompareValue {
bool operator()(const WeightedIndex& lhs, const WeightedIndex& rhs) const
{
- return lhs.value_ref().load_relaxed() < rhs.value_ref().load_relaxed();
+ return multivalue::get_value_ref(lhs).load_relaxed() < multivalue::get_value_ref(rhs).load_relaxed();
};
};
@@ -178,7 +178,7 @@ private:
{
const WeightedIndex *srce = src + sz;
for (const WeightedIndex *i = src; i < srce; ++i) {
- dst.emplace_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(mapEnumIndex(i->value_ref().load_relaxed())), multivalue::get_weight(*i)));
+ dst.emplace_back(multivalue::ValueBuilder<WeightedIndex>::build(AtomicEntryRef(mapEnumIndex(multivalue::get_value_ref(*i).load_relaxed())), multivalue::get_weight(*i)));
}
}
@@ -205,10 +205,10 @@ class MergeDupIterator {
Entry _entry;
bool _valid;
void merge() {
- EnumIndex idx = _cur->value_ref().load_relaxed();
+ EnumIndex idx = multivalue::get_value_ref(*_cur).load_relaxed();
int32_t weight = multivalue::get_weight(*_cur);
++_cur;
- while (_cur != _end && _cur->value_ref().load_relaxed() == idx) {
+ while (_cur != _end && multivalue::get_value_ref(*_cur).load_relaxed() == idx) {
// sum weights together. Overflow is not handled.
weight += multivalue::get_weight(*_cur);
++_cur;
diff --git a/searchlib/src/vespa/searchlib/features/attributefeature.cpp b/searchlib/src/vespa/searchlib/features/attributefeature.cpp
index ea88bfb6aa6..2349e8f1398 100644
--- a/searchlib/src/vespa/searchlib/features/attributefeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/attributefeature.cpp
@@ -245,7 +245,7 @@ MultiAttributeExecutor<BaseType>::execute(uint32_t docId)
{
auto values = _array_read_view->get_raw_values(docId);
auto o = outputs().get_bound();
- o[0].as_number = __builtin_expect(_idx < values.size(), true) ? values[_idx].value() : 0;
+ o[0].as_number = __builtin_expect(_idx < values.size(), true) ? multivalue::get_value(values[_idx]) : 0;
}
void
diff --git a/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp b/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp
index 635c8fed4c3..739d0f01cee 100644
--- a/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp
+++ b/searchlib/src/vespa/searchlib/features/internal_max_reduce_prod_join_feature.cpp
@@ -62,11 +62,21 @@ RawExecutor<BaseType>::RawExecutor(const ArrayReadView* array_read_view, const I
{
}
+namespace {
+
+template <typename T>
+inline T get_array_element_value(const multivalue::Value<T>& value) noexcept { return multivalue::get_value(value); }
+
+template <typename T>
+inline T get_array_element_value(const search::attribute::WeightedType<T>& value) noexcept { return value.value(); }
+
+}
+
template<typename A, typename V>
feature_t maxProduct(const A &array, size_t count, const V &query) {
feature_t val = -std::numeric_limits<double>::max();
for (size_t i = 0; i < count; ++i) {
- auto itr = query.getDimMap().find(array[i].value());
+ auto itr = query.getDimMap().find(get_array_element_value(array[i]));
if (itr != query.getDimMap().end()) {
feature_t v = itr->second; // weight from attribute is assumed to be 1.0
if (v > val) {