fn find_window_fn()

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"
    )))
}