Skip to main content

reinhardt_query/query/
drop_view.rs

1//! DROP VIEW statement builder
2//!
3//! This module provides the `DropViewStatement` type for building SQL DROP VIEW queries.
4
5use crate::{
6	backend::QueryBuilder,
7	types::{DynIden, IntoIden},
8};
9
10use super::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12/// DROP VIEW statement builder
13///
14/// This struct provides a fluent API for constructing DROP VIEW queries.
15///
16/// # Examples
17///
18/// ```rust,ignore
19/// use reinhardt_query::prelude::*;
20///
21/// let query = Query::drop_view()
22///     .name("active_users")
23///     .if_exists();
24/// ```
25#[derive(Debug, Clone)]
26pub struct DropViewStatement {
27	pub(crate) names: Vec<DynIden>,
28	pub(crate) if_exists: bool,
29	pub(crate) cascade: bool,
30	pub(crate) restrict: bool,
31	pub(crate) materialized: bool,
32}
33
34impl DropViewStatement {
35	/// Create a new DROP VIEW statement
36	pub fn new() -> Self {
37		Self {
38			names: Vec::new(),
39			if_exists: false,
40			cascade: false,
41			restrict: false,
42			materialized: false,
43		}
44	}
45
46	/// Take the ownership of data in the current [`DropViewStatement`]
47	pub fn take(&mut self) -> Self {
48		Self {
49			names: std::mem::take(&mut self.names),
50			if_exists: self.if_exists,
51			cascade: self.cascade,
52			restrict: self.restrict,
53			materialized: self.materialized,
54		}
55	}
56
57	/// Set the view name to drop
58	///
59	/// # Examples
60	///
61	/// ```rust,ignore
62	/// use reinhardt_query::prelude::*;
63	///
64	/// let query = Query::drop_view()
65	///     .name("active_users");
66	/// ```
67	pub fn name<N>(&mut self, name: N) -> &mut Self
68	where
69		N: IntoIden,
70	{
71		self.names.push(name.into_iden());
72		self
73	}
74
75	/// Set multiple view names to drop
76	///
77	/// # Examples
78	///
79	/// ```rust,ignore
80	/// use reinhardt_query::prelude::*;
81	///
82	/// let query = Query::drop_view()
83	///     .names(vec!["view1", "view2", "view3"]);
84	/// ```
85	pub fn names<I, N>(&mut self, names: I) -> &mut Self
86	where
87		I: IntoIterator<Item = N>,
88		N: IntoIden,
89	{
90		for name in names {
91			self.names.push(name.into_iden());
92		}
93		self
94	}
95
96	/// Add IF EXISTS clause
97	///
98	/// # Examples
99	///
100	/// ```rust,ignore
101	/// use reinhardt_query::prelude::*;
102	///
103	/// let query = Query::drop_view()
104	///     .name("active_users")
105	///     .if_exists();
106	/// ```
107	pub fn if_exists(&mut self) -> &mut Self {
108		self.if_exists = true;
109		self
110	}
111
112	/// Add CASCADE clause
113	///
114	/// This option automatically drops dependent objects.
115	/// Supported by PostgreSQL.
116	///
117	/// # Examples
118	///
119	/// ```rust,ignore
120	/// use reinhardt_query::prelude::*;
121	///
122	/// let query = Query::drop_view()
123	///     .name("active_users")
124	///     .cascade();
125	/// ```
126	pub fn cascade(&mut self) -> &mut Self {
127		self.cascade = true;
128		self.restrict = false;
129		self
130	}
131
132	/// Add RESTRICT clause
133	///
134	/// This option prevents dropping if there are dependent objects (default behavior).
135	/// Supported by PostgreSQL.
136	///
137	/// # Examples
138	///
139	/// ```rust,ignore
140	/// use reinhardt_query::prelude::*;
141	///
142	/// let query = Query::drop_view()
143	///     .name("active_users")
144	///     .restrict();
145	/// ```
146	pub fn restrict(&mut self) -> &mut Self {
147		self.restrict = true;
148		self.cascade = false;
149		self
150	}
151
152	/// Set MATERIALIZED flag (PostgreSQL only)
153	///
154	/// # Examples
155	///
156	/// ```rust,ignore
157	/// use reinhardt_query::prelude::*;
158	///
159	/// let query = Query::drop_view()
160	///     .name("active_users")
161	///     .materialized(true);
162	/// ```
163	pub fn materialized(&mut self, materialized: bool) -> &mut Self {
164		self.materialized = materialized;
165		self
166	}
167}
168
169impl Default for DropViewStatement {
170	fn default() -> Self {
171		Self::new()
172	}
173}
174
175impl QueryStatementBuilder for DropViewStatement {
176	fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
177		// Downcast to concrete QueryBuilder type
178		use std::any::Any;
179		if let Some(builder) =
180			(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
181		{
182			return builder.build_drop_view(self);
183		}
184		if let Some(builder) =
185			(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
186		{
187			return builder.build_drop_view(self);
188		}
189		if let Some(builder) =
190			(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
191		{
192			return builder.build_drop_view(self);
193		}
194		panic!("Unsupported query builder type");
195	}
196}
197
198impl QueryStatementWriter for DropViewStatement {}