use std::fmt::Debug; use segment::data_types::vectors::{ DenseVector, Named, NamedQuery, NamedVectorStruct, VectorInternal, }; use segment::vector_storage::query::{ContextQuery, DiscoveryQuery, RecoQuery}; use sparse::common::sparse_vector::SparseVector; impl QueryEnum { pub fn get_vector_name(&self) -> &str { match self { QueryEnum::Nearest(vector) => vector.get_name(), QueryEnum::RecommendBestScore(reco_query) => reco_query.get_name(), QueryEnum::Discover(discovery_query) => discovery_query.get_name(), QueryEnum::Context(context_query) => context_query.get_name(), } } /// Only when the distance is the scoring, this will return true. pub fn is_distance_scored(&self) -> bool { match self { QueryEnum::Nearest(_) => true, QueryEnum::RecommendBestScore(_) | QueryEnum::Discover(_) | QueryEnum::Context(_) => { false } } } pub fn iterate_sparse(&self, mut f: impl FnMut(&str, &SparseVector)) { match self { QueryEnum::Nearest(vector) => match vector { NamedVectorStruct::Sparse(named_sparse_vector) => { f(&named_sparse_vector.name, &named_sparse_vector.vector) } NamedVectorStruct::Default(_) | NamedVectorStruct::Dense(_) | NamedVectorStruct::MultiDense(_) => {} }, QueryEnum::RecommendBestScore(reco_query) => { let name = reco_query.get_name(); for vector in reco_query.query.flat_iter() { match vector { VectorInternal::Sparse(sparse_vector) => f(name, sparse_vector), VectorInternal::Dense(_) | VectorInternal::MultiDense(_) => {} } } } QueryEnum::Discover(discovery_query) => { let name = discovery_query.get_name(); for pair in discovery_query.query.flat_iter() { match pair { VectorInternal::Sparse(sparse_vector) => f(name, sparse_vector), VectorInternal::Dense(_) | VectorInternal::MultiDense(_) => {} } } } QueryEnum::Context(context_query) => { let name = context_query.get_name(); for pair in context_query.query.flat_iter() { match pair { VectorInternal::Sparse(sparse_vector) => f(name, sparse_vector), VectorInternal::Dense(_) | VectorInternal::MultiDense(_) => {} } } } } } } #[derive(Debug, Clone, PartialEq)] pub enum QueryEnum { Nearest(NamedVectorStruct), RecommendBestScore(NamedQuery>), Discover(NamedQuery>), Context(NamedQuery>), } impl From for QueryEnum { fn from(vector: DenseVector) -> Self { QueryEnum::Nearest(NamedVectorStruct::Default(vector)) } } impl From>> for QueryEnum { fn from(query: NamedQuery>) -> Self { QueryEnum::Discover(query) } } impl AsRef for QueryEnum { fn as_ref(&self) -> &QueryEnum { self } }