Skip to main content

reinhardt_query/query/materialized_view/
alter_materialized_view.rs

1//! ALTER MATERIALIZED VIEW statement builder
2//!
3//! This module provides the `AlterMaterializedViewStatement` type for building
4//! SQL ALTER MATERIALIZED VIEW queries.
5
6use crate::backend::QueryBuilder;
7use crate::types::{DynIden, IntoIden, MaterializedViewOperation};
8
9use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
10
11/// ALTER MATERIALIZED VIEW statement builder
12///
13/// This struct provides a fluent API for constructing ALTER MATERIALIZED VIEW queries.
14///
15/// # Examples
16///
17/// ```rust,ignore
18/// use reinhardt_query::prelude::*;
19///
20/// // Rename materialized view
21/// let query = Query::alter_materialized_view()
22///     .name("old_mv")
23///     .rename_to("new_mv");
24///
25/// // Change owner
26/// let query = Query::alter_materialized_view()
27///     .name("my_mv")
28///     .owner_to("new_owner");
29/// ```
30#[derive(Debug, Clone)]
31pub struct AlterMaterializedViewStatement {
32	pub(crate) name: Option<DynIden>,
33	pub(crate) operations: Vec<MaterializedViewOperation>,
34}
35
36impl AlterMaterializedViewStatement {
37	/// Create a new ALTER MATERIALIZED VIEW statement
38	pub fn new() -> Self {
39		Self {
40			name: None,
41			operations: Vec::new(),
42		}
43	}
44
45	/// Take the ownership of data in the current statement
46	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	/// Set the materialized view name
54	///
55	/// # Examples
56	///
57	/// ```rust,ignore
58	/// use reinhardt_query::prelude::*;
59	///
60	/// let query = Query::alter_materialized_view()
61	///     .name("my_mv");
62	/// ```
63	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	/// Add RENAME TO operation
72	///
73	/// # Examples
74	///
75	/// ```rust,ignore
76	/// use reinhardt_query::prelude::*;
77	///
78	/// let query = Query::alter_materialized_view()
79	///     .name("old_mv")
80	///     .rename_to("new_mv");
81	/// ```
82	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	/// Add OWNER TO operation
92	///
93	/// # Examples
94	///
95	/// ```rust,ignore
96	/// use reinhardt_query::prelude::*;
97	///
98	/// let query = Query::alter_materialized_view()
99	///     .name("my_mv")
100	///     .owner_to("new_owner");
101	/// ```
102	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	/// Add SET SCHEMA operation
112	///
113	/// # Examples
114	///
115	/// ```rust,ignore
116	/// use reinhardt_query::prelude::*;
117	///
118	/// let query = Query::alter_materialized_view()
119	///     .name("my_mv")
120	///     .set_schema("new_schema");
121	/// ```
122	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		// Downcast to concrete QueryBuilder type
141		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}