use sea_orm::sea_query::{Alias, Expr, ExprTrait, SimpleExpr};
pub fn count(field: &str) -> SimpleExpr {
Expr::col(Alias::new(field)).count()
}
pub fn sum(field: &str) -> SimpleExpr {
Expr::col(Alias::new(field)).sum()
}
pub fn avg(field: &str) -> SimpleExpr {
Expr::col(Alias::new(field)).avg()
}
pub fn min(field: &str) -> SimpleExpr {
Expr::col(Alias::new(field)).min()
}
pub fn max(field: &str) -> SimpleExpr {
Expr::col(Alias::new(field)).max()
}
pub fn count_star() -> SimpleExpr {
Expr::col(Alias::new("*")).count()
}
#[cfg(test)]
mod tests {
use sea_orm::sea_query::{Alias, Query, SimpleExpr, SqliteQueryBuilder};
use super::{avg, count, count_star, max, min, sum};
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(SqliteQueryBuilder)
}
#[test]
fn aggregate_helpers_render_sql_functions() {
let count_sql = render_select_expr(count("id"), "total");
let sum_sql = render_select_expr(sum("amount"), "total_amount");
let avg_sql = render_select_expr(avg("score"), "average_score");
let min_sql = render_select_expr(min("price"), "lowest_price");
let max_sql = render_select_expr(max("price"), "highest_price");
let count_star_sql = render_select_expr(count_star(), "all_rows");
assert!(
count_sql.contains("COUNT(\"id\")"),
"expected COUNT SQL, got: {count_sql}"
);
assert!(
sum_sql.contains("SUM(\"amount\")"),
"expected SUM SQL, got: {sum_sql}"
);
assert!(
avg_sql.contains("AVG(\"score\")"),
"expected AVG SQL, got: {avg_sql}"
);
assert!(
min_sql.contains("MIN(\"price\")"),
"expected MIN SQL, got: {min_sql}"
);
assert!(
max_sql.contains("MAX(\"price\")"),
"expected MAX SQL, got: {max_sql}"
);
assert!(
count_star_sql.contains("COUNT("),
"expected COUNT in count_star SQL, got: {count_star_sql}"
);
assert!(
count_star_sql.contains("*"),
"expected star in count_star SQL, got: {count_star_sql}"
);
}
}