25 const std::vector<InputTableInfo>& query_infos,
28 const size_t entry_count,
31 const std::vector<InnerOuter>& inner_outer_pairs,
32 const int device_count)
47 static std::shared_ptr<OverlapsJoinHashTable>
getInstance(
48 const std::shared_ptr<Analyzer::BinOper> condition,
49 const std::vector<InputTableInfo>& query_infos,
51 const int device_count,
68 const size_t entry_count,
69 const size_t emitted_keys_count,
78 std::vector<ColumnsForDevice>& columns_per_device);
81 size_t emitted_keys_count,
82 size_t entry_count)
const;
85 const std::vector<Fragmenter_Namespace::FragmentInfo>& fragments,
90 const std::vector<JoinColumn>& join_columns,
91 const std::vector<JoinColumnTypeInfo>& join_column_types,
95 const std::vector<ColumnsForDevice>&)
const;
107 return hash_table->getLayout();
117 const std::vector<JoinColumnTypeInfo>& join_column_types,
118 const std::vector<JoinBucketInfo>& join_bucket_info,
120 const size_t entry_count,
121 const size_t emitted_keys_count);
124 const size_t)
override;
127 const int device_id = 0,
128 bool raw =
false)
const override;
131 const int device_id)
const override;
145 return hash_table->getEntryCount();
151 return hash_table->getEmittedKeysCount();
158 return hash_table->getEntryCount() *
sizeof(int32_t);
170 const std::vector<InnerOuter>& inner_outer_pairs)
const {
179 return first_inner_col->get_rte_idx();
184 CHECK(key_component_width == 4 || key_component_width == 8);
187 return getEntryCount() * key_component_count * key_component_width;
189 return getEntryCount() * (key_component_count + 1) * key_component_width;
219 std::shared_ptr<HashTable>& hash_table);
224 const std::vector<InnerOuter>& inner_outer_pairs);
242 std::optional<HashType>
246 static std::unique_ptr<HashTableCache<HashTableCacheKey, HashTableCacheValue>>
llvm::Value * codegenKey(const CompilationOptions &)
std::shared_ptr< HashTable > initHashTableOnCpuFromCache(const HashTableCacheKey &key)
static std::unique_ptr< HashTableCache< HashTableCacheKey, HashTableCacheValue > > hash_table_cache_
std::vector< double > bucket_sizes_for_dimension_
int getInnerTableId() const noexceptoverride
void reifyWithLayout(const HashType layout)
std::string toString(const ExecutorDeviceType device_type, const int device_id=0, bool raw=false) const override
static std::mutex auto_tuner_cache_mutex_
size_t getEntryCount() const
std::string getHashJoinType() const final
static std::shared_ptr< OverlapsJoinHashTable > getInstance(const std::shared_ptr< Analyzer::BinOper > condition, const std::vector< InputTableInfo > &query_infos, const Data_Namespace::MemoryLevel memory_level, const int device_count, ColumnCacheMap &column_cache, Executor *executor)
Make hash table from an in-flight SQL query's parse tree etc.
void reifyForDevice(const ColumnsForDevice &columns_for_device, const HashType layout, const size_t entry_count, const size_t emitted_keys_count, const int device_id, const logger::ThreadId parent_thread_id)
int getInnerTableRteIdx() const noexceptoverride
std::pair< size_t, size_t > calculateCounts(size_t shard_count, const Fragmenter_Namespace::TableInfo &query_info, std::vector< ColumnsForDevice > &columns_per_device)
double overlaps_hashjoin_bucket_threshold_
std::vector< std::shared_ptr< HashTable > > hash_tables_for_device_
virtual ~OverlapsJoinHashTable()
void initHashTableOnCpu(const std::vector< JoinColumn > &join_columns, const std::vector< JoinColumnTypeInfo > &join_column_types, const std::vector< JoinBucketInfo > &join_bucket_info, const HashType layout, const size_t entry_count, const size_t emitted_keys_count)
Data_Namespace::MemoryLevel getMemoryLevel() const noexceptoverride
HashType getHashType() const noexceptoverride
size_t calculateHashTableSize(size_t number_of_dimensions, size_t emitted_keys_count, size_t entry_count) const
const std::shared_ptr< Analyzer::BinOper > condition_
int getDeviceCount() const noexceptoverride
std::vector< JoinBucketInfo > computeBucketInfo(const std::vector< JoinColumn > &join_columns, const std::vector< JoinColumnTypeInfo > &join_column_types, const int device_id)
void reify(const HashType preferred_layout)
void computeBucketSizes(std::vector< double > &bucket_sizes_for_dimension, const JoinColumn &join_column, const JoinColumnTypeInfo &join_column_type, const std::vector< InnerOuter > &inner_outer_pairs)
ColumnCacheMap & column_cache_
const std::vector< InputTableInfo > & query_infos_
size_t payloadBufferOff() const noexceptoverride
DecodedJoinHashBufferSet toSet(const ExecutorDeviceType device_type, const int device_id) const override
void putHashTableOnCpuToCache(const HashTableCacheKey &key, std::shared_ptr< HashTable > &hash_table)
static std::map< HashTableCacheKey, double > auto_tuner_cache_
std::vector< llvm::Value * > codegenManyKey(const CompilationOptions &)
std::shared_ptr< HashTable > HashTableCacheValue
std::unordered_map< int, std::unordered_map< int, std::shared_ptr< const ColumnarResults >>> ColumnCacheMap
HashTable * getHashTableForDevice(const size_t device_id) const
std::optional< HashType > layout_override_
llvm::Value * codegenSlot(const CompilationOptions &, const size_t) override
std::set< DecodedJoinHashBufferEntry > DecodedJoinHashBufferSet
ColumnsForDevice fetchColumnsForDevice(const std::vector< Fragmenter_Namespace::FragmentInfo > &fragments, const int device_id, DeviceAllocator *dev_buff_owner)
size_t getKeyComponentCount() const
HashJoinMatchingSet codegenMatchingSet(const CompilationOptions &, const size_t) override
size_t offsetBufferOff() const noexceptoverride
size_t countBufferOff() const noexceptoverride
std::pair< std::optional< size_t >, size_t > getApproximateTupleCountFromCache(const HashTableCacheKey &) const
size_t shardCount() const
std::pair< size_t, size_t > approximateTupleCount(const std::vector< ColumnsForDevice > &) const
const Data_Namespace::MemoryLevel memory_level_
size_t getEmittedKeysCount() const
size_t getComponentBufferSize() const noexceptoverride
std::vector< InnerOuter > inner_outer_pairs_
static auto getCacheInvalidator() -> std::function< void()>
static size_t getShardCountForCondition(const Analyzer::BinOper *condition, const Executor *executor, const std::vector< InnerOuter > &inner_outer_pairs)
Data_Namespace::MemoryLevel getEffectiveMemoryLevel(const std::vector< InnerOuter > &inner_outer_pairs) const
OverlapsJoinHashTable(const std::shared_ptr< Analyzer::BinOper > condition, const std::vector< InputTableInfo > &query_infos, const Data_Namespace::MemoryLevel memory_level, HashType hash_layout_type, const size_t entry_count, ColumnCacheMap &column_cache, Executor *executor, const std::vector< InnerOuter > &inner_outer_pairs, const int device_count)
size_t getKeyComponentWidth() const
size_t getKeyBufferSize() const noexcept
static bool layoutRequiresAdditionalBuffers(HashType layout) noexcept