reinhardt_query/query/materialized_view/
alter_materialized_view.rs1use crate::backend::QueryBuilder;
7use crate::types::{DynIden, IntoIden, MaterializedViewOperation};
8
9use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
10
11#[derive(Debug, Clone)]
31pub struct AlterMaterializedViewStatement {
32 pub(crate) name: Option<DynIden>,
33 pub(crate) operations: Vec<MaterializedViewOperation>,
34}
35
36impl AlterMaterializedViewStatement {
37 pub fn new() -> Self {
39 Self {
40 name: None,
41 operations: Vec::new(),
42 }
43 }
44
45 pub fn take(&mut self) -> Self {
47 Self {
48 name: self.name.take(),
49 operations: std::mem::take(&mut self.operations),
50 }
51 }
52
53 pub fn name<N>(&mut self, name: N) -> &mut Self
64 where
65 N: IntoIden,
66 {
67 self.name = Some(name.into_iden());
68 self
69 }
70
71 pub fn rename_to<N>(&mut self, new_name: N) -> &mut Self
83 where
84 N: IntoIden,
85 {
86 self.operations
87 .push(MaterializedViewOperation::Rename(new_name.into_iden()));
88 self
89 }
90
91 pub fn owner_to<O>(&mut self, owner: O) -> &mut Self
103 where
104 O: IntoIden,
105 {
106 self.operations
107 .push(MaterializedViewOperation::OwnerTo(owner.into_iden()));
108 self
109 }
110
111 pub fn set_schema<S>(&mut self, schema: S) -> &mut Self
123 where
124 S: IntoIden,
125 {
126 self.operations
127 .push(MaterializedViewOperation::SetSchema(schema.into_iden()));
128 self
129 }
130}
131
132impl Default for AlterMaterializedViewStatement {
133 fn default() -> Self {
134 Self::new()
135 }
136}
137
138impl QueryStatementBuilder for AlterMaterializedViewStatement {
139 fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
140 use std::any::Any;
142 if let Some(builder) =
143 (query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
144 {
145 return builder.build_alter_materialized_view(self);
146 }
147 if let Some(builder) =
148 (query_builder as &dyn Any).downcast_ref::<crate::backend::CockroachDBQueryBuilder>()
149 {
150 return builder.build_alter_materialized_view(self);
151 }
152 if let Some(_builder) =
153 (query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
154 {
155 panic!("MySQL does not support materialized views");
156 }
157 if let Some(_builder) =
158 (query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
159 {
160 panic!("SQLite does not support materialized views");
161 }
162 panic!("Unsupported query builder type");
163 }
164}
165
166impl QueryStatementWriter for AlterMaterializedViewStatement {}
167
168#[cfg(test)]
169mod tests {
170 use super::*;
171 use rstest::*;
172
173 #[rstest]
174 fn test_alter_materialized_view_basic() {
175 let mut stmt = AlterMaterializedViewStatement::new();
176 stmt.name("my_mv");
177 assert_eq!(stmt.name.as_ref().unwrap().to_string(), "my_mv");
178 assert!(stmt.operations.is_empty());
179 }
180
181 #[rstest]
182 fn test_alter_materialized_view_rename_to() {
183 let mut stmt = AlterMaterializedViewStatement::new();
184 stmt.name("old_mv").rename_to("new_mv");
185 assert_eq!(stmt.name.as_ref().unwrap().to_string(), "old_mv");
186 assert_eq!(stmt.operations.len(), 1);
187 assert!(matches!(
188 &stmt.operations[0],
189 MaterializedViewOperation::Rename(_)
190 ));
191 }
192
193 #[rstest]
194 fn test_alter_materialized_view_owner_to() {
195 let mut stmt = AlterMaterializedViewStatement::new();
196 stmt.name("my_mv").owner_to("new_owner");
197 assert_eq!(stmt.operations.len(), 1);
198 assert!(matches!(
199 &stmt.operations[0],
200 MaterializedViewOperation::OwnerTo(_)
201 ));
202 }
203
204 #[rstest]
205 fn test_alter_materialized_view_set_schema() {
206 let mut stmt = AlterMaterializedViewStatement::new();
207 stmt.name("my_mv").set_schema("new_schema");
208 assert_eq!(stmt.operations.len(), 1);
209 assert!(matches!(
210 &stmt.operations[0],
211 MaterializedViewOperation::SetSchema(_)
212 ));
213 }
214
215 #[rstest]
216 fn test_alter_materialized_view_multiple_operations() {
217 let mut stmt = AlterMaterializedViewStatement::new();
218 stmt.name("my_mv").owner_to("alice").set_schema("public");
219 assert_eq!(stmt.operations.len(), 2);
220 }
221
222 #[rstest]
223 fn test_alter_materialized_view_default() {
224 let stmt = AlterMaterializedViewStatement::default();
225 assert!(stmt.name.is_none());
226 assert!(stmt.operations.is_empty());
227 }
228
229 #[rstest]
230 fn test_alter_materialized_view_take() {
231 let mut stmt = AlterMaterializedViewStatement::new();
232 stmt.name("my_mv").rename_to("new_mv");
233 let taken = stmt.take();
234 assert_eq!(taken.name.as_ref().unwrap().to_string(), "my_mv");
235 assert_eq!(taken.operations.len(), 1);
236 assert!(stmt.name.is_none());
237 assert!(stmt.operations.is_empty());
238 }
239}