in src/functions.rs [255:317]
fn find_window_fn(
name: &str,
ctx: Option<PySessionContext>,
) -> PyDataFusionResult<WindowFunctionDefinition> {
if let Some(ctx) = ctx {
// search UDAFs
let udaf = ctx
.ctx
.udaf(name)
.map(WindowFunctionDefinition::AggregateUDF)
.ok();
if let Some(udaf) = udaf {
return Ok(udaf);
}
let session_state = ctx.ctx.state();
// search registered window functions
let window_fn = session_state
.window_functions()
.get(name)
.map(|f| WindowFunctionDefinition::WindowUDF(f.clone()));
if let Some(window_fn) = window_fn {
return Ok(window_fn);
}
// search registered aggregate functions
let agg_fn = session_state
.aggregate_functions()
.get(name)
.map(|f| WindowFunctionDefinition::AggregateUDF(f.clone()));
if let Some(agg_fn) = agg_fn {
return Ok(agg_fn);
}
}
// search default aggregate functions
let agg_fn = all_default_aggregate_functions()
.iter()
.find(|v| v.name() == name || v.aliases().contains(&name.to_string()))
.map(|f| WindowFunctionDefinition::AggregateUDF(f.clone()));
if let Some(agg_fn) = agg_fn {
return Ok(agg_fn);
}
// search default window functions
let window_fn = all_default_window_functions()
.iter()
.find(|v| v.name() == name || v.aliases().contains(&name.to_string()))
.map(|f| WindowFunctionDefinition::WindowUDF(f.clone()));
if let Some(window_fn) = window_fn {
return Ok(window_fn);
}
Err(PyDataFusionError::Common(format!(
"window function `{name}` not found"
)))
}