Delete all secondary index entries for a document. Scans the INDEXES table for entries ending with `:{document_id}` and removes them. Called during document deletion cascade.
(
&self,
tenant_id: u64,
collection: &str,
document_id: &str,
)
| 16 | /// Scans the INDEXES table for entries ending with `:{document_id}` and |
| 17 | /// removes them. Called during document deletion cascade. |
| 18 | pub fn delete_indexes_for_document( |
| 19 | &self, |
| 20 | tenant_id: u64, |
| 21 | collection: &str, |
| 22 | document_id: &str, |
| 23 | ) -> crate::Result<()> { |
| 24 | let prefix = format!("{tenant_id}:{collection}:"); |
| 25 | let end = format!("{tenant_id}:{collection}:\u{ffff}"); |
| 26 | let suffix = format!(":{document_id}"); |
| 27 | |
| 28 | let write_txn = self |
| 29 | .db |
| 30 | .begin_write() |
| 31 | .map_err(|e| redb_err("write txn", e))?; |
| 32 | { |
| 33 | let mut table = write_txn |
| 34 | .open_table(INDEXES) |
| 35 | .map_err(|e| redb_err("open indexes", e))?; |
| 36 | |
| 37 | let keys_to_remove: Vec<String> = table |
| 38 | .range(prefix.as_str()..end.as_str()) |
| 39 | .map_err(|e| redb_err("index range", e))? |
| 40 | .filter_map(|r| { |
| 41 | r.ok().and_then(|(k, _)| { |
| 42 | let key = k.value().to_string(); |
| 43 | if key.ends_with(&suffix) { |
| 44 | Some(key) |
| 45 | } else { |
| 46 | None |
| 47 | } |
| 48 | }) |
| 49 | }) |
| 50 | .collect(); |
| 51 | |
| 52 | for key in &keys_to_remove { |
| 53 | table |
| 54 | .remove(key.as_str()) |
| 55 | .map_err(|e| redb_err("remove index", e))?; |
| 56 | } |
| 57 | } |
| 58 | write_txn |
| 59 | .commit() |
| 60 | .map_err(|e| redb_err("commit index cascade", e))?; |
| 61 | |
| 62 | Ok(()) |
| 63 | } |
| 64 | |
| 65 | /// Delete all secondary index entries for a specific field in a collection. |
| 66 | pub fn delete_index_entries_for_field( |
no test coverage detected