MCPcopy Create free account
hub / github.com/apache/datafusion / resolve_lambda_variables

Function resolve_lambda_variables

datafusion/expr/src/higher_order_function.rs:1112–1148  ·  view source on GitHub ↗
(
    expr: Expr,
    schema: &DFSchema,
    // a map of lambda variable name => a never empty stack of fields [ [..shadowed], in_scope ]
    vars: &mut HashMap<String, Vec<FieldRef>>,
)

Source from the content-addressed store, hash-verified

1110}
1111
1112pub(crate) fn resolve_lambda_variables(
1113 expr: Expr,
1114 schema: &DFSchema,
1115 // a map of lambda variable name => a never empty stack of fields [ [..shadowed], in_scope ]
1116 vars: &mut HashMap<String, Vec<FieldRef>>,
1117) -> Result<Transformed<Expr>> {
1118 expr.transform_down(|expr| match expr {
1119 Expr::HigherOrderFunction(HigherOrderFunction { func, args }) => {
1120 // not inlined to reduce nesting
1121 resolve_higher_order_function(func, args, schema, vars)
1122 }
1123 Expr::LambdaVariable(mut var) => {
1124 let field_stack = vars.get(&var.name).ok_or_else(|| {
1125 plan_datafusion_err!(
1126 "missing field of lambda variable {} while resolving",
1127 var.name
1128 )
1129 })?;
1130
1131 let field = field_stack.last().ok_or_else(|| {
1132 internal_datafusion_err!("every entry should have at least one field")
1133 })?;
1134
1135 let field = Arc::clone(field).renamed(&var.name);
1136
1137 let transformed = var.field.as_ref().is_none_or(|old| old != &field);
1138
1139 var.field = Some(field);
1140
1141 Ok(Transformed::new_transformed(
1142 Expr::LambdaVariable(var),
1143 transformed,
1144 ))
1145 }
1146 _ => Ok(Transformed::no(expr)),
1147 })
1148}
1149
1150fn resolve_higher_order_function(
1151 func: Arc<HigherOrderUDF>,

Callers 2

Calls 7

transform_downMethod · 0.80
lastMethod · 0.80
renamedMethod · 0.80
LambdaVariableClass · 0.70
getMethod · 0.45
as_refMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…