rjango 0.1.1

A full-stack Rust backend framework inspired by Django
Documentation
use sea_orm::sea_query::SimpleExpr;

use super::custom_function;

/// SQL ROW_NUMBER().
pub fn row_number() -> SimpleExpr {
    custom_function("ROW_NUMBER", Vec::new())
}

/// SQL RANK().
pub fn rank() -> SimpleExpr {
    custom_function("RANK", Vec::new())
}

/// SQL DENSE_RANK().
pub fn dense_rank() -> SimpleExpr {
    custom_function("DENSE_RANK", Vec::new())
}

/// SQL NTH_VALUE(expr, nth).
pub fn nth_value(expr: SimpleExpr, nth: SimpleExpr) -> SimpleExpr {
    custom_function("NTH_VALUE", vec![expr, nth])
}

/// SQL LEAD(expr, offset).
pub fn lead(expr: SimpleExpr, offset: SimpleExpr) -> SimpleExpr {
    custom_function("LEAD", vec![expr, offset])
}

/// SQL LAG(expr, offset).
pub fn lag(expr: SimpleExpr, offset: SimpleExpr) -> SimpleExpr {
    custom_function("LAG", vec![expr, offset])
}

/// SQL FIRST_VALUE(expr).
pub fn first_value(expr: SimpleExpr) -> SimpleExpr {
    custom_function("FIRST_VALUE", vec![expr])
}

/// SQL LAST_VALUE(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}"
        );
    }
}