pub struct AnnIndex { /* private fields */ }Expand description
A project-scoped, disk-persisted HNSW index. See the module docs for the overall approach.
Implementations§
Source§impl AnnIndex
impl AnnIndex
Sourcepub async fn load_or_empty(
project_hash: &str,
dim: usize,
) -> Result<Self, CoreError>
pub async fn load_or_empty( project_hash: &str, dim: usize, ) -> Result<Self, CoreError>
Load from disk, or create an empty index if the on-disk files are missing / corrupt / dim-mismatched. Never errors — worst case the caller gets an empty index and retrieval falls through to the linear path.
Sourcepub async fn build_from_chunks(
project_hash: &str,
chunks: &[(String, Vec<f32>)],
) -> Result<Self, CoreError>
pub async fn build_from_chunks( project_hash: &str, chunks: &[(String, Vec<f32>)], ) -> Result<Self, CoreError>
Construct a fresh index from a full slice of chunks. Used when no on-disk graph exists or when the caller wants to compact out tombstones. Swallows per-chunk dim mismatches (those rows are dropped) but never errors.
Sourcepub fn upsert(&mut self, chunk_id: &str, embedding: &[f32])
pub fn upsert(&mut self, chunk_id: &str, embedding: &[f32])
Upsert a single chunk. The previous entry (if any) is marked tombstoned so it won’t surface in future searches; the new embedding is appended to the graph with a fresh internal id.
A dim mismatch is silently ignored — the caller is the SQL upsert path which continues regardless, matching the “ANN never blocks rule writes” contract.
Sourcepub fn remove(&mut self, chunk_id: &str)
pub fn remove(&mut self, chunk_id: &str)
Mark a chunk as removed. The underlying HNSW entry is NOT
physically deleted (hnsw_rs has no public remove API); instead
we tombstone it so search skips it. Full reclamation happens on
the next build_from_chunks.
Sourcepub fn search(&self, query: &[f32], top_k: usize) -> Vec<(String, f32)>
pub fn search(&self, query: &[f32], top_k: usize) -> Vec<(String, f32)>
Search for top_k nearest chunks to the query. Returns
(chunk_id, distance) pairs with smaller distance = more similar
(DistCosine returns 1 - cos). An empty index, dim mismatch,
empty query, or any internal error yields an empty result — the
caller should interpret that as “use the linear scan”.
Sourcepub async fn save(&mut self) -> Result<(), CoreError>
pub async fn save(&mut self) -> Result<(), CoreError>
Persist the index + sidecar to ~/.difflore/projects/{hash}/.
A best-effort operation — directory-create and graph-dump errors
bubble up so callers can log them, but the typical caller
(upsert_rule_chunks) swallows the error. Sets dirty = false
on success.
Sourcepub const fn is_dirty(&self) -> bool
pub const fn is_dirty(&self) -> bool
Has the in-memory state diverged from disk? Callers can gate
expensive save() calls on this.
Sourcepub fn live_size(&self) -> u32
pub fn live_size(&self) -> u32
Number of live (non-tombstoned) chunks in the index. Used by the trajectory emitter so the cloud dashboard can chart index growth.
Sourcepub fn total_size(&self) -> u32
pub fn total_size(&self) -> u32
Total chunk count including tombstones. Mostly for tests / diagnostics.
Auto Trait Implementations§
impl !RefUnwindSafe for AnnIndex
impl !UnwindSafe for AnnIndex
impl Freeze for AnnIndex
impl Send for AnnIndex
impl Sync for AnnIndex
impl Unpin for AnnIndex
impl UnsafeUnpin for AnnIndex
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more