diesel/expression/functions/
aggregate_folding.rs

1use crate::expression::functions::declare_sql_function;
2use crate::sql_types::Foldable;
3
4#[declare_sql_function]
5extern "SQL" {
6    /// Represents a SQL `SUM` function. This function can only take types which are
7    /// Foldable.
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(12i64)), animals.select(sum(legs)).first(connection));
19    /// # }
20    /// ```
21    #[aggregate]
22    fn sum<ST: Foldable>(expr: ST) -> ST::Sum;
23
24    /// Represents a SQL `AVG` function. This function can only take types which are
25    /// Foldable.
26    ///
27    /// # Examples
28    ///
29    /// ```rust
30    /// # include!("../../doctest_setup.rs");
31    /// # use diesel::dsl::*;
32    /// # #[cfg(feature = "numeric")]
33    /// # extern crate bigdecimal;
34    /// #
35    /// # fn main() {
36    /// #     run_test().unwrap();
37    /// # }
38    /// #
39    /// # table! {
40    /// #     numbers (number) {
41    /// #         number -> Integer,
42    /// #     }
43    /// # }
44    /// #
45    /// # #[cfg(all(feature = "numeric", any(feature = "postgres", not(feature = "sqlite"))))]
46    /// # fn run_test() -> QueryResult<()> {
47    /// #     use bigdecimal::BigDecimal;
48    /// #     use self::numbers::dsl::*;
49    /// #     let conn = &mut establish_connection();
50    /// #     diesel::sql_query("CREATE TEMPORARY TABLE numbers (number INTEGER)").execute(conn)?;
51    /// diesel::insert_into(numbers)
52    ///     .values(&vec![number.eq(1), number.eq(2)])
53    ///     .execute(conn)?;
54    /// let average = numbers.select(avg(number)).get_result(conn)?;
55    /// let expected = "1.5".parse::<BigDecimal>().unwrap();
56    /// assert_eq!(Some(expected), average);
57    /// #     Ok(())
58    /// # }
59    /// #
60    /// # #[cfg(not(all(feature = "numeric", any(feature = "postgres", not(feature = "sqlite")))))]
61    /// # fn run_test() -> QueryResult<()> {
62    /// #     Ok(())
63    /// # }
64    #[aggregate]
65    fn avg<ST: Foldable>(expr: ST) -> ST::Avg;
66}