1use crate::qb::{bind::BindValue, condition::Condition};
2use std::marker::PhantomData;
3
4pub struct Column<T> {
21 pub name: &'static str,
23
24 pub aliased_name: &'static str,
27
28 pub table_alias: &'static str,
30
31 pub _marker: PhantomData<T>,
33}
34impl<T> AsRef<str> for Column<T> {
35 fn as_ref(&self) -> &str {
36 self.name
37 }
38}
39
40impl<T> Copy for Column<T> {}
41impl<T> Clone for Column<T> {
42 fn clone(&self) -> Self {
43 *self
44 }
45}
46
47impl<T> Column<T>
48where
49 T: BindValue + Clone,
50{
51 fn qualified_name(&self) -> String {
53 format!("{}.{}", self.table_alias, self.name)
54 }
55
56 pub fn eq(self, val: T) -> Condition {
58 Condition::new(format!("{} = ?", self.qualified_name()), val)
59 }
60
61 pub fn ne(self, val: T) -> Condition {
63 Condition::new(format!("{} <> ?", self.qualified_name()), val)
64 }
65
66 pub fn gt(self, val: T) -> Condition {
68 Condition::new(format!("{} > ?", self.qualified_name()), val)
69 }
70
71 pub fn ge(self, val: T) -> Condition {
73 Condition::new(format!("{} >= ?", self.qualified_name()), val)
74 }
75
76 pub fn lt(self, val: T) -> Condition {
78 Condition::new(format!("{} < ?", self.qualified_name()), val)
79 }
80
81 pub fn le(self, val: T) -> Condition {
83 Condition::new(format!("{} <= ?", self.qualified_name()), val)
84 }
85
86 pub fn like(self, val: T) -> Condition {
88 Condition::new(format!("{} LIKE ?", self.qualified_name()), val)
89 }
90
91 pub fn in_(self, vals: Vec<T>) -> Condition {
97 if vals.is_empty() {
98 panic!(
99 "Cannot create IN condition with empty value list. At least one value must be specified."
100 );
101 }
102 let placeholders: Vec<String> = (0..vals.len()).map(|_| "?".to_string()).collect();
103 let sql = format!("{} IN ({})", self.qualified_name(), placeholders.join(", "));
104 Condition::multi(sql, vals)
105 }
106
107 pub fn not_in(self, vals: Vec<T>) -> Condition {
111 if vals.is_empty() {
112 panic!(
113 "Cannot create NOT IN condition with empty value list. At least one value must be specified."
114 );
115 }
116 let placeholders: Vec<String> = (0..vals.len()).map(|_| "?".to_string()).collect();
117 let sql = format!(
118 "{} NOT IN ({})",
119 self.qualified_name(),
120 placeholders.join(", ")
121 );
122 Condition::multi(sql, vals)
123 }
124
125 pub fn is_null(self) -> Condition {
127 Condition::none(format!("{} IS NULL", self.qualified_name()))
128 }
129
130 pub fn is_not_null(self) -> Condition {
132 Condition::none(format!("{} IS NOT NULL", self.qualified_name()))
133 }
134
135 pub fn between(self, start: T, end: T) -> Condition {
137 let sql = format!("{} BETWEEN ? AND ?", self.qualified_name());
138 Condition::multi(sql, vec![start, end])
139 }
140
141 pub fn not_between(self, start: T, end: T) -> Condition {
143 let sql = format!("{} NOT BETWEEN ? AND ?", self.qualified_name());
144 Condition::multi(sql, vec![start, end])
145 }
146}