(
join_t: JoinType,
set0_tv: TypedValue,
set1_tv: TypedValue,
has_column_masks: bool,
headers: &HashMap<String, String>,
res_t: Type,
)
| 499 | } |
| 500 | |
| 501 | pub(crate) fn evaluate_join( |
| 502 | join_t: JoinType, |
| 503 | set0_tv: TypedValue, |
| 504 | set1_tv: TypedValue, |
| 505 | has_column_masks: bool, |
| 506 | headers: &HashMap<String, String>, |
| 507 | res_t: Type, |
| 508 | ) -> Result<Value> { |
| 509 | if join_t == JoinType::Full { |
| 510 | return evaluate_full_join(set0_tv, set1_tv, has_column_masks, headers, res_t); |
| 511 | } |
| 512 | let headers_types1 = get_named_types(&set1_tv.t)?; |
| 513 | // Extract columns of the second set |
| 514 | let set1 = extract_columns(&set1_tv, headers_types1, has_column_masks)?; |
| 515 | |
| 516 | let (key_headers0, key_headers1): (Vec<_>, Vec<_>) = headers.clone().into_iter().unzip(); |
| 517 | // Key columns of the second set are merged and added to the hash map along with the corresponding rows |
| 518 | let key_data_hashmap1 = get_hashmap_from_key_columns(&set1, &key_headers1)?; |
| 519 | |
| 520 | let headers_types0 = get_named_types(&set0_tv.t)?; |
| 521 | // Extract columns of the first set |
| 522 | let set0 = extract_columns(&set0_tv, headers_types0, has_column_masks)?; |
| 523 | |
| 524 | let result_headers_types = get_named_types(&res_t)?; |
| 525 | |
| 526 | let mut nonkey_headers1 = vec![]; |
| 527 | for (h, _) in headers_types1 { |
| 528 | if h != NULL_HEADER && !key_headers1.contains(h) { |
| 529 | nonkey_headers1.push((*h).clone()); |
| 530 | } |
| 531 | } |
| 532 | let mut same_headers = vec![]; |
| 533 | for (h, _) in headers_types0 { |
| 534 | if nonkey_headers1.contains(h) { |
| 535 | same_headers.push((*h).clone()); |
| 536 | } |
| 537 | } |
| 538 | |
| 539 | let join_input = JoinInput { |
| 540 | set0, |
| 541 | set1, |
| 542 | headers_types0, |
| 543 | key_headers0, |
| 544 | nonkey_headers1, |
| 545 | key_headers_map: headers.clone(), |
| 546 | key_data_hashmap1, |
| 547 | result_headers_types, |
| 548 | same_headers, |
| 549 | }; |
| 550 | |
| 551 | let res_columns = match join_t { |
| 552 | JoinType::Inner => get_inner_join_columns(&join_input)?, |
| 553 | JoinType::Left => get_left_join_columns(&join_input)?, |
| 554 | JoinType::Union => get_union_columns(&join_input)?, |
| 555 | JoinType::Full => { |
| 556 | // Full join is computed via left and union joins |
| 557 | return Err(runtime_error!("Shouldn't be here")); |
| 558 | } |
no test coverage detected