Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit e44ca84

Browse files
committed
Remove soft deleted ids from ExternalDocumentIds during document import
If the document import replaces a document using hard deletion
1 parent bebd050 commit e44ca84

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

milli/src/update/delete_documents.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ pub struct DocumentDeletionResult {
3434
pub deleted_documents: u64,
3535
pub remaining_documents: u64,
3636
}
37+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38+
pub struct DetailedDocumentDeletionResult {
39+
pub deleted_documents: u64,
40+
pub remaining_documents: u64,
41+
pub used_soft_deletion: bool,
42+
}
3743

3844
impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
3945
pub fn new(
@@ -68,8 +74,16 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
6874
self.delete_document(docid);
6975
Some(docid)
7076
}
71-
72-
pub fn execute(mut self) -> Result<DocumentDeletionResult> {
77+
pub fn execute(self) -> Result<DocumentDeletionResult> {
78+
let DetailedDocumentDeletionResult {
79+
deleted_documents,
80+
remaining_documents,
81+
used_soft_deletion: _,
82+
} = self.execute_inner()?;
83+
84+
Ok(DocumentDeletionResult { deleted_documents, remaining_documents })
85+
}
86+
pub(crate) fn execute_inner(mut self) -> Result<DetailedDocumentDeletionResult> {
7387
self.index.set_updated_at(self.wtxn, &OffsetDateTime::now_utc())?;
7488

7589
// We retrieve the current documents ids that are in the database.
@@ -83,7 +97,11 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
8397
if !soft_deleted_docids.is_empty() {
8498
ClearDocuments::new(self.wtxn, self.index).execute()?;
8599
}
86-
return Ok(DocumentDeletionResult { deleted_documents: 0, remaining_documents: 0 });
100+
return Ok(DetailedDocumentDeletionResult {
101+
deleted_documents: 0,
102+
remaining_documents: 0,
103+
used_soft_deletion: false,
104+
});
87105
}
88106

89107
// We remove the documents ids that we want to delete
@@ -95,9 +113,10 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
95113
// to delete is exactly the number of documents in the database.
96114
if current_documents_ids_len == self.to_delete_docids.len() {
97115
let remaining_documents = ClearDocuments::new(self.wtxn, self.index).execute()?;
98-
return Ok(DocumentDeletionResult {
116+
return Ok(DetailedDocumentDeletionResult {
99117
deleted_documents: current_documents_ids_len,
100118
remaining_documents,
119+
used_soft_deletion: false,
101120
});
102121
}
103122

@@ -159,9 +178,10 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
159178
&& percentage_used_by_soft_deleted_documents < 10
160179
{
161180
self.index.put_soft_deleted_documents_ids(self.wtxn, &soft_deleted_docids)?;
162-
return Ok(DocumentDeletionResult {
181+
return Ok(DetailedDocumentDeletionResult {
163182
deleted_documents: self.to_delete_docids.len(),
164183
remaining_documents: documents_ids.len(),
184+
used_soft_deletion: true,
165185
});
166186
}
167187

@@ -488,9 +508,10 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> {
488508
&self.to_delete_docids,
489509
)?;
490510

491-
Ok(DocumentDeletionResult {
511+
Ok(DetailedDocumentDeletionResult {
492512
deleted_documents: self.to_delete_docids.len(),
493513
remaining_documents: documents_ids.len(),
514+
used_soft_deletion: false,
494515
})
495516
}
496517
}

milli/src/update/index_documents/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ where
210210
primary_key,
211211
fields_ids_map,
212212
field_distribution,
213-
external_documents_ids,
213+
mut external_documents_ids,
214214
new_documents_ids,
215215
replaced_documents_ids,
216216
documents_count,
@@ -335,8 +335,11 @@ where
335335
deletion_builder.disable_soft_deletion(self.config.disable_soft_deletion);
336336
debug!("documents to delete {:?}", replaced_documents_ids);
337337
deletion_builder.delete_documents(&replaced_documents_ids);
338-
let deleted_documents_count = deletion_builder.execute()?;
339-
debug!("{} documents actually deleted", deleted_documents_count.deleted_documents);
338+
let deleted_documents_result = deletion_builder.execute_inner()?;
339+
debug!("{} documents actually deleted", deleted_documents_result.deleted_documents);
340+
if !deleted_documents_result.used_soft_deletion {
341+
external_documents_ids.delete_soft_deleted_documents_ids_from_fsts()?;
342+
}
340343
}
341344

342345
let index_documents_ids = self.index.documents_ids(self.wtxn)?;

0 commit comments

Comments
 (0)