DELETE: remove key(s). Returns count of keys actually deleted.
(
&mut self,
tenant_id: u64,
collection: &str,
keys: &[Vec<u8>],
now_ms: u64,
)
| 121 | |
| 122 | /// DELETE: remove key(s). Returns count of keys actually deleted. |
| 123 | pub fn delete( |
| 124 | &mut self, |
| 125 | tenant_id: u64, |
| 126 | collection: &str, |
| 127 | keys: &[Vec<u8>], |
| 128 | now_ms: u64, |
| 129 | ) -> usize { |
| 130 | let tkey = table_key(tenant_id, collection); |
| 131 | let table = match self.tables.get_mut(&tkey) { |
| 132 | Some(t) => t, |
| 133 | None => return 0, |
| 134 | }; |
| 135 | |
| 136 | let mut count = 0; |
| 137 | let has_indexes = self.indexes.get(&tkey).is_some_and(|s| !s.is_empty()); |
| 138 | let has_sorted = self.sorted_indexes.has_indexes(tkey); |
| 139 | |
| 140 | for key in keys { |
| 141 | // Cancel expiry if the key had one. |
| 142 | if let Some(meta) = table.get_entry_meta(key) |
| 143 | && meta.has_ttl |
| 144 | { |
| 145 | let composite = expiry_key(tenant_id, collection, key); |
| 146 | self.expiry.cancel(&composite, meta.expire_at_ms); |
| 147 | } |
| 148 | |
| 149 | // Extract field values before deletion (for index cleanup). |
| 150 | let old_fields = if has_indexes { |
| 151 | table |
| 152 | .get(key, now_ms) |
| 153 | .map(extract_all_field_values_from_msgpack) |
| 154 | } else { |
| 155 | None |
| 156 | }; |
| 157 | |
| 158 | if table.delete(key, now_ms) { |
| 159 | count += 1; |
| 160 | |
| 161 | // Clean up secondary indexes. |
| 162 | if let Some(fields) = &old_fields |
| 163 | && let Some(idx_set) = self.indexes.get_mut(&tkey) |
| 164 | { |
| 165 | let refs: Vec<(&str, &[u8])> = fields |
| 166 | .iter() |
| 167 | .map(|(k, v)| (k.as_str(), v.as_slice())) |
| 168 | .collect(); |
| 169 | idx_set.on_delete(key, &refs); |
| 170 | } |
| 171 | |
| 172 | // Clean up sorted indexes. |
| 173 | if has_sorted { |
| 174 | self.sorted_indexes.on_delete(tkey, key); |
| 175 | } |
| 176 | } |
| 177 | } |
| 178 | count |
| 179 | } |
| 180 |