use sea_orm::sea_query::SimpleExpr;
use super::custom_function;
pub fn row_number() -> SimpleExpr {
custom_function("ROW_NUMBER", Vec::new())
}
pub fn rank() -> SimpleExpr {
custom_function("RANK", Vec::new())
}
pub fn dense_rank() -> SimpleExpr {
custom_function("DENSE_RANK", Vec::new())
}
pub fn nth_value(expr: SimpleExpr, nth: SimpleExpr) -> SimpleExpr {
custom_function("NTH_VALUE", vec![expr, nth])
}
pub fn lead(expr: SimpleExpr, offset: SimpleExpr) -> SimpleExpr {
custom_function("LEAD", vec![expr, offset])
}
pub fn lag(expr: SimpleExpr, offset: SimpleExpr) -> SimpleExpr {
custom_function("LAG", vec![expr, offset])
}
pub fn first_value(expr: SimpleExpr) -> SimpleExpr {
custom_function("FIRST_VALUE", vec![expr])
}
pub fn last_value(expr: SimpleExpr) -> SimpleExpr {
custom_function("LAST_VALUE", vec![expr])
}
#[cfg(test)]
mod tests {
use super::{dense_rank, first_value, lag, last_value, lead, nth_value, rank, row_number};
use sea_orm::sea_query::{Alias, Expr, PostgresQueryBuilder, Query, SimpleExpr};
fn column(name: &str) -> SimpleExpr {
Expr::col(Alias::new(name)).into()
}
fn render_select_expr(expr: SimpleExpr, alias: &str) -> String {
Query::select()
.expr_as(expr, Alias::new(alias))
.from(Alias::new("widgets"))
.to_owned()
.to_string(PostgresQueryBuilder)
}
#[test]
fn test_row_number() {
let sql = render_select_expr(row_number(), "row_number");
assert!(
sql.contains("ROW_NUMBER"),
"expected ROW_NUMBER SQL, got: {sql}"
);
}
#[test]
fn test_rank() {
let sql = render_select_expr(rank(), "rank_value");
assert!(sql.contains("RANK"), "expected RANK SQL, got: {sql}");
}
#[test]
fn test_dense_rank() {
let sql = render_select_expr(dense_rank(), "dense_rank_value");
assert!(
sql.contains("DENSE_RANK"),
"expected DENSE_RANK SQL, got: {sql}"
);
}
#[test]
fn test_nth_value() {
let sql = render_select_expr(nth_value(column("score"), Expr::value(2)), "second_score");
assert!(
sql.contains("NTH_VALUE"),
"expected NTH_VALUE SQL, got: {sql}"
);
}
#[test]
fn test_lead() {
let sql = render_select_expr(lead(column("score"), Expr::value(1)), "next_score");
assert!(sql.contains("LEAD"), "expected LEAD SQL, got: {sql}");
}
#[test]
fn test_lag() {
let sql = render_select_expr(lag(column("score"), Expr::value(1)), "previous_score");
assert!(sql.contains("LAG"), "expected LAG SQL, got: {sql}");
}
#[test]
fn test_first_value() {
let sql = render_select_expr(first_value(column("score")), "first_score");
assert!(
sql.contains("FIRST_VALUE"),
"expected FIRST_VALUE SQL, got: {sql}"
);
}
#[test]
fn test_last_value() {
let sql = render_select_expr(last_value(column("score")), "last_score");
assert!(
sql.contains("LAST_VALUE"),
"expected LAST_VALUE SQL, got: {sql}"
);
}
}