diesel/expression/functions/
aggregate_ordering.rs

1use self::private::SqlOrdAggregate;
2use crate::expression::functions::declare_sql_function;
3
4#[declare_sql_function]
5extern "SQL" {
6    /// Represents a SQL `MAX` function. This function can only take types which are
7    /// ordered.
8    ///
9    /// # Examples
10    ///
11    /// ```rust
12    /// # include!("../../doctest_setup.rs");
13    /// # use diesel::dsl::*;
14    /// #
15    /// # fn main() {
16    /// #     use schema::animals::dsl::*;
17    /// #     let connection = &mut establish_connection();
18    /// assert_eq!(Ok(Some(8)), animals.select(max(legs)).first(connection));
19    /// # }
20    #[aggregate]
21    fn max<ST: SqlOrdAggregate>(expr: ST) -> ST::Ret;
22
23    /// Represents a SQL `MIN` function. This function can only take types which are
24    /// ordered.
25    ///
26    /// # Examples
27    ///
28    /// ```rust
29    /// # include!("../../doctest_setup.rs");
30    /// # use diesel::dsl::*;
31    /// #
32    /// # fn main() {
33    /// #     use schema::animals::dsl::*;
34    /// #     let connection = &mut establish_connection();
35    /// assert_eq!(Ok(Some(4)), animals.select(min(legs)).first(connection));
36    /// # }
37    #[aggregate]
38    fn min<ST: SqlOrdAggregate>(expr: ST) -> ST::Ret;
39}
40
41mod private {
42    use crate::sql_types::{IntoNullable, SingleValue, SqlOrd, SqlType};
43    pub trait SqlOrdAggregate: SingleValue {
44        type Ret: SqlType + SingleValue;
45    }
46
47    impl<T> SqlOrdAggregate for T
48    where
49        T: SqlOrd + IntoNullable + SingleValue,
50        T::Nullable: SqlType + SingleValue,
51    {
52        type Ret = T::Nullable;
53    }
54}