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}