datasources/statements/
bulk_delete_statement_text_renderer.rs1use 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}