datasources 0.1.5

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use super::bulk_delete_statement::BulkDeleteStatement;

pub struct BulkDeleteStatementTextRenderer;

impl BulkDeleteStatementTextRenderer {
    pub fn render(&self, statement: &BulkDeleteStatement) -> String {
        if statement.ids().is_empty() {
            return format!("DELETE FROM {} WHERE 1 = 1", statement.table());
        }
        if statement.ids().len() == 1 {
            let column = &statement.ids()[0];
            let names = (0..statement.rows().len())
                .map(|index| format!("${column}__{index}"))
                .collect::<Vec<_>>()
                .join(", ");
            return format!(
                "DELETE FROM {} WHERE {column} IN ({names})",
                statement.table()
            );
        }
        let tuples = (0..statement.rows().len())
            .map(|index| {
                format!(
                    "({})",
                    statement
                        .ids()
                        .iter()
                        .map(|column| format!("${column}__{index}"))
                        .collect::<Vec<_>>()
                        .join(", ")
                )
            })
            .collect::<Vec<_>>()
            .join(", ");
        format!(
            "DELETE FROM {} WHERE ({}) IN ({tuples})",
            statement.table(),
            statement.ids().join(", ")
        )
    }
}

impl Default for BulkDeleteStatementTextRenderer {
    fn default() -> Self {
        Self
    }
}