pub struct InMemoryVectorStore { /* private fields */ }Expand description
In-process VectorStore backed by a per-namespace Vec<Slot>.
Cloning is cheap — internal state lives behind Arc<RwLock<...>>
so multiple SemanticMemory instances can share one store.
Implementations§
Source§impl InMemoryVectorStore
impl InMemoryVectorStore
Sourcepub fn new(dimension: usize) -> InMemoryVectorStore
pub fn new(dimension: usize) -> InMemoryVectorStore
Build an empty store fixed to dimension. Inserts whose
vector.len() differs surface
Error::InvalidRequest at add time.
Sourcepub fn total_slots(&self) -> usize
pub fn total_slots(&self) -> usize
Total slot count across every namespace. Useful for tests.
Trait Implementations§
Source§impl Clone for InMemoryVectorStore
impl Clone for InMemoryVectorStore
Source§fn clone(&self) -> InMemoryVectorStore
fn clone(&self) -> InMemoryVectorStore
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for InMemoryVectorStore
impl Debug for InMemoryVectorStore
Source§impl VectorStore for InMemoryVectorStore
impl VectorStore for InMemoryVectorStore
Source§fn add<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
document: Document,
vector: Vec<f32>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn add<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
document: Document,
vector: Vec<f32>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
InMemoryVectorStore: 'async_trait,
Add a document with its pre-computed vector to the index.
Implementations validate
vector.len() == self.dimension().Source§fn search<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
query_vector: &'life3 [f32],
top_k: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn search<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
query_vector: &'life3 [f32],
top_k: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
Search for the top
top_k nearest documents to query_vector.Source§fn delete<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
doc_id: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn delete<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
doc_id: &'life3 str,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
Delete a document by its backend-assigned id. Default impl
returns
Error::Config — backends without a stable id space
must override or document the lifecycle.Source§fn update<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
doc_id: &'life3 str,
document: Document,
vector: Vec<f32>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn update<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
doc_id: &'life3 str,
document: Document,
vector: Vec<f32>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
Replace an existing document’s vector and metadata. Default
impl chains
delete + add (non-atomic — concurrent
searches observe a gap); backends with atomic-update support
must override.Source§fn search_filtered<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
query_vector: &'life3 [f32],
top_k: usize,
filter: &'life4 VectorFilter,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn search_filtered<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
query_vector: &'life3 [f32],
top_k: usize,
filter: &'life4 VectorFilter,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
'life4: 'async_trait,
InMemoryVectorStore: 'async_trait,
Top-K nearest matches with a metadata filter pushed down to
the index. Default impl returns
entelix_core::Error::Config —
silently dropping the filter would return wrong results, so
the trait makes the backend’s lack of filter support
explicit. Backends with filter support must override.Source§fn count<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
filter: Option<&'life3 VectorFilter>,
) -> Pin<Box<dyn Future<Output = Result<usize, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn count<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
filter: Option<&'life3 VectorFilter>,
) -> Pin<Box<dyn Future<Output = Result<usize, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
Count documents in the namespace, optionally narrowed by a
filter. Used by dashboards reporting per-tenant index sizes
and by memory-budget enforcement (skip indexing when the
namespace is at its cap). Read more
Source§fn list<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
filter: Option<&'life3 VectorFilter>,
limit: usize,
offset: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
fn list<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
filter: Option<&'life3 VectorFilter>,
limit: usize,
offset: usize,
) -> Pin<Box<dyn Future<Output = Result<Vec<Document>, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
InMemoryVectorStore: 'async_trait,
Enumerate documents in the namespace, optionally narrowed by
a filter.
limit caps the page size; offset is the page
start (cursor-style pagination semantics depend on the
backend). Returned documents may omit their vectors — the
method is for inspection / pagination, not for retrieval. Read moreSource§fn add_batch<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
items: Vec<(Document, Vec<f32>)>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
fn add_batch<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
ctx: &'life1 ExecutionContext,
ns: &'life2 Namespace,
items: Vec<(Document, Vec<f32>)>,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
Insert many documents at once. Default impl loops over
add,
polling ExecutionContext::is_cancelled between iterations
so a cancelled caller releases the index lock within one
add round-trip instead of completing the full batch.
Backends that support a native batch endpoint should
override — sequential calls amplify network latency by N.Auto Trait Implementations§
impl Freeze for InMemoryVectorStore
impl !RefUnwindSafe for InMemoryVectorStore
impl Send for InMemoryVectorStore
impl Sync for InMemoryVectorStore
impl Unpin for InMemoryVectorStore
impl UnsafeUnpin for InMemoryVectorStore
impl !UnwindSafe for InMemoryVectorStore
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
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>
Converts
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>
Converts
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestCreates a shared type from an unshared type.