icydb_core/db/query/fluent/
delete.rs1use crate::{
2 db::{
3 DbSession,
4 query::{
5 explain::ExplainPlan,
6 expr::{FilterExpr, SortExpr},
7 intent::{Query, QueryError},
8 plan::lowering::ExecutablePlan,
9 predicate::Predicate,
10 },
11 response::Response,
12 },
13 traits::{EntityKind, EntityValue, SingletonEntity},
14 types::Id,
15};
16
17pub struct FluentDeleteQuery<'a, E>
26where
27 E: EntityKind,
28{
29 session: &'a DbSession<E::Canister>,
30 query: Query<E>,
31}
32
33impl<'a, E> FluentDeleteQuery<'a, E>
34where
35 E: EntityKind,
36{
37 pub(crate) const fn new(session: &'a DbSession<E::Canister>, query: Query<E>) -> Self {
38 Self { session, query }
39 }
40
41 #[must_use]
46 pub const fn query(&self) -> &Query<E> {
47 &self.query
48 }
49
50 #[must_use]
58 pub fn by_id(mut self, id: Id<E>) -> Self {
59 self.query = self.query.by_id(id.key());
60 self
61 }
62
63 #[must_use]
67 pub fn by_ids<I>(mut self, ids: I) -> Self
68 where
69 I: IntoIterator<Item = Id<E>>,
70 {
71 self.query = self.query.by_ids(ids.into_iter().map(|id| id.key()));
72 self
73 }
74
75 #[must_use]
80 pub fn filter(mut self, predicate: Predicate) -> Self {
81 self.query = self.query.filter(predicate);
82 self
83 }
84
85 pub fn filter_expr(mut self, expr: FilterExpr) -> Result<Self, QueryError> {
86 self.query = self.query.filter_expr(expr)?;
87 Ok(self)
88 }
89
90 pub fn sort_expr(mut self, expr: SortExpr) -> Result<Self, QueryError> {
91 self.query = self.query.sort_expr(expr)?;
92 Ok(self)
93 }
94
95 #[must_use]
96 pub fn order_by(mut self, field: impl AsRef<str>) -> Self {
97 self.query = self.query.order_by(field);
98 self
99 }
100
101 #[must_use]
102 pub fn order_by_desc(mut self, field: impl AsRef<str>) -> Self {
103 self.query = self.query.order_by_desc(field);
104 self
105 }
106
107 #[must_use]
108 pub fn limit(mut self, limit: u32) -> Self {
109 self.query = self.query.limit(limit);
110 self
111 }
112
113 pub fn explain(&self) -> Result<ExplainPlan, QueryError> {
118 self.query.explain()
119 }
120
121 pub fn plan(&self) -> Result<ExecutablePlan<E>, QueryError> {
122 self.query.plan()
123 }
124
125 pub fn execute(&self) -> Result<Response<E>, QueryError>
133 where
134 E: EntityValue,
135 {
136 self.session.execute_query(self.query())
137 }
138
139 pub fn is_empty(&self) -> Result<bool, QueryError>
141 where
142 E: EntityValue,
143 {
144 Ok(self.execute()?.is_empty())
145 }
146
147 pub fn count(&self) -> Result<u32, QueryError>
149 where
150 E: EntityValue,
151 {
152 Ok(self.execute()?.count())
153 }
154
155 pub fn require_one(&self) -> Result<(), QueryError>
157 where
158 E: EntityValue,
159 {
160 self.execute()?.require_one()?;
161 Ok(())
162 }
163
164 pub fn require_some(&self) -> Result<(), QueryError>
166 where
167 E: EntityValue,
168 {
169 self.execute()?.require_some()?;
170 Ok(())
171 }
172}
173
174impl<E> FluentDeleteQuery<'_, E>
175where
176 E: EntityKind + SingletonEntity,
177 E::Key: Default,
178{
179 #[must_use]
181 pub fn only(mut self) -> Self {
182 self.query = self.query.only();
183 self
184 }
185}