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}