use datafusion_common::ScalarValue;
use crate::{expr::WindowFunction, BuiltInWindowFunction, Expr, Literal};
pub fn rank() -> Expr {
Expr::WindowFunction(WindowFunction::new(BuiltInWindowFunction::Rank, vec![]))
}
pub fn dense_rank() -> Expr {
Expr::WindowFunction(WindowFunction::new(
BuiltInWindowFunction::DenseRank,
vec![],
))
}
pub fn percent_rank() -> Expr {
Expr::WindowFunction(WindowFunction::new(
BuiltInWindowFunction::PercentRank,
vec![],
))
}
pub fn cume_dist() -> Expr {
Expr::WindowFunction(WindowFunction::new(BuiltInWindowFunction::CumeDist, vec![]))
}
pub fn ntile(arg: Expr) -> Expr {
Expr::WindowFunction(WindowFunction::new(BuiltInWindowFunction::Ntile, vec![arg]))
}
pub fn lag(
arg: Expr,
shift_offset: Option<i64>,
default_value: Option<ScalarValue>,
) -> Expr {
let shift_offset_lit = shift_offset
.map(|v| v.lit())
.unwrap_or(ScalarValue::Null.lit());
let default_lit = default_value.unwrap_or(ScalarValue::Null).lit();
Expr::WindowFunction(WindowFunction::new(
BuiltInWindowFunction::Lag,
vec![arg, shift_offset_lit, default_lit],
))
}
pub fn lead(
arg: Expr,
shift_offset: Option<i64>,
default_value: Option<ScalarValue>,
) -> Expr {
let shift_offset_lit = shift_offset
.map(|v| v.lit())
.unwrap_or(ScalarValue::Null.lit());
let default_lit = default_value.unwrap_or(ScalarValue::Null).lit();
Expr::WindowFunction(WindowFunction::new(
BuiltInWindowFunction::Lead,
vec![arg, shift_offset_lit, default_lit],
))
}
pub fn nth_value(arg: Expr, n: i64) -> Expr {
Expr::WindowFunction(WindowFunction::new(
BuiltInWindowFunction::NthValue,
vec![arg, n.lit()],
))
}