(
set0: TypedValue,
set1: TypedValue,
has_column_masks: bool,
headers: &HashMap<String, String>,
res_t: Type,
)
| 442 | } |
| 443 | |
| 444 | fn evaluate_full_join( |
| 445 | set0: TypedValue, |
| 446 | set1: TypedValue, |
| 447 | has_column_masks: bool, |
| 448 | headers: &HashMap<String, String>, |
| 449 | res_t: Type, |
| 450 | ) -> Result<Value> { |
| 451 | // First, evaluate the left join of set1 and set0. |
| 452 | let num_rows1 = get_number_of_rows(&set1.t)?; |
| 453 | let headers_types0 = get_named_types(&set0.t)?; |
| 454 | // Resulting type of this left join. The columns of set1 go first, then the remaining columns of set0. |
| 455 | let left_join_t = { |
| 456 | let mut result_types_vec = vec![]; |
| 457 | let headers_types1 = get_named_types(&set1.t)?; |
| 458 | for (h, sub_t) in headers_types1 { |
| 459 | result_types_vec.push((h.clone(), (**sub_t).clone())); |
| 460 | } |
| 461 | for (h, sub_t) in headers_types0 { |
| 462 | if h != NULL_HEADER && !headers.contains_key(h) { |
| 463 | let column_t = ColumnType::new((**sub_t).clone(), has_column_masks, h)?; |
| 464 | let res_t = column_t.clone_with_number_of_entries(num_rows1); |
| 465 | result_types_vec.push((h.clone(), res_t.into())); |
| 466 | } |
| 467 | } |
| 468 | |
| 469 | named_tuple_type(result_types_vec) |
| 470 | }; |
| 471 | // The headers of the left join are the reversed input headers. |
| 472 | let mut left_join_headers = HashMap::new(); |
| 473 | for (h0, h1) in headers { |
| 474 | left_join_headers.insert(h1.clone(), h0.clone()); |
| 475 | } |
| 476 | |
| 477 | let left_join_value = evaluate_join( |
| 478 | JoinType::Left, |
| 479 | set1, |
| 480 | set0.clone(), |
| 481 | has_column_masks, |
| 482 | &left_join_headers, |
| 483 | left_join_t.clone(), |
| 484 | )?; |
| 485 | let left_join = TypedValue { |
| 486 | value: left_join_value, |
| 487 | t: left_join_t, |
| 488 | name: None, |
| 489 | }; |
| 490 | // Then, evaluate the union of set0 and the left join result |
| 491 | evaluate_join( |
| 492 | JoinType::Union, |
| 493 | set0, |
| 494 | left_join, |
| 495 | has_column_masks, |
| 496 | headers, |
| 497 | res_t, |
| 498 | ) |
| 499 | } |
| 500 | |
| 501 | pub(crate) fn evaluate_join( |
no test coverage detected