rust_pgdatadiff/diff/sequence/query/
sequence_query.rs

1use crate::diff::sequence::query::sequence_types::SequenceName;
2use crate::diff::types::SchemaName;
3use std::fmt::{Display, Formatter};
4
5/// Represents a query for retrieving information about sequences.
6pub enum SequenceQuery {
7    /// Retrieves the last value of a specific sequence.
8    LastValue(SchemaName, SequenceName),
9    /// Retrieves all sequences in the database.
10    AllSequences(SchemaName),
11}
12
13impl Display for SequenceQuery {
14    /// Formats the `SequenceQuery` as a string.
15    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
16        match self {
17            Self::LastValue(schema_name, sequence_name) => {
18                write!(
19                    f,
20                    "SELECT last_value FROM {}.\"{}\";",
21                    schema_name.name(),
22                    sequence_name.name()
23                )
24            }
25            SequenceQuery::AllSequences(schema_name) => {
26                write!(
27                    f,
28                    r#"
29                    SELECT sequence_name
30                    FROM information_schema.sequences
31                    WHERE sequence_schema = '{}';
32                    "#,
33                    schema_name.name()
34                )
35            }
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::diff::internal::tests::sanitize_raw_string;
44
45    impl From<SequenceQuery> for String {
46        fn from(value: SequenceQuery) -> Self {
47            value.to_string()
48        }
49    }
50
51    #[test]
52    fn test_sequence_last_value_query() {
53        let schema_name = SchemaName::new("test_schema");
54        let sequence_name = SequenceName::new("test_sequence");
55        let last_value_query = SequenceQuery::LastValue(schema_name, sequence_name);
56
57        assert_eq!(
58            last_value_query.to_string(),
59            "SELECT last_value FROM test_schema.test_sequence;"
60        );
61    }
62
63    #[test]
64    fn test_all_sequences_query() {
65        let schema_name = SchemaName::new("test_schema");
66        let all_sequences_query = SequenceQuery::AllSequences(schema_name);
67
68        assert_eq!(
69            sanitize_raw_string(all_sequences_query),
70            "SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'test_schema';"
71        );
72    }
73}