reinhardt_query/types/
table_ref.rs1use super::iden::{DynIden, IntoIden};
9
10#[derive(Debug, Clone)]
15pub enum TableRef {
16 Table(DynIden),
18 SchemaTable(DynIden, DynIden),
20 DatabaseSchemaTable(DynIden, DynIden, DynIden),
22 TableAlias(DynIden, DynIden),
24 SchemaTableAlias(DynIden, DynIden, DynIden),
26 SubQuery(Box<crate::query::SelectStatement>, DynIden),
28}
29
30impl TableRef {
31 pub fn table<I: IntoIden>(table: I) -> Self {
41 Self::Table(table.into_iden())
42 }
43
44 pub fn schema_table<S: IntoIden, T: IntoIden>(schema: S, table: T) -> Self {
54 Self::SchemaTable(schema.into_iden(), table.into_iden())
55 }
56
57 pub fn database_schema_table<D: IntoIden, S: IntoIden, T: IntoIden>(
67 database: D,
68 schema: S,
69 table: T,
70 ) -> Self {
71 Self::DatabaseSchemaTable(database.into_iden(), schema.into_iden(), table.into_iden())
72 }
73
74 pub fn table_alias<T: IntoIden, A: IntoIden>(table: T, alias: A) -> Self {
84 Self::TableAlias(table.into_iden(), alias.into_iden())
85 }
86
87 pub fn schema_table_alias<S: IntoIden, T: IntoIden, A: IntoIden>(
97 schema: S,
98 table: T,
99 alias: A,
100 ) -> Self {
101 Self::SchemaTableAlias(schema.into_iden(), table.into_iden(), alias.into_iden())
102 }
103}
104
105pub trait IntoTableRef {
109 fn into_table_ref(self) -> TableRef;
111}
112
113impl IntoTableRef for TableRef {
115 fn into_table_ref(self) -> TableRef {
116 self
117 }
118}
119
120impl IntoTableRef for DynIden {
122 fn into_table_ref(self) -> TableRef {
123 TableRef::Table(self)
124 }
125}
126
127impl IntoTableRef for &'static str {
129 fn into_table_ref(self) -> TableRef {
130 TableRef::Table(self.into_iden())
131 }
132}
133
134impl IntoTableRef for String {
136 fn into_table_ref(self) -> TableRef {
137 TableRef::Table(self.into_iden())
138 }
139}
140
141impl<S, T> IntoTableRef for (S, T)
143where
144 S: IntoIden,
145 T: IntoIden,
146{
147 fn into_table_ref(self) -> TableRef {
148 TableRef::SchemaTable(self.0.into_iden(), self.1.into_iden())
149 }
150}
151
152impl<D, S, T> IntoTableRef for (D, S, T)
154where
155 D: IntoIden,
156 S: IntoIden,
157 T: IntoIden,
158{
159 fn into_table_ref(self) -> TableRef {
160 TableRef::DatabaseSchemaTable(self.0.into_iden(), self.1.into_iden(), self.2.into_iden())
161 }
162}
163
164impl IntoTableRef for super::alias::Alias {
166 fn into_table_ref(self) -> TableRef {
167 TableRef::Table(self.into_iden())
168 }
169}
170
171#[cfg(test)]
172mod tests {
173 use super::*;
174 use crate::types::Alias;
175 use rstest::rstest;
176
177 #[rstest]
178 fn test_table_ref_simple() {
179 let table = TableRef::table("users");
180 if let TableRef::Table(iden) = table {
181 assert_eq!(iden.to_string(), "users");
182 } else {
183 panic!("Expected Table variant");
184 }
185 }
186
187 #[rstest]
188 fn test_table_ref_schema_qualified() {
189 let table = TableRef::schema_table("public", "users");
190 if let TableRef::SchemaTable(schema, tbl) = table {
191 assert_eq!(schema.to_string(), "public");
192 assert_eq!(tbl.to_string(), "users");
193 } else {
194 panic!("Expected SchemaTable variant");
195 }
196 }
197
198 #[rstest]
199 fn test_table_ref_database_schema_qualified() {
200 let table = TableRef::database_schema_table("mydb", "public", "users");
201 if let TableRef::DatabaseSchemaTable(db, schema, tbl) = table {
202 assert_eq!(db.to_string(), "mydb");
203 assert_eq!(schema.to_string(), "public");
204 assert_eq!(tbl.to_string(), "users");
205 } else {
206 panic!("Expected DatabaseSchemaTable variant");
207 }
208 }
209
210 #[rstest]
211 fn test_table_ref_with_alias() {
212 let table = TableRef::table_alias("users", "u");
213 if let TableRef::TableAlias(tbl, alias) = table {
214 assert_eq!(tbl.to_string(), "users");
215 assert_eq!(alias.to_string(), "u");
216 } else {
217 panic!("Expected TableAlias variant");
218 }
219 }
220
221 #[rstest]
222 fn test_table_ref_schema_with_alias() {
223 let table = TableRef::schema_table_alias("public", "users", "u");
224 if let TableRef::SchemaTableAlias(schema, tbl, alias) = table {
225 assert_eq!(schema.to_string(), "public");
226 assert_eq!(tbl.to_string(), "users");
227 assert_eq!(alias.to_string(), "u");
228 } else {
229 panic!("Expected SchemaTableAlias variant");
230 }
231 }
232
233 #[rstest]
234 fn test_into_table_ref_from_str() {
235 let table: TableRef = "users".into_table_ref();
236 if let TableRef::Table(iden) = table {
237 assert_eq!(iden.to_string(), "users");
238 } else {
239 panic!("Expected Table variant");
240 }
241 }
242
243 #[rstest]
244 fn test_into_table_ref_from_alias() {
245 let alias = Alias::new("my_table");
246 let table: TableRef = alias.into_table_ref();
247 if let TableRef::Table(iden) = table {
248 assert_eq!(iden.to_string(), "my_table");
249 } else {
250 panic!("Expected Table variant");
251 }
252 }
253}