diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-03-30 14:54:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-30 14:54:20 +0200 |
commit | 58200e0e03baf5fc712fd28313622bc8b4515dca (patch) | |
tree | 02860f68ecf2f6770e4844bbc343fc4fa04689e2 | |
parent | 93859fca3e5ed153d0503fe0c4354e6a9cabac29 (diff) | |
parent | b848f308c12f71ef90d829727ddcb838415dda97 (diff) |
Merge pull request #21895 from vespa-engine/geirst/implement-multivalueattribute-interface
Implement IMultiValueAttribute interface in MultiValueAttribute.
6 files changed, 68 insertions, 25 deletions
diff --git a/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_attribute.h b/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_attribute.h index 5831380eaae..6c3a8cbd2da 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_attribute.h +++ b/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_attribute.h @@ -13,20 +13,38 @@ namespace search::attribute { * Otherwise a nullptr is returned. */ class IMultiValueAttribute { +public: + template<typename MultiValueType> + class Tag {}; + + template<typename T> + using ArrayTag = Tag<search::multivalue::Value<T>>; + + using ArrayEnumTag = ArrayTag<vespalib::datastore::AtomicEntryRef>; + + template<typename T> + using WeightedSetTag = Tag<search::multivalue::WeightedValue<T>>; + + using WeightedSetEnumTag = WeightedSetTag<vespalib::datastore::AtomicEntryRef>; + virtual ~IMultiValueAttribute() {} - virtual const IArrayReadView<int8_t>* as_int8_array() const = 0; - virtual const IArrayReadView<int32_t>* as_int32_array() const = 0; - virtual const IArrayReadView<int64_t>* as_int64_array() const = 0; - virtual const IArrayReadView<float>* as_float_array() const = 0; - virtual const IArrayReadView<double>* as_double_array() const = 0; - - virtual const IWeightedSetReadView<int8_t>* as_int8_wset() const = 0; - virtual const IWeightedSetReadView<int32_t>* as_int32_wset() const = 0; - virtual const IWeightedSetReadView<int64_t>* as_int64_wset() const = 0; - virtual const IWeightedSetReadView<float>* as_float_wset() const = 0; - virtual const IWeightedSetReadView<double>* as_double_wset() const = 0; - - virtual const IWeightedSetEnumReadView* as_enum_wset() const = 0; + + virtual const IArrayReadView<int8_t>* as_read_view(ArrayTag<int8_t>) const { return nullptr; } + virtual const IArrayReadView<int16_t>* as_read_view(ArrayTag<int16_t>) const { return nullptr; } + virtual const IArrayReadView<int32_t>* as_read_view(ArrayTag<int32_t>) const { return nullptr; } + virtual const IArrayReadView<int64_t>* as_read_view(ArrayTag<int64_t>) const { return nullptr; } + virtual const IArrayReadView<float>* as_read_view(ArrayTag<float>) const { return nullptr; } + virtual const IArrayReadView<double>* as_read_view(ArrayTag<double>) const { return nullptr; } + + virtual const IWeightedSetReadView<int8_t>* as_read_view(WeightedSetTag<int8_t>) const { return nullptr; } + virtual const IWeightedSetReadView<int16_t>* as_read_view(WeightedSetTag<int16_t>) const { return nullptr; } + virtual const IWeightedSetReadView<int32_t>* as_read_view(WeightedSetTag<int32_t>) const { return nullptr; } + virtual const IWeightedSetReadView<int64_t>* as_read_view(WeightedSetTag<int64_t>) const { return nullptr; } + virtual const IWeightedSetReadView<float>* as_read_view(WeightedSetTag<float>) const { return nullptr; } + virtual const IWeightedSetReadView<double>* as_read_view(WeightedSetTag<double>) const { return nullptr; } + + virtual const IArrayEnumReadView* as_read_view(ArrayEnumTag) const { return nullptr; } + virtual const IWeightedSetEnumReadView* as_read_view(WeightedSetEnumTag) const { return nullptr; } }; } diff --git a/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_read_view.h b/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_read_view.h index df69c5cfde8..7d7f8831fc8 100644 --- a/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_read_view.h +++ b/searchcommon/src/vespa/searchcommon/attribute/i_multi_value_read_view.h @@ -34,8 +34,13 @@ template <typename T> using IWeightedSetReadView = IMultiValueReadView<multivalue::WeightedValue<T>>; /** + * Read view for the raw data stored in an enumerated array attribute. + */ +using IArrayEnumReadView = IArrayReadView<vespalib::datastore::AtomicEntryRef>; + +/** * Read view for the raw data stored in an enumerated weighted set attribute. */ -using IWeightedSetEnumReadView = IMultiValueReadView<multivalue::WeightedValue<vespalib::datastore::AtomicEntryRef>>; +using IWeightedSetEnumReadView = IWeightedSetReadView<vespalib::datastore::AtomicEntryRef>; }; diff --git a/searchlib/src/tests/attribute/postinglistattribute/postinglistattribute_test.cpp b/searchlib/src/tests/attribute/postinglistattribute/postinglistattribute_test.cpp index ad49212fffc..6abcb99c3b3 100644 --- a/searchlib/src/tests/attribute/postinglistattribute/postinglistattribute_test.cpp +++ b/searchlib/src/tests/attribute/postinglistattribute/postinglistattribute_test.cpp @@ -90,11 +90,11 @@ private: Int32PostingListAttribute; typedef MultiValueNumericPostingAttribute< EnumAttribute<IntegerAttributeTemplate<int32_t> >, - multivalue::Value<IEnumStore::Index> > + multivalue::Value<IEnumStore::AtomicIndex> > Int32ArrayPostingListAttribute; typedef MultiValueNumericPostingAttribute< EnumAttribute<IntegerAttributeTemplate<int32_t> >, - multivalue::WeightedValue<IEnumStore::Index> > + multivalue::WeightedValue<IEnumStore::AtomicIndex> > Int32WsetPostingListAttribute; typedef SingleValueNumericPostingAttribute< @@ -102,11 +102,11 @@ private: FloatPostingListAttribute; typedef MultiValueNumericPostingAttribute< EnumAttribute<FloatingPointAttributeTemplate<float> >, - multivalue::Value<IEnumStore::Index> > + multivalue::Value<IEnumStore::AtomicIndex> > FloatArrayPostingListAttribute; typedef MultiValueNumericPostingAttribute< EnumAttribute<FloatingPointAttributeTemplate<float> >, - multivalue::WeightedValue<IEnumStore::Index> > + multivalue::WeightedValue<IEnumStore::AtomicIndex> > FloatWsetPostingListAttribute; typedef SingleValueStringPostingAttribute StringPostingListAttribute; diff --git a/searchlib/src/vespa/searchlib/attribute/enum_store_types.h b/searchlib/src/vespa/searchlib/attribute/enum_store_types.h index 435e94fe592..d97b83aac05 100644 --- a/searchlib/src/vespa/searchlib/attribute/enum_store_types.h +++ b/searchlib/src/vespa/searchlib/attribute/enum_store_types.h @@ -2,16 +2,17 @@ #pragma once -#include <vespa/vespalib/datastore/entryref.h> +#include <vespa/vespalib/datastore/atomic_entry_ref.h> #include <vespa/vespalib/stllike/allocator.h> #include <vector> namespace search::enumstore { -using Index = vespalib::datastore::EntryRef; -using InternalIndex = vespalib::datastore::EntryRefT<22>; -using IndexVector = std::vector<Index, vespalib::allocator_large<Index>>; +using AtomicIndex = vespalib::datastore::AtomicEntryRef; using EnumHandle = uint32_t; using EnumVector = std::vector<uint32_t, vespalib::allocator_large<uint32_t>>; +using Index = vespalib::datastore::EntryRef; +using IndexVector = std::vector<Index, vespalib::allocator_large<Index>>; +using InternalIndex = vespalib::datastore::EntryRefT<22>; } diff --git a/searchlib/src/vespa/searchlib/attribute/i_enum_store.h b/searchlib/src/vespa/searchlib/attribute/i_enum_store.h index d8b09ba211f..57886511221 100644 --- a/searchlib/src/vespa/searchlib/attribute/i_enum_store.h +++ b/searchlib/src/vespa/searchlib/attribute/i_enum_store.h @@ -34,6 +34,7 @@ class IEnumStoreDictionary; */ class IEnumStore { public: + using AtomicIndex = enumstore::AtomicIndex; using Index = enumstore::Index; using InternalIndex = enumstore::InternalIndex; using IndexVector = enumstore::IndexVector; diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h index 01cef03e687..848d5547672 100644 --- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.h @@ -2,9 +2,11 @@ #pragma once -#include "multi_value_mapping.h" -#include "attributevector.h" #include "atomic_utils.h" +#include "attributevector.h" +#include "multi_value_mapping.h" +#include <vespa/searchcommon/attribute/i_multi_value_attribute.h> +#include <vespa/searchcommon/attribute/i_multi_value_read_view.h> namespace search { @@ -15,7 +17,9 @@ namespace search { * M: MultiValueType */ template <typename B, typename M> -class MultiValueAttribute : public B +class MultiValueAttribute : public B, + public attribute::IMultiValueAttribute, + public attribute::IMultiValueReadView<M> { protected: typedef typename B::DocId DocId; @@ -74,6 +78,20 @@ public: void clearDocs(DocId lidLow, DocId lidLimit, bool in_shrink_lid_space) override; void onShrinkLidSpace() override ; void onAddDocs(DocId lidLimit) override; + + const IMultiValueAttribute* as_multi_value_attribute() const override { + return this; + } + + // Implements attribute::IMultiValueAttribute + const attribute::IMultiValueReadView<MultiValueType>* as_read_view(attribute::IMultiValueAttribute::Tag<MultiValueType>) const override { + return this; + } + + // Implements attribute::IMultiValueReadView + vespalib::ConstArrayRef<MultiValueType> get_raw_values(uint32_t docid) const override { + return this->_mvMapping.get(docid); + } }; } // namespace search |