use api::rest::schema::ShardKeySelector; use segment::data_types::vectors::DEFAULT_VECTOR_NAME; use segment::types::PointIdType; use crate::operations::types::{DiscoverRequestInternal, RecommendRequestInternal, UsingVector}; use crate::operations::universal_query::collection_query::{ CollectionQueryResolveRequest, VectorInputInternal, VectorQuery, }; const EMPTY_SHARD_KEY_SELECTOR: Option = None; pub trait RetrieveRequest { fn get_lookup_collection(&self) -> Option<&String>; fn get_referenced_point_ids(&self) -> Vec; fn get_lookup_vector_name(&self) -> String; fn get_lookup_shard_key(&self) -> &Option; } impl RetrieveRequest for RecommendRequestInternal { fn get_lookup_collection(&self) -> Option<&String> { self.lookup_from.as_ref().map(|x| &x.collection) } fn get_referenced_point_ids(&self) -> Vec { self.positive .iter() .chain(self.negative.iter()) .filter_map(|example| example.as_point_id()) .collect() } fn get_lookup_vector_name(&self) -> String { match &self.lookup_from { None => match &self.using { None => DEFAULT_VECTOR_NAME.to_owned(), Some(UsingVector::Name(vector_name)) => vector_name.clone(), }, Some(lookup_from) => match &lookup_from.vector { None => DEFAULT_VECTOR_NAME.to_owned(), Some(vector_name) => vector_name.clone(), }, } } fn get_lookup_shard_key(&self) -> &Option { self.lookup_from .as_ref() .map(|x| &x.shard_key) .unwrap_or(&EMPTY_SHARD_KEY_SELECTOR) } } impl RetrieveRequest for DiscoverRequestInternal { fn get_lookup_collection(&self) -> Option<&String> { self.lookup_from.as_ref().map(|x| &x.collection) } fn get_referenced_point_ids(&self) -> Vec { let mut res = Vec::new(); match &self.target { None => {} Some(example) => { if let Some(point_id) = example.as_point_id() { res.push(point_id); } } } if let Some(context) = &self.context { for pair in context { if let Some(pos_id) = pair.positive.as_point_id() { res.push(pos_id); } if let Some(neg_id) = pair.negative.as_point_id() { res.push(neg_id); } } } res } fn get_lookup_vector_name(&self) -> String { match &self.lookup_from { None => match &self.using { None => DEFAULT_VECTOR_NAME.to_owned(), Some(UsingVector::Name(vector_name)) => vector_name.clone(), }, Some(lookup_from) => match &lookup_from.vector { None => DEFAULT_VECTOR_NAME.to_owned(), Some(vector_name) => vector_name.clone(), }, } } fn get_lookup_shard_key(&self) -> &Option { self.lookup_from .as_ref() .map(|x| &x.shard_key) .unwrap_or(&EMPTY_SHARD_KEY_SELECTOR) } } impl<'a> RetrieveRequest for CollectionQueryResolveRequest<'a> { fn get_lookup_collection(&self) -> Option<&String> { self.lookup_from.as_ref().map(|x| &x.collection) } fn get_referenced_point_ids(&self) -> Vec { self.vector_query .get_referenced_ids() .iter() .map(|x| **x) .collect() } fn get_lookup_vector_name(&self) -> String { match &self.lookup_from { None => self.using.clone(), Some(lookup_from) => match &lookup_from.vector { None => self.using.clone(), Some(vector_name) => vector_name.clone(), }, } } fn get_lookup_shard_key(&self) -> &Option { self.lookup_from .as_ref() .map(|x| &x.shard_key) .unwrap_or(&EMPTY_SHARD_KEY_SELECTOR) } } impl VectorQuery { pub fn get_referenced_ids(&self) -> Vec<&PointIdType> { self.flat_iter() .filter_map(VectorInputInternal::as_id) .collect() } }