| 349 | } |
| 350 | |
| 351 | void IR_ALWAYS_INLINE PartitionedHashJoinNode::EvalAndHashProbePrefetchGroup( |
| 352 | TPrefetchMode::type prefetch_mode, HashTableCtx* ht_ctx) { |
| 353 | RowBatch* probe_batch = probe_batch_.get(); |
| 354 | HashTableCtx::ExprValuesCache* expr_vals_cache = ht_ctx->expr_values_cache(); |
| 355 | const int prefetch_size = expr_vals_cache->capacity(); |
| 356 | DCHECK(expr_vals_cache->AtEnd()); |
| 357 | |
| 358 | expr_vals_cache->Reset(); |
| 359 | FOREACH_ROW_LIMIT(probe_batch, probe_batch_pos_, prefetch_size, batch_iter) { |
| 360 | TupleRow* row = batch_iter.Get(); |
| 361 | if (ht_ctx->EvalAndHashProbe(row)) { |
| 362 | if (prefetch_mode != TPrefetchMode::NONE) { |
| 363 | uint32_t hash = expr_vals_cache->CurExprValuesHash(); |
| 364 | const uint32_t partition_idx = hash >> (32 - NUM_PARTITIONING_BITS); |
| 365 | HashTable* hash_tbl = hash_tbls_[partition_idx]; |
| 366 | if (LIKELY(hash_tbl != NULL)) hash_tbl->PrefetchBucket<true>(hash); |
| 367 | } |
| 368 | } else { |
| 369 | expr_vals_cache->SetRowNull(); |
| 370 | } |
| 371 | expr_vals_cache->NextRow(); |
| 372 | } |
| 373 | expr_vals_cache->ResetForRead(); |
| 374 | } |
| 375 | |
| 376 | // CreateOutputRow, EvalOtherJoinConjuncts, and EvalConjuncts are replaced by codegen. |
| 377 | template <int const JoinOp> |
nothing calls this directly
no test coverage detected