fixed key-based access control for Tantivy backends
This commit is contained in:
@@ -394,6 +394,10 @@ impl TantivySearch {
|
||||
writer
|
||||
.commit()
|
||||
.map_err(|e| DBError(format!("Failed to commit: {}", e)))?;
|
||||
// Make new documents visible to searches
|
||||
self.reader
|
||||
.reload()
|
||||
.map_err(|e| DBError(format!("Failed to reload reader: {}", e)))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -402,6 +406,10 @@ impl TantivySearch {
|
||||
query_str: &str,
|
||||
options: SearchOptions,
|
||||
) -> Result<SearchResults, DBError> {
|
||||
// Ensure reader is up to date with latest commits
|
||||
self.reader
|
||||
.reload()
|
||||
.map_err(|e| DBError(format!("Failed to reload reader: {}", e)))?;
|
||||
let searcher = self.reader.searcher();
|
||||
|
||||
// Ensure we have searchable fields
|
||||
@@ -602,6 +610,40 @@ impl TantivySearch {
|
||||
config: self.config.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
/// Delete a document by its _id term. Returns true if the document existed before deletion.
|
||||
pub fn delete_document_by_id(&self, doc_id: &str) -> Result<bool, DBError> {
|
||||
// Determine existence by running a tiny term query
|
||||
let existed = if let Some((id_field, _)) = self.index_schema.fields.get("_id") {
|
||||
let term = Term::from_field_text(*id_field, doc_id);
|
||||
let searcher = self.reader.searcher();
|
||||
let tq = TermQuery::new(term.clone(), IndexRecordOption::Basic);
|
||||
let hits = searcher
|
||||
.search(&tq, &TopDocs::with_limit(1))
|
||||
.map_err(|e| DBError(format!("Failed to search for existing doc: {}", e)))?;
|
||||
!hits.is_empty()
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
// Perform deletion and commit
|
||||
let mut writer = self
|
||||
.writer
|
||||
.write()
|
||||
.map_err(|e| DBError(format!("Failed to acquire writer lock: {}", e)))?;
|
||||
if let Some((id_field, _)) = self.index_schema.fields.get("_id") {
|
||||
writer.delete_term(Term::from_field_text(*id_field, doc_id));
|
||||
}
|
||||
writer
|
||||
.commit()
|
||||
.map_err(|e| DBError(format!("Failed to commit delete: {}", e)))?;
|
||||
// Refresh reader to observe deletion
|
||||
self.reader
|
||||
.reload()
|
||||
.map_err(|e| DBError(format!("Failed to reload reader: {}", e)))?;
|
||||
|
||||
Ok(existed)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
Reference in New Issue
Block a user