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 49 50 51 52 53 54 55 56 57 58 59 60
use expression::Expression; use query_builder::AsQuery; use query_source::Table; /// Sets the order clause of a query. If there was already a order clause, it /// will be overridden. The expression passed to `order` must actually be valid /// for the query. See also: /// [`.desc()`](../expression/expression_methods/global_expression_methods/trait.ExpressionMethods.html#method.desc) /// and [`.asc()`](../expression/expression_methods/global_expression_methods/trait.ExpressionMethods.html#method.asc) /// /// Ordering by multiple columns can be achieved by passing a tuple of those /// columns. /// /// This is automatically implemented for the various query builder types. /// /// # Examples /// /// ```rust /// # #[macro_use] extern crate diesel; /// # include!("src/doctest_setup.rs"); /// # /// # table! { /// # users { /// # id -> Integer, /// # name -> VarChar, /// # } /// # } /// # /// # fn main() { /// use self::users::dsl::{users, id, name}; /// /// let connection = establish_connection(); /// # connection.execute("DELETE FROM users").unwrap(); /// connection.execute("INSERT INTO users (name) VALUES ('Saul'), ('Steve'), ('Stan')").unwrap(); /// // load all users' names, ordered by their name descending /// let ordered_names: Vec<String> = users.select(name).order(name.desc()).load(&connection).unwrap(); /// assert_eq!(vec![String::from("Steve"), String::from("Stan"), String::from("Saul")], ordered_names); /// /// connection.execute("INSERT INTO users (name) VALUES ('Stan')").unwrap(); /// let ordered_name_id_pairs = users.select((name, id)).order((name.asc(), id.desc())).load(&connection).unwrap(); /// assert_eq!(vec![(String::from("Saul"), 3), (String::from("Stan"), 6), (String::from("Stan"), 5), (String::from("Steve"), 4)], ordered_name_id_pairs); /// # } /// ``` pub trait OrderDsl<Expr: Expression>: AsQuery { type Output: AsQuery<SqlType=Self::SqlType>; fn order(self, expr: Expr) -> Self::Output; } impl<T, Expr, ST> OrderDsl<Expr> for T where Expr: Expression, T: Table + AsQuery<SqlType=ST>, T::Query: OrderDsl<Expr, SqlType=ST>, { type Output = <T::Query as OrderDsl<Expr>>::Output; fn order(self, expr: Expr) -> Self::Output { self.as_query().order(expr) } }