diesel/expression/functions/
aggregate_folding.rs1#[cfg(doc)]
2use super::aggregate_expressions::{AggregateExpressionMethods, WindowExpressionMethods};
3use crate::expression::functions::declare_sql_function;
4use crate::sql_types::Foldable;
5
6#[doc(hidden)]
#[allow(non_camel_case_types, non_snake_case, unused_imports)]
pub(crate) mod avg_utils {
use diesel::{self, QueryResult};
use diesel::expression::{
AsExpression, Expression, SelectableExpression, AppearsOnTable,
ValidGrouping,
};
use diesel::query_builder::{QueryFragment, AstPass};
use diesel::sql_types::*;
use diesel::internal::sql_functions::*;
use super::*;
pub struct avg<ST, expr> {
pub(in super) expr: expr,
pub(in super) ST: ::std::marker::PhantomData<ST>,
}
const _: () =
{
use diesel;
use diesel::internal::derives::numeric_ops as ops;
use diesel::expression::{Expression, AsExpression};
use diesel::sql_types::ops::{Add, Sub, Mul, Div};
use diesel::sql_types::{SqlType, SingleValue};
impl<ST, expr, __Rhs> ::std::ops::Add<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Add,
<<Self as Expression>::SqlType as Add>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Add>::Rhs> {
type Output = ops::Add<Self, __Rhs::Expression>;
fn add(self, rhs: __Rhs) -> Self::Output {
ops::Add::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Sub<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Sub,
<<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Sub>::Rhs> {
type Output = ops::Sub<Self, __Rhs::Expression>;
fn sub(self, rhs: __Rhs) -> Self::Output {
ops::Sub::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Mul<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Mul,
<<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Mul>::Rhs> {
type Output = ops::Mul<Self, __Rhs::Expression>;
fn mul(self, rhs: __Rhs) -> Self::Output {
ops::Mul::new(self, rhs.as_expression())
}
}
impl<ST, expr, __Rhs> ::std::ops::Div<__Rhs> for avg<ST, expr>
where Self: Expression, Self: Expression,
<Self as Expression>::SqlType: Div,
<<Self as Expression>::SqlType as Div>::Rhs: SqlType +
SingleValue,
__Rhs: AsExpression<<<Self as Expression>::SqlType as
Div>::Rhs> {
type Output = ops::Div<Self, __Rhs::Expression>;
fn div(self, rhs: __Rhs) -> Self::Output {
ops::Div::new(self, rhs.as_expression())
}
}
};
#[automatically_derived]
impl<ST: ::core::fmt::Debug, expr: ::core::fmt::Debug> ::core::fmt::Debug
for avg<ST, expr> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "avg",
"expr", &self.expr, "ST", &&self.ST)
}
}
#[automatically_derived]
impl<ST: ::core::clone::Clone, expr: ::core::clone::Clone>
::core::clone::Clone for avg<ST, expr> {
#[inline]
fn clone(&self) -> avg<ST, expr> {
avg {
expr: ::core::clone::Clone::clone(&self.expr),
ST: ::core::clone::Clone::clone(&self.ST),
}
}
}
#[automatically_derived]
impl<ST: ::core::marker::Copy, expr: ::core::marker::Copy>
::core::marker::Copy for avg<ST, expr> {
}
const _: () =
{
use diesel;
#[allow(non_camel_case_types)]
impl<ST: diesel::query_builder::QueryId,
expr: diesel::query_builder::QueryId>
diesel::query_builder::QueryId for avg<ST, expr> {
type QueryId =
avg<<ST as diesel::query_builder::QueryId>::QueryId,
<expr as diesel::query_builder::QueryId>::QueryId>;
const HAS_STATIC_QUERY_ID: bool =
<ST as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
&&
<expr as
diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
true;
const IS_WINDOW_FUNCTION: bool =
<ST as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
||
<expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
|| false;
}
};
#[doc = "The return type of [`avg()`](super::fn_name)"]
pub type HelperType<ST, expr> =
avg<ST, <expr as AsExpression<ST>>::Expression>;
impl<ST: Foldable, expr> Expression for avg<ST, expr> where
(expr): Expression {
type SqlType = ST::Avg;
}
impl<ST: Foldable, expr, __DieselInternal>
SelectableExpression<__DieselInternal> for avg<ST, expr> where
expr: SelectableExpression<__DieselInternal>,
Self: AppearsOnTable<__DieselInternal> {}
impl<ST: Foldable, expr, __DieselInternal>
AppearsOnTable<__DieselInternal> for avg<ST, expr> where
expr: AppearsOnTable<__DieselInternal>, Self: Expression {}
impl<ST: Foldable, expr, __DieselInternal>
FunctionFragment<__DieselInternal> for avg<ST, expr> where
__DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
const FUNCTION_NAME: &'static str = "avg";
#[allow(unused_assignments)]
fn walk_arguments<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
let mut needs_comma = false;
if !self.expr.is_noop(out.backend())? {
if needs_comma { out.push_sql(", "); }
self.expr.walk_ast(out.reborrow())?;
needs_comma = true;
}
Ok(())
}
}
impl<ST: Foldable, expr, __DieselInternal> QueryFragment<__DieselInternal>
for avg<ST, expr> where __DieselInternal: diesel::backend::Backend,
expr: QueryFragment<__DieselInternal> {
fn walk_ast<'__b>(&'__b self,
mut out: AstPass<'_, '__b, __DieselInternal>) -> QueryResult<()> {
out.push_sql(<Self as
FunctionFragment<__DieselInternal>>::FUNCTION_NAME);
out.push_sql("(");
self.walk_arguments(out.reborrow())?;
out.push_sql(")");
Ok(())
}
}
impl<ST: Foldable, expr, __P, __O, __F, __DieselInternal>
WindowFunctionFragment<avg<ST, expr>, __DieselInternal> for
OverClause<__P, __O, __F> where
__DieselInternal: diesel::backend::Backend {}
impl<ST: Foldable, expr> IsWindowFunction for avg<ST, expr> {
type ArgTypes = (expr,);
}
impl<ST: Foldable, expr, __DieselInternal> ValidGrouping<__DieselInternal>
for avg<ST, expr> {
type IsAggregate = diesel::expression::is_aggregate::Yes;
}
impl<ST: Foldable, expr> IsAggregateFunction for avg<ST, expr> {}
}#[declare_sql_function]
7extern "SQL" {
8 #[aggregate]
73 #[window]
74 fn sum<ST: Foldable>(expr: ST) -> ST::Sum;
75
76 #[aggregate]
196 #[window]
197 fn avg<ST: Foldable>(expr: ST) -> ST::Avg;
198}