use nodedb_types::SparseVector;
use nodedb_types::error::{NodeDbError, NodeDbResult};
use crate::nodedb::lock_ext::LockExt;
use crate::storage::engine::StorageEngine;
use super::types::NodeDbLite;
impl<S: StorageEngine> NodeDbLite<S> {
pub(crate) fn index_document_sparse(
&self,
collection: &str,
doc_id: &str,
fields: &std::collections::HashMap<String, nodedb_types::Value>,
) {
self.sparse_state
.manager
.lock_or_recover()
.index_document_fields(collection, doc_id, fields);
}
pub(crate) fn remove_document_sparse(&self, collection: &str, doc_id: &str) {
self.sparse_state
.manager
.lock_or_recover()
.remove_document_all_fields(collection, doc_id);
}
pub fn sparse_insert(
&self,
collection: &str,
field: &str,
doc_id: &str,
entries: &[(u32, f32)],
) -> NodeDbResult<()> {
let vector =
SparseVector::from_entries(entries.to_vec()).map_err(NodeDbError::bad_request)?;
self.sparse_state
.manager
.lock_or_recover()
.index_document(collection, field, doc_id, &vector);
Ok(())
}
pub fn sparse_delete(&self, collection: &str, field: &str, doc_id: &str) -> bool {
self.sparse_state
.manager
.lock_or_recover()
.remove_document(collection, field, doc_id)
}
pub fn sparse_search(
&self,
collection: &str,
field: &str,
query_entries: &[(u32, f32)],
top_k: usize,
) -> NodeDbResult<Vec<(String, f32)>> {
let query =
SparseVector::from_entries(query_entries.to_vec()).map_err(NodeDbError::bad_request)?;
let hits = self
.sparse_state
.manager
.lock_or_recover()
.search(collection, field, &query, top_k);
Ok(hits.into_iter().map(|h| (h.doc_id, h.score)).collect())
}
}