use crate::SqlWriterValues;
use crate::expr::Expr;
use crate::expr::write_expr;
use crate::query::Returning;
use crate::query::With;
use crate::query::write_returning;
use crate::query::write_with;
use crate::types::IntoTableRef;
use crate::types::TableRef;
use crate::types::write_table_ref;
use crate::writer::SqlWriter;
#[derive(Default, Debug, Clone, PartialEq)]
pub struct Delete {
table: Option<TableRef>,
conditions: Vec<Expr>,
returning: Option<Returning>,
with: Option<With>,
}
impl Delete {
pub fn new() -> Self {
Self::default()
}
pub fn to_values(&self) -> SqlWriterValues {
let mut w = SqlWriterValues::new();
write_delete(&mut w, self);
w
}
pub fn to_sql(&self) -> String {
let mut sql = String::new();
write_delete(&mut sql, self);
sql
}
pub fn from_table<T>(mut self, table: T) -> Self
where
T: IntoTableRef,
{
self.table = Some(table.into());
self
}
pub fn and_where<T>(mut self, expr: T) -> Self
where
T: Into<Expr>,
{
self.conditions.push(expr.into());
self
}
pub fn returning(mut self, returning_cols: Returning) -> Self {
self.returning = Some(returning_cols);
self
}
pub fn with(mut self, with: With) -> Self {
self.with = Some(with);
self
}
}
pub(crate) fn write_delete<W: SqlWriter>(w: &mut W, delete: &Delete) {
if let Some(with) = &delete.with {
write_with(w, with);
w.push_char(' ');
}
w.push_str("DELETE ");
if let Some(table) = &delete.table {
w.push_str("FROM ");
write_table_ref(w, table);
}
if let Some(condition) = Expr::from_conditions(delete.conditions.clone()) {
w.push_str(" WHERE ");
write_expr(w, &condition);
}
if let Some(returning) = &delete.returning {
write_returning(w, returning);
}
}