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