reinhardt_query/query/sequence/
create_sequence.rs1use crate::{
6 backend::QueryBuilder,
7 types::{IntoIden, sequence::SequenceDef},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12#[derive(Debug, Clone)]
39pub struct CreateSequenceStatement {
40 pub(crate) sequence_def: SequenceDef,
41}
42
43impl CreateSequenceStatement {
44 pub fn new() -> Self {
54 Self {
56 sequence_def: SequenceDef::new(""),
57 }
58 }
59
60 pub fn take(&mut self) -> Self {
62 let taken = Self {
63 sequence_def: self.sequence_def.clone(),
64 };
65 self.sequence_def = SequenceDef::new("");
67 taken
68 }
69
70 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 pub fn if_not_exists(&mut self) -> &mut Self {
100 self.sequence_def.if_not_exists = true;
101 self
102 }
103
104 pub fn increment(&mut self, increment: i64) -> &mut Self {
116 self.sequence_def.increment = Some(increment);
117 self
118 }
119
120 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 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 pub fn start(&mut self, start: i64) -> &mut Self {
168 self.sequence_def.start = Some(start);
169 self
170 }
171
172 pub fn cache(&mut self, cache: i64) -> &mut Self {
184 self.sequence_def.cache = Some(cache);
185 self
186 }
187
188 pub fn cycle(&mut self, cycle: bool) -> &mut Self {
200 self.sequence_def.cycle = Some(cycle);
201 self
202 }
203
204 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 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 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}