multisql/executor/alter_row/
delete.rs1use {
2	crate::{
3		data::Schema,
4		recipe::{MetaRecipe, PlannedRecipe},
5		types::{ColumnInfo, ComplexTableName},
6		Column, ExecuteError, Glue, Payload, Result, Value,
7	},
8	sqlparser::ast::{Expr, ObjectName},
9};
10
11impl Glue {
12	pub async fn ast_delete(
13		&mut self,
14		table_name: &ObjectName,
15		selection: &Option<Expr>,
16	) -> Result<Payload> {
17		let ComplexTableName {
18			name: table_name,
19			database,
20			..
21		} = table_name.try_into()?;
22		let Schema {
23			column_defs,
24			indexes,
25			..
26		} = self
27			.get_database(&database)?
28			.fetch_schema(&table_name)
29			.await?
30			.ok_or(ExecuteError::TableNotExists)?;
31
32		let columns = column_defs
33			.clone()
34			.into_iter()
35			.map(|Column { name, .. }| ColumnInfo::of_name(name))
36			.collect::<Vec<ColumnInfo>>();
37		let filter = selection
38			.clone()
39			.map(|selection| {
40				PlannedRecipe::new(
41					MetaRecipe::new(selection)?.simplify_by_tempdb(&self.tempdb)?,
42					&columns,
43				)
44			})
45			.unwrap_or(Ok(PlannedRecipe::TRUE))?;
46
47		let keys = self
48			.get_database(&database)?
49			.scan_data(&table_name)
50			.await?
51			.into_iter()
52			.filter_map(|(key, row)| {
53				let row = row.0;
54
55				let confirm_constraint = filter.confirm_constraint(&row);
56				match confirm_constraint {
57					Ok(true) => Some(Ok(key)),
58					Ok(false) => None,
59					Err(error) => Some(Err(error)),
60				}
61			})
62			.collect::<Result<Vec<Value>>>()?;
63
64		let num_keys = keys.len();
65
66		let database = &mut **self.get_mut_database(&None)?;
67		let result = database
68			.delete_data(&table_name, keys)
69			.await
70			.map(|_| Payload::Delete(num_keys))?;
71
72		for index in indexes.iter() {
73			index.reset(database, &table_name, &column_defs).await?; }
75		Ok(result)
76	}
77}