qdrant_edge/edge/read_view/
shard_read.rs1use std::path::Path;
2use std::sync::Arc;
3
4use rayon::ThreadPool;
5use crate::segment::common::operation_error::OperationResult;
6use crate::segment::data_types::facets::FacetResponse;
7use crate::segment::types::{PointIdType, ScoredPoint};
8use crate::shard::retrieve::record_internal::RecordInternal;
9
10use super::{EdgeReadView, Group, ReadSegmentHandle, SearchMatrixResponse, ShardInfo};
11use crate::edge::EdgeConfig;
12use crate::edge::requests::{
13 CountRequest, FacetRequest, GroupRequest, QueryRequest, RetrieveRequest, ScrollRequest,
14 SearchMatrixRequest, SearchRequest,
15};
16
17mod sealed {
18 pub trait Sealed {}
22}
23
24impl<T: ReadViewProvider + ?Sized> sealed::Sealed for T {}
25
26pub(crate) trait ReadViewProvider {
30 type Handle: ReadSegmentHandle;
33
34 fn read_segments(&self) -> Vec<Self::Handle>;
36
37 fn config_snapshot(&self) -> Arc<EdgeConfig>;
39
40 fn search_pool(&self) -> Arc<ThreadPool>;
42
43 fn path(&self) -> &Path;
44}
45
46pub trait EdgeShardRead: sealed::Sealed {
57 fn config_snapshot(&self) -> Arc<EdgeConfig>;
59
60 fn path(&self) -> &Path;
61
62 fn search(&self, request: SearchRequest) -> OperationResult<Vec<ScoredPoint>>;
64
65 fn query(&self, request: QueryRequest) -> OperationResult<Vec<ScoredPoint>>;
66
67 fn scroll(
68 &self,
69 request: ScrollRequest,
70 ) -> OperationResult<(Vec<RecordInternal>, Option<PointIdType>)>;
71
72 fn retrieve(&self, request: RetrieveRequest) -> OperationResult<Vec<RecordInternal>>;
73
74 fn count(&self, request: CountRequest) -> OperationResult<usize>;
75
76 fn facet(&self, request: FacetRequest) -> OperationResult<FacetResponse>;
77
78 fn search_matrix(&self, request: SearchMatrixRequest) -> OperationResult<SearchMatrixResponse>;
79
80 fn query_groups(&self, request: GroupRequest) -> OperationResult<Vec<Group>>;
81
82 fn info(&self) -> OperationResult<ShardInfo>;
83}
84
85impl<T: ReadViewProvider + ?Sized> EdgeShardRead for T {
86 fn config_snapshot(&self) -> Arc<EdgeConfig> {
87 ReadViewProvider::config_snapshot(self)
88 }
89
90 fn path(&self) -> &Path {
91 ReadViewProvider::path(self)
92 }
93
94 fn search(&self, request: SearchRequest) -> OperationResult<Vec<ScoredPoint>> {
95 view(self).search(request.into())
96 }
97
98 fn query(&self, request: QueryRequest) -> OperationResult<Vec<ScoredPoint>> {
99 view(self).query(request.into())
100 }
101
102 fn scroll(
103 &self,
104 request: ScrollRequest,
105 ) -> OperationResult<(Vec<RecordInternal>, Option<PointIdType>)> {
106 view(self).scroll(request.into())
107 }
108
109 fn retrieve(&self, request: RetrieveRequest) -> OperationResult<Vec<RecordInternal>> {
110 let RetrieveRequest {
111 point_ids,
112 with_payload,
113 with_vector,
114 } = request;
115 view(self).retrieve(&point_ids, with_payload, with_vector)
116 }
117
118 fn count(&self, request: CountRequest) -> OperationResult<usize> {
119 view(self).count(request.into())
120 }
121
122 fn facet(&self, request: FacetRequest) -> OperationResult<FacetResponse> {
123 view(self).facet(request.into())
124 }
125
126 fn search_matrix(&self, request: SearchMatrixRequest) -> OperationResult<SearchMatrixResponse> {
127 view(self).search_matrix(request)
128 }
129
130 fn query_groups(&self, request: GroupRequest) -> OperationResult<Vec<Group>> {
131 view(self).query_groups(request)
132 }
133
134 fn info(&self) -> OperationResult<ShardInfo> {
135 view(self).info()
136 }
137}
138
139fn view<T: ReadViewProvider + ?Sized>(shard: &T) -> EdgeReadView<T::Handle> {
142 EdgeReadView::new(
143 shard.read_segments(),
144 shard.config_snapshot(),
145 shard.search_pool(),
146 )
147}