diesel/expression_methods/
bool_expression_methods.rs

1use expression::grouped::Grouped;
2use expression::operators::{And, Or};
3use expression::{AsExpression, Expression};
4use sql_types::Bool;
5
6/// Methods present on boolean expressions
7pub trait BoolExpressionMethods: Expression<SqlType = Bool> + Sized {
8    /// Creates a SQL `AND` expression
9    ///
10    /// # Example
11    ///
12    /// ```
13    /// # #[macro_use] extern crate diesel;
14    /// # include!("../doctest_setup.rs");
15    /// #
16    /// # fn main() {
17    /// #     run_test().unwrap();
18    /// # }
19    /// #
20    /// # fn run_test() -> QueryResult<()> {
21    /// #     use schema::animals::dsl::*;
22    /// #     let connection = establish_connection();
23    /// #
24    /// diesel::insert_into(animals)
25    ///     .values(&vec![
26    ///         (species.eq("ferret"), legs.eq(4), name.eq("Freddy")),
27    ///         (species.eq("ferret"), legs.eq(4), name.eq("Jack")),
28    ///     ])
29    ///     .execute(&connection)?;
30    ///
31    /// let data = animals.select((species, name))
32    ///     .filter(species.eq("ferret").and(name.eq("Jack")))
33    ///     .load(&connection)?;
34    /// let expected = vec![
35    ///     (String::from("ferret"), Some(String::from("Jack"))),
36    /// ];
37    /// assert_eq!(expected, data);
38    /// #     Ok(())
39    /// # }
40    fn and<T: AsExpression<Bool>>(self, other: T) -> And<Self, T::Expression> {
41        And::new(self.as_expression(), other.as_expression())
42    }
43
44    /// Creates a SQL `OR` expression
45    ///
46    /// The result will be wrapped in parenthesis, so that precedence matches
47    /// that of your function calls. For example, `false.and(false.or(true))`
48    /// will generate the SQL `FALSE AND (FALSE OR TRUE)`, which returns `false`
49    ///
50    /// # Example
51    ///
52    /// ```
53    /// # #[macro_use] extern crate diesel;
54    /// # include!("../doctest_setup.rs");
55    /// #
56    /// # fn main() {
57    /// #     run_test().unwrap();
58    /// # }
59    /// #
60    /// # fn run_test() -> QueryResult<()> {
61    /// #     use schema::animals::dsl::*;
62    /// #     let connection = establish_connection();
63    /// #
64    /// diesel::insert_into(animals)
65    ///     .values(&vec![
66    ///         (species.eq("ferret"), legs.eq(4), name.eq("Freddy")),
67    ///         (species.eq("ferret"), legs.eq(4), name.eq("Jack")),
68    ///     ])
69    ///     .execute(&connection)?;
70    ///
71    /// let data = animals.select((species, name))
72    ///     .filter(species.eq("ferret").or(name.eq("Jack")))
73    ///     .load(&connection)?;
74    /// let expected = vec![
75    ///     (String::from("dog"), Some(String::from("Jack"))),
76    ///     (String::from("ferret"), Some(String::from("Freddy"))),
77    ///     (String::from("ferret"), Some(String::from("Jack"))),
78    /// ];
79    /// assert_eq!(expected, data);
80    /// #     Ok(())
81    /// # }
82    fn or<T: AsExpression<Bool>>(self, other: T) -> Grouped<Or<Self, T::Expression>> {
83        Grouped(Or::new(self, other.as_expression()))
84    }
85}
86
87impl<T: Expression<SqlType = Bool>> BoolExpressionMethods for T {}