diff --git a/proto/points.proto b/proto/points.proto index 58db3e2..504c4df 100644 --- a/proto/points.proto +++ b/proto/points.proto @@ -66,9 +66,9 @@ message InferenceObject { // Legacy vector format, which determines the vector type by the configuration of its fields. message Vector { - repeated float data = 1; // Vector data (flatten for multi vectors), deprecated - optional SparseIndices indices = 2; // Sparse indices for sparse vectors, deprecated - optional uint32 vectors_count = 3; // Number of vectors per multi vector, deprecated + repeated float data = 1 [deprecated=true]; // Vector data (flatten for multi vectors), deprecated + optional SparseIndices indices = 2 [deprecated=true]; // Sparse indices for sparse vectors, deprecated + optional uint32 vectors_count = 3 [deprecated=true]; // Number of vectors per multi vector, deprecated oneof vector { DenseVector dense = 101; // Dense vector SparseVector sparse = 102; // Sparse vector diff --git a/src/qdrant.rs b/src/qdrant.rs index dbfe073..3632f66 100644 --- a/src/qdrant.rs +++ b/src/qdrant.rs @@ -3134,12 +3134,15 @@ pub struct InferenceObject { #[derive(Clone, PartialEq, ::prost::Message)] pub struct Vector { /// Vector data (flatten for multi vectors), deprecated - #[prost(float, repeated, tag = "1")] + #[deprecated] + #[prost(float, repeated, packed = "false", tag = "1")] pub data: ::prost::alloc::vec::Vec, /// Sparse indices for sparse vectors, deprecated + #[deprecated] #[prost(message, optional, tag = "2")] pub indices: ::core::option::Option, /// Number of vectors per multi vector, deprecated + #[deprecated] #[prost(uint32, optional, tag = "3")] pub vectors_count: ::core::option::Option, #[prost(oneof = "vector::Vector", tags = "101, 102, 103, 104, 105, 106")] diff --git a/src/qdrant_client/builders/vectors.rs b/src/qdrant_client/builders/vectors.rs index 457c61e..74e504a 100644 --- a/src/qdrant_client/builders/vectors.rs +++ b/src/qdrant_client/builders/vectors.rs @@ -1,5 +1,5 @@ use crate::qdrant::{ - DenseVectorBuilder, MultiDenseVector, NamedVectors, SparseVectorBuilder, Vector, + vector, DenseVectorBuilder, MultiDenseVector, NamedVectors, SparseVectorBuilder, Vector, }; use crate::QdrantError; @@ -24,68 +24,164 @@ impl Vector { MultiDenseVector::from(vectors.into()).into() } + #[allow(deprecated)] pub fn try_into_dense(self) -> Result, QdrantError> { - if self.indices.is_some() { + let Vector { + data, + indices, + vectors_count, + vector, + } = self; + + if let Some(v) = vector { + return match v { + vector::Vector::Dense(dense) => Ok(dense.data), + vector::Vector::Sparse(_) => Err(QdrantError::ConversionError( + "Cannot convert sparse vector to dense".to_string(), + )), + vector::Vector::MultiDense(_) => Err(QdrantError::ConversionError( + "Cannot convert multi-vector to dense".to_string(), + )), + vector::Vector::Document(_) => Err(QdrantError::ConversionError( + "Cannot convert document vector to dense".to_string(), + )), + vector::Vector::Image(_) => Err(QdrantError::ConversionError( + "Cannot convert image vector to dense".to_string(), + )), + vector::Vector::Object(_) => Err(QdrantError::ConversionError( + "Cannot convert object vector to dense".to_string(), + )), + }; + } + + if indices.is_some() { return Err(QdrantError::ConversionError( "Cannot convert sparse vector to dense".to_string(), )); } - if self.vectors_count.is_some() && self.vectors_count.unwrap() > 1 { + if vectors_count.is_some() && vectors_count.unwrap() > 1 { return Err(QdrantError::ConversionError( "Cannot convert multi vector to dense".to_string(), )); } - Ok(self.data) + Ok(data) } + #[allow(deprecated)] pub fn try_into_sparse(self) -> Result<(Vec, Vec), QdrantError> { - if self.indices.is_none() { + let Vector { + data, + indices, + vectors_count, + vector, + } = self; + + if let Some(v) = vector { + return match v { + vector::Vector::Dense(_) => Err(QdrantError::ConversionError( + "Cannot convert dense vector to sparse".to_string(), + )), + vector::Vector::Sparse(sparse) => Ok((sparse.indices, sparse.values)), + vector::Vector::MultiDense(_) => Err(QdrantError::ConversionError( + "Cannot convert multi-vector to sparse".to_string(), + )), + vector::Vector::Document(_) => Err(QdrantError::ConversionError( + "Cannot convert document vector to sparse".to_string(), + )), + vector::Vector::Image(_) => Err(QdrantError::ConversionError( + "Cannot convert image vector to sparse".to_string(), + )), + vector::Vector::Object(_) => Err(QdrantError::ConversionError( + "Cannot convert object vector to sparse".to_string(), + )), + }; + } + + if indices.is_none() { return Err(QdrantError::ConversionError( "Cannot convert dense vector to sparse".to_string(), )); } - if self.vectors_count.is_some() && self.vectors_count.unwrap() > 1 { + if vectors_count.is_some() && vectors_count.unwrap() > 1 { return Err(QdrantError::ConversionError( "Cannot convert multi vector to sparse".to_string(), )); } - let indices = self.indices.unwrap().data; + let indices = indices.unwrap().data; - if indices.len() != self.data.len() { + if indices.len() != data.len() { return Err(QdrantError::ConversionError(format!( "Malformed sparse vector: indices length {} is not equal to data length {}", indices.len(), - self.data.len() + data.len() ))); } - Ok((indices, self.data)) + Ok((indices, data)) } + #[allow(deprecated)] pub fn try_into_multi(self) -> Result>, QdrantError> { - if self.vectors_count.is_none() { + let Vector { + data, + indices, + vectors_count, + vector, + } = self; + + if let Some(v) = vector { + return match v { + vector::Vector::Dense(_) => Err(QdrantError::ConversionError( + "Cannot convert dense vector to multi-vector".to_string(), + )), + vector::Vector::Sparse(_) => Err(QdrantError::ConversionError( + "Cannot convert sparse vector to multi-vector".to_string(), + )), + vector::Vector::MultiDense(multivec) => Ok(multivec + .vectors + .into_iter() + .map(|v| v.data) + .collect::>()), + vector::Vector::Document(_) => Err(QdrantError::ConversionError( + "Cannot convert document vector to multi-vector".to_string(), + )), + vector::Vector::Image(_) => Err(QdrantError::ConversionError( + "Cannot convert image vector to multi-vector".to_string(), + )), + vector::Vector::Object(_) => Err(QdrantError::ConversionError( + "Cannot convert object vector to multi-vector".to_string(), + )), + }; + } + + if vectors_count.is_none() { return Err(QdrantError::ConversionError( "Cannot convert single vector to multi".to_string(), )); } - let vectors_count = self.vectors_count.unwrap(); + if indices.is_some() { + return Err(QdrantError::ConversionError( + "Cannot convert sparse vector to multi-vector".to_string(), + )); + } + + let vectors_count = vectors_count.unwrap(); - if self.data.len() % vectors_count as usize != 0 { + if data.len() % vectors_count as usize != 0 { return Err(QdrantError::ConversionError(format!( "Malformed multi vector: data length {} is not divisible by vectors count {}", - self.data.len(), + data.len(), vectors_count ))); } - Ok(self - .data - .chunks(self.data.len() / self.vectors_count.unwrap() as usize) + Ok(data + .chunks(data.len() / vectors_count as usize) .map(|v| v.to_vec()) .collect()) } @@ -99,6 +195,7 @@ impl NamedVectors { } impl From for Vector { + #[allow(deprecated)] fn from(vector: crate::qdrant::vector::Vector) -> Self { Vector { vector: Some(vector),