use std::path::Path;
use std::sync::Arc;
use rayon::ThreadPool;
use crate::segment::common::operation_error::OperationResult;
use crate::segment::data_types::facets::FacetResponse;
use crate::segment::types::{PointIdType, ScoredPoint};
use crate::shard::retrieve::record_internal::RecordInternal;
use super::{EdgeReadView, Group, ReadSegmentHandle, SearchMatrixResponse, ShardInfo};
use crate::edge::EdgeConfig;
use crate::edge::requests::{
CountRequest, FacetRequest, GroupRequest, QueryRequest, RetrieveRequest, ScrollRequest,
SearchMatrixRequest, SearchRequest,
};
mod sealed {
pub trait Sealed {}
}
impl<T: ReadViewProvider + ?Sized> sealed::Sealed for T {}
pub(crate) trait ReadViewProvider {
type Handle: ReadSegmentHandle;
fn read_segments(&self) -> Vec<Self::Handle>;
fn config_snapshot(&self) -> Arc<EdgeConfig>;
fn search_pool(&self) -> Arc<ThreadPool>;
fn path(&self) -> &Path;
}
pub trait EdgeShardRead: sealed::Sealed {
fn config_snapshot(&self) -> Arc<EdgeConfig>;
fn path(&self) -> &Path;
fn search(&self, request: SearchRequest) -> OperationResult<Vec<ScoredPoint>>;
fn query(&self, request: QueryRequest) -> OperationResult<Vec<ScoredPoint>>;
fn scroll(
&self,
request: ScrollRequest,
) -> OperationResult<(Vec<RecordInternal>, Option<PointIdType>)>;
fn retrieve(&self, request: RetrieveRequest) -> OperationResult<Vec<RecordInternal>>;
fn count(&self, request: CountRequest) -> OperationResult<usize>;
fn facet(&self, request: FacetRequest) -> OperationResult<FacetResponse>;
fn search_matrix(&self, request: SearchMatrixRequest) -> OperationResult<SearchMatrixResponse>;
fn query_groups(&self, request: GroupRequest) -> OperationResult<Vec<Group>>;
fn info(&self) -> OperationResult<ShardInfo>;
}
impl<T: ReadViewProvider + ?Sized> EdgeShardRead for T {
fn config_snapshot(&self) -> Arc<EdgeConfig> {
ReadViewProvider::config_snapshot(self)
}
fn path(&self) -> &Path {
ReadViewProvider::path(self)
}
fn search(&self, request: SearchRequest) -> OperationResult<Vec<ScoredPoint>> {
view(self).search(request.into())
}
fn query(&self, request: QueryRequest) -> OperationResult<Vec<ScoredPoint>> {
view(self).query(request.into())
}
fn scroll(
&self,
request: ScrollRequest,
) -> OperationResult<(Vec<RecordInternal>, Option<PointIdType>)> {
view(self).scroll(request.into())
}
fn retrieve(&self, request: RetrieveRequest) -> OperationResult<Vec<RecordInternal>> {
let RetrieveRequest {
point_ids,
with_payload,
with_vector,
} = request;
view(self).retrieve(&point_ids, with_payload, with_vector)
}
fn count(&self, request: CountRequest) -> OperationResult<usize> {
view(self).count(request.into())
}
fn facet(&self, request: FacetRequest) -> OperationResult<FacetResponse> {
view(self).facet(request.into())
}
fn search_matrix(&self, request: SearchMatrixRequest) -> OperationResult<SearchMatrixResponse> {
view(self).search_matrix(request)
}
fn query_groups(&self, request: GroupRequest) -> OperationResult<Vec<Group>> {
view(self).query_groups(request)
}
fn info(&self) -> OperationResult<ShardInfo> {
view(self).info()
}
}
fn view<T: ReadViewProvider + ?Sized>(shard: &T) -> EdgeReadView<T::Handle> {
EdgeReadView::new(
shard.read_segments(),
shard.config_snapshot(),
shard.search_pool(),
)
}