From b7a150cc6311beadda6ae9b8633068195fb41c16 Mon Sep 17 00:00:00 2001 From: Maksim Kita Date: Sat, 23 Jan 2021 19:47:33 +0300 Subject: [PATCH] Updated DictionaryDefaultValueExtractor interface --- src/Dictionaries/CacheDictionary.cpp | 15 ++--- src/Dictionaries/CacheDictionary.h | 6 +- .../ComplexKeyCacheDictionary.cpp | 15 ++--- src/Dictionaries/ComplexKeyCacheDictionary.h | 6 +- .../ComplexKeyDirectDictionary.cpp | 10 +-- .../ComplexKeyHashedDictionary.cpp | 11 ++-- src/Dictionaries/ComplexKeyHashedDictionary.h | 4 +- src/Dictionaries/DictionaryBlockInputStream.h | 2 +- src/Dictionaries/DictionaryHelpers.h | 65 +++++++++---------- src/Dictionaries/DirectDictionary.cpp | 9 +-- src/Dictionaries/FlatDictionary.cpp | 13 ++-- src/Dictionaries/FlatDictionary.h | 4 +- src/Dictionaries/HashedDictionary.cpp | 17 ++--- src/Dictionaries/HashedDictionary.h | 8 +-- src/Dictionaries/IDictionary.h | 31 +++++---- src/Dictionaries/IPAddressDictionary.cpp | 14 ++-- src/Dictionaries/IPAddressDictionary.h | 8 +-- src/Dictionaries/PolygonDictionary.cpp | 7 +- src/Dictionaries/RangeHashedDictionary.cpp | 17 +++-- src/Dictionaries/RangeHashedDictionary.h | 4 +- src/Dictionaries/SSDCacheDictionary.cpp | 5 +- .../SSDComplexKeyCacheDictionary.cpp | 12 ++-- .../SSDComplexKeyCacheDictionary.h | 6 +- 23 files changed, 145 insertions(+), 144 deletions(-) diff --git a/src/Dictionaries/CacheDictionary.cpp b/src/Dictionaries/CacheDictionary.cpp index eac2cd1b41d..ee9408e0c91 100644 --- a/src/Dictionaries/CacheDictionary.cpp +++ b/src/Dictionaries/CacheDictionary.cpp @@ -271,11 +271,10 @@ ColumnPtr CacheDictionary::getColumn( { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = static_cast(std::get(attribute.null_value)); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto null_value = std::get(attribute.null_value); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -297,12 +296,12 @@ ColumnPtr CacheDictionary::getColumn( return result; } -template +template void CacheDictionary::getItemsNumberImpl( - Attribute & attribute, + Attribute & attribute, const PaddedPODArray & ids, ResultArrayType & out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { /// First fill everything with default values const auto rows = ext::size(ids); @@ -427,7 +426,7 @@ void CacheDictionary::getItemsString( Attribute & attribute, const PaddedPODArray & ids, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DictionaryDefaultValueExtractor & default_value_extractor) const { const auto rows = ext::size(ids); diff --git a/src/Dictionaries/CacheDictionary.h b/src/Dictionaries/CacheDictionary.h index 9f0b3fa4f63..35d38f03cbe 100644 --- a/src/Dictionaries/CacheDictionary.h +++ b/src/Dictionaries/CacheDictionary.h @@ -204,18 +204,18 @@ private: /* NOLINTNEXTLINE(readability-convert-member-functions-to-static) */ Attribute createAttributeWithTypeAndName(const AttributeUnderlyingType type, const String & name, const Field & null_value); - template + template void getItemsNumberImpl( Attribute & attribute, const PaddedPODArray & ids, ResultArrayType & out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; void getItemsString( Attribute & attribute, const PaddedPODArray & ids, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DictionaryDefaultValueExtractor & default_value_extractor) const; PaddedPODArray getCachedIds() const; diff --git a/src/Dictionaries/ComplexKeyCacheDictionary.cpp b/src/Dictionaries/ComplexKeyCacheDictionary.cpp index 6775f2b737b..ff5a0ed9356 100644 --- a/src/Dictionaries/ComplexKeyCacheDictionary.cpp +++ b/src/Dictionaries/ComplexKeyCacheDictionary.cpp @@ -91,11 +91,10 @@ ColumnPtr ComplexKeyCacheDictionary::getColumn( { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - using ValueType = DictionaryValueType; - using ColumnProvider = DictionaryAttributeColumnProvider; + using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = ValueType{std::get(attribute.null_values)}; - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto null_value = std::get(attribute.null_values); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -248,12 +247,12 @@ ColumnUInt8::Ptr ComplexKeyCacheDictionary::hasKeys(const Columns & key_columns, } -template +template void ComplexKeyCacheDictionary::getItemsNumberImpl( - Attribute & attribute, + Attribute & attribute, const Columns & key_columns, PaddedPODArray & out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { /// Mapping: -> { all indices `i` of `key_columns` such that `key_columns[i]` = } MapType> outdated_keys; @@ -335,7 +334,7 @@ void ComplexKeyCacheDictionary::getItemsString( Attribute & attribute, const Columns & key_columns, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DictionaryDefaultValueExtractor & default_value_extractor) const { const auto rows_num = key_columns.front()->size(); /// save on some allocations diff --git a/src/Dictionaries/ComplexKeyCacheDictionary.h b/src/Dictionaries/ComplexKeyCacheDictionary.h index de6fb508e5a..48ffcb814ef 100644 --- a/src/Dictionaries/ComplexKeyCacheDictionary.h +++ b/src/Dictionaries/ComplexKeyCacheDictionary.h @@ -175,18 +175,18 @@ private: Attribute createAttributeWithType(const AttributeUnderlyingType type, const Field & null_value); - template + template void getItemsNumberImpl( Attribute & attribute, const Columns & key_columns, PaddedPODArray & out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; void getItemsString( Attribute & attribute, const Columns & key_columns, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DictionaryDefaultValueExtractor & default_value_extractor) const; template void update( diff --git a/src/Dictionaries/ComplexKeyDirectDictionary.cpp b/src/Dictionaries/ComplexKeyDirectDictionary.cpp index 6186b8b7dae..391b5c47980 100644 --- a/src/Dictionaries/ComplexKeyDirectDictionary.cpp +++ b/src/Dictionaries/ComplexKeyDirectDictionary.cpp @@ -64,9 +64,10 @@ ColumnPtr ComplexKeyDirectDictionary::getColumn( using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = static_cast(attribute_null_value); + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -94,7 +95,8 @@ ColumnPtr ComplexKeyDirectDictionary::getColumn( getItemsImpl( attribute, key_columns, - [&](const size_t row, const auto value, bool is_null) { + [&](const size_t row, const auto value, bool is_null) + { if (attribute.is_nullable) (*vec_null_map_to)[row] = is_null; diff --git a/src/Dictionaries/ComplexKeyHashedDictionary.cpp b/src/Dictionaries/ComplexKeyHashedDictionary.cpp index 76eaad1dcbc..01cc089b99a 100644 --- a/src/Dictionaries/ComplexKeyHashedDictionary.cpp +++ b/src/Dictionaries/ComplexKeyHashedDictionary.cpp @@ -65,10 +65,11 @@ ColumnPtr ComplexKeyHashedDictionary::getColumn( using Type = std::decay_t; using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; - using ColumnProvider = DictionaryAttributeColumnProvider; + using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = attribute_null_value; + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -370,12 +371,12 @@ ComplexKeyHashedDictionary::createAttribute(const DictionaryAttribute & attribut } -template +template void ComplexKeyHashedDictionary::getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { const auto & attr = std::get>(attribute.maps); diff --git a/src/Dictionaries/ComplexKeyHashedDictionary.h b/src/Dictionaries/ComplexKeyHashedDictionary.h index 63458c3c759..6acb6600189 100644 --- a/src/Dictionaries/ComplexKeyHashedDictionary.h +++ b/src/Dictionaries/ComplexKeyHashedDictionary.h @@ -140,12 +140,12 @@ private: Attribute createAttribute(const DictionaryAttribute & attribute, const Field & null_value); - template + template void getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; template bool setAttributeValueImpl(Attribute & attribute, const StringRef key, const T value); diff --git a/src/Dictionaries/DictionaryBlockInputStream.h b/src/Dictionaries/DictionaryBlockInputStream.h index b5ab19acb6f..f045d47c2c2 100644 --- a/src/Dictionaries/DictionaryBlockInputStream.h +++ b/src/Dictionaries/DictionaryBlockInputStream.h @@ -233,7 +233,7 @@ Block DictionaryBlockInputStream::fillBlock( else { column = dictionary->getColumn( - attribute.name, + attribute.name, attribute.type, keys, data_types, diff --git a/src/Dictionaries/DictionaryHelpers.h b/src/Dictionaries/DictionaryHelpers.h index 001a2a804b7..587a4dc8f5a 100644 --- a/src/Dictionaries/DictionaryHelpers.h +++ b/src/Dictionaries/DictionaryHelpers.h @@ -10,11 +10,16 @@ namespace DB { +namespace ErrorCodes +{ + extern const int TYPE_MISMATCH; +} + /** * In Dictionaries implementation String attribute is stored in arena and StringRefsĀ are pointing to it. */ template -using DictionaryValueType = +using DictionaryValueType = std::conditional_t, StringRef, DictionaryAttributeType>; /** @@ -24,9 +29,9 @@ template class DictionaryAttributeColumnProvider { public: - using ColumnType = + using ColumnType = std::conditional_t, ColumnString, - std::conditional_t, ColumnDecimal, + std::conditional_t, ColumnDecimal, ColumnVector>>; using ColumnPtr = typename ColumnType::MutablePtr; @@ -50,66 +55,60 @@ public: }; /** - * DictionaryDefaultValueExtractor used to simplify getting default value for IDictionary function `getColumn`. - * Provides interface for getting default value with operator[]; - * - * If default_values_column is not null in constructor than this column values will be used as default values. - * If default_values_column is null then attribute_default_value will be used. + * DictionaryDefaultValueExtractor used to simplify getting default value for IDictionary function `getColumn`. + * Provides interface for getting default value with operator[]; + * + * If default_values_column is null then attribute_default_value will be used. + * If default_values_column is not null in constructor than this column values will be used as default values. */ -template +template class DictionaryDefaultValueExtractor { - using ResultColumnType = - std::conditional_t< std::is_same_v, ColumnString, - std::conditional_t, ColumnDecimal, - ColumnVector>>; + using DefaultColumnType = typename DictionaryAttributeColumnProvider::ColumnType; public: - DictionaryDefaultValueExtractor(DefaultValueType attribute_default_value, ColumnPtr default_values_column_ = nullptr) + DictionaryDefaultValueExtractor(DictionaryAttributeType attribute_default_value, ColumnPtr default_values_column_ = nullptr) { - if (default_values_column_ != nullptr) + if (!default_values_column_) + default_value = { std::move(attribute_default_value) }; + else { - if (const auto * const default_col = checkAndGetColumn(*default_values_column)) + if (const auto * const default_col = checkAndGetColumn(*default_values_column)) { default_values_column = default_col; } - else if (const auto * const default_col_const = checkAndGetColumnConst(default_values_column_.get())) + else if (const auto * const default_col_const = checkAndGetColumnConst(default_values_column_.get())) { - /// TODO: Check String lifetime safety - /// DefaultValueType for StringColumn is StringRef, but const column getValue will return String - using ConstColumnValue = std::conditional_t, String, DefaultValueType>; - default_value = std::make_optional(default_col_const->template getValue()); + default_value = { default_col_const->template getValue() }; } else - throw Exception{"Type of default column is not the same as result type.", ErrorCodes::TYPE_MISMATCH}; + throw Exception{"Type of default column is not the same as dictionary attribute type.", ErrorCodes::TYPE_MISMATCH}; } - else - default_value = std::make_optional(attribute_default_value); } - DefaultValueType operator[](size_t row) + DictionaryValueType operator[](size_t row) { if (default_value) - return *default_value; - - if constexpr (std::is_same_v) + return static_cast(*default_value); + + if constexpr (std::is_same_v) return default_values_column->getDataAt(row); else return default_values_column->getData()[row]; } private: - const ResultColumnType * default_values_column = nullptr; - std::optional default_value = {}; + const DefaultColumnType * default_values_column = nullptr; + std::optional default_value = {}; }; /** - * Returns ColumnVector data as PaddedPodArray. - * + * Returns ColumnVector data as PaddedPodArray. + * If column is constant parameter backup_storage is used to store values. */ template static const PaddedPODArray & getColumnVectorData( - const IDictionaryBase * dictionary [[maybe_unused]], + const IDictionaryBase * dictionary, const ColumnPtr column, PaddedPODArray & backup_storage) { diff --git a/src/Dictionaries/DirectDictionary.cpp b/src/Dictionaries/DirectDictionary.cpp index 0d767f322f7..b61f256b0cc 100644 --- a/src/Dictionaries/DirectDictionary.cpp +++ b/src/Dictionaries/DirectDictionary.cpp @@ -39,7 +39,7 @@ void DirectDictionary::toParent(const PaddedPODArray & ids, PaddedPODArray< { const auto null_value = std::get(hierarchical_attribute->null_values); DictionaryDefaultValueExtractor extractor(null_value); - + getItemsImpl( *hierarchical_attribute, ids, @@ -166,9 +166,10 @@ ColumnPtr DirectDictionary::getColumn( using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = static_cast(attribute_null_value); + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); diff --git a/src/Dictionaries/FlatDictionary.cpp b/src/Dictionaries/FlatDictionary.cpp index 3f6dad9a20d..f4f50a69598 100644 --- a/src/Dictionaries/FlatDictionary.cpp +++ b/src/Dictionaries/FlatDictionary.cpp @@ -131,9 +131,10 @@ ColumnPtr FlatDictionary::getColumn( using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = static_cast(attribute_null_value); + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, size); @@ -153,7 +154,7 @@ ColumnPtr FlatDictionary::getColumn( getItemsImpl( attribute, - ids, + ids, [&](const size_t row, const auto value) { out[row] = value; }, default_value_extractor); } @@ -404,12 +405,12 @@ FlatDictionary::Attribute FlatDictionary::createAttribute(const DictionaryAttrib } -template +template void FlatDictionary::getItemsImpl( const Attribute & attribute, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { const auto & attr = std::get>(attribute.arrays); const auto rows = ext::size(ids); diff --git a/src/Dictionaries/FlatDictionary.h b/src/Dictionaries/FlatDictionary.h index 9e719a4368d..90123ce08bf 100644 --- a/src/Dictionaries/FlatDictionary.h +++ b/src/Dictionaries/FlatDictionary.h @@ -148,12 +148,12 @@ private: Attribute createAttribute(const DictionaryAttribute& attribute, const Field & null_value); - template + template void getItemsImpl( const Attribute & attribute, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; template void resize(Attribute & attribute, const Key id); diff --git a/src/Dictionaries/HashedDictionary.cpp b/src/Dictionaries/HashedDictionary.cpp index 22bcd3a602c..5a9f9a02066 100644 --- a/src/Dictionaries/HashedDictionary.cpp +++ b/src/Dictionaries/HashedDictionary.cpp @@ -152,9 +152,10 @@ ColumnPtr HashedDictionary::getColumn( using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = static_cast(attribute_null_value); + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, size); @@ -178,7 +179,7 @@ ColumnPtr HashedDictionary::getColumn( [&](const size_t row, const auto value) { return out[row] = value; }, default_value_extractor); } - + result = std::move(column); }; @@ -518,12 +519,12 @@ HashedDictionary::Attribute HashedDictionary::createAttribute(const DictionaryAt } -template +template void HashedDictionary::getItemsAttrImpl( const MapType & attr, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { const auto rows = ext::size(ids); @@ -536,12 +537,12 @@ void HashedDictionary::getItemsAttrImpl( query_count.fetch_add(rows, std::memory_order_relaxed); } -template +template void HashedDictionary::getItemsImpl( const Attribute & attribute, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { if (!sparse) return getItemsAttrImpl(*std::get>(attribute.maps), ids, set_value, default_value_extractor); diff --git a/src/Dictionaries/HashedDictionary.h b/src/Dictionaries/HashedDictionary.h index fd8bc0c10b1..97b329a8b25 100644 --- a/src/Dictionaries/HashedDictionary.h +++ b/src/Dictionaries/HashedDictionary.h @@ -182,19 +182,19 @@ private: Attribute createAttribute(const DictionaryAttribute& attribute, const Field & null_value); - template + template void getItemsAttrImpl( const MapType & attr, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & extractor) const; + DefaultValueExtractor & default_value_extractor) const; - template + template void getItemsImpl( const Attribute & attribute, const PaddedPODArray & ids, ValueSetter && set_value, - DictionaryDefaultValueExtractor & extractor) const; + DefaultValueExtractor & default_value_extractor) const; template bool setAttributeValueImpl(Attribute & attribute, const Key id, const T value); diff --git a/src/Dictionaries/IDictionary.h b/src/Dictionaries/IDictionary.h index 4c03b7cf2ad..e0e4c7eb880 100644 --- a/src/Dictionaries/IDictionary.h +++ b/src/Dictionaries/IDictionary.h @@ -22,21 +22,20 @@ namespace DB namespace ErrorCodes { extern const int NOT_IMPLEMENTED; - extern const int TYPE_MISMATCH; } struct IDictionaryBase; using DictionaryPtr = std::unique_ptr; -/** DictionaryKeyType provides IDictionary client information about - * which key type is supported by dictionary. - * - * Simple is for dictionaries that support UInt64 key column. - * - * Complex is for dictionaries that support any combination of key columns. - * - * Range is for dictionary that support combination of UInt64 key column, - * and Integer representable range key column. +/** DictionaryKeyType provides IDictionary client information about + * which key type is supported by dictionary. + * + * Simple is for dictionaries that support UInt64 key column. + * + * Complex is for dictionaries that support any combination of key columns. + * + * Range is for dictionary that support combination of UInt64 key column, + * and numeric representable range key column. */ enum class DictionaryKeyType { @@ -47,7 +46,7 @@ enum class DictionaryKeyType /** * Base class for Dictionaries implementation. - */ + */ struct IDictionaryBase : public IExternalLoadable { using Key = UInt64; @@ -109,11 +108,11 @@ struct IDictionaryBase : public IExternalLoadable */ virtual DictionaryKeyType getKeyType() const = 0; - /** Subclass must validate key columns and keys types + /** Subclass must validate key columns and keys types * and return column representation of dictionary attribute. - * + * * Parameter default_values_column must be used to provide default values - * for keys that are not in dictionary. If null pointer is passed, + * for keys that are not in dictionary. If null pointer is passed, * then default attribute value must be used. */ virtual ColumnPtr getColumn( @@ -123,8 +122,8 @@ struct IDictionaryBase : public IExternalLoadable const DataTypes & key_types, const ColumnPtr default_values_column) const = 0; - /** Subclass must validate key columns and key types and return ColumnUInt8 that - * is bitmask representation of is key in dictionary or not. + /** Subclass must validate key columns and key types and return ColumnUInt8 that + * is bitmask representation of is key in dictionary or not. * If key is in dictionary then value of associated row will be 1, otherwise 0. */ virtual ColumnUInt8::Ptr hasKeys( diff --git a/src/Dictionaries/IPAddressDictionary.cpp b/src/Dictionaries/IPAddressDictionary.cpp index 468d720f69d..b59fa85cc51 100644 --- a/src/Dictionaries/IPAddressDictionary.cpp +++ b/src/Dictionaries/IPAddressDictionary.cpp @@ -289,10 +289,10 @@ ColumnPtr IPAddressDictionary::getColumn( using Type = std::decay_t; using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; - using ColumnProvider = DictionaryAttributeColumnProvider; + using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = ValueType{std::get(attribute.null_values)}; - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto null_value = std::get(attribute.null_values); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, size); @@ -637,12 +637,12 @@ const uint8_t * IPAddressDictionary::getIPv6FromOffset(const IPAddressDictionary return reinterpret_cast(&ipv6_col[i * IPV6_BINARY_LENGTH]); } -template +template void IPAddressDictionary::getItemsByTwoKeyColumnsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { const auto first_column = key_columns.front(); const auto rows = first_column->size(); @@ -718,12 +718,12 @@ void IPAddressDictionary::getItemsByTwoKeyColumnsImpl( } } -template +template void IPAddressDictionary::getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { const auto first_column = key_columns.front(); const auto rows = first_column->size(); diff --git a/src/Dictionaries/IPAddressDictionary.h b/src/Dictionaries/IPAddressDictionary.h index 0694724aaca..445cea9910f 100644 --- a/src/Dictionaries/IPAddressDictionary.h +++ b/src/Dictionaries/IPAddressDictionary.h @@ -141,19 +141,19 @@ private: Attribute createAttributeWithType(const AttributeUnderlyingType type, const Field & null_value); - template + template void getItemsByTwoKeyColumnsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; - template + template void getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; template void setAttributeValueImpl(Attribute & attribute, const T value); diff --git a/src/Dictionaries/PolygonDictionary.cpp b/src/Dictionaries/PolygonDictionary.cpp index 15af4680d9d..497a7483808 100644 --- a/src/Dictionaries/PolygonDictionary.cpp +++ b/src/Dictionaries/PolygonDictionary.cpp @@ -112,11 +112,10 @@ ColumnPtr IPolygonDictionary::getColumn( { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - - const auto null_value = static_cast(std::get(null_values[index])); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + + const auto null_value = std::get(null_values[index]); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); diff --git a/src/Dictionaries/RangeHashedDictionary.cpp b/src/Dictionaries/RangeHashedDictionary.cpp index a1f5c7a68fb..9fb1a57a381 100644 --- a/src/Dictionaries/RangeHashedDictionary.cpp +++ b/src/Dictionaries/RangeHashedDictionary.cpp @@ -124,10 +124,11 @@ ColumnPtr RangeHashedDictionary::getColumn( using Type = std::decay_t; using AttributeType = typename Type::AttributeType; using ValueType = DictionaryValueType; - using ColumnProvider = DictionaryAttributeColumnProvider; + using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = std::get(attribute.null_values); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto attribute_null_value = std::get(attribute.null_values); + AttributeType null_value = static_cast(attribute_null_value); + DictionaryDefaultValueExtractor default_value_extractor(std::move(null_value), default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -138,7 +139,8 @@ ColumnPtr RangeHashedDictionary::getColumn( getItemsImpl( attribute, modified_key_columns, - [&](const size_t row, const StringRef value, bool is_null) { + [&](const size_t row, const StringRef value, bool is_null) + { if (attribute.is_nullable) (*vec_null_map_to)[row] = is_null; @@ -153,7 +155,8 @@ ColumnPtr RangeHashedDictionary::getColumn( getItemsImpl( attribute, modified_key_columns, - [&](const size_t row, const auto value, bool is_null) { + [&](const size_t row, const auto value, bool is_null) + { if (attribute.is_nullable) (*vec_null_map_to)[row] = is_null; @@ -313,12 +316,12 @@ RangeHashedDictionary::createAttribute(const DictionaryAttribute& attribute, con return attr; } -template +template void RangeHashedDictionary::getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { PaddedPODArray key_backup_storage; PaddedPODArray range_backup_storage; diff --git a/src/Dictionaries/RangeHashedDictionary.h b/src/Dictionaries/RangeHashedDictionary.h index 8252ee24cd5..216559089f5 100644 --- a/src/Dictionaries/RangeHashedDictionary.h +++ b/src/Dictionaries/RangeHashedDictionary.h @@ -152,12 +152,12 @@ private: Attribute createAttribute(const DictionaryAttribute& attribute, const Field & null_value); - template + template void getItemsImpl( const Attribute & attribute, const Columns & key_columns, ValueSetter && set_value, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; template void setAttributeValueImpl(Attribute & attribute, const Key id, const Range & range, const Field & value); diff --git a/src/Dictionaries/SSDCacheDictionary.cpp b/src/Dictionaries/SSDCacheDictionary.cpp index c064ccb0e63..217ae6ca1f0 100644 --- a/src/Dictionaries/SSDCacheDictionary.cpp +++ b/src/Dictionaries/SSDCacheDictionary.cpp @@ -1348,11 +1348,10 @@ ColumnPtr SSDCacheDictionary::getColumn( { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = static_cast(std::get(null_values[index])); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto null_value = std::get(null_values[index]); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); diff --git a/src/Dictionaries/SSDComplexKeyCacheDictionary.cpp b/src/Dictionaries/SSDComplexKeyCacheDictionary.cpp index 1bff34b7cb3..a51df76c92f 100644 --- a/src/Dictionaries/SSDComplexKeyCacheDictionary.cpp +++ b/src/Dictionaries/SSDComplexKeyCacheDictionary.cpp @@ -1401,12 +1401,10 @@ ColumnPtr SSDComplexKeyCacheDictionary::getColumn( { using Type = std::decay_t; using AttributeType = typename Type::AttributeType; - - using ValueType = DictionaryValueType; using ColumnProvider = DictionaryAttributeColumnProvider; - const auto null_value = static_cast(std::get(null_values[index])); - DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); + const auto null_value = std::get(null_values[index]); + DictionaryDefaultValueExtractor default_value_extractor(null_value, default_values_column); auto column = ColumnProvider::getColumn(dictionary_attribute, keys_size); @@ -1434,13 +1432,13 @@ ColumnPtr SSDComplexKeyCacheDictionary::getColumn( return result; } -template +template void SSDComplexKeyCacheDictionary::getItemsNumberImpl( const size_t attribute_index, const Columns & key_columns, const DataTypes & key_types, ResultArrayType & out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DefaultValueExtractor & default_value_extractor) const { assert(dict_struct.key); assert(key_columns.size() == key_types.size()); @@ -1488,7 +1486,7 @@ void SSDComplexKeyCacheDictionary::getItemsStringImpl( const Columns & key_columns, const DataTypes & key_types, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const + DictionaryDefaultValueExtractor & default_value_extractor) const { dict_struct.validateKeyTypes(key_types); diff --git a/src/Dictionaries/SSDComplexKeyCacheDictionary.h b/src/Dictionaries/SSDComplexKeyCacheDictionary.h index 9e33e1dbdfb..be65d823e34 100644 --- a/src/Dictionaries/SSDComplexKeyCacheDictionary.h +++ b/src/Dictionaries/SSDComplexKeyCacheDictionary.h @@ -593,20 +593,20 @@ private: AttributeValueVariant createAttributeNullValueWithType(const AttributeUnderlyingType type, const Field & null_value); void createAttributes(); - template + template void getItemsNumberImpl( const size_t attribute_index, const Columns & key_columns, const DataTypes & key_types, ResultArrayType & out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DefaultValueExtractor & default_value_extractor) const; void getItemsStringImpl( const size_t attribute_index, const Columns & key_columns, const DataTypes & key_types, ColumnString * out, - DictionaryDefaultValueExtractor & default_value_extractor) const; + DictionaryDefaultValueExtractor & default_value_extractor) const; const std::string name; const DictionaryStructure dict_struct;