27 const size_t key_bytes) {
28 for (
size_t i = 0; i < key_bytes; ++i) {
29 if (entry[i] != key[i]) {
47 const size_t key_bytes) {
48 const auto lookup_result_ptr = hash_buff + h * (key_bytes +
sizeof(
T));
50 return *
reinterpret_cast<const T*
>(lookup_result_ptr + key_bytes);
52 if (*reinterpret_cast<const T*>(lookup_result_ptr) ==
62 const size_t key_bytes,
63 const size_t entry_count) {
67 const uint32_t h =
MurmurHash1(key, key_bytes, 0) % entry_count;
68 int64_t matching_slot = get_matching_slot<T>(hash_buff, h, key, key_bytes);
72 uint32_t h_probe = (h + 1) % entry_count;
73 while (h_probe != h) {
74 matching_slot = get_matching_slot<T>(hash_buff, h_probe, key, key_bytes);
78 h_probe = (h_probe + 1) % entry_count;
86 const size_t key_bytes,
87 const size_t entry_count) {
88 return baseline_hash_join_idx_impl<int32_t>(hash_buff, key, key_bytes, entry_count);
94 const size_t key_bytes,
95 const size_t entry_count) {
96 return baseline_hash_join_idx_impl<int64_t>(hash_buff, key, key_bytes, entry_count);
101 const double bucket_size) {
102 return static_cast<int64_t
>(floor(static_cast<double>(value) * bucket_size));
107 const size_t range_component_index,
108 const double bucket_size) {
109 const auto range =
reinterpret_cast<const double*
>(range_bytes);
115 const size_t range_component_index,
116 const double bucket_size) {
117 const auto range_ptr =
reinterpret_cast<const int32_t*
>(range);
118 if (range_component_index % 2 == 0) {
131 const size_t range_component_index,
132 const double bucket_size) {
134 range, range_component_index, bucket_size);
137 template <
typename T>
139 const size_t key_component_count,
140 const T* composite_key_dict,
141 const size_t entry_count) {
142 const uint32_t h =
MurmurHash1(key, key_component_count *
sizeof(
T), 0) % entry_count;
143 uint32_t off = h * key_component_count;
144 if (
keys_are_equal(&composite_key_dict[off], key, key_component_count)) {
147 uint32_t h_probe = (h + 1) % entry_count;
148 while (h_probe != h) {
149 off = h_probe * key_component_count;
150 if (
keys_are_equal(&composite_key_dict[off], key, key_component_count)) {
156 h_probe = (h_probe + 1) % entry_count;
163 const size_t key_component_count,
164 const int32_t* composite_key_dict,
165 const size_t entry_count) {
167 key, key_component_count, composite_key_dict, entry_count);
172 const size_t key_component_count,
173 const int64_t* composite_key_dict,
174 const size_t entry_count) {
176 key, key_component_count, composite_key_dict, entry_count);
182 for (
size_t i = 0; i < elem_count; i++) {
183 if (elem == arr[i]) {
191 for (
size_t j = elem_count; i < j; j--) {
198 arr[elem_count] = elem;
205 const int64_t min_key,
206 const int64_t max_key) {
207 if (key >= min_key && key <= max_key) {
208 return *(
reinterpret_cast<int32_t*
>(hash_buff) + (key - min_key));
221 const int64_t key_component_count,
222 const int64_t entry_count,
223 const int64_t offset_buffer_ptr_offset,
224 const int64_t sub_buff_size) {
225 const int64_t min_key = 0;
226 const int64_t max_key = entry_count - 1;
235 int8_t* one_to_many_ptr =
reinterpret_cast<int8_t*
>(hash_table_ptr);
236 one_to_many_ptr += offset_buffer_ptr_offset;
240 reinterpret_cast<int64_t>(one_to_many_ptr), key_idx, min_key, max_key);
246 int8_t* count_ptr = one_to_many_ptr + sub_buff_size;
249 reinterpret_cast<int64_t>(count_ptr), key_idx, min_key, max_key);
252 int32_t* rowid_buffer = (int32_t*)(one_to_many_ptr + 2 * sub_buff_size);
253 const auto rowidoff_ptr = &rowid_buffer[slot];
255 return BufferRange{rowidoff_ptr, matched_row_count};
292 const uint32_t max_arr_size,
293 const int8_t* range_bytes,
294 const int32_t range_component_index,
295 const double bucket_size_x,
296 const double bucket_size_y,
297 const int32_t keys_count,
298 const int64_t key_component_count,
299 int64_t* hash_table_ptr,
300 const int64_t entry_count,
301 const int64_t offset_buffer_ptr_offset,
302 const int64_t sub_buff_size,
303 const int32_t max_bbox_overlaps_error_code) {
304 const auto range =
reinterpret_cast<const double*
>(range_bytes);
306 size_t elem_count = 0;
308 const auto bounds =
Bounds{range[0], range[1], range[2], range[3]};
310 for (int64_t x = floor(bounds.min_X * bucket_size_x);
311 x <= floor(bounds.max_X * bucket_size_x);
313 for (int64_t y = floor(bounds.min_Y * bucket_size_y);
314 y <= floor(bounds.max_Y * bucket_size_y);
317 cur_key[0] =
static_cast<int64_t
>(x);
318 cur_key[1] =
static_cast<int64_t
>(y);
324 offset_buffer_ptr_offset,
327 for (int64_t j = 0; j < buffer_range.element_count; j++) {
328 const auto rowid = buffer_range.buffer[j];
330 if (elem_count > max_arr_size) {
331 *error_code = max_bbox_overlaps_error_code;
346 const int32_t range_component_index,
347 const double bucket_size_x,
348 const double bucket_size_y) {
349 const auto range =
reinterpret_cast<const double*
>(range_bytes);
351 const auto bounds_min_x = range[0];
352 const auto bounds_min_y = range[1];
353 const auto bounds_max_x = range[2];
354 const auto bounds_max_y = range[3];
357 floor(bounds_max_x * bucket_size_x) - floor(bounds_min_x * bucket_size_x);
359 floor(bounds_max_y * bucket_size_y) - floor(bounds_min_y * bucket_size_y);
360 const auto num_buckets = (num_x + 1) * (num_y + 1);
DEVICE bool compare_to_key(const int8_t *entry, const int8_t *key, const size_t key_bytes)
ALWAYS_INLINE DEVICE BufferRange get_row_id_buffer_ptr(int64_t *hash_table_ptr, const int64_t *key, const int64_t key_component_count, const int64_t entry_count, const int64_t offset_buffer_ptr_offset, const int64_t sub_buff_size)
bool keys_are_equal(const T *key1, const T *key2, const size_t key_component_count)
DEVICE double decompress_latitude_coord_geoint32(const int32_t compressed)
DEVICE int64_t get_matching_slot(const int8_t *hash_buff, const uint32_t h, const int8_t *key, const size_t key_bytes)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t get_composite_key_index_64(const int64_t *key, const size_t key_component_count, const int64_t *composite_key_dict, const size_t entry_count)
RUNTIME_EXPORT NEVER_INLINE DEVICE int32_t insert_sorted(int32_t *arr, size_t elem_count, int32_t elem)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t get_bucket_key_for_range_double(const int8_t *range_bytes, const size_t range_component_index, const double bucket_size)
FORCE_INLINE DEVICE int64_t get_bucket_key_for_value_impl(const T value, const double bucket_size)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t baseline_hash_join_idx_32(const int8_t *hash_buff, const int8_t *key, const size_t key_bytes, const size_t entry_count)
DEVICE T SUFFIX() get_invalid_key()
const int64_t element_count
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t get_candidate_rows(int32_t *out_arr, int32_t *error_code, const uint32_t max_arr_size, const int8_t *range_bytes, const int32_t range_component_index, const double bucket_size_x, const double bucket_size_y, const int32_t keys_count, const int64_t key_component_count, int64_t *hash_table_ptr, const int64_t entry_count, const int64_t offset_buffer_ptr_offset, const int64_t sub_buff_size, const int32_t max_bbox_overlaps_error_code)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t get_bucket_key_for_range_compressed(const int8_t *range, const size_t range_component_index, const double bucket_size)
RUNTIME_EXPORT NEVER_INLINE DEVICE uint32_t MurmurHash1(const void *key, int len, const uint32_t seed)
DEVICE double decompress_longitude_coord_geoint32(const int32_t compressed)
FORCE_INLINE DEVICE int64_t get_bucket_key_for_range_compressed_impl(const int8_t *range, const size_t range_component_index, const double bucket_size)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t get_composite_key_index_32(const int32_t *key, const size_t key_component_count, const int32_t *composite_key_dict, const size_t entry_count)
FORCE_INLINE DEVICE int64_t baseline_hash_join_idx_impl(const int8_t *hash_buff, const int8_t *key, const size_t key_bytes, const size_t entry_count)
RUNTIME_EXPORT NEVER_INLINE DEVICE int32_t get_num_buckets_for_bounds(const int8_t *range_bytes, const int32_t range_component_index, const double bucket_size_x, const double bucket_size_y)
FORCE_INLINE DEVICE int64_t get_composite_key_index_impl(const T *key, const size_t key_component_count, const T *composite_key_dict, const size_t entry_count)
RUNTIME_EXPORT NEVER_INLINE DEVICE int64_t baseline_hash_join_idx_64(const int8_t *hash_buff, const int8_t *key, const size_t key_bytes, const size_t entry_count)
RUNTIME_EXPORT ALWAYS_INLINE DEVICE int64_t bbox_intersect_hash_join_idx(int64_t hash_buff, const int64_t key, const int64_t min_key, const int64_t max_key)