1818// along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
2020use crate :: config:: { VectorCardinality , VectorConfig } ;
21- use crate :: field_list_metadata:: encode_field_list_metadata;
2221use crate :: multivector:: extract_multi_vectors;
2322use crate :: segment:: { self , Elem } ;
2423use crate :: utils:: FieldKey ;
@@ -152,13 +151,8 @@ pub fn index_resource(
152151 Ok ( Some ( segment. into_metadata ( ) ) )
153152}
154153
155- fn encode_metadata_field ( rid : & str , fields : & HashSet < & String > ) -> Vec < u8 > {
156- let encoded_fields: Vec < _ > = fields
157- . iter ( )
158- . map ( |f| format ! ( "{rid}/{f}" ) )
159- . filter_map ( |f| FieldKey :: from_field_id ( & f) )
160- . collect ( ) ;
161- encode_field_list_metadata ( & encoded_fields)
154+ fn encode_metadata_field ( rid : & str , field : & str ) -> Option < Vec < u8 > > {
155+ FieldKey :: from_field_id ( & format ! ( "{rid}/{field}" ) ) . map ( |k| k. bytes ( ) . to_vec ( ) )
162156}
163157
164158pub fn index_relation_nodes (
@@ -169,50 +163,25 @@ pub fn index_relation_nodes(
169163) -> anyhow:: Result < Option < VectorSegmentMetadata > > {
170164 debug ! ( "Creating elements for the main index" ) ;
171165
172- let mut entity_fields = HashMap :: new ( ) ;
173166 let Some ( resource_id) = & resource. resource else {
174167 return Err ( anyhow ! ( "resource_id required" ) ) ;
175168 } ;
176169 let rid = & resource_id. uuid ;
177170
178- for ( field, relations) in & resource. field_relations {
179- // Find all copies of each relation node
180- for relation in & relations. relations {
181- let Some ( relation) = & relation. relation else {
182- return Err ( anyhow ! ( "relation required" ) ) ;
183- } ;
184- let Some ( source) = & relation. source else {
185- return Err ( anyhow ! ( "relation source node required" ) ) ;
186- } ;
187- entity_fields
188- . entry ( source. value . clone ( ) )
189- . or_insert_with ( HashSet :: new)
190- . insert ( field) ;
191-
192- let Some ( to) = & relation. to else {
193- return Err ( anyhow ! ( "relation to node required" ) ) ;
194- } ;
195- entity_fields
196- . entry ( to. value . clone ( ) )
197- . or_insert_with ( HashSet :: new)
198- . insert ( field) ;
199- }
200- }
201-
202- // Index each vector
203171 let mut elems = Vec :: new ( ) ;
204- if let Some ( vectorset) = & resource. relation_node_vectors . get ( index_name) {
172+ for ( field_id, field_data) in & resource. field_node_vectors {
173+ let Some ( vectorset) = field_data. node_vectors . get ( index_name) else {
174+ continue ;
175+ } ;
176+ let Some ( metadata) = encode_metadata_field ( rid, field_id) else {
177+ continue ;
178+ } ;
205179 for node_vector in & vectorset. vectors {
206- let vector = node_vector. vector . clone ( ) ;
207- let fields = entity_fields. get ( & node_vector. node_value ) ;
208- let Some ( fields) = fields else {
209- continue ;
210- } ;
211180 elems. push ( Elem :: new (
212181 node_vector. node_value . clone ( ) ,
213- vector,
182+ node_vector . vector . clone ( ) ,
214183 vec ! [ ] ,
215- Some ( encode_metadata_field ( rid , fields ) ) ,
184+ Some ( metadata . clone ( ) ) ,
216185 ) ) ;
217186 }
218187 }
@@ -235,40 +204,25 @@ pub fn index_relation_edges(
235204) -> anyhow:: Result < Option < VectorSegmentMetadata > > {
236205 debug ! ( "Creating elements for the main index" ) ;
237206
238- let mut entity_fields = HashMap :: new ( ) ;
239207 let Some ( resource_id) = & resource. resource else {
240208 return Err ( anyhow ! ( "resource_id required" ) ) ;
241209 } ;
242210 let rid = & resource_id. uuid ;
243211
244- for ( field, relations) in & resource. field_relations {
245- // Find all copies of each relation edge
246- for relation in & relations. relations {
247- let Some ( relation) = & relation. relation else {
248- return Err ( anyhow ! ( "relation required" ) ) ;
249- } ;
250-
251- entity_fields
252- . entry ( relation. relation_label . clone ( ) )
253- . or_insert_with ( HashSet :: new)
254- . insert ( field) ;
255- }
256- }
257-
258- // Index each vector
259212 let mut elems = Vec :: new ( ) ;
260- if let Some ( vectorset) = & resource. relation_edge_vectors . get ( index_name) {
213+ for ( field_id, field_data) in & resource. field_edge_vectors {
214+ let Some ( vectorset) = field_data. edge_vectors . get ( index_name) else {
215+ continue ;
216+ } ;
217+ let Some ( metadata) = encode_metadata_field ( rid, field_id) else {
218+ continue ;
219+ } ;
261220 for rel_vector in & vectorset. vectors {
262- let vector = rel_vector. vector . clone ( ) ;
263- let fields = entity_fields. get ( & rel_vector. relation_label ) ;
264- let Some ( fields) = fields else {
265- continue ;
266- } ;
267221 elems. push ( Elem :: new (
268222 rel_vector. relation_label . clone ( ) ,
269- vector,
223+ rel_vector . vector . clone ( ) ,
270224 vec ! [ ] ,
271- Some ( encode_metadata_field ( rid , fields ) ) ,
225+ Some ( metadata . clone ( ) ) ,
272226 ) ) ;
273227 }
274228 }
0 commit comments