diff --git a/diskann-garnet/src/dyn_index.rs b/diskann-garnet/src/dyn_index.rs index badedba51..d58e3daaa 100644 --- a/diskann-garnet/src/dyn_index.rs +++ b/diskann-garnet/src/dyn_index.rs @@ -7,12 +7,12 @@ use crate::{ SearchResults, garnet::{Context, GarnetId}, labels::GarnetQueryLabelProvider, - provider::{self, GarnetProvider}, + provider::GarnetProvider, }; use diskann::{ - ANNError, ANNResult, - graph::{InplaceDeleteMethod, glue::SearchStrategy, index::SearchStats, search}, - provider::{Accessor, DataProvider}, + ANNResult, + graph::{InplaceDeleteMethod, index::SearchStats, search}, + provider::DataProvider, utils::VectorRepr, }; use diskann_providers::{ @@ -102,19 +102,9 @@ impl DynIndex for DiskANNIndex> { filter: Option<(&GarnetQueryLabelProvider, f32)>, output: &mut SearchResults<'_>, ) -> ANNResult { - let rt = tokio::runtime::Builder::new_current_thread() - .build() - .map_err(|e| ANNError::new(diskann::ANNErrorKind::Opaque, e))?; - let mut accessor: provider::FullAccessor<'_, T> = - >::search_accessor( - &FullPrecision, - self.inner.provider(), - context, - )?; - // Look up internal ID let iid = self.inner.provider().to_internal_id(context, id)?; - let data = rt.block_on(accessor.get_element(iid))?; + let data = self.inner.provider().get_vector(context, iid)?; let data_bytes = bytemuck::cast_slice::(&data); self.search_vector(context, data_bytes, params, filter, output) } diff --git a/diskann-garnet/src/provider.rs b/diskann-garnet/src/provider.rs index 0be5be9a4..a0dbd7084 100644 --- a/diskann-garnet/src/provider.rs +++ b/diskann-garnet/src/provider.rs @@ -240,6 +240,33 @@ impl GarnetProvider { pub fn max_internal_id(&self) -> u32 { self.fsm.max_id() } + + pub(crate) fn get_vector( + &self, + context: &Context, + iid: u32, + ) -> Result, GarnetProviderError> { + let mut v = vec![T::default(); self.dim]; + + if iid == 0 { + let guard = if let Some(r) = self.start_point_cache.get(&iid) { + r + } else { + return Err(GarnetError::Read.into()); + }; + v.copy_from_slice(&guard); + return Ok(v); + } + + if !self + .callbacks + .read_single_iid(context.term(Term::Vector), iid, &mut v) + { + return Err(GarnetError::Read.into()); + } + + Ok(v) + } } impl DataProvider for GarnetProvider { @@ -531,27 +558,7 @@ impl Accessor for FullAccessor<'_, T> { &mut self, id: Self::Id, ) -> impl Future, Self::GetError>> + Send { - let mut v = vec![T::default(); self.provider.dim]; - - if id == 0 { - let guard = if let Some(r) = self.provider.start_point_cache.get(&id) { - r - } else { - return future::ready(Err(GarnetError::Read.into())); - }; - v.copy_from_slice(&guard); - return future::ready(Ok(v)); - } - - if !self - .provider - .callbacks - .read_single_iid(self.context.term(Term::Vector), id, &mut v) - { - return future::ready(Err(GarnetError::Read.into())); - } - - future::ready(Ok(v)) + std::future::ready(self.provider.get_vector(self.context, id)) } }