Skip to main content

reinhardt_query/query/sequence/
create_sequence.rs

1//! CREATE SEQUENCE statement builder
2//!
3//! This module provides the `CreateSequenceStatement` type for building SQL CREATE SEQUENCE queries.
4
5use crate::{
6	backend::QueryBuilder,
7	types::{IntoIden, sequence::SequenceDef},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12/// CREATE SEQUENCE statement builder
13///
14/// This struct provides a fluent API for constructing CREATE SEQUENCE queries.
15///
16/// # Examples
17///
18/// ```rust
19/// use reinhardt_query::prelude::*;
20///
21/// // CREATE SEQUENCE my_seq
22/// let query = Query::create_sequence()
23///     .name("my_seq");
24///
25/// // CREATE SEQUENCE IF NOT EXISTS my_seq INCREMENT BY 5
26/// let query = Query::create_sequence()
27///     .name("my_seq")
28///     .if_not_exists()
29///     .increment(5);
30///
31/// // CREATE SEQUENCE my_seq START WITH 100 MINVALUE 1 MAXVALUE 1000
32/// let query = Query::create_sequence()
33///     .name("my_seq")
34///     .start(100)
35///     .min_value(Some(1))
36///     .max_value(Some(1000));
37/// ```
38#[derive(Debug, Clone)]
39pub struct CreateSequenceStatement {
40	pub(crate) sequence_def: SequenceDef,
41}
42
43impl CreateSequenceStatement {
44	/// Create a new CREATE SEQUENCE statement
45	///
46	/// # Examples
47	///
48	/// ```rust
49	/// use reinhardt_query::prelude::*;
50	///
51	/// let query = Query::create_sequence();
52	/// ```
53	pub fn new() -> Self {
54		// Start with empty name - will be set via .name()
55		Self {
56			sequence_def: SequenceDef::new(""),
57		}
58	}
59
60	/// Take the ownership of data in the current [`CreateSequenceStatement`]
61	pub fn take(&mut self) -> Self {
62		let taken = Self {
63			sequence_def: self.sequence_def.clone(),
64		};
65		// Reset self to empty state
66		self.sequence_def = SequenceDef::new("");
67		taken
68	}
69
70	/// Set the sequence name
71	///
72	/// # Examples
73	///
74	/// ```rust
75	/// use reinhardt_query::prelude::*;
76	///
77	/// let query = Query::create_sequence()
78	///     .name("my_seq");
79	/// ```
80	pub fn name<N>(&mut self, name: N) -> &mut Self
81	where
82		N: IntoIden,
83	{
84		self.sequence_def.name = name.into_iden();
85		self
86	}
87
88	/// Add IF NOT EXISTS clause
89	///
90	/// # Examples
91	///
92	/// ```rust
93	/// use reinhardt_query::prelude::*;
94	///
95	/// let query = Query::create_sequence()
96	///     .name("my_seq")
97	///     .if_not_exists();
98	/// ```
99	pub fn if_not_exists(&mut self) -> &mut Self {
100		self.sequence_def.if_not_exists = true;
101		self
102	}
103
104	/// Set INCREMENT BY value
105	///
106	/// # Examples
107	///
108	/// ```rust
109	/// use reinhardt_query::prelude::*;
110	///
111	/// let query = Query::create_sequence()
112	///     .name("my_seq")
113	///     .increment(5);
114	/// ```
115	pub fn increment(&mut self, increment: i64) -> &mut Self {
116		self.sequence_def.increment = Some(increment);
117		self
118	}
119
120	/// Set MINVALUE
121	///
122	/// Use `None` for NO MINVALUE, or `Some(value)` for specific minimum.
123	///
124	/// # Examples
125	///
126	/// ```rust
127	/// use reinhardt_query::prelude::*;
128	///
129	/// let query = Query::create_sequence()
130	///     .name("my_seq")
131	///     .min_value(Some(1));
132	/// ```
133	pub fn min_value(&mut self, min_value: Option<i64>) -> &mut Self {
134		self.sequence_def.min_value = Some(min_value);
135		self
136	}
137
138	/// Set MAXVALUE
139	///
140	/// Use `None` for NO MAXVALUE, or `Some(value)` for specific maximum.
141	///
142	/// # Examples
143	///
144	/// ```rust
145	/// use reinhardt_query::prelude::*;
146	///
147	/// let query = Query::create_sequence()
148	///     .name("my_seq")
149	///     .max_value(Some(1000));
150	/// ```
151	pub fn max_value(&mut self, max_value: Option<i64>) -> &mut Self {
152		self.sequence_def.max_value = Some(max_value);
153		self
154	}
155
156	/// Set START WITH value
157	///
158	/// # Examples
159	///
160	/// ```rust
161	/// use reinhardt_query::prelude::*;
162	///
163	/// let query = Query::create_sequence()
164	///     .name("my_seq")
165	///     .start(100);
166	/// ```
167	pub fn start(&mut self, start: i64) -> &mut Self {
168		self.sequence_def.start = Some(start);
169		self
170	}
171
172	/// Set CACHE value
173	///
174	/// # Examples
175	///
176	/// ```rust
177	/// use reinhardt_query::prelude::*;
178	///
179	/// let query = Query::create_sequence()
180	///     .name("my_seq")
181	///     .cache(20);
182	/// ```
183	pub fn cache(&mut self, cache: i64) -> &mut Self {
184		self.sequence_def.cache = Some(cache);
185		self
186	}
187
188	/// Set CYCLE or NO CYCLE
189	///
190	/// # Examples
191	///
192	/// ```rust
193	/// use reinhardt_query::prelude::*;
194	///
195	/// let query = Query::create_sequence()
196	///     .name("my_seq")
197	///     .cycle(true);
198	/// ```
199	pub fn cycle(&mut self, cycle: bool) -> &mut Self {
200		self.sequence_def.cycle = Some(cycle);
201		self
202	}
203
204	/// Set OWNED BY table.column
205	///
206	/// # Examples
207	///
208	/// ```rust
209	/// use reinhardt_query::prelude::*;
210	///
211	/// let query = Query::create_sequence()
212	///     .name("my_seq")
213	///     .owned_by_column("my_table", "id");
214	/// ```
215	pub fn owned_by_column<T: IntoIden, C: IntoIden>(&mut self, table: T, column: C) -> &mut Self {
216		self.sequence_def = self.sequence_def.clone().owned_by_column(table, column);
217		self
218	}
219
220	/// Set OWNED BY NONE
221	///
222	/// # Examples
223	///
224	/// ```rust
225	/// use reinhardt_query::prelude::*;
226	///
227	/// let query = Query::create_sequence()
228	///     .name("my_seq")
229	///     .owned_by_none();
230	/// ```
231	pub fn owned_by_none(&mut self) -> &mut Self {
232		self.sequence_def = self.sequence_def.clone().owned_by_none();
233		self
234	}
235}
236
237impl Default for CreateSequenceStatement {
238	fn default() -> Self {
239		Self::new()
240	}
241}
242
243impl QueryStatementBuilder for CreateSequenceStatement {
244	fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
245		// Downcast to concrete QueryBuilder type
246		use std::any::Any;
247		if let Some(builder) =
248			(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
249		{
250			return builder.build_create_sequence(self);
251		}
252		if let Some(builder) =
253			(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
254		{
255			return builder.build_create_sequence(self);
256		}
257		if let Some(builder) =
258			(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
259		{
260			return builder.build_create_sequence(self);
261		}
262		panic!("Unsupported query builder type");
263	}
264}
265
266impl QueryStatementWriter for CreateSequenceStatement {}
267
268#[cfg(test)]
269mod tests {
270	use super::*;
271	use rstest::*;
272
273	#[rstest]
274	fn test_create_sequence_new() {
275		let stmt = CreateSequenceStatement::new();
276		assert!(stmt.sequence_def.name.to_string().is_empty());
277		assert!(!stmt.sequence_def.if_not_exists);
278		assert!(stmt.sequence_def.increment.is_none());
279	}
280
281	#[rstest]
282	fn test_create_sequence_with_name() {
283		let mut stmt = CreateSequenceStatement::new();
284		stmt.name("my_seq");
285		assert_eq!(stmt.sequence_def.name.to_string(), "my_seq");
286	}
287
288	#[rstest]
289	fn test_create_sequence_if_not_exists() {
290		let mut stmt = CreateSequenceStatement::new();
291		stmt.name("my_seq").if_not_exists();
292		assert!(stmt.sequence_def.if_not_exists);
293	}
294
295	#[rstest]
296	fn test_create_sequence_increment() {
297		let mut stmt = CreateSequenceStatement::new();
298		stmt.name("my_seq").increment(5);
299		assert_eq!(stmt.sequence_def.increment, Some(5));
300	}
301
302	#[rstest]
303	fn test_create_sequence_min_max_values() {
304		let mut stmt = CreateSequenceStatement::new();
305		stmt.name("my_seq").min_value(Some(1)).max_value(Some(1000));
306		assert_eq!(stmt.sequence_def.min_value, Some(Some(1)));
307		assert_eq!(stmt.sequence_def.max_value, Some(Some(1000)));
308	}
309
310	#[rstest]
311	fn test_create_sequence_start() {
312		let mut stmt = CreateSequenceStatement::new();
313		stmt.name("my_seq").start(100);
314		assert_eq!(stmt.sequence_def.start, Some(100));
315	}
316
317	#[rstest]
318	fn test_create_sequence_cache() {
319		let mut stmt = CreateSequenceStatement::new();
320		stmt.name("my_seq").cache(20);
321		assert_eq!(stmt.sequence_def.cache, Some(20));
322	}
323
324	#[rstest]
325	fn test_create_sequence_cycle() {
326		let mut stmt = CreateSequenceStatement::new();
327		stmt.name("my_seq").cycle(true);
328		assert_eq!(stmt.sequence_def.cycle, Some(true));
329	}
330
331	#[rstest]
332	fn test_create_sequence_take() {
333		let mut stmt = CreateSequenceStatement::new();
334		stmt.name("my_seq");
335		let taken = stmt.take();
336		assert!(stmt.sequence_def.name.to_string().is_empty());
337		assert_eq!(taken.sequence_def.name.to_string(), "my_seq");
338	}
339}