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 {}