aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzverevgeny <zverevgeny@ydb.tech>2024-04-12 22:17:11 +0300
committerGitHub <noreply@github.com>2024-04-12 22:17:11 +0300
commit46481ac5d61bb657c0095130a499f7401f35b27f (patch)
tree05220e23b43631047aee0e081830b1025de1f525
parent3095889ae8d8baa2c00dedcb53d3e5ddd2dd47d7 (diff)
downloadydb-46481ac5d61bb657c0095130a499f7401f35b27f.tar.gz
YQ-2068 use common hash and eq implementation in TUnboxedKeyValueLruCacheWithTtl (#3640)
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node_holders.cpp2
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node_holders.h2
-rw-r--r--ydb/library/yql/minikql/computation/mkql_key_payload_value_lru_cache.h56
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;