1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use query_builder::AsQuery; use query_source::QuerySource; /// Adds the `DISTINCT` keyword to a query. /// /// # Example /// /// ```rust /// /// # #[macro_use] extern crate diesel; /// # include!("src/doctest_setup.rs"); /// # /// # table! { /// # users { /// # id -> Integer, /// # name -> VarChar, /// # } /// # } /// # /// # fn main() { /// # use self::users::dsl::*; /// # let connection = establish_connection(); /// # connection.execute("DELETE FROM users").unwrap(); /// connection.execute("INSERT INTO users (name) VALUES ('Sean'), ('Sean'), ('Sean')") /// .unwrap(); /// let names = users.select(name).load(&connection); /// let distinct_names = users.select(name).distinct().load(&connection); /// /// let sean = String::from("Sean"); /// assert_eq!(Ok(vec![sean.clone(), sean.clone(), sean.clone()]), names); /// assert_eq!(Ok(vec![sean.clone()]), distinct_names); /// # } /// ``` pub trait DistinctDsl: AsQuery { type Output: AsQuery<SqlType=Self::SqlType>; fn distinct(self) -> Self::Output; } impl<T, ST> DistinctDsl for T where T: AsQuery<SqlType=ST> + QuerySource, T::Query: DistinctDsl<SqlType=ST>, { type Output = <T::Query as DistinctDsl>::Output; fn distinct(self) -> Self::Output { self.as_query().distinct() } }