diesel/pg/expression/
array_comparison.rsuse expression::subselect::Subselect;
use expression::{AsExpression, Expression, NonAggregate};
use pg::Pg;
use query_builder::*;
use result::QueryResult;
use sql_types::Array;
pub fn any<ST, T>(vals: T) -> Any<T::Expression>
where
T: AsArrayExpression<ST>,
{
Any::new(vals.as_expression())
}
pub fn all<ST, T>(vals: T) -> All<T::Expression>
where
T: AsArrayExpression<ST>,
{
All::new(vals.as_expression())
}
#[doc(hidden)]
#[derive(Debug, Copy, Clone, QueryId)]
pub struct Any<Expr> {
expr: Expr,
}
impl<Expr> Any<Expr> {
fn new(expr: Expr) -> Self {
Any { expr: expr }
}
}
impl<Expr, ST> Expression for Any<Expr>
where
Expr: Expression<SqlType = Array<ST>>,
{
type SqlType = ST;
}
impl<Expr> QueryFragment<Pg> for Any<Expr>
where
Expr: QueryFragment<Pg>,
{
fn walk_ast(&self, mut out: AstPass<Pg>) -> QueryResult<()> {
out.push_sql("ANY(");
self.expr.walk_ast(out.reborrow())?;
out.push_sql(")");
Ok(())
}
}
impl_selectable_expression!(Any<Expr>);
impl<Expr> NonAggregate for Any<Expr> where Expr: NonAggregate {}
#[doc(hidden)]
#[derive(Debug, Copy, Clone, QueryId)]
pub struct All<Expr> {
expr: Expr,
}
impl<Expr> All<Expr> {
fn new(expr: Expr) -> Self {
All { expr: expr }
}
}
impl<Expr, ST> Expression for All<Expr>
where
Expr: Expression<SqlType = Array<ST>>,
{
type SqlType = ST;
}
impl<Expr> QueryFragment<Pg> for All<Expr>
where
Expr: QueryFragment<Pg>,
{
fn walk_ast(&self, mut out: AstPass<Pg>) -> QueryResult<()> {
out.push_sql("ALL(");
self.expr.walk_ast(out.reborrow())?;
out.push_sql(")");
Ok(())
}
}
impl_selectable_expression!(All<Expr>);
impl<Expr> NonAggregate for All<Expr> where Expr: NonAggregate {}
pub trait AsArrayExpression<ST> {
type Expression: Expression<SqlType = Array<ST>>;
fn as_expression(self) -> Self::Expression;
}
impl<ST, T> AsArrayExpression<ST> for T
where
T: AsExpression<Array<ST>>,
{
type Expression = <T as AsExpression<Array<ST>>>::Expression;
fn as_expression(self) -> Self::Expression {
AsExpression::as_expression(self)
}
}
impl<ST, S, F, W, O, L, Of, G, FU> AsArrayExpression<ST>
for SelectStatement<S, F, W, O, L, Of, G, FU>
where
Self: SelectQuery<SqlType = ST>,
{
type Expression = Subselect<Self, Array<ST>>;
fn as_expression(self) -> Self::Expression {
Subselect::new(self)
}
}
impl<'a, ST, QS, DB> AsArrayExpression<ST> for BoxedSelectStatement<'a, ST, QS, DB>
where
Self: SelectQuery<SqlType = ST>,
{
type Expression = Subselect<Self, Array<ST>>;
fn as_expression(self) -> Self::Expression {
Subselect::new(self)
}
}