Skip to main content

kali/
column.rs

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}