use polars_core::prelude::*;
use crate::dsl::function_expr::ArrayFunction;
use crate::prelude::*;
pub struct ArrayNameSpace(pub Expr);
impl ArrayNameSpace {
pub fn len(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Length))
}
pub fn max(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Max))
}
pub fn min(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Min))
}
pub fn sum(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Sum))
}
pub fn std(self, ddof: u8) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Std(ddof)))
}
pub fn var(self, ddof: u8) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Var(ddof)))
}
pub fn mean(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Mean))
}
pub fn median(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Median))
}
pub fn unique(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Unique(false)))
}
pub fn unique_stable(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Unique(true)))
}
pub fn n_unique(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::NUnique))
}
pub fn to_list(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::ToList))
}
#[cfg(feature = "array_any_all")]
pub fn all(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::All))
}
#[cfg(feature = "array_any_all")]
pub fn any(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Any))
}
pub fn sort(self, options: SortOptions) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Sort(options)))
}
pub fn reverse(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Reverse))
}
pub fn arg_min(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::ArgMin))
}
pub fn arg_max(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::ArgMax))
}
pub fn get(self, index: Expr, null_on_oob: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ArrayExpr(ArrayFunction::Get(null_on_oob)),
index,
)
}
pub fn join(self, separator: Expr, ignore_nulls: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ArrayExpr(ArrayFunction::Join(ignore_nulls)),
separator,
)
}
#[cfg(feature = "is_in")]
pub fn contains<E: Into<Expr>>(self, other: E, nulls_equal: bool) -> Expr {
self.0.map_binary(
FunctionExpr::ArrayExpr(ArrayFunction::Contains { nulls_equal }),
other.into(),
)
}
#[cfg(feature = "array_count")]
pub fn count_matches<E: Into<Expr>>(self, element: E) -> Expr {
self.0.map_binary(
FunctionExpr::ArrayExpr(ArrayFunction::CountMatches),
element.into(),
)
}
#[cfg(feature = "array_to_struct")]
pub fn to_struct(self, name_generator: Option<DslNameGenerator>) -> Expr {
self.0.map_unary(ArrayFunction::ToStruct(name_generator))
}
pub fn slice(self, offset: Expr, length: Expr, as_array: bool) -> PolarsResult<Expr> {
if as_array {
let Ok(offset) = offset.extract_i64() else {
polars_bail!(InvalidOperation: "Offset must be a constant `i64` value if `as_array=true`, got: {}", offset)
};
let Ok(length) = length.extract_i64() else {
polars_bail!(InvalidOperation: "Length must be a constant `i64` value if `as_array=true`, got: {}", length)
};
Ok(self
.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Slice(
offset, length,
))))
} else {
Ok(self
.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::ToList))
.map_ternary(FunctionExpr::ListExpr(ListFunction::Slice), offset, length))
}
}
pub fn head(self, n: Expr, as_array: bool) -> PolarsResult<Expr> {
self.slice(lit(0), n, as_array)
}
pub fn tail(self, n: Expr, as_array: bool) -> PolarsResult<Expr> {
self.slice(lit(0i64) - n.clone().cast(DataType::Int64), n, as_array)
}
pub fn shift(self, n: Expr) -> Expr {
self.0
.map_binary(FunctionExpr::ArrayExpr(ArrayFunction::Shift), n)
}
pub fn explode(self) -> Expr {
self.0
.map_unary(FunctionExpr::ArrayExpr(ArrayFunction::Explode {
skip_empty: false,
}))
}
}