MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / extract_equi_link

Function extract_equi_link

nodedb-sql/src/planner/cte.rs:435–469  ·  view source on GitHub ↗

Extract `(collection_field, cte_field)` from an equi-join ON clause.

(
    expr: &ast::Expr,
    real_alias: &str,
    cte_alias: &str,
)

Source from the content-addressed store, hash-verified

433
434/// Extract `(collection_field, cte_field)` from an equi-join ON clause.
435fn extract_equi_link(
436 expr: &ast::Expr,
437 real_alias: &str,
438 cte_alias: &str,
439) -> Option<(String, String)> {
440 match expr {
441 ast::Expr::BinaryOp {
442 left,
443 op: ast::BinaryOperator::Eq,
444 right,
445 } => {
446 let left_parts = extract_qualified_column(left)?;
447 let right_parts = extract_qualified_column(right)?;
448
449 if left_parts.0.eq_ignore_ascii_case(real_alias)
450 && right_parts.0.eq_ignore_ascii_case(cte_alias)
451 {
452 Some((left_parts.1, right_parts.1))
453 } else if right_parts.0.eq_ignore_ascii_case(real_alias)
454 && left_parts.0.eq_ignore_ascii_case(cte_alias)
455 {
456 Some((right_parts.1, left_parts.1))
457 } else {
458 None
459 }
460 }
461 ast::Expr::BinaryOp {
462 left,
463 op: ast::BinaryOperator::And,
464 right,
465 } => extract_equi_link(left, real_alias, cte_alias)
466 .or_else(|| extract_equi_link(right, real_alias, cte_alias)),
467 _ => None,
468 }
469}
470
471fn extract_qualified_column(expr: &ast::Expr) -> Option<(String, String)> {
472 match expr {

Callers 1

extract_recursive_infoFunction · 0.85

Calls 1

extract_qualified_columnFunction · 0.70

Tested by

no test coverage detected