use crate::expr::Expr;
use crate::table_expr::TableExpr;
use crate::item::Field;
use crate::item::Table;
use crate::item::Ident;
use crate::item::Order;
use crate::item::Sort;
#[inline]
pub fn as_field<'a, E, A>(expr: E, alias: A) -> Field<'a>
where
E: Into<Expr<'a>>,
A: Into<Ident<'a>>,
{
Field {
expr: expr.into(),
alias: Some(alias.into()),
}
}
#[inline]
pub fn as_table<'a, T, A>(table: T, alias: A) -> Table<'a>
where
T: Into<TableExpr<'a>>,
A: Into<Ident<'a>>,
{
Table {
table: table.into(),
alias: Some(alias.into()),
}
}
#[inline]
pub fn paren<'a, E>(expr: E) -> Expr<'a>
where
E: Into<Expr<'a>>,
{
Expr::Paren(Box::new(expr.into()))
}
#[inline]
pub fn asc<'a, E: Into<Expr<'a>>>(expr: E) -> Order<'a> {
Order(expr.into(), Some(Sort::Asc))
}
#[inline]
pub fn desc<'a, E: Into<Expr<'a>>>(expr: E) -> Order<'a> {
Order(expr.into(), Some(Sort::Desc))
}
#[inline]
pub fn binop<'a, L, R>(left: L, op: &'static str, right: R) -> Expr<'a>
where
L: Into<Expr<'a>>,
R: Into<Expr<'a>>,
{
Expr::Infix(Box::new(left.into()), op, Box::new(right.into()))
}
#[inline]
pub fn preop<'a, E>(op: &'static str, expr: E) -> Expr<'a>
where
E: Into<Expr<'a>>,
{
Expr::Prefix(op, Box::new(expr.into()))
}
#[inline]
pub fn postop<'a, E>(expr: E, op: &'static str) -> Expr<'a>
where
E: Into<Expr<'a>>,
{
Expr::Postfix(Box::new(expr.into()), op)
}
macro_rules! generate_binop_funcs {
($trait:ident {$($(#[$comment:meta])* $name:ident: $op:expr),+}) => {
$(
$(#[$comment])*
#[inline]
pub fn $name<'a, L, R>(left: L, right: R) -> $crate::expr::Expr<'a>
where L: Into<$crate::expr::Expr<'a>>,
R: Into<$crate::expr::Expr<'a>>,
{
crate::expr::Expr::Infix(
Box::new(left.into()),
$op,
Box::new(right.into()),
)
}
)+
};
}
generate_binop_funcs!(BinOps {
add: "+",
sub: "-",
mul: "*",
div: "/",
rem: "%",
eq: "=",
ne: "<>",
gt: ">",
ge: ">=",
lt: "<",
le: "<=",
and: "AND",
or: "OR",
like: "LIKE",
ilike: "ILIKE"
});
#[inline]
pub fn not<'a, E>(expr: E) -> Expr<'a>
where
E: Into<Expr<'a>>,
{
preop("NOT", expr)
}
#[inline]
pub fn isnull<'a, E>(expr: E) -> Expr<'a>
where
E: Into<Expr<'a>>,
{
postop(expr, "ISNULL")
}
macro_rules! generate_join_funcs {
($(#[$comment:meta])* $join:ident $fn:ident) => {
$(#[$comment])*
#[inline]
pub fn $fn<'a, L, R>(left: L, right: R) -> crate::table_expr::TableExpr<'a>
where
L: Into<crate::table_expr::TableExpr<'a>>,
R: Into<crate::table_expr::TableExpr<'a>>,
{
crate::table_expr::TableExpr::$join(Box::new(left.into()), Box::new(right.into()))
}
};
($(#[$comment:meta])* $join:ident $fn:ident cond) => {
$(#[$comment])*
#[inline]
pub fn $fn<'a, L, R, E>(left: L, right: R, cond: E) -> crate::table_expr::TableExpr<'a>
where
L: Into<crate::table_expr::TableExpr<'a>>,
R: Into<crate::table_expr::TableExpr<'a>>,
E: Into<crate::expr::Expr<'a>>,
{
crate::table_expr::TableExpr::$join(
Box::new(left.into()),
Box::new(right.into()),
cond.into(),
)
}
};
}
generate_join_funcs!(
Join join cond);
generate_join_funcs!(
LeftJoin left_join cond);
generate_join_funcs!(
RightJoin right_join cond);
generate_join_funcs!(
FullJoin full_join cond);
generate_join_funcs!(
NaturalJoin natural_join);
generate_join_funcs!(
NaturalLeftJoin natural_left_join);
generate_join_funcs!(
NaturalRightJoin natural_right_join);
generate_join_funcs!(
NaturalFullJoin natural_full_join);
generate_join_funcs!(
CrossJoin cross_join);