MCPcopy Create free account
hub / github.com/ciphermodelabs/ciphercore / evaluate_join

Function evaluate_join

ciphercore-base/src/evaluators/join.rs:501–561  ·  view source on GitHub ↗
(
    join_t: JoinType,
    set0_tv: TypedValue,
    set1_tv: TypedValue,
    has_column_masks: bool,
    headers: &HashMap<String, String>,
    res_t: Type,
)

Source from the content-addressed store, hash-verified

499}
500
501pub(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 }

Callers 2

evaluate_nodeMethod · 0.85
evaluate_full_joinFunction · 0.85

Calls 10

evaluate_full_joinFunction · 0.85
get_named_typesFunction · 0.85
extract_columnsFunction · 0.85
get_inner_join_columnsFunction · 0.85
get_left_join_columnsFunction · 0.85
get_union_columnsFunction · 0.85
cloneMethod · 0.80
to_valueMethod · 0.80
pushMethod · 0.45

Tested by

no test coverage detected