reinhardt_query/query/sequence/
alter_sequence.rs1use 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#[derive(Debug, Clone)]
47pub struct AlterSequenceStatement {
48 pub(crate) name: DynIden,
49 pub(crate) options: Vec<SequenceOption>,
50}
51
52impl AlterSequenceStatement {
53 pub fn new() -> Self {
63 Self {
64 name: "".into_iden(),
65 options: Vec::new(),
66 }
67 }
68
69 pub fn take(&mut self) -> Self {
71 let taken = Self {
72 name: self.name.clone(),
73 options: self.options.clone(),
74 };
75 self.name = "".into_iden();
77 self.options.clear();
78 taken
79 }
80
81 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 pub fn restart(&mut self, value: Option<i64>) -> &mut Self {
119 self.options.push(SequenceOption::Restart(value));
120 self
121 }
122
123 pub fn increment_by(&mut self, increment: i64) -> &mut Self {
135 self.options.push(SequenceOption::IncrementBy(increment));
136 self
137 }
138
139 pub fn min_value(&mut self, value: i64) -> &mut Self {
151 self.options.push(SequenceOption::MinValue(value));
152 self
153 }
154
155 pub fn no_min_value(&mut self) -> &mut Self {
167 self.options.push(SequenceOption::NoMinValue);
168 self
169 }
170
171 pub fn max_value(&mut self, value: i64) -> &mut Self {
183 self.options.push(SequenceOption::MaxValue(value));
184 self
185 }
186
187 pub fn no_max_value(&mut self) -> &mut Self {
199 self.options.push(SequenceOption::NoMaxValue);
200 self
201 }
202
203 pub fn cache(&mut self, value: i64) -> &mut Self {
215 self.options.push(SequenceOption::Cache(value));
216 self
217 }
218
219 pub fn cycle(&mut self) -> &mut Self {
231 self.options.push(SequenceOption::Cycle);
232 self
233 }
234
235 pub fn no_cycle(&mut self) -> &mut Self {
247 self.options.push(SequenceOption::NoCycle);
248 self
249 }
250
251 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 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 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}