diff options
author | zverevgeny <zverevgeny@ydb.tech> | 2024-04-12 22:17:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-12 22:17:11 +0300 |
commit | 46481ac5d61bb657c0095130a499f7401f35b27f (patch) | |
tree | 05220e23b43631047aee0e081830b1025de1f525 | |
parent | 3095889ae8d8baa2c00dedcb53d3e5ddd2dd47d7 (diff) | |
download | ydb-46481ac5d61bb657c0095130a499f7401f35b27f.tar.gz |
YQ-2068 use common hash and eq implementation in TUnboxedKeyValueLruCacheWithTtl (#3640)
3 files changed, 30 insertions, 30 deletions
diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node_holders.cpp b/ydb/library/yql/minikql/computation/mkql_computation_node_holders.cpp index 10119daf00d..30cea5a1395 100644 --- a/ydb/library/yql/minikql/computation/mkql_computation_node_holders.cpp +++ b/ydb/library/yql/minikql/computation/mkql_computation_node_holders.cpp @@ -3496,7 +3496,7 @@ KNOWN_PRIMITIVE_VALUE_TYPES(DEFINE_HASHED_SINGLE_FIXED_COMPACT_MULTI_MAP_OPT) KNOWN_PRIMITIVE_VALUE_TYPES(DEFINE_HASHED_SINGLE_FIXED_COMPACT_MULTI_MAP_NONOPT) #undef DEFINE_HASHED_SINGLE_FIXED_COMPACT_MULTI_MAP_NONOPT -void GetDictionaryKeyTypes(TType* keyType, TKeyTypes& types, bool& isTuple, bool& encoded, bool& useIHash, bool expandTuple) { +void GetDictionaryKeyTypes(const TType* keyType, TKeyTypes& types, bool& isTuple, bool& encoded, bool& useIHash, bool expandTuple) { isTuple = false; encoded = false; useIHash = false; diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node_holders.h b/ydb/library/yql/minikql/computation/mkql_computation_node_holders.h index f52c7a7093f..34298745280 100644 --- a/ydb/library/yql/minikql/computation/mkql_computation_node_holders.h +++ b/ydb/library/yql/minikql/computation/mkql_computation_node_holders.h @@ -1030,7 +1030,7 @@ inline bool TComputationContext::CheckAdjustedMemLimit(ui64 memLimit, ui64 initM return currentMemUsage * UsageAdjustor >= initMemUsage + memLimit; } -void GetDictionaryKeyTypes(TType* keyType, TKeyTypes& types, bool& isTuple, bool& encoded, bool& useIHash, bool expandTuple = true); +void GetDictionaryKeyTypes(const TType* keyType, TKeyTypes& types, bool& isTuple, bool& encoded, bool& useIHash, bool expandTuple = true); class TPlainContainerCache { public: diff --git a/ydb/library/yql/minikql/computation/mkql_key_payload_value_lru_cache.h b/ydb/library/yql/minikql/computation/mkql_key_payload_value_lru_cache.h index 9fec15a20e1..e3eea5d488b 100644 --- a/ydb/library/yql/minikql/computation/mkql_key_payload_value_lru_cache.h +++ b/ydb/library/yql/minikql/computation/mkql_key_payload_value_lru_cache.h @@ -2,7 +2,7 @@ #include <ydb/library/yql/public/udf/udf_value.h> #include <ydb/library/yql/minikql/mkql_node.h> -#include <ydb/library/yql/minikql/mkql_type_builder.h> +#include <ydb/library/yql/minikql/computation/mkql_computation_node_holders.h> #include <util/generic/string.h> #include <unordered_map> #include <list> @@ -30,34 +30,15 @@ class TUnboxedKeyValueLruCacheWithTtl { }; using TUsageList = std::list<TEntry>; - class TUnboxedValueHash { - public: - TUnboxedValueHash(const NKikimr::NMiniKQL::TType* type) - : HashImpl(NKikimr::NMiniKQL::MakeHashImpl(type)) - {} - ui64 operator()(NUdf::TUnboxedValuePod v) const { - return HashImpl->Hash(v); - } - private: - NUdf::IHash::TPtr HashImpl; - }; - - class TUnboxedValueEquate { - public: - TUnboxedValueEquate(const NKikimr::NMiniKQL::TType* type) - : EquateImpl(NKikimr::NMiniKQL::MakeEquateImpl(type)) - {} - ui64 operator()(NUdf::TUnboxedValuePod lhs, NUdf::TUnboxedValuePod rhs) const { - return EquateImpl->Equals(lhs, rhs); - } - private: - NUdf::IEquate::TPtr EquateImpl; - }; - public: TUnboxedKeyValueLruCacheWithTtl(size_t maxSize, const NKikimr::NMiniKQL::TType* keyType) : MaxSize(maxSize) - , Map(1000, TUnboxedValueHash(keyType), TUnboxedValueEquate(keyType)) + , KeyTypeHelpers(GetKeyTypeHelpers(keyType)) + , Map( + 1000, + TValueHasher(KeyTypeHelpers.KeyTypes, KeyTypeHelpers.IsTuple, KeyTypeHelpers.Hash.Get()), + TValueEqual(KeyTypeHelpers.KeyTypes, KeyTypeHelpers.IsTuple, KeyTypeHelpers.Equate.Get()) + ) { Y_ABORT_UNLESS(MaxSize > 0); } @@ -109,6 +90,24 @@ public: return Map.size(); } private: + struct TKeyTypeHelpers { + TKeyTypes KeyTypes; + bool IsTuple; + NUdf::IHash::TPtr Hash; + NUdf::IEquate::TPtr Equate; + }; + + TKeyTypeHelpers GetKeyTypeHelpers(const TType* type) { + TKeyTypeHelpers helpers; + bool encoded; + bool useIHash; + GetDictionaryKeyTypes(type, helpers.KeyTypes, helpers.IsTuple, encoded, useIHash); + if (useIHash) { + helpers.Hash = MakeHashImpl(type); + helpers.Equate = MakeEquateImpl(type);; + } + return helpers; + } void Touch(TUsageList::iterator it) { UsageList.splice(UsageList.end(), UsageList, it); //move accessed element to the end of Usage list } @@ -119,11 +118,12 @@ private: private: const size_t MaxSize; TUsageList UsageList; + const TKeyTypeHelpers KeyTypeHelpers; std::unordered_map< NUdf::TUnboxedValue, TUsageList::iterator, - TUnboxedValueHash, - TUnboxedValueEquate, + TValueHasher, + TValueEqual, NKikimr::NMiniKQL::TMKQLAllocator<std::pair<const NUdf::TUnboxedValue, TUsageList::iterator>> > Map; |