4646#include " velox/common/base/BloomFilter.h"
4747#include " velox/common/file/FileSystems.h"
4848#include " velox/exec/HashTable.h"
49+ #include " velox/exec/HashTableCache.h"
4950
5051#ifdef GLUTEN_ENABLE_GPU
5152#include " cudf/CudfPlanValidator.h"
@@ -949,7 +950,7 @@ JNIEXPORT jobject JNICALL Java_org_apache_gluten_execution_IcebergWriteJniWrappe
949950JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_nativeBuild ( // NOLINT
950951 JNIEnv* env,
951952 jobject wrapper,
952- jstring /* tableId*/ ,
953+ jstring tableId,
953954 jlongArray batchHandles,
954955 jobjectArray joinKeys,
955956 jobjectArray filterBuildColumns,
@@ -974,6 +975,8 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_native
974975 queryConf.get <uint32_t >(kAbandonDedupHashMapMinRows , kAbandonDedupHashMapMinRowsDefault );
975976 const auto abandonHashBuildDedupMinPct =
976977 queryConf.get <uint32_t >(kAbandonDedupHashMapMinPct , kAbandonDedupHashMapMinPctDefault );
978+ const auto hashTableId = jStringToCString (env, tableId);
979+
977980 // Convert Java String array to C++ vector<string>
978981 std::vector<std::string> hashJoinKeys;
979982 jsize joinKeysCount = env->GetArrayLength (joinKeys);
@@ -1052,6 +1055,12 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_native
10521055 nullptr );
10531056 builder->setHashTable (std::move (mainTable));
10541057
1058+ auto * cache = facebook::velox::exec::HashTableCache::instance ();
1059+
1060+ if (!cache->exist (hashTableId)) {
1061+ cache->add (hashTableId, builder->hashTable (), builder->joinHasNullKeys (), defaultLeafVeloxMemoryPool ());
1062+ }
1063+
10551064 return gluten::getHashTableObjStore ()->save (builder);
10561065 }
10571066
@@ -1134,44 +1143,69 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_native
11341143 }
11351144
11361145 hashTableBuilders[0 ]->setHashTable (std::move (mainTable));
1146+
1147+ auto * cache = facebook::velox::exec::HashTableCache::instance ();
1148+ if (!cache->exist (hashTableId)) {
1149+ cache->add (
1150+ hashTableId,
1151+ hashTableBuilders[0 ]->hashTable (),
1152+ hashTableBuilders[0 ]->joinHasNullKeys (),
1153+ defaultLeafVeloxMemoryPool ());
1154+ }
1155+
11371156 return gluten::getHashTableObjStore ()->save (hashTableBuilders[0 ]);
11381157 JNI_METHOD_END (kInvalidObjectHandle )
11391158}
11401159
11411160JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_cloneHashTable ( // NOLINT
11421161 JNIEnv* env,
11431162 jclass,
1163+ jstring cacheKey,
11441164 jlong tableHandler) {
11451165 JNI_METHOD_START
1166+ auto cacheKeyStr = jStringToCString (env, cacheKey);
11461167 auto hashTableHandler = ObjectStore::retrieve<gluten::HashTableBuilder>(tableHandler);
1168+ auto * cache = facebook::velox::exec::HashTableCache::instance ();
1169+ if (!cache->exist (cacheKeyStr)) {
1170+ cache->add (
1171+ cacheKeyStr, hashTableHandler->hashTable (), hashTableHandler->joinHasNullKeys (), defaultLeafVeloxMemoryPool ());
1172+ }
1173+
11471174 return gluten::getHashTableObjStore ()->save (hashTableHandler);
11481175 JNI_METHOD_END (kInvalidObjectHandle )
11491176}
11501177
11511178JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_clearHashTable ( // NOLINT
11521179 JNIEnv* env,
11531180 jclass,
1181+ jstring cacheKey,
11541182 jlong tableHandler) {
11551183 JNI_METHOD_START
1156- auto hashTableHandler = ObjectStore::retrieve<gluten::HashTableBuilder>(tableHandler );
1157- hashTableHandler-> hashTable ()->clear ( true );
1184+ auto cacheKeyStr = jStringToCString (env, cacheKey );
1185+ facebook::velox::exec::HashTableCache::instance ()->drop (cacheKeyStr );
11581186 ObjectStore::release (tableHandler);
11591187 JNI_METHOD_END ()
11601188}
11611189
11621190JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_HashJoinBuilder_deserializeHashTableDirect ( // NOLINT
11631191 JNIEnv* env,
11641192 jclass,
1193+ jstring cacheKey,
11651194 jlong address,
11661195 jint size,
11671196 jboolean ignoreNullKeys,
11681197 jboolean joinHasNullKeys) {
11691198 JNI_METHOD_START
1199+ auto cacheKeyStr = jStringToCString (env, cacheKey);
11701200 auto builder = gluten::deserializeHashTable (
11711201 reinterpret_cast <const uint8_t *>(address),
11721202 static_cast <size_t >(size),
11731203 static_cast <bool >(ignoreNullKeys),
11741204 static_cast <bool >(joinHasNullKeys));
1205+ auto * cache = facebook::velox::exec::HashTableCache::instance ();
1206+ if (!cache->exist (cacheKeyStr)) {
1207+ cache->add (cacheKeyStr, builder->hashTable (), builder->joinHasNullKeys (), defaultLeafVeloxMemoryPool ());
1208+ }
11751209 return gluten::getHashTableObjStore ()->save (builder);
11761210 JNI_METHOD_END (kInvalidObjectHandle )
11771211}
0 commit comments