use crate::{
backend::QueryBuilder,
prepare::*,
query::{condition::*, OrderedStatement},
types::*,
value::*,
QueryStatementBuilder, QueryStatementWriter, ReturningClause, SimpleExpr, SubQueryStatement,
WithClause, WithQuery,
};
use inherent::inherent;
#[derive(Default, Debug, Clone, PartialEq)]
pub struct DeleteStatement {
pub(crate) table: Option<Box<TableRef>>,
pub(crate) r#where: ConditionHolder,
pub(crate) orders: Vec<OrderExpr>,
pub(crate) limit: Option<Value>,
pub(crate) returning: Option<ReturningClause>,
pub(crate) with: Option<WithClause>,
}
impl DeleteStatement {
pub fn new() -> Self {
Self::default()
}
#[allow(clippy::wrong_self_convention)]
pub fn from_table<T>(&mut self, tbl_ref: T) -> &mut Self
where
T: IntoTableRef,
{
self.table = Some(Box::new(tbl_ref.into_table_ref()));
self
}
pub fn limit(&mut self, limit: u64) -> &mut Self {
self.limit = Some(limit.into());
self
}
pub fn returning(&mut self, returning_cols: ReturningClause) -> &mut Self {
self.returning = Some(returning_cols);
self
}
pub fn returning_col<C>(&mut self, col: C) -> &mut Self
where
C: IntoColumnRef,
{
self.returning(ReturningClause::Columns(vec![col.into_column_ref()]))
}
pub fn returning_all(&mut self) -> &mut Self {
self.returning(ReturningClause::All)
}
pub fn with(self, clause: WithClause) -> WithQuery {
clause.query(self)
}
pub fn with_cte<C: Into<WithClause>>(&mut self, clause: C) -> &mut Self {
self.with = Some(clause.into());
self
}
}
#[inherent]
impl QueryStatementBuilder for DeleteStatement {
pub fn build_collect_any_into(
&self,
query_builder: &dyn QueryBuilder,
sql: &mut dyn SqlWriter,
) {
query_builder.prepare_delete_statement(self, sql);
}
pub fn into_sub_query_statement(self) -> SubQueryStatement {
SubQueryStatement::DeleteStatement(self)
}
pub fn build_any(&self, query_builder: &dyn QueryBuilder) -> (String, Values);
pub fn build_collect_any(
&self,
query_builder: &dyn QueryBuilder,
sql: &mut dyn SqlWriter,
) -> String;
}
#[inherent]
impl QueryStatementWriter for DeleteStatement {
pub fn build_collect_into<T: QueryBuilder>(&self, query_builder: T, sql: &mut dyn SqlWriter) {
query_builder.prepare_delete_statement(self, sql);
}
pub fn build_collect<T: QueryBuilder>(
&self,
query_builder: T,
sql: &mut dyn SqlWriter,
) -> String;
pub fn build<T: QueryBuilder>(&self, query_builder: T) -> (String, Values);
pub fn to_string<T: QueryBuilder>(&self, query_builder: T) -> String;
}
#[inherent]
impl OrderedStatement for DeleteStatement {
pub fn add_order_by(&mut self, order: OrderExpr) -> &mut Self {
self.orders.push(order);
self
}
pub fn clear_order_by(&mut self) -> &mut Self {
self.orders = Vec::new();
self
}
pub fn order_by<T>(&mut self, col: T, order: Order) -> &mut Self
where
T: IntoColumnRef;
pub fn order_by_expr(&mut self, expr: SimpleExpr, order: Order) -> &mut Self;
pub fn order_by_customs<I, T>(&mut self, cols: I) -> &mut Self
where
T: ToString,
I: IntoIterator<Item = (T, Order)>;
pub fn order_by_columns<I, T>(&mut self, cols: I) -> &mut Self
where
T: IntoColumnRef,
I: IntoIterator<Item = (T, Order)>;
pub fn order_by_with_nulls<T>(
&mut self,
col: T,
order: Order,
nulls: NullOrdering,
) -> &mut Self
where
T: IntoColumnRef;
pub fn order_by_expr_with_nulls(
&mut self,
expr: SimpleExpr,
order: Order,
nulls: NullOrdering,
) -> &mut Self;
pub fn order_by_customs_with_nulls<I, T>(&mut self, cols: I) -> &mut Self
where
T: ToString,
I: IntoIterator<Item = (T, Order, NullOrdering)>;
pub fn order_by_columns_with_nulls<I, T>(&mut self, cols: I) -> &mut Self
where
T: IntoColumnRef,
I: IntoIterator<Item = (T, Order, NullOrdering)>;
}
#[inherent]
impl ConditionalStatement for DeleteStatement {
pub fn and_or_where(&mut self, condition: LogicalChainOper) -> &mut Self {
self.r#where.add_and_or(condition);
self
}
pub fn cond_where<C>(&mut self, condition: C) -> &mut Self
where
C: IntoCondition,
{
self.r#where.add_condition(condition.into_condition());
self
}
pub fn and_where_option(&mut self, other: Option<SimpleExpr>) -> &mut Self;
pub fn and_where(&mut self, other: SimpleExpr) -> &mut Self;
}