derive_sql/structs/order/
and.rs

1//! Implement `AND` combination of filter.
2use super::*;
3
4pub struct And<T, U, V, W, X, Y>
5where T: traits::FlavoredOrder,
6      U: traits::FlavoredOrder,
7      V: traits::FlavoredOrder,
8      W: traits::FlavoredOrder,
9      X: traits::FlavoredOrder,
10      Y: traits::FlavoredOrder,
11{
12  t: T,
13  u: U,
14  v: Option<V>,
15  w: Option<W>,
16  x: Option<X>,
17  y: Option<Y>,
18}
19
20impl<T, U> std::convert::From<(T, U)> for And<T, U, T, T, T, T>
21where T: traits::FlavoredOrder, U: traits::FlavoredOrder {
22  fn from((t, u): (T, U)) -> Self {
23    And { t, u, v: None, w: None, x: None, y: None }
24  }
25}
26
27impl<T, U, V> std::convert::From<(T, U, V)> for And<T, U, V, T, T, T>
28where T: traits::FlavoredOrder, U: traits::FlavoredOrder, V: traits::FlavoredOrder {
29  fn from((t, u, v): (T, U, V)) -> Self {
30    And { t, u, v: Some(v), w: None, x: None, y: None }
31  }
32}
33
34impl<T, U, V, W> std::convert::From<(T, U, V, W)> for And<T, U, V, W, T, T>
35where T: traits::FlavoredOrder, U: traits::FlavoredOrder, V: traits::FlavoredOrder, W: traits::FlavoredOrder {
36  fn from((t, u, v, w): (T, U, V, W)) -> Self {
37    And { t, u, v: Some(v), w: Some(w), x: None, y: None }
38  }
39}
40
41impl<T, U, V, W, X> std::convert::From<(T, U, V, W, X)> for And<T, U, V, W, X, T>
42where T: traits::FlavoredOrder, U: traits::FlavoredOrder, V: traits::FlavoredOrder, W: traits::FlavoredOrder, X: traits::FlavoredOrder {
43  fn from((t, u, v, w, x): (T, U, V, W, X)) -> Self {
44    And { t, u, v: Some(v), w: Some(w), x: Some(x), y: None }
45  }
46}
47
48impl<T, U, V, W, X, Y> std::convert::From<(T, U, V, W, X, Y)> for And<T, U, V, W, X, Y>
49where T: traits::FlavoredOrder, U: traits::FlavoredOrder, V: traits::FlavoredOrder, W: traits::FlavoredOrder, X: traits::FlavoredOrder, Y: traits::FlavoredOrder {
50  fn from((t, u, v, w, x, y): (T, U, V, W, X, Y)) -> Self {
51    And { t, u, v: Some(v), w: Some(w), x: Some(x), y: Some(y) }
52  }
53}
54
55impl<T, U, V, W, X, Y> traits::FlavoredOrder for And<T, U, V, W, X, Y>
56where T: traits::FlavoredOrder, U: traits::FlavoredOrder, V: traits::FlavoredOrder,
57      W: traits::FlavoredOrder, X: traits::FlavoredOrder, Y: traits::FlavoredOrder,
58{
59  fn as_order_clause<C, R>(&self, conn: &C) -> Result<String> 
60  where C: traits::Connection<R>, R: traits::Row
61  {
62    let a = self.t.as_order_clause(conn)?; let b = self.u.as_order_clause(conn)?;
63    let r = match self.v.as_ref().map(|v| v.as_order_clause(conn)).transpose()? {
64      Some(c) => match self.w.as_ref().map(|w| w.as_order_clause(conn)).transpose()? {
65        Some(d) => match self.x.as_ref().map(|x| x.as_order_clause(conn)).transpose()? {
66          Some(e) => match self.y.as_ref().map(|y| y.as_order_clause(conn)).transpose()? {
67            Some(f) => format!("( {a}, {b}, {c}, {d}, {e}, {f} )"),
68            None => format!("( {a}, {b}, {c}, {d}, {e} )"),
69          },
70          None => format!("( {a}, {b}, {c}, {d} )"),
71        },
72        None => format!("( {a}, {b}, {c} )"),
73      },
74      None => format!("( {a}, {b} )"),
75    };
76    Ok(r)
77  }
78}
79
80#[cfg(test)]
81mod tests {
82  use super::*;
83
84  struct WordOne { }
85  impl traits::FlavoredOrder for WordOne {
86    fn as_order_clause<C, R>(&self, _: &C) -> Result<String>
87    where C: traits::Connection<R>, R: traits::Row,
88    {
89      Ok("1".to_string())
90    }
91  }
92
93  struct WordHouse { }
94  impl traits::FlavoredOrder for WordHouse {
95    fn as_order_clause<C, R>(&self, _: &C) -> Result<String>
96    where C: traits::Connection<R>, R: traits::Row,
97    {
98      Ok("House".to_string())
99    }
100  }
101
102  #[cfg(test)]
103  fn it_combines_as_order_clause() -> DeriveSqlResult<()> {
104    use traits::FlavoredOrder;
105    let conn = traits::tests::SQLiteFlavoredConnection {};
106    type Row = traits::tests::Row;
107
108    let and: And<_, _, _, _, _, _> = (WordOne {}, WordOne {}).into();
109    assert!(and.as_order_clause::<_, Row>(&conn)?.eq("( 1, 1 )"));
110
111    let and: And<_, _, _, _, _, _> = (WordOne {}, WordHouse {}, WordOne {}).into();
112    assert!(and.as_order_clause::<_, Row>(&conn)?.eq("( 1, House, 1 )"));
113
114    let and: And<_, _, _, _, _, _> = (WordOne {}, WordHouse {}, WordHouse {}, WordOne {}).into();
115    assert!(and.as_order_clause::<_, Row>(&conn)?.eq("( 1, House, House, 1 )"));
116
117    let and: And<_, _, _, _, _, _> = (WordOne {}, WordHouse {}, WordHouse {}, WordOne {}, WordHouse {}, ).into();
118    assert!(and.as_order_clause::<_, Row>(&conn)?.eq("( 1, House, House, 1, House )"));
119
120    let and: And<_, _, _, _, _, _> = (WordOne {}, WordHouse {}, WordHouse {}, WordOne {}, WordHouse {}, WordHouse {}).into();
121    assert!(and.as_order_clause::<_, Row>(&conn)?.eq("( 1, House, House, 1, House, House )"));
122
123    Ok(())
124  }
125}