1use crate::builder::{expr::Expr, ordering::ColumnOrdering, value::Value};
2
3pub trait Column: Copy + Send + Sync {
4 fn to_col_name(&self) -> &str;
5
6 fn write(&self, f: &mut String) {
7 f.push('"');
8 f.push_str(self.to_col_name());
9 f.push('"');
10 }
11}
12
13pub trait ColumnExpr<'a, C: Column> {
14 fn eq<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
15 fn gt<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
16 fn lt<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
17 fn like<V: Into<Value>>(self, value: V) -> Expr<'a, C>;
18 fn in_list<V: Into<Value>>(self, values: Vec<V>) -> Expr<'a, C>;
19 fn is_null(self) -> Expr<'a, C>;
20
21 fn asc(self) -> ColumnOrdering<C>;
22 fn desc(self) -> ColumnOrdering<C>;
23 fn asc_nulls_first(self) -> ColumnOrdering<C>;
24 fn asc_nulls_last(self) -> ColumnOrdering<C>;
25 fn desc_nulls_first(self) -> ColumnOrdering<C>;
26 fn desc_nulls_last(self) -> ColumnOrdering<C>;
27}
28
29impl<'a, C: Column> ColumnExpr<'a, C> for C {
30 fn eq<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
31 Expr::Equal(self, value.into())
32 }
33
34 fn gt<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
35 Expr::Gt(self, value.into())
36 }
37
38 fn lt<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
39 Expr::Lt(self, value.into())
40 }
41
42 fn like<V: Into<Value>>(self, value: V) -> Expr<'a, C> {
43 Expr::Like(self, value.into())
44 }
45
46 fn in_list<V: Into<Value>>(self, values: Vec<V>) -> Expr<'a, C> {
47 let values = values.into_iter().map(|v| v.into()).collect();
48 Expr::In(self, values)
49 }
50
51 fn is_null(self) -> Expr<'a, C> {
52 Expr::Equal(self, Value::Null)
53 }
54
55 fn asc(self) -> ColumnOrdering<C> {
56 ColumnOrdering::Asc(self)
57 }
58
59 fn desc(self) -> ColumnOrdering<C> {
60 ColumnOrdering::Desc(self)
61 }
62
63 fn asc_nulls_first(self) -> ColumnOrdering<C> {
64 ColumnOrdering::AscNullsFirst(self)
65 }
66
67 fn asc_nulls_last(self) -> ColumnOrdering<C> {
68 ColumnOrdering::AscNullsLast(self)
69 }
70
71 fn desc_nulls_first(self) -> ColumnOrdering<C> {
72 ColumnOrdering::DescNullsFirst(self)
73 }
74
75 fn desc_nulls_last(self) -> ColumnOrdering<C> {
76 ColumnOrdering::DescNullsLast(self)
77 }
78}