use sea_orm::sea_query::{Expr, SimpleExpr};
use super::custom_function;
pub fn now() -> SimpleExpr {
Expr::cust("CURRENT_TIMESTAMP")
}
pub fn extract(part: &str, expr: SimpleExpr) -> SimpleExpr {
Expr::cust_with_exprs(format!("EXTRACT({part} FROM ?)"), [expr])
}
pub fn trunc(part: &str, expr: SimpleExpr) -> SimpleExpr {
custom_function("DATE_TRUNC", vec![Expr::value(part), expr])
}
#[cfg(test)]
mod tests {
use super::{extract, now, trunc};
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_now() {
let sql = render_select_expr(now(), "current_time");
assert!(
sql.contains("CURRENT_TIMESTAMP"),
"expected CURRENT_TIMESTAMP SQL, got: {sql}"
);
}
#[test]
fn test_extract() {
let sql = render_select_expr(extract("YEAR", column("created_at")), "created_year");
assert!(
sql.contains("EXTRACT(YEAR FROM"),
"expected EXTRACT SQL, got: {sql}"
);
}
#[test]
fn test_trunc() {
let sql = render_select_expr(trunc("day", column("created_at")), "created_day");
assert!(
sql.contains("DATE_TRUNC"),
"expected DATE_TRUNC SQL, got: {sql}"
);
assert!(
sql.contains("'day'"),
"expected trunc precision literal, got: {sql}"
);
}
}