polars-expr 0.54.1

Physical expression implementation of the Polars project.
Documentation
use std::sync::Arc;

use polars_core::error::PolarsResult;
use polars_core::prelude::Column;
use polars_ops::series::Roll;
use polars_plan::dsl::{ColumnsUdf, SpecialEq};
use polars_plan::plans::IRBusinessFunction;

pub fn function_expr_to_udf(func: IRBusinessFunction) -> SpecialEq<Arc<dyn ColumnsUdf>> {
    use IRBusinessFunction::*;
    match func {
        BusinessDayCount { week_mask } => {
            map_as_slice!(business_day_count, week_mask)
        },
        AddBusinessDay { week_mask, roll } => {
            map_as_slice!(add_business_days, week_mask, roll)
        },
        IsBusinessDay { week_mask } => {
            map_as_slice!(is_business_day, week_mask)
        },
    }
}

pub(super) fn business_day_count(s: &[Column], week_mask: [bool; 7]) -> PolarsResult<Column> {
    let start = &s[0];
    let end = &s[1];
    let holidays = &s[2];
    polars_ops::prelude::business_day_count(
        start.as_materialized_series(),
        end.as_materialized_series(),
        week_mask,
        holidays.as_materialized_series(),
    )
    .map(Column::from)
}

pub(super) fn add_business_days(
    s: &[Column],
    week_mask: [bool; 7],
    roll: Roll,
) -> PolarsResult<Column> {
    let start = &s[0];
    let n = &s[1];
    let holidays = &s[2];
    polars_ops::prelude::add_business_days(
        start.as_materialized_series(),
        n.as_materialized_series(),
        week_mask,
        holidays.as_materialized_series(),
        roll,
    )
    .map(Column::from)
}

pub(super) fn is_business_day(s: &[Column], week_mask: [bool; 7]) -> PolarsResult<Column> {
    let dates = &s[0];
    let holidays = &s[1];
    polars_ops::prelude::is_business_day(
        dates.as_materialized_series(),
        week_mask,
        holidays.as_materialized_series(),
    )
    .map(Column::from)
}