Skip to main content

datasources/statements/
bulk_delete_statement_text_renderer.rs

1use super::bulk_delete_statement::BulkDeleteStatement;
2
3pub struct BulkDeleteStatementTextRenderer;
4
5impl BulkDeleteStatementTextRenderer {
6    pub fn quote(&self, name: &str) -> String {
7        name.to_string()
8    }
9
10    pub fn parameter(&self, name: &str) -> String {
11        format!("${name}")
12    }
13
14    pub fn render(&self, statement: &BulkDeleteStatement) -> String {
15        Self::render_with(statement, |name| self.quote(name), |name| self.parameter(name))
16    }
17
18    pub fn render_with(
19        statement: &BulkDeleteStatement,
20        quote: impl Fn(&str) -> String,
21        parameter: impl Fn(&str) -> String,
22    ) -> String {
23        if statement.ids().is_empty() {
24            return format!("DELETE FROM {} WHERE 1 = 1", quote(statement.table()));
25        }
26        if statement.ids().len() == 1 {
27            let column = &statement.ids()[0];
28            let names = (0..statement.rows().len())
29                .map(|index| parameter(&format!("{column}__{index}")))
30                .collect::<Vec<_>>()
31                .join(", ");
32            return format!(
33                "DELETE FROM {} WHERE {} IN ({names})",
34                quote(statement.table()),
35                quote(column)
36            );
37        }
38        let tuples = (0..statement.rows().len())
39            .map(|index| {
40                format!(
41                    "({})",
42                    statement
43                        .ids()
44                        .iter()
45                        .map(|column| parameter(&format!("{column}__{index}")))
46                        .collect::<Vec<_>>()
47                        .join(", ")
48                )
49            })
50            .collect::<Vec<_>>()
51            .join(", ");
52        format!(
53            "DELETE FROM {} WHERE ({}) IN ({tuples})",
54            quote(statement.table()),
55            statement
56                .ids()
57                .iter()
58                .map(|column| quote(column))
59                .collect::<Vec<_>>()
60                .join(", ")
61        )
62    }
63}
64
65impl Default for BulkDeleteStatementTextRenderer {
66    fn default() -> Self {
67        Self
68    }
69}