Skip to main content

reinhardt_query/query/sequence/
alter_sequence.rs

1//! ALTER SEQUENCE statement builder
2//!
3//! This module provides the `AlterSequenceStatement` type for building SQL ALTER SEQUENCE queries.
4
5use crate::{
6	backend::QueryBuilder,
7	types::{
8		DynIden, IntoIden,
9		sequence::{OwnedBy, SequenceOption},
10	},
11};
12
13use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
14
15/// ALTER SEQUENCE statement builder
16///
17/// This struct provides a fluent API for constructing ALTER SEQUENCE queries.
18///
19/// # Examples
20///
21/// ```rust
22/// use reinhardt_query::prelude::*;
23///
24/// // ALTER SEQUENCE my_seq RESTART
25/// let query = Query::alter_sequence()
26///     .name("my_seq")
27///     .restart(None);
28///
29/// // ALTER SEQUENCE my_seq RESTART WITH 100
30/// let query = Query::alter_sequence()
31///     .name("my_seq")
32///     .restart(Some(100));
33///
34/// // ALTER SEQUENCE my_seq INCREMENT BY 5 MINVALUE 1 MAXVALUE 1000
35/// let query = Query::alter_sequence()
36///     .name("my_seq")
37///     .increment_by(5)
38///     .min_value(1)
39///     .max_value(1000);
40///
41/// // ALTER SEQUENCE my_seq OWNED BY my_table.id
42/// let query = Query::alter_sequence()
43///     .name("my_seq")
44///     .owned_by_column("my_table", "id");
45/// ```
46#[derive(Debug, Clone)]
47pub struct AlterSequenceStatement {
48	pub(crate) name: DynIden,
49	pub(crate) options: Vec<SequenceOption>,
50}
51
52impl AlterSequenceStatement {
53	/// Create a new ALTER SEQUENCE statement
54	///
55	/// # Examples
56	///
57	/// ```rust
58	/// use reinhardt_query::prelude::*;
59	///
60	/// let query = Query::alter_sequence();
61	/// ```
62	pub fn new() -> Self {
63		Self {
64			name: "".into_iden(),
65			options: Vec::new(),
66		}
67	}
68
69	/// Take the ownership of data in the current [`AlterSequenceStatement`]
70	pub fn take(&mut self) -> Self {
71		let taken = Self {
72			name: self.name.clone(),
73			options: self.options.clone(),
74		};
75		// Reset self to empty state
76		self.name = "".into_iden();
77		self.options.clear();
78		taken
79	}
80
81	/// Set the sequence name
82	///
83	/// # Examples
84	///
85	/// ```rust
86	/// use reinhardt_query::prelude::*;
87	///
88	/// let query = Query::alter_sequence()
89	///     .name("my_seq");
90	/// ```
91	pub fn name<N>(&mut self, name: N) -> &mut Self
92	where
93		N: IntoIden,
94	{
95		self.name = name.into_iden();
96		self
97	}
98
99	/// Add RESTART option
100	///
101	/// Use `None` for RESTART (without value) or `Some(value)` for RESTART WITH value.
102	///
103	/// # Examples
104	///
105	/// ```rust
106	/// use reinhardt_query::prelude::*;
107	///
108	/// // RESTART
109	/// let query = Query::alter_sequence()
110	///     .name("my_seq")
111	///     .restart(None);
112	///
113	/// // RESTART WITH 100
114	/// let query = Query::alter_sequence()
115	///     .name("my_seq")
116	///     .restart(Some(100));
117	/// ```
118	pub fn restart(&mut self, value: Option<i64>) -> &mut Self {
119		self.options.push(SequenceOption::Restart(value));
120		self
121	}
122
123	/// Add INCREMENT BY option
124	///
125	/// # Examples
126	///
127	/// ```rust
128	/// use reinhardt_query::prelude::*;
129	///
130	/// let query = Query::alter_sequence()
131	///     .name("my_seq")
132	///     .increment_by(5);
133	/// ```
134	pub fn increment_by(&mut self, increment: i64) -> &mut Self {
135		self.options.push(SequenceOption::IncrementBy(increment));
136		self
137	}
138
139	/// Add MINVALUE option
140	///
141	/// # Examples
142	///
143	/// ```rust
144	/// use reinhardt_query::prelude::*;
145	///
146	/// let query = Query::alter_sequence()
147	///     .name("my_seq")
148	///     .min_value(1);
149	/// ```
150	pub fn min_value(&mut self, value: i64) -> &mut Self {
151		self.options.push(SequenceOption::MinValue(value));
152		self
153	}
154
155	/// Add NO MINVALUE option
156	///
157	/// # Examples
158	///
159	/// ```rust
160	/// use reinhardt_query::prelude::*;
161	///
162	/// let query = Query::alter_sequence()
163	///     .name("my_seq")
164	///     .no_min_value();
165	/// ```
166	pub fn no_min_value(&mut self) -> &mut Self {
167		self.options.push(SequenceOption::NoMinValue);
168		self
169	}
170
171	/// Add MAXVALUE option
172	///
173	/// # Examples
174	///
175	/// ```rust
176	/// use reinhardt_query::prelude::*;
177	///
178	/// let query = Query::alter_sequence()
179	///     .name("my_seq")
180	///     .max_value(1000);
181	/// ```
182	pub fn max_value(&mut self, value: i64) -> &mut Self {
183		self.options.push(SequenceOption::MaxValue(value));
184		self
185	}
186
187	/// Add NO MAXVALUE option
188	///
189	/// # Examples
190	///
191	/// ```rust
192	/// use reinhardt_query::prelude::*;
193	///
194	/// let query = Query::alter_sequence()
195	///     .name("my_seq")
196	///     .no_max_value();
197	/// ```
198	pub fn no_max_value(&mut self) -> &mut Self {
199		self.options.push(SequenceOption::NoMaxValue);
200		self
201	}
202
203	/// Add CACHE option
204	///
205	/// # Examples
206	///
207	/// ```rust
208	/// use reinhardt_query::prelude::*;
209	///
210	/// let query = Query::alter_sequence()
211	///     .name("my_seq")
212	///     .cache(20);
213	/// ```
214	pub fn cache(&mut self, value: i64) -> &mut Self {
215		self.options.push(SequenceOption::Cache(value));
216		self
217	}
218
219	/// Add CYCLE option
220	///
221	/// # Examples
222	///
223	/// ```rust
224	/// use reinhardt_query::prelude::*;
225	///
226	/// let query = Query::alter_sequence()
227	///     .name("my_seq")
228	///     .cycle();
229	/// ```
230	pub fn cycle(&mut self) -> &mut Self {
231		self.options.push(SequenceOption::Cycle);
232		self
233	}
234
235	/// Add NO CYCLE option
236	///
237	/// # Examples
238	///
239	/// ```rust
240	/// use reinhardt_query::prelude::*;
241	///
242	/// let query = Query::alter_sequence()
243	///     .name("my_seq")
244	///     .no_cycle();
245	/// ```
246	pub fn no_cycle(&mut self) -> &mut Self {
247		self.options.push(SequenceOption::NoCycle);
248		self
249	}
250
251	/// Add OWNED BY table.column option
252	///
253	/// # Examples
254	///
255	/// ```rust
256	/// use reinhardt_query::prelude::*;
257	///
258	/// let query = Query::alter_sequence()
259	///     .name("my_seq")
260	///     .owned_by_column("my_table", "id");
261	/// ```
262	pub fn owned_by_column<T: IntoIden, C: IntoIden>(&mut self, table: T, column: C) -> &mut Self {
263		self.options.push(SequenceOption::OwnedBy(OwnedBy::Column {
264			table: table.into_iden(),
265			column: column.into_iden(),
266		}));
267		self
268	}
269
270	/// Add OWNED BY NONE option
271	///
272	/// # Examples
273	///
274	/// ```rust
275	/// use reinhardt_query::prelude::*;
276	///
277	/// let query = Query::alter_sequence()
278	///     .name("my_seq")
279	///     .owned_by_none();
280	/// ```
281	pub fn owned_by_none(&mut self) -> &mut Self {
282		self.options.push(SequenceOption::OwnedBy(OwnedBy::None));
283		self
284	}
285}
286
287impl Default for AlterSequenceStatement {
288	fn default() -> Self {
289		Self::new()
290	}
291}
292
293impl QueryStatementBuilder for AlterSequenceStatement {
294	fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
295		// Downcast to concrete QueryBuilder type
296		use std::any::Any;
297		if let Some(builder) =
298			(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
299		{
300			return builder.build_alter_sequence(self);
301		}
302		if let Some(builder) =
303			(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
304		{
305			return builder.build_alter_sequence(self);
306		}
307		if let Some(builder) =
308			(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
309		{
310			return builder.build_alter_sequence(self);
311		}
312		panic!("Unsupported query builder type");
313	}
314}
315
316impl QueryStatementWriter for AlterSequenceStatement {}
317
318#[cfg(test)]
319mod tests {
320	use super::*;
321	use rstest::*;
322
323	#[rstest]
324	fn test_alter_sequence_new() {
325		let stmt = AlterSequenceStatement::new();
326		assert!(stmt.name.to_string().is_empty());
327		assert!(stmt.options.is_empty());
328	}
329
330	#[rstest]
331	fn test_alter_sequence_with_name() {
332		let mut stmt = AlterSequenceStatement::new();
333		stmt.name("my_seq");
334		assert_eq!(stmt.name.to_string(), "my_seq");
335	}
336
337	#[rstest]
338	fn test_alter_sequence_restart_without_value() {
339		let mut stmt = AlterSequenceStatement::new();
340		stmt.name("my_seq").restart(None);
341		assert_eq!(stmt.options.len(), 1);
342		assert!(matches!(stmt.options[0], SequenceOption::Restart(None)));
343	}
344
345	#[rstest]
346	fn test_alter_sequence_restart_with_value() {
347		let mut stmt = AlterSequenceStatement::new();
348		stmt.name("my_seq").restart(Some(100));
349		assert_eq!(stmt.options.len(), 1);
350		assert!(matches!(
351			stmt.options[0],
352			SequenceOption::Restart(Some(100))
353		));
354	}
355
356	#[rstest]
357	fn test_alter_sequence_increment_by() {
358		let mut stmt = AlterSequenceStatement::new();
359		stmt.name("my_seq").increment_by(5);
360		assert_eq!(stmt.options.len(), 1);
361		assert!(matches!(stmt.options[0], SequenceOption::IncrementBy(5)));
362	}
363
364	#[rstest]
365	fn test_alter_sequence_min_value() {
366		let mut stmt = AlterSequenceStatement::new();
367		stmt.name("my_seq").min_value(1);
368		assert_eq!(stmt.options.len(), 1);
369		assert!(matches!(stmt.options[0], SequenceOption::MinValue(1)));
370	}
371
372	#[rstest]
373	fn test_alter_sequence_no_min_value() {
374		let mut stmt = AlterSequenceStatement::new();
375		stmt.name("my_seq").no_min_value();
376		assert_eq!(stmt.options.len(), 1);
377		assert!(matches!(stmt.options[0], SequenceOption::NoMinValue));
378	}
379
380	#[rstest]
381	fn test_alter_sequence_max_value() {
382		let mut stmt = AlterSequenceStatement::new();
383		stmt.name("my_seq").max_value(1000);
384		assert_eq!(stmt.options.len(), 1);
385		assert!(matches!(stmt.options[0], SequenceOption::MaxValue(1000)));
386	}
387
388	#[rstest]
389	fn test_alter_sequence_no_max_value() {
390		let mut stmt = AlterSequenceStatement::new();
391		stmt.name("my_seq").no_max_value();
392		assert_eq!(stmt.options.len(), 1);
393		assert!(matches!(stmt.options[0], SequenceOption::NoMaxValue));
394	}
395
396	#[rstest]
397	fn test_alter_sequence_cache() {
398		let mut stmt = AlterSequenceStatement::new();
399		stmt.name("my_seq").cache(20);
400		assert_eq!(stmt.options.len(), 1);
401		assert!(matches!(stmt.options[0], SequenceOption::Cache(20)));
402	}
403
404	#[rstest]
405	fn test_alter_sequence_cycle() {
406		let mut stmt = AlterSequenceStatement::new();
407		stmt.name("my_seq").cycle();
408		assert_eq!(stmt.options.len(), 1);
409		assert!(matches!(stmt.options[0], SequenceOption::Cycle));
410	}
411
412	#[rstest]
413	fn test_alter_sequence_no_cycle() {
414		let mut stmt = AlterSequenceStatement::new();
415		stmt.name("my_seq").no_cycle();
416		assert_eq!(stmt.options.len(), 1);
417		assert!(matches!(stmt.options[0], SequenceOption::NoCycle));
418	}
419
420	#[rstest]
421	fn test_alter_sequence_owned_by_column() {
422		let mut stmt = AlterSequenceStatement::new();
423		stmt.name("my_seq").owned_by_column("my_table", "id");
424		assert_eq!(stmt.options.len(), 1);
425		match &stmt.options[0] {
426			SequenceOption::OwnedBy(OwnedBy::Column { table, column }) => {
427				assert_eq!(table.to_string(), "my_table");
428				assert_eq!(column.to_string(), "id");
429			}
430			_ => panic!("Expected OwnedBy::Column"),
431		}
432	}
433
434	#[rstest]
435	fn test_alter_sequence_owned_by_none() {
436		let mut stmt = AlterSequenceStatement::new();
437		stmt.name("my_seq").owned_by_none();
438		assert_eq!(stmt.options.len(), 1);
439		assert!(matches!(
440			stmt.options[0],
441			SequenceOption::OwnedBy(OwnedBy::None)
442		));
443	}
444
445	#[rstest]
446	fn test_alter_sequence_multiple_options() {
447		let mut stmt = AlterSequenceStatement::new();
448		stmt.name("my_seq")
449			.increment_by(5)
450			.min_value(1)
451			.max_value(1000)
452			.cache(20)
453			.cycle();
454		assert_eq!(stmt.options.len(), 5);
455	}
456
457	#[rstest]
458	fn test_alter_sequence_take() {
459		let mut stmt = AlterSequenceStatement::new();
460		stmt.name("my_seq").increment_by(5);
461		let taken = stmt.take();
462		assert!(stmt.name.to_string().is_empty());
463		assert!(stmt.options.is_empty());
464		assert_eq!(taken.name.to_string(), "my_seq");
465		assert_eq!(taken.options.len(), 1);
466	}
467}