use crate::values::PostgresValue;
use core::fmt::Debug;
use core::marker::PhantomData;
use drizzle_core::ToSQL;
use super::ExecutableState;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteInitial;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteWhereSet;
#[derive(Debug, Clone, Copy, Default)]
pub struct DeleteReturningSet;
impl ExecutableState for DeleteInitial {}
impl ExecutableState for DeleteWhereSet {}
impl ExecutableState for DeleteReturningSet {}
pub type DeleteBuilder<'a, Schema, State, Table, Marker = (), Row = ()> =
super::QueryBuilder<'a, Schema, State, Table, Marker, Row>;
type ReturningMarker<Table, Columns> = drizzle_core::Scoped<
<Columns as drizzle_core::IntoSelectTarget>::Marker,
drizzle_core::Cons<Table, drizzle_core::Nil>,
>;
type ReturningRow<Table, Columns> =
<<Columns as drizzle_core::IntoSelectTarget>::Marker as drizzle_core::ResolveRow<Table>>::Row;
type ReturningBuilder<'a, S, T, Columns> = DeleteBuilder<
'a,
S,
DeleteReturningSet,
T,
ReturningMarker<T, Columns>,
ReturningRow<T, Columns>,
>;
impl<'a, S, T> DeleteBuilder<'a, S, DeleteInitial, T> {
#[inline]
pub fn r#where<E>(self, condition: E) -> DeleteBuilder<'a, S, DeleteWhereSet, T>
where
E: drizzle_core::expr::Expr<'a, PostgresValue<'a>>,
E::SQLType: drizzle_core::types::BooleanLike,
{
let where_sql = crate::helpers::r#where(condition);
DeleteBuilder {
sql: self.sql.append(where_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
marker: PhantomData,
row: PhantomData,
grouped: PhantomData,
}
}
#[inline]
pub fn returning<Columns>(self, columns: Columns) -> ReturningBuilder<'a, S, T, Columns>
where
Columns: ToSQL<'a, PostgresValue<'a>> + drizzle_core::IntoSelectTarget,
Columns::Marker: drizzle_core::ResolveRow<T>,
{
let returning_sql = crate::helpers::returning(columns);
DeleteBuilder {
sql: self.sql.append(returning_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
marker: PhantomData,
row: PhantomData,
grouped: PhantomData,
}
}
}
impl<'a, S, T> DeleteBuilder<'a, S, DeleteWhereSet, T> {
#[inline]
pub fn returning<Columns>(self, columns: Columns) -> ReturningBuilder<'a, S, T, Columns>
where
Columns: ToSQL<'a, PostgresValue<'a>> + drizzle_core::IntoSelectTarget,
Columns::Marker: drizzle_core::ResolveRow<T>,
{
let returning_sql = crate::helpers::returning(columns);
DeleteBuilder {
sql: self.sql.append(returning_sql),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
marker: PhantomData,
row: PhantomData,
grouped: PhantomData,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use drizzle_core::{SQL, ToSQL};
#[test]
fn test_delete_builder_creation() {
let builder = DeleteBuilder::<(), DeleteInitial, ()> {
sql: SQL::raw("DELETE FROM test"),
schema: PhantomData,
state: PhantomData,
table: PhantomData,
marker: PhantomData,
row: PhantomData,
grouped: PhantomData,
};
assert_eq!(builder.to_sql().sql(), "DELETE FROM test");
}
}