diff --git a/src/common/grpc-expr/src/delete.rs b/src/common/grpc-expr/src/delete.rs index 3ebe16a7a0..cd228857ed 100644 --- a/src/common/grpc-expr/src/delete.rs +++ b/src/common/grpc-expr/src/delete.rs @@ -16,7 +16,6 @@ use std::collections::HashMap; use api::helper::ColumnDataTypeWrapper; use api::v1::{Column, DeleteRequest as GrpcDeleteRequest}; -use datatypes::data_type::DataType; use datatypes::prelude::ConcreteDataType; use snafu::{ensure, ResultExt}; use table::requests::DeleteRequest; @@ -41,14 +40,11 @@ pub fn to_table_delete_request(request: GrpcDeleteRequest) -> Result, + data_type: ConcreteDataType, values: Values, row_count: usize, null_mask: Vec, -) -> Result<()> { - let data_type = builder.data_type(); - let values = convert_values(&data_type, values); - +) -> Result { if null_mask.is_empty() { - ensure!( - values.len() == row_count, - UnexpectedValuesLengthSnafu { - reason: "If null_mask is empty, the length of values must be equal to row_count." - } - ); - - values.iter().try_for_each(|value| { - builder - .try_push_value_ref(value.as_value_ref()) - .context(CreateVectorSnafu) - })?; + Ok(values_to_vector(&data_type, values)) } else { + let builder = &mut data_type.create_mutable_vector(row_count); + let values = convert_values(&data_type, values); let null_mask = BitVec::from_vec(null_mask); ensure!( null_mask.count_ones() + values.len() == row_count, @@ -354,8 +344,53 @@ pub(crate) fn add_values_to_builder( } } } + Ok(builder.to_vector()) + } +} + +fn values_to_vector(data_type: &ConcreteDataType, values: Values) -> VectorRef { + match data_type { + ConcreteDataType::Boolean(_) => Arc::new(BooleanVector::from(values.bool_values)), + ConcreteDataType::Int8(_) => Arc::new(PrimitiveVector::::from_iter_values( + values.i8_values.into_iter().map(|x| x as i8), + )), + ConcreteDataType::Int16(_) => Arc::new(PrimitiveVector::::from_iter_values( + values.i16_values.into_iter().map(|x| x as i16), + )), + ConcreteDataType::Int32(_) => Arc::new(Int32Vector::from_vec(values.i32_values)), + ConcreteDataType::Int64(_) => Arc::new(Int64Vector::from_vec(values.i64_values)), + ConcreteDataType::UInt8(_) => Arc::new(PrimitiveVector::::from_iter_values( + values.u8_values.into_iter().map(|x| x as u8), + )), + ConcreteDataType::UInt16(_) => Arc::new(PrimitiveVector::::from_iter_values( + values.u16_values.into_iter().map(|x| x as u16), + )), + ConcreteDataType::UInt32(_) => Arc::new(UInt32Vector::from_vec(values.u32_values)), + ConcreteDataType::UInt64(_) => Arc::new(UInt64Vector::from_vec(values.u64_values)), + ConcreteDataType::Float32(_) => Arc::new(Float32Vector::from_vec(values.f32_values)), + ConcreteDataType::Float64(_) => Arc::new(Float64Vector::from_vec(values.f64_values)), + ConcreteDataType::Binary(_) => Arc::new(BinaryVector::from(values.binary_values)), + ConcreteDataType::String(_) => Arc::new(StringVector::from_vec(values.string_values)), + ConcreteDataType::Date(_) => Arc::new(DateVector::from_vec(values.date_values)), + ConcreteDataType::DateTime(_) => Arc::new(DateTimeVector::from_vec(values.datetime_values)), + ConcreteDataType::Timestamp(unit) => match unit { + TimestampType::Second(_) => { + Arc::new(TimestampSecondVector::from_vec(values.ts_second_values)) + } + TimestampType::Millisecond(_) => Arc::new(TimestampMillisecondVector::from_vec( + values.ts_millisecond_values, + )), + TimestampType::Microsecond(_) => Arc::new(TimestampMicrosecondVector::from_vec( + values.ts_microsecond_values, + )), + TimestampType::Nanosecond(_) => Arc::new(TimestampNanosecondVector::from_vec( + values.ts_nanosecond_values, + )), + }, + ConcreteDataType::Null(_) | ConcreteDataType::List(_) | ConcreteDataType::Dictionary(_) => { + unreachable!() + } } - Ok(()) } fn convert_values(data_type: &ConcreteDataType, values: Values) -> Vec { diff --git a/src/datatypes/src/vectors/binary.rs b/src/datatypes/src/vectors/binary.rs index 575f930789..5b9ed3b442 100644 --- a/src/datatypes/src/vectors/binary.rs +++ b/src/datatypes/src/vectors/binary.rs @@ -113,6 +113,14 @@ impl Vector for BinaryVector { } } +impl From>> for BinaryVector { + fn from(data: Vec>) -> Self { + Self { + array: BinaryArray::from_iter_values(data), + } + } +} + impl ScalarVector for BinaryVector { type OwnedItem = Vec; type RefItem<'a> = &'a [u8]; diff --git a/src/datatypes/src/vectors/primitive.rs b/src/datatypes/src/vectors/primitive.rs index 502dd5ee4d..9f16aa332e 100644 --- a/src/datatypes/src/vectors/primitive.rs +++ b/src/datatypes/src/vectors/primitive.rs @@ -130,6 +130,12 @@ impl PrimitiveVector { } } + pub fn from_iter_values>(iter: I) -> Self { + Self { + array: PrimitiveArray::from_iter_values(iter), + } + } + pub fn from_values>(iter: I) -> Self { Self { array: PrimitiveArray::from_iter_values(iter),