api/
helper.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::collections::HashSet;
16use std::sync::Arc;
17
18use common_base::BitVec;
19use common_decimal::decimal128::{DECIMAL128_DEFAULT_SCALE, DECIMAL128_MAX_PRECISION};
20use common_decimal::Decimal128;
21use common_time::time::Time;
22use common_time::timestamp::TimeUnit;
23use common_time::{Date, IntervalDayTime, IntervalMonthDayNano, IntervalYearMonth, Timestamp};
24use datatypes::prelude::{ConcreteDataType, ValueRef};
25use datatypes::scalars::ScalarVector;
26use datatypes::types::{
27    Int16Type, Int8Type, IntervalType, TimeType, TimestampType, UInt16Type, UInt8Type,
28};
29use datatypes::value::{OrderedF32, OrderedF64, Value};
30use datatypes::vectors::{
31    BinaryVector, BooleanVector, DateVector, Decimal128Vector, Float32Vector, Float64Vector,
32    Int32Vector, Int64Vector, IntervalDayTimeVector, IntervalMonthDayNanoVector,
33    IntervalYearMonthVector, PrimitiveVector, StringVector, TimeMicrosecondVector,
34    TimeMillisecondVector, TimeNanosecondVector, TimeSecondVector, TimestampMicrosecondVector,
35    TimestampMillisecondVector, TimestampNanosecondVector, TimestampSecondVector, UInt32Vector,
36    UInt64Vector, VectorRef,
37};
38use greptime_proto::v1::column_data_type_extension::TypeExt;
39use greptime_proto::v1::ddl_request::Expr;
40use greptime_proto::v1::greptime_request::Request;
41use greptime_proto::v1::query_request::Query;
42use greptime_proto::v1::value::ValueData;
43use greptime_proto::v1::{
44    self, ColumnDataTypeExtension, DdlRequest, DecimalTypeExtension, JsonTypeExtension,
45    QueryRequest, Row, SemanticType, VectorTypeExtension,
46};
47use paste::paste;
48use snafu::prelude::*;
49
50use crate::error::{self, InconsistentTimeUnitSnafu, InvalidTimeUnitSnafu, Result};
51use crate::v1::column::Values;
52use crate::v1::{Column, ColumnDataType, Value as GrpcValue};
53
54/// ColumnDataTypeWrapper is a wrapper of ColumnDataType and ColumnDataTypeExtension.
55/// It could be used to convert with ConcreteDataType.
56#[derive(Debug, PartialEq)]
57pub struct ColumnDataTypeWrapper {
58    datatype: ColumnDataType,
59    datatype_ext: Option<ColumnDataTypeExtension>,
60}
61
62impl ColumnDataTypeWrapper {
63    /// Try to create a ColumnDataTypeWrapper from i32(ColumnDataType) and ColumnDataTypeExtension.
64    pub fn try_new(datatype: i32, datatype_ext: Option<ColumnDataTypeExtension>) -> Result<Self> {
65        let datatype = ColumnDataType::try_from(datatype)
66            .context(error::UnknownColumnDataTypeSnafu { datatype })?;
67        Ok(Self {
68            datatype,
69            datatype_ext,
70        })
71    }
72
73    /// Create a ColumnDataTypeWrapper from ColumnDataType and ColumnDataTypeExtension.
74    pub fn new(datatype: ColumnDataType, datatype_ext: Option<ColumnDataTypeExtension>) -> Self {
75        Self {
76            datatype,
77            datatype_ext,
78        }
79    }
80
81    /// Get the ColumnDataType.
82    pub fn datatype(&self) -> ColumnDataType {
83        self.datatype
84    }
85
86    /// Get a tuple of ColumnDataType and ColumnDataTypeExtension.
87    pub fn to_parts(&self) -> (ColumnDataType, Option<ColumnDataTypeExtension>) {
88        (self.datatype, self.datatype_ext)
89    }
90}
91
92impl From<ColumnDataTypeWrapper> for ConcreteDataType {
93    fn from(datatype_wrapper: ColumnDataTypeWrapper) -> Self {
94        match datatype_wrapper.datatype {
95            ColumnDataType::Boolean => ConcreteDataType::boolean_datatype(),
96            ColumnDataType::Int8 => ConcreteDataType::int8_datatype(),
97            ColumnDataType::Int16 => ConcreteDataType::int16_datatype(),
98            ColumnDataType::Int32 => ConcreteDataType::int32_datatype(),
99            ColumnDataType::Int64 => ConcreteDataType::int64_datatype(),
100            ColumnDataType::Uint8 => ConcreteDataType::uint8_datatype(),
101            ColumnDataType::Uint16 => ConcreteDataType::uint16_datatype(),
102            ColumnDataType::Uint32 => ConcreteDataType::uint32_datatype(),
103            ColumnDataType::Uint64 => ConcreteDataType::uint64_datatype(),
104            ColumnDataType::Float32 => ConcreteDataType::float32_datatype(),
105            ColumnDataType::Float64 => ConcreteDataType::float64_datatype(),
106            ColumnDataType::Binary => {
107                if let Some(TypeExt::JsonType(_)) = datatype_wrapper
108                    .datatype_ext
109                    .as_ref()
110                    .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
111                {
112                    ConcreteDataType::json_datatype()
113                } else {
114                    ConcreteDataType::binary_datatype()
115                }
116            }
117            ColumnDataType::Json => ConcreteDataType::json_datatype(),
118            ColumnDataType::String => ConcreteDataType::string_datatype(),
119            ColumnDataType::Date => ConcreteDataType::date_datatype(),
120            ColumnDataType::Datetime => ConcreteDataType::timestamp_microsecond_datatype(),
121            ColumnDataType::TimestampSecond => ConcreteDataType::timestamp_second_datatype(),
122            ColumnDataType::TimestampMillisecond => {
123                ConcreteDataType::timestamp_millisecond_datatype()
124            }
125            ColumnDataType::TimestampMicrosecond => {
126                ConcreteDataType::timestamp_microsecond_datatype()
127            }
128            ColumnDataType::TimestampNanosecond => {
129                ConcreteDataType::timestamp_nanosecond_datatype()
130            }
131            ColumnDataType::TimeSecond => ConcreteDataType::time_second_datatype(),
132            ColumnDataType::TimeMillisecond => ConcreteDataType::time_millisecond_datatype(),
133            ColumnDataType::TimeMicrosecond => ConcreteDataType::time_microsecond_datatype(),
134            ColumnDataType::TimeNanosecond => ConcreteDataType::time_nanosecond_datatype(),
135            ColumnDataType::IntervalYearMonth => ConcreteDataType::interval_year_month_datatype(),
136            ColumnDataType::IntervalDayTime => ConcreteDataType::interval_day_time_datatype(),
137            ColumnDataType::IntervalMonthDayNano => {
138                ConcreteDataType::interval_month_day_nano_datatype()
139            }
140            ColumnDataType::Decimal128 => {
141                if let Some(TypeExt::DecimalType(d)) = datatype_wrapper
142                    .datatype_ext
143                    .as_ref()
144                    .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
145                {
146                    ConcreteDataType::decimal128_datatype(d.precision as u8, d.scale as i8)
147                } else {
148                    ConcreteDataType::decimal128_default_datatype()
149                }
150            }
151            ColumnDataType::Vector => {
152                if let Some(TypeExt::VectorType(d)) = datatype_wrapper
153                    .datatype_ext
154                    .as_ref()
155                    .and_then(|datatype_ext| datatype_ext.type_ext.as_ref())
156                {
157                    ConcreteDataType::vector_datatype(d.dim)
158                } else {
159                    ConcreteDataType::vector_default_datatype()
160                }
161            }
162        }
163    }
164}
165
166/// This macro is used to generate datatype functions
167/// with lower style for ColumnDataTypeWrapper.
168///
169///
170/// For example: we can use `ColumnDataTypeWrapper::int8_datatype()`,
171/// to get a ColumnDataTypeWrapper with datatype `ColumnDataType::Int8`.
172macro_rules! impl_column_type_functions {
173    ($($Type: ident), +) => {
174        paste! {
175            impl ColumnDataTypeWrapper {
176                $(
177                    pub fn [<$Type:lower _datatype>]() -> ColumnDataTypeWrapper {
178                        ColumnDataTypeWrapper {
179                            datatype: ColumnDataType::$Type,
180                            datatype_ext: None,
181                        }
182                    }
183                )+
184            }
185        }
186    }
187}
188
189/// This macro is used to generate datatype functions
190/// with snake style for ColumnDataTypeWrapper.
191///
192///
193/// For example: we can use `ColumnDataTypeWrapper::duration_second_datatype()`,
194/// to get a ColumnDataTypeWrapper with datatype `ColumnDataType::DurationSecond`.
195macro_rules! impl_column_type_functions_with_snake {
196    ($($TypeName: ident), +) => {
197        paste!{
198            impl ColumnDataTypeWrapper {
199                $(
200                    pub fn [<$TypeName:snake _datatype>]() -> ColumnDataTypeWrapper {
201                        ColumnDataTypeWrapper {
202                            datatype: ColumnDataType::$TypeName,
203                            datatype_ext: None,
204                        }
205                    }
206                )+
207            }
208        }
209    };
210}
211
212impl_column_type_functions!(
213    Boolean, Uint8, Uint16, Uint32, Uint64, Int8, Int16, Int32, Int64, Float32, Float64, Binary,
214    Date, Datetime, String
215);
216
217impl_column_type_functions_with_snake!(
218    TimestampSecond,
219    TimestampMillisecond,
220    TimestampMicrosecond,
221    TimestampNanosecond,
222    TimeSecond,
223    TimeMillisecond,
224    TimeMicrosecond,
225    TimeNanosecond,
226    IntervalYearMonth,
227    IntervalDayTime,
228    IntervalMonthDayNano
229);
230
231impl ColumnDataTypeWrapper {
232    pub fn decimal128_datatype(precision: i32, scale: i32) -> Self {
233        ColumnDataTypeWrapper {
234            datatype: ColumnDataType::Decimal128,
235            datatype_ext: Some(ColumnDataTypeExtension {
236                type_ext: Some(TypeExt::DecimalType(DecimalTypeExtension {
237                    precision,
238                    scale,
239                })),
240            }),
241        }
242    }
243
244    pub fn vector_datatype(dim: u32) -> Self {
245        ColumnDataTypeWrapper {
246            datatype: ColumnDataType::Vector,
247            datatype_ext: Some(ColumnDataTypeExtension {
248                type_ext: Some(TypeExt::VectorType(VectorTypeExtension { dim })),
249            }),
250        }
251    }
252}
253
254impl TryFrom<ConcreteDataType> for ColumnDataTypeWrapper {
255    type Error = error::Error;
256
257    fn try_from(datatype: ConcreteDataType) -> Result<Self> {
258        let column_datatype = match datatype {
259            ConcreteDataType::Boolean(_) => ColumnDataType::Boolean,
260            ConcreteDataType::Int8(_) => ColumnDataType::Int8,
261            ConcreteDataType::Int16(_) => ColumnDataType::Int16,
262            ConcreteDataType::Int32(_) => ColumnDataType::Int32,
263            ConcreteDataType::Int64(_) => ColumnDataType::Int64,
264            ConcreteDataType::UInt8(_) => ColumnDataType::Uint8,
265            ConcreteDataType::UInt16(_) => ColumnDataType::Uint16,
266            ConcreteDataType::UInt32(_) => ColumnDataType::Uint32,
267            ConcreteDataType::UInt64(_) => ColumnDataType::Uint64,
268            ConcreteDataType::Float32(_) => ColumnDataType::Float32,
269            ConcreteDataType::Float64(_) => ColumnDataType::Float64,
270            ConcreteDataType::Binary(_) => ColumnDataType::Binary,
271            ConcreteDataType::String(_) => ColumnDataType::String,
272            ConcreteDataType::Date(_) => ColumnDataType::Date,
273            ConcreteDataType::Timestamp(t) => match t {
274                TimestampType::Second(_) => ColumnDataType::TimestampSecond,
275                TimestampType::Millisecond(_) => ColumnDataType::TimestampMillisecond,
276                TimestampType::Microsecond(_) => ColumnDataType::TimestampMicrosecond,
277                TimestampType::Nanosecond(_) => ColumnDataType::TimestampNanosecond,
278            },
279            ConcreteDataType::Time(t) => match t {
280                TimeType::Second(_) => ColumnDataType::TimeSecond,
281                TimeType::Millisecond(_) => ColumnDataType::TimeMillisecond,
282                TimeType::Microsecond(_) => ColumnDataType::TimeMicrosecond,
283                TimeType::Nanosecond(_) => ColumnDataType::TimeNanosecond,
284            },
285            ConcreteDataType::Interval(i) => match i {
286                IntervalType::YearMonth(_) => ColumnDataType::IntervalYearMonth,
287                IntervalType::DayTime(_) => ColumnDataType::IntervalDayTime,
288                IntervalType::MonthDayNano(_) => ColumnDataType::IntervalMonthDayNano,
289            },
290            ConcreteDataType::Decimal128(_) => ColumnDataType::Decimal128,
291            ConcreteDataType::Json(_) => ColumnDataType::Json,
292            ConcreteDataType::Vector(_) => ColumnDataType::Vector,
293            ConcreteDataType::Null(_)
294            | ConcreteDataType::List(_)
295            | ConcreteDataType::Struct(_)
296            | ConcreteDataType::Dictionary(_)
297            | ConcreteDataType::Duration(_) => {
298                return error::IntoColumnDataTypeSnafu { from: datatype }.fail()
299            }
300        };
301        let datatype_extension = match column_datatype {
302            ColumnDataType::Decimal128 => {
303                datatype
304                    .as_decimal128()
305                    .map(|decimal_type| ColumnDataTypeExtension {
306                        type_ext: Some(TypeExt::DecimalType(DecimalTypeExtension {
307                            precision: decimal_type.precision() as i32,
308                            scale: decimal_type.scale() as i32,
309                        })),
310                    })
311            }
312            ColumnDataType::Json => datatype.as_json().map(|_| ColumnDataTypeExtension {
313                type_ext: Some(TypeExt::JsonType(JsonTypeExtension::JsonBinary.into())),
314            }),
315            ColumnDataType::Vector => {
316                datatype
317                    .as_vector()
318                    .map(|vector_type| ColumnDataTypeExtension {
319                        type_ext: Some(TypeExt::VectorType(VectorTypeExtension {
320                            dim: vector_type.dim as _,
321                        })),
322                    })
323            }
324            _ => None,
325        };
326        Ok(Self {
327            datatype: column_datatype,
328            datatype_ext: datatype_extension,
329        })
330    }
331}
332
333pub fn values_with_capacity(datatype: ColumnDataType, capacity: usize) -> Values {
334    match datatype {
335        ColumnDataType::Boolean => Values {
336            bool_values: Vec::with_capacity(capacity),
337            ..Default::default()
338        },
339        ColumnDataType::Int8 => Values {
340            i8_values: Vec::with_capacity(capacity),
341            ..Default::default()
342        },
343        ColumnDataType::Int16 => Values {
344            i16_values: Vec::with_capacity(capacity),
345            ..Default::default()
346        },
347        ColumnDataType::Int32 => Values {
348            i32_values: Vec::with_capacity(capacity),
349            ..Default::default()
350        },
351        ColumnDataType::Int64 => Values {
352            i64_values: Vec::with_capacity(capacity),
353            ..Default::default()
354        },
355        ColumnDataType::Uint8 => Values {
356            u8_values: Vec::with_capacity(capacity),
357            ..Default::default()
358        },
359        ColumnDataType::Uint16 => Values {
360            u16_values: Vec::with_capacity(capacity),
361            ..Default::default()
362        },
363        ColumnDataType::Uint32 => Values {
364            u32_values: Vec::with_capacity(capacity),
365            ..Default::default()
366        },
367        ColumnDataType::Uint64 => Values {
368            u64_values: Vec::with_capacity(capacity),
369            ..Default::default()
370        },
371        ColumnDataType::Float32 => Values {
372            f32_values: Vec::with_capacity(capacity),
373            ..Default::default()
374        },
375        ColumnDataType::Float64 => Values {
376            f64_values: Vec::with_capacity(capacity),
377            ..Default::default()
378        },
379        ColumnDataType::Binary => Values {
380            binary_values: Vec::with_capacity(capacity),
381            ..Default::default()
382        },
383        ColumnDataType::String => Values {
384            string_values: Vec::with_capacity(capacity),
385            ..Default::default()
386        },
387        ColumnDataType::Date => Values {
388            date_values: Vec::with_capacity(capacity),
389            ..Default::default()
390        },
391        ColumnDataType::Datetime => Values {
392            datetime_values: Vec::with_capacity(capacity),
393            ..Default::default()
394        },
395        ColumnDataType::TimestampSecond => Values {
396            timestamp_second_values: Vec::with_capacity(capacity),
397            ..Default::default()
398        },
399        ColumnDataType::TimestampMillisecond => Values {
400            timestamp_millisecond_values: Vec::with_capacity(capacity),
401            ..Default::default()
402        },
403        ColumnDataType::TimestampMicrosecond => Values {
404            timestamp_microsecond_values: Vec::with_capacity(capacity),
405            ..Default::default()
406        },
407        ColumnDataType::TimestampNanosecond => Values {
408            timestamp_nanosecond_values: Vec::with_capacity(capacity),
409            ..Default::default()
410        },
411        ColumnDataType::TimeSecond => Values {
412            time_second_values: Vec::with_capacity(capacity),
413            ..Default::default()
414        },
415        ColumnDataType::TimeMillisecond => Values {
416            time_millisecond_values: Vec::with_capacity(capacity),
417            ..Default::default()
418        },
419        ColumnDataType::TimeMicrosecond => Values {
420            time_microsecond_values: Vec::with_capacity(capacity),
421            ..Default::default()
422        },
423        ColumnDataType::TimeNanosecond => Values {
424            time_nanosecond_values: Vec::with_capacity(capacity),
425            ..Default::default()
426        },
427        ColumnDataType::IntervalDayTime => Values {
428            interval_day_time_values: Vec::with_capacity(capacity),
429            ..Default::default()
430        },
431        ColumnDataType::IntervalYearMonth => Values {
432            interval_year_month_values: Vec::with_capacity(capacity),
433            ..Default::default()
434        },
435        ColumnDataType::IntervalMonthDayNano => Values {
436            interval_month_day_nano_values: Vec::with_capacity(capacity),
437            ..Default::default()
438        },
439        ColumnDataType::Decimal128 => Values {
440            decimal128_values: Vec::with_capacity(capacity),
441            ..Default::default()
442        },
443        ColumnDataType::Json => Values {
444            string_values: Vec::with_capacity(capacity),
445            ..Default::default()
446        },
447        ColumnDataType::Vector => Values {
448            binary_values: Vec::with_capacity(capacity),
449            ..Default::default()
450        },
451    }
452}
453
454// The type of vals must be same.
455pub fn push_vals(column: &mut Column, origin_count: usize, vector: VectorRef) {
456    let values = column.values.get_or_insert_with(Values::default);
457    let mut null_mask = BitVec::from_slice(&column.null_mask);
458    let len = vector.len();
459    null_mask.reserve_exact(origin_count + len);
460    null_mask.extend(BitVec::repeat(false, len));
461
462    (0..len).for_each(|idx| match vector.get(idx) {
463        Value::Null => null_mask.set(idx + origin_count, true),
464        Value::Boolean(val) => values.bool_values.push(val),
465        Value::UInt8(val) => values.u8_values.push(val.into()),
466        Value::UInt16(val) => values.u16_values.push(val.into()),
467        Value::UInt32(val) => values.u32_values.push(val),
468        Value::UInt64(val) => values.u64_values.push(val),
469        Value::Int8(val) => values.i8_values.push(val.into()),
470        Value::Int16(val) => values.i16_values.push(val.into()),
471        Value::Int32(val) => values.i32_values.push(val),
472        Value::Int64(val) => values.i64_values.push(val),
473        Value::Float32(val) => values.f32_values.push(*val),
474        Value::Float64(val) => values.f64_values.push(*val),
475        Value::String(val) => values.string_values.push(val.as_utf8().to_string()),
476        Value::Binary(val) => values.binary_values.push(val.to_vec()),
477        Value::Date(val) => values.date_values.push(val.val()),
478        Value::Timestamp(val) => match val.unit() {
479            TimeUnit::Second => values.timestamp_second_values.push(val.value()),
480            TimeUnit::Millisecond => values.timestamp_millisecond_values.push(val.value()),
481            TimeUnit::Microsecond => values.timestamp_microsecond_values.push(val.value()),
482            TimeUnit::Nanosecond => values.timestamp_nanosecond_values.push(val.value()),
483        },
484        Value::Time(val) => match val.unit() {
485            TimeUnit::Second => values.time_second_values.push(val.value()),
486            TimeUnit::Millisecond => values.time_millisecond_values.push(val.value()),
487            TimeUnit::Microsecond => values.time_microsecond_values.push(val.value()),
488            TimeUnit::Nanosecond => values.time_nanosecond_values.push(val.value()),
489        },
490        Value::IntervalYearMonth(val) => values.interval_year_month_values.push(val.to_i32()),
491        Value::IntervalDayTime(val) => values.interval_day_time_values.push(val.to_i64()),
492        Value::IntervalMonthDayNano(val) => values
493            .interval_month_day_nano_values
494            .push(convert_month_day_nano_to_pb(val)),
495        Value::Decimal128(val) => values.decimal128_values.push(convert_to_pb_decimal128(val)),
496        Value::List(_) | Value::Duration(_) => unreachable!(),
497    });
498    column.null_mask = null_mask.into_vec();
499}
500
501/// Returns the type name of the [Request].
502pub fn request_type(request: &Request) -> &'static str {
503    match request {
504        Request::Inserts(_) => "inserts",
505        Request::Query(query_req) => query_request_type(query_req),
506        Request::Ddl(ddl_req) => ddl_request_type(ddl_req),
507        Request::Deletes(_) => "deletes",
508        Request::RowInserts(_) => "row_inserts",
509        Request::RowDeletes(_) => "row_deletes",
510    }
511}
512
513/// Returns the type name of the [QueryRequest].
514fn query_request_type(request: &QueryRequest) -> &'static str {
515    match request.query {
516        Some(Query::Sql(_)) => "query.sql",
517        Some(Query::LogicalPlan(_)) => "query.logical_plan",
518        Some(Query::PromRangeQuery(_)) => "query.prom_range",
519        Some(Query::InsertIntoPlan(_)) => "query.insert_into_plan",
520        None => "query.empty",
521    }
522}
523
524/// Returns the type name of the [DdlRequest].
525fn ddl_request_type(request: &DdlRequest) -> &'static str {
526    match request.expr {
527        Some(Expr::CreateDatabase(_)) => "ddl.create_database",
528        Some(Expr::CreateTable(_)) => "ddl.create_table",
529        Some(Expr::AlterTable(_)) => "ddl.alter_table",
530        Some(Expr::DropTable(_)) => "ddl.drop_table",
531        Some(Expr::TruncateTable(_)) => "ddl.truncate_table",
532        Some(Expr::CreateFlow(_)) => "ddl.create_flow",
533        Some(Expr::DropFlow(_)) => "ddl.drop_flow",
534        Some(Expr::CreateView(_)) => "ddl.create_view",
535        Some(Expr::DropView(_)) => "ddl.drop_view",
536        Some(Expr::AlterDatabase(_)) => "ddl.alter_database",
537        None => "ddl.empty",
538    }
539}
540
541/// Converts an interval to google protobuf type [IntervalMonthDayNano].
542pub fn convert_month_day_nano_to_pb(v: IntervalMonthDayNano) -> v1::IntervalMonthDayNano {
543    v1::IntervalMonthDayNano {
544        months: v.months,
545        days: v.days,
546        nanoseconds: v.nanoseconds,
547    }
548}
549
550/// Convert common decimal128 to grpc decimal128 without precision and scale.
551pub fn convert_to_pb_decimal128(v: Decimal128) -> v1::Decimal128 {
552    let (hi, lo) = v.split_value();
553    v1::Decimal128 { hi, lo }
554}
555
556pub fn pb_value_to_value_ref<'a>(
557    value: &'a v1::Value,
558    datatype_ext: &'a Option<ColumnDataTypeExtension>,
559) -> ValueRef<'a> {
560    let Some(value) = &value.value_data else {
561        return ValueRef::Null;
562    };
563
564    match value {
565        ValueData::I8Value(v) => ValueRef::Int8(*v as i8),
566        ValueData::I16Value(v) => ValueRef::Int16(*v as i16),
567        ValueData::I32Value(v) => ValueRef::Int32(*v),
568        ValueData::I64Value(v) => ValueRef::Int64(*v),
569        ValueData::U8Value(v) => ValueRef::UInt8(*v as u8),
570        ValueData::U16Value(v) => ValueRef::UInt16(*v as u16),
571        ValueData::U32Value(v) => ValueRef::UInt32(*v),
572        ValueData::U64Value(v) => ValueRef::UInt64(*v),
573        ValueData::F32Value(f) => ValueRef::Float32(OrderedF32::from(*f)),
574        ValueData::F64Value(f) => ValueRef::Float64(OrderedF64::from(*f)),
575        ValueData::BoolValue(b) => ValueRef::Boolean(*b),
576        ValueData::BinaryValue(bytes) => ValueRef::Binary(bytes.as_slice()),
577        ValueData::StringValue(string) => ValueRef::String(string.as_str()),
578        ValueData::DateValue(d) => ValueRef::Date(Date::from(*d)),
579        ValueData::TimestampSecondValue(t) => ValueRef::Timestamp(Timestamp::new_second(*t)),
580        ValueData::TimestampMillisecondValue(t) => {
581            ValueRef::Timestamp(Timestamp::new_millisecond(*t))
582        }
583        ValueData::DatetimeValue(t) | ValueData::TimestampMicrosecondValue(t) => {
584            ValueRef::Timestamp(Timestamp::new_microsecond(*t))
585        }
586        ValueData::TimestampNanosecondValue(t) => {
587            ValueRef::Timestamp(Timestamp::new_nanosecond(*t))
588        }
589        ValueData::TimeSecondValue(t) => ValueRef::Time(Time::new_second(*t)),
590        ValueData::TimeMillisecondValue(t) => ValueRef::Time(Time::new_millisecond(*t)),
591        ValueData::TimeMicrosecondValue(t) => ValueRef::Time(Time::new_microsecond(*t)),
592        ValueData::TimeNanosecondValue(t) => ValueRef::Time(Time::new_nanosecond(*t)),
593        ValueData::IntervalYearMonthValue(v) => {
594            ValueRef::IntervalYearMonth(IntervalYearMonth::from_i32(*v))
595        }
596        ValueData::IntervalDayTimeValue(v) => {
597            ValueRef::IntervalDayTime(IntervalDayTime::from_i64(*v))
598        }
599        ValueData::IntervalMonthDayNanoValue(v) => {
600            let interval = IntervalMonthDayNano::new(v.months, v.days, v.nanoseconds);
601            ValueRef::IntervalMonthDayNano(interval)
602        }
603        ValueData::Decimal128Value(v) => {
604            // get precision and scale from datatype_extension
605            if let Some(TypeExt::DecimalType(d)) = datatype_ext
606                .as_ref()
607                .and_then(|column_ext| column_ext.type_ext.as_ref())
608            {
609                ValueRef::Decimal128(Decimal128::from_value_precision_scale(
610                    v.hi,
611                    v.lo,
612                    d.precision as u8,
613                    d.scale as i8,
614                ))
615            } else {
616                // If the precision and scale are not set, use the default value.
617                ValueRef::Decimal128(Decimal128::from_value_precision_scale(
618                    v.hi,
619                    v.lo,
620                    DECIMAL128_MAX_PRECISION,
621                    DECIMAL128_DEFAULT_SCALE,
622                ))
623            }
624        }
625    }
626}
627
628pub fn pb_values_to_vector_ref(data_type: &ConcreteDataType, values: Values) -> VectorRef {
629    match data_type {
630        ConcreteDataType::Boolean(_) => Arc::new(BooleanVector::from(values.bool_values)),
631        ConcreteDataType::Int8(_) => Arc::new(PrimitiveVector::<Int8Type>::from_iter_values(
632            values.i8_values.into_iter().map(|x| x as i8),
633        )),
634        ConcreteDataType::Int16(_) => Arc::new(PrimitiveVector::<Int16Type>::from_iter_values(
635            values.i16_values.into_iter().map(|x| x as i16),
636        )),
637        ConcreteDataType::Int32(_) => Arc::new(Int32Vector::from_vec(values.i32_values)),
638        ConcreteDataType::Int64(_) => Arc::new(Int64Vector::from_vec(values.i64_values)),
639        ConcreteDataType::UInt8(_) => Arc::new(PrimitiveVector::<UInt8Type>::from_iter_values(
640            values.u8_values.into_iter().map(|x| x as u8),
641        )),
642        ConcreteDataType::UInt16(_) => Arc::new(PrimitiveVector::<UInt16Type>::from_iter_values(
643            values.u16_values.into_iter().map(|x| x as u16),
644        )),
645        ConcreteDataType::UInt32(_) => Arc::new(UInt32Vector::from_vec(values.u32_values)),
646        ConcreteDataType::UInt64(_) => Arc::new(UInt64Vector::from_vec(values.u64_values)),
647        ConcreteDataType::Float32(_) => Arc::new(Float32Vector::from_vec(values.f32_values)),
648        ConcreteDataType::Float64(_) => Arc::new(Float64Vector::from_vec(values.f64_values)),
649        ConcreteDataType::Binary(_) => Arc::new(BinaryVector::from(values.binary_values)),
650        ConcreteDataType::String(_) => Arc::new(StringVector::from_vec(values.string_values)),
651        ConcreteDataType::Date(_) => Arc::new(DateVector::from_vec(values.date_values)),
652        ConcreteDataType::Timestamp(unit) => match unit {
653            TimestampType::Second(_) => Arc::new(TimestampSecondVector::from_vec(
654                values.timestamp_second_values,
655            )),
656            TimestampType::Millisecond(_) => Arc::new(TimestampMillisecondVector::from_vec(
657                values.timestamp_millisecond_values,
658            )),
659            TimestampType::Microsecond(_) => Arc::new(TimestampMicrosecondVector::from_vec(
660                values.timestamp_microsecond_values,
661            )),
662            TimestampType::Nanosecond(_) => Arc::new(TimestampNanosecondVector::from_vec(
663                values.timestamp_nanosecond_values,
664            )),
665        },
666        ConcreteDataType::Time(unit) => match unit {
667            TimeType::Second(_) => Arc::new(TimeSecondVector::from_iter_values(
668                values.time_second_values.iter().map(|x| *x as i32),
669            )),
670            TimeType::Millisecond(_) => Arc::new(TimeMillisecondVector::from_iter_values(
671                values.time_millisecond_values.iter().map(|x| *x as i32),
672            )),
673            TimeType::Microsecond(_) => Arc::new(TimeMicrosecondVector::from_vec(
674                values.time_microsecond_values,
675            )),
676            TimeType::Nanosecond(_) => Arc::new(TimeNanosecondVector::from_vec(
677                values.time_nanosecond_values,
678            )),
679        },
680
681        ConcreteDataType::Interval(unit) => match unit {
682            IntervalType::YearMonth(_) => Arc::new(IntervalYearMonthVector::from_vec(
683                values.interval_year_month_values,
684            )),
685            IntervalType::DayTime(_) => Arc::new(IntervalDayTimeVector::from_iter_values(
686                values
687                    .interval_day_time_values
688                    .iter()
689                    .map(|x| IntervalDayTime::from_i64(*x).into()),
690            )),
691            IntervalType::MonthDayNano(_) => {
692                Arc::new(IntervalMonthDayNanoVector::from_iter_values(
693                    values
694                        .interval_month_day_nano_values
695                        .iter()
696                        .map(|x| IntervalMonthDayNano::new(x.months, x.days, x.nanoseconds).into()),
697                ))
698            }
699        },
700        ConcreteDataType::Decimal128(d) => Arc::new(Decimal128Vector::from_values(
701            values.decimal128_values.iter().map(|x| {
702                Decimal128::from_value_precision_scale(x.hi, x.lo, d.precision(), d.scale()).into()
703            }),
704        )),
705        ConcreteDataType::Vector(_) => Arc::new(BinaryVector::from_vec(values.binary_values)),
706        ConcreteDataType::Null(_)
707        | ConcreteDataType::List(_)
708        | ConcreteDataType::Struct(_)
709        | ConcreteDataType::Dictionary(_)
710        | ConcreteDataType::Duration(_)
711        | ConcreteDataType::Json(_) => {
712            unreachable!()
713        }
714    }
715}
716
717pub fn pb_values_to_values(data_type: &ConcreteDataType, values: Values) -> Vec<Value> {
718    match data_type {
719        ConcreteDataType::Int64(_) => values
720            .i64_values
721            .into_iter()
722            .map(|val| val.into())
723            .collect(),
724        ConcreteDataType::Float64(_) => values
725            .f64_values
726            .into_iter()
727            .map(|val| val.into())
728            .collect(),
729        ConcreteDataType::String(_) => values
730            .string_values
731            .into_iter()
732            .map(|val| val.into())
733            .collect(),
734        ConcreteDataType::Boolean(_) => values
735            .bool_values
736            .into_iter()
737            .map(|val| val.into())
738            .collect(),
739        ConcreteDataType::Int8(_) => values
740            .i8_values
741            .into_iter()
742            // Safety: Since i32 only stores i8 data here, so i32 as i8 is safe.
743            .map(|val| (val as i8).into())
744            .collect(),
745        ConcreteDataType::Int16(_) => values
746            .i16_values
747            .into_iter()
748            // Safety: Since i32 only stores i16 data here, so i32 as i16 is safe.
749            .map(|val| (val as i16).into())
750            .collect(),
751        ConcreteDataType::Int32(_) => values
752            .i32_values
753            .into_iter()
754            .map(|val| val.into())
755            .collect(),
756        ConcreteDataType::UInt8(_) => values
757            .u8_values
758            .into_iter()
759            // Safety: Since i32 only stores u8 data here, so i32 as u8 is safe.
760            .map(|val| (val as u8).into())
761            .collect(),
762        ConcreteDataType::UInt16(_) => values
763            .u16_values
764            .into_iter()
765            // Safety: Since i32 only stores u16 data here, so i32 as u16 is safe.
766            .map(|val| (val as u16).into())
767            .collect(),
768        ConcreteDataType::UInt32(_) => values
769            .u32_values
770            .into_iter()
771            .map(|val| val.into())
772            .collect(),
773        ConcreteDataType::UInt64(_) => values
774            .u64_values
775            .into_iter()
776            .map(|val| val.into())
777            .collect(),
778        ConcreteDataType::Float32(_) => values
779            .f32_values
780            .into_iter()
781            .map(|val| val.into())
782            .collect(),
783        ConcreteDataType::Binary(_) => values
784            .binary_values
785            .into_iter()
786            .map(|val| val.into())
787            .collect(),
788        ConcreteDataType::Date(_) => values
789            .date_values
790            .into_iter()
791            .map(|v| Value::Date(v.into()))
792            .collect(),
793        ConcreteDataType::Timestamp(TimestampType::Second(_)) => values
794            .timestamp_second_values
795            .into_iter()
796            .map(|v| Value::Timestamp(Timestamp::new_second(v)))
797            .collect(),
798        ConcreteDataType::Timestamp(TimestampType::Millisecond(_)) => values
799            .timestamp_millisecond_values
800            .into_iter()
801            .map(|v| Value::Timestamp(Timestamp::new_millisecond(v)))
802            .collect(),
803        ConcreteDataType::Timestamp(TimestampType::Microsecond(_)) => values
804            .timestamp_microsecond_values
805            .into_iter()
806            .map(|v| Value::Timestamp(Timestamp::new_microsecond(v)))
807            .collect(),
808        ConcreteDataType::Timestamp(TimestampType::Nanosecond(_)) => values
809            .timestamp_nanosecond_values
810            .into_iter()
811            .map(|v| Value::Timestamp(Timestamp::new_nanosecond(v)))
812            .collect(),
813        ConcreteDataType::Time(TimeType::Second(_)) => values
814            .time_second_values
815            .into_iter()
816            .map(|v| Value::Time(Time::new_second(v)))
817            .collect(),
818        ConcreteDataType::Time(TimeType::Millisecond(_)) => values
819            .time_millisecond_values
820            .into_iter()
821            .map(|v| Value::Time(Time::new_millisecond(v)))
822            .collect(),
823        ConcreteDataType::Time(TimeType::Microsecond(_)) => values
824            .time_microsecond_values
825            .into_iter()
826            .map(|v| Value::Time(Time::new_microsecond(v)))
827            .collect(),
828        ConcreteDataType::Time(TimeType::Nanosecond(_)) => values
829            .time_nanosecond_values
830            .into_iter()
831            .map(|v| Value::Time(Time::new_nanosecond(v)))
832            .collect(),
833
834        ConcreteDataType::Interval(IntervalType::YearMonth(_)) => values
835            .interval_year_month_values
836            .into_iter()
837            .map(|v| Value::IntervalYearMonth(IntervalYearMonth::from_i32(v)))
838            .collect(),
839        ConcreteDataType::Interval(IntervalType::DayTime(_)) => values
840            .interval_day_time_values
841            .into_iter()
842            .map(|v| Value::IntervalDayTime(IntervalDayTime::from_i64(v)))
843            .collect(),
844        ConcreteDataType::Interval(IntervalType::MonthDayNano(_)) => values
845            .interval_month_day_nano_values
846            .into_iter()
847            .map(|v| {
848                Value::IntervalMonthDayNano(IntervalMonthDayNano::new(
849                    v.months,
850                    v.days,
851                    v.nanoseconds,
852                ))
853            })
854            .collect(),
855        ConcreteDataType::Decimal128(d) => values
856            .decimal128_values
857            .into_iter()
858            .map(|v| {
859                Value::Decimal128(Decimal128::from_value_precision_scale(
860                    v.hi,
861                    v.lo,
862                    d.precision(),
863                    d.scale(),
864                ))
865            })
866            .collect(),
867        ConcreteDataType::Vector(_) => values.binary_values.into_iter().map(|v| v.into()).collect(),
868        ConcreteDataType::Null(_)
869        | ConcreteDataType::List(_)
870        | ConcreteDataType::Struct(_)
871        | ConcreteDataType::Dictionary(_)
872        | ConcreteDataType::Duration(_)
873        | ConcreteDataType::Json(_) => {
874            unreachable!()
875        }
876    }
877}
878
879/// Returns true if the pb semantic type is valid.
880pub fn is_semantic_type_eq(type_value: i32, semantic_type: SemanticType) -> bool {
881    type_value == semantic_type as i32
882}
883
884/// Returns true if the pb type value is valid.
885pub fn is_column_type_value_eq(
886    type_value: i32,
887    type_extension: Option<ColumnDataTypeExtension>,
888    expect_type: &ConcreteDataType,
889) -> bool {
890    ColumnDataTypeWrapper::try_new(type_value, type_extension)
891        .map(|wrapper| {
892            let datatype = ConcreteDataType::from(wrapper);
893            expect_type == &datatype
894        })
895        .unwrap_or(false)
896}
897
898/// Convert value into proto's value.
899pub fn to_proto_value(value: Value) -> Option<v1::Value> {
900    let proto_value = match value {
901        Value::Null => v1::Value { value_data: None },
902        Value::Boolean(v) => v1::Value {
903            value_data: Some(ValueData::BoolValue(v)),
904        },
905        Value::UInt8(v) => v1::Value {
906            value_data: Some(ValueData::U8Value(v.into())),
907        },
908        Value::UInt16(v) => v1::Value {
909            value_data: Some(ValueData::U16Value(v.into())),
910        },
911        Value::UInt32(v) => v1::Value {
912            value_data: Some(ValueData::U32Value(v)),
913        },
914        Value::UInt64(v) => v1::Value {
915            value_data: Some(ValueData::U64Value(v)),
916        },
917        Value::Int8(v) => v1::Value {
918            value_data: Some(ValueData::I8Value(v.into())),
919        },
920        Value::Int16(v) => v1::Value {
921            value_data: Some(ValueData::I16Value(v.into())),
922        },
923        Value::Int32(v) => v1::Value {
924            value_data: Some(ValueData::I32Value(v)),
925        },
926        Value::Int64(v) => v1::Value {
927            value_data: Some(ValueData::I64Value(v)),
928        },
929        Value::Float32(v) => v1::Value {
930            value_data: Some(ValueData::F32Value(*v)),
931        },
932        Value::Float64(v) => v1::Value {
933            value_data: Some(ValueData::F64Value(*v)),
934        },
935        Value::String(v) => v1::Value {
936            value_data: Some(ValueData::StringValue(v.as_utf8().to_string())),
937        },
938        Value::Binary(v) => v1::Value {
939            value_data: Some(ValueData::BinaryValue(v.to_vec())),
940        },
941        Value::Date(v) => v1::Value {
942            value_data: Some(ValueData::DateValue(v.val())),
943        },
944        Value::Timestamp(v) => match v.unit() {
945            TimeUnit::Second => v1::Value {
946                value_data: Some(ValueData::TimestampSecondValue(v.value())),
947            },
948            TimeUnit::Millisecond => v1::Value {
949                value_data: Some(ValueData::TimestampMillisecondValue(v.value())),
950            },
951            TimeUnit::Microsecond => v1::Value {
952                value_data: Some(ValueData::TimestampMicrosecondValue(v.value())),
953            },
954            TimeUnit::Nanosecond => v1::Value {
955                value_data: Some(ValueData::TimestampNanosecondValue(v.value())),
956            },
957        },
958        Value::Time(v) => match v.unit() {
959            TimeUnit::Second => v1::Value {
960                value_data: Some(ValueData::TimeSecondValue(v.value())),
961            },
962            TimeUnit::Millisecond => v1::Value {
963                value_data: Some(ValueData::TimeMillisecondValue(v.value())),
964            },
965            TimeUnit::Microsecond => v1::Value {
966                value_data: Some(ValueData::TimeMicrosecondValue(v.value())),
967            },
968            TimeUnit::Nanosecond => v1::Value {
969                value_data: Some(ValueData::TimeNanosecondValue(v.value())),
970            },
971        },
972        Value::IntervalYearMonth(v) => v1::Value {
973            value_data: Some(ValueData::IntervalYearMonthValue(v.to_i32())),
974        },
975        Value::IntervalDayTime(v) => v1::Value {
976            value_data: Some(ValueData::IntervalDayTimeValue(v.to_i64())),
977        },
978        Value::IntervalMonthDayNano(v) => v1::Value {
979            value_data: Some(ValueData::IntervalMonthDayNanoValue(
980                convert_month_day_nano_to_pb(v),
981            )),
982        },
983        Value::Decimal128(v) => v1::Value {
984            value_data: Some(ValueData::Decimal128Value(convert_to_pb_decimal128(v))),
985        },
986        Value::List(_) | Value::Duration(_) => return None,
987    };
988
989    Some(proto_value)
990}
991
992/// Returns the [ColumnDataTypeWrapper] of the value.
993///
994/// If value is null, returns `None`.
995pub fn proto_value_type(value: &v1::Value) -> Option<ColumnDataType> {
996    let value_type = match value.value_data.as_ref()? {
997        ValueData::I8Value(_) => ColumnDataType::Int8,
998        ValueData::I16Value(_) => ColumnDataType::Int16,
999        ValueData::I32Value(_) => ColumnDataType::Int32,
1000        ValueData::I64Value(_) => ColumnDataType::Int64,
1001        ValueData::U8Value(_) => ColumnDataType::Uint8,
1002        ValueData::U16Value(_) => ColumnDataType::Uint16,
1003        ValueData::U32Value(_) => ColumnDataType::Uint32,
1004        ValueData::U64Value(_) => ColumnDataType::Uint64,
1005        ValueData::F32Value(_) => ColumnDataType::Float32,
1006        ValueData::F64Value(_) => ColumnDataType::Float64,
1007        ValueData::BoolValue(_) => ColumnDataType::Boolean,
1008        ValueData::BinaryValue(_) => ColumnDataType::Binary,
1009        ValueData::StringValue(_) => ColumnDataType::String,
1010        ValueData::DateValue(_) => ColumnDataType::Date,
1011        ValueData::DatetimeValue(_) => ColumnDataType::Datetime,
1012        ValueData::TimestampSecondValue(_) => ColumnDataType::TimestampSecond,
1013        ValueData::TimestampMillisecondValue(_) => ColumnDataType::TimestampMillisecond,
1014        ValueData::TimestampMicrosecondValue(_) => ColumnDataType::TimestampMicrosecond,
1015        ValueData::TimestampNanosecondValue(_) => ColumnDataType::TimestampNanosecond,
1016        ValueData::TimeSecondValue(_) => ColumnDataType::TimeSecond,
1017        ValueData::TimeMillisecondValue(_) => ColumnDataType::TimeMillisecond,
1018        ValueData::TimeMicrosecondValue(_) => ColumnDataType::TimeMicrosecond,
1019        ValueData::TimeNanosecondValue(_) => ColumnDataType::TimeNanosecond,
1020        ValueData::IntervalYearMonthValue(_) => ColumnDataType::IntervalYearMonth,
1021        ValueData::IntervalDayTimeValue(_) => ColumnDataType::IntervalDayTime,
1022        ValueData::IntervalMonthDayNanoValue(_) => ColumnDataType::IntervalMonthDayNano,
1023        ValueData::Decimal128Value(_) => ColumnDataType::Decimal128,
1024    };
1025    Some(value_type)
1026}
1027
1028pub fn vectors_to_rows<'a>(
1029    columns: impl Iterator<Item = &'a VectorRef>,
1030    row_count: usize,
1031) -> Vec<Row> {
1032    let mut rows = vec![Row { values: vec![] }; row_count];
1033    for column in columns {
1034        for (row_index, row) in rows.iter_mut().enumerate() {
1035            row.values.push(value_to_grpc_value(column.get(row_index)))
1036        }
1037    }
1038
1039    rows
1040}
1041
1042pub fn value_to_grpc_value(value: Value) -> GrpcValue {
1043    GrpcValue {
1044        value_data: match value {
1045            Value::Null => None,
1046            Value::Boolean(v) => Some(ValueData::BoolValue(v)),
1047            Value::UInt8(v) => Some(ValueData::U8Value(v as _)),
1048            Value::UInt16(v) => Some(ValueData::U16Value(v as _)),
1049            Value::UInt32(v) => Some(ValueData::U32Value(v)),
1050            Value::UInt64(v) => Some(ValueData::U64Value(v)),
1051            Value::Int8(v) => Some(ValueData::I8Value(v as _)),
1052            Value::Int16(v) => Some(ValueData::I16Value(v as _)),
1053            Value::Int32(v) => Some(ValueData::I32Value(v)),
1054            Value::Int64(v) => Some(ValueData::I64Value(v)),
1055            Value::Float32(v) => Some(ValueData::F32Value(*v)),
1056            Value::Float64(v) => Some(ValueData::F64Value(*v)),
1057            Value::String(v) => Some(ValueData::StringValue(v.into_string())),
1058            Value::Binary(v) => Some(ValueData::BinaryValue(v.to_vec())),
1059            Value::Date(v) => Some(ValueData::DateValue(v.val())),
1060            Value::Timestamp(v) => Some(match v.unit() {
1061                TimeUnit::Second => ValueData::TimestampSecondValue(v.value()),
1062                TimeUnit::Millisecond => ValueData::TimestampMillisecondValue(v.value()),
1063                TimeUnit::Microsecond => ValueData::TimestampMicrosecondValue(v.value()),
1064                TimeUnit::Nanosecond => ValueData::TimestampNanosecondValue(v.value()),
1065            }),
1066            Value::Time(v) => Some(match v.unit() {
1067                TimeUnit::Second => ValueData::TimeSecondValue(v.value()),
1068                TimeUnit::Millisecond => ValueData::TimeMillisecondValue(v.value()),
1069                TimeUnit::Microsecond => ValueData::TimeMicrosecondValue(v.value()),
1070                TimeUnit::Nanosecond => ValueData::TimeNanosecondValue(v.value()),
1071            }),
1072            Value::IntervalYearMonth(v) => Some(ValueData::IntervalYearMonthValue(v.to_i32())),
1073            Value::IntervalDayTime(v) => Some(ValueData::IntervalDayTimeValue(v.to_i64())),
1074            Value::IntervalMonthDayNano(v) => Some(ValueData::IntervalMonthDayNanoValue(
1075                convert_month_day_nano_to_pb(v),
1076            )),
1077            Value::Decimal128(v) => Some(ValueData::Decimal128Value(convert_to_pb_decimal128(v))),
1078            Value::List(_) | Value::Duration(_) => unreachable!(),
1079        },
1080    }
1081}
1082
1083pub fn from_pb_time_unit(unit: v1::TimeUnit) -> TimeUnit {
1084    match unit {
1085        v1::TimeUnit::Second => TimeUnit::Second,
1086        v1::TimeUnit::Millisecond => TimeUnit::Millisecond,
1087        v1::TimeUnit::Microsecond => TimeUnit::Microsecond,
1088        v1::TimeUnit::Nanosecond => TimeUnit::Nanosecond,
1089    }
1090}
1091
1092pub fn to_pb_time_unit(unit: TimeUnit) -> v1::TimeUnit {
1093    match unit {
1094        TimeUnit::Second => v1::TimeUnit::Second,
1095        TimeUnit::Millisecond => v1::TimeUnit::Millisecond,
1096        TimeUnit::Microsecond => v1::TimeUnit::Microsecond,
1097        TimeUnit::Nanosecond => v1::TimeUnit::Nanosecond,
1098    }
1099}
1100
1101pub fn from_pb_time_ranges(time_ranges: v1::TimeRanges) -> Result<Vec<(Timestamp, Timestamp)>> {
1102    if time_ranges.time_ranges.is_empty() {
1103        return Ok(vec![]);
1104    }
1105    let proto_time_unit = v1::TimeUnit::try_from(time_ranges.time_unit).map_err(|_| {
1106        InvalidTimeUnitSnafu {
1107            time_unit: time_ranges.time_unit,
1108        }
1109        .build()
1110    })?;
1111    let time_unit = from_pb_time_unit(proto_time_unit);
1112    Ok(time_ranges
1113        .time_ranges
1114        .into_iter()
1115        .map(|r| {
1116            (
1117                Timestamp::new(r.start, time_unit),
1118                Timestamp::new(r.end, time_unit),
1119            )
1120        })
1121        .collect())
1122}
1123
1124/// All time_ranges must be of the same time unit.
1125///
1126/// if input `time_ranges` is empty, it will return a default `TimeRanges` with `Millisecond` as the time unit.
1127pub fn to_pb_time_ranges(time_ranges: &[(Timestamp, Timestamp)]) -> Result<v1::TimeRanges> {
1128    let is_same_time_unit = time_ranges.windows(2).all(|x| {
1129        x[0].0.unit() == x[1].0.unit()
1130            && x[0].1.unit() == x[1].1.unit()
1131            && x[0].0.unit() == x[0].1.unit()
1132    });
1133
1134    if !is_same_time_unit {
1135        let all_time_units: Vec<_> = time_ranges
1136            .iter()
1137            .map(|(s, e)| [s.unit(), e.unit()])
1138            .clone()
1139            .flatten()
1140            .collect::<HashSet<_>>()
1141            .into_iter()
1142            .collect();
1143        InconsistentTimeUnitSnafu {
1144            units: all_time_units,
1145        }
1146        .fail()?
1147    }
1148
1149    let mut pb_time_ranges = v1::TimeRanges {
1150        // default time unit is Millisecond
1151        time_unit: v1::TimeUnit::Millisecond as i32,
1152        time_ranges: Vec::with_capacity(time_ranges.len()),
1153    };
1154    if let Some((start, _end)) = time_ranges.first() {
1155        pb_time_ranges.time_unit = to_pb_time_unit(start.unit()) as i32;
1156    }
1157    for (start, end) in time_ranges {
1158        pb_time_ranges.time_ranges.push(v1::TimeRange {
1159            start: start.value(),
1160            end: end.value(),
1161        });
1162    }
1163    Ok(pb_time_ranges)
1164}
1165
1166#[cfg(test)]
1167mod tests {
1168    use std::sync::Arc;
1169
1170    use common_time::interval::IntervalUnit;
1171    use datatypes::types::{
1172        Int32Type, IntervalDayTimeType, IntervalMonthDayNanoType, IntervalYearMonthType,
1173        TimeMillisecondType, TimeSecondType, TimestampMillisecondType, TimestampSecondType,
1174        UInt32Type,
1175    };
1176    use datatypes::vectors::{
1177        BooleanVector, IntervalDayTimeVector, IntervalMonthDayNanoVector, IntervalYearMonthVector,
1178        TimeMicrosecondVector, TimeMillisecondVector, TimeNanosecondVector, TimeSecondVector,
1179        TimestampMicrosecondVector, TimestampMillisecondVector, TimestampNanosecondVector,
1180        TimestampSecondVector, Vector,
1181    };
1182    use paste::paste;
1183
1184    use super::*;
1185
1186    #[test]
1187    fn test_values_with_capacity() {
1188        let values = values_with_capacity(ColumnDataType::Int8, 2);
1189        let values = values.i8_values;
1190        assert_eq!(2, values.capacity());
1191
1192        let values = values_with_capacity(ColumnDataType::Int32, 2);
1193        let values = values.i32_values;
1194        assert_eq!(2, values.capacity());
1195
1196        let values = values_with_capacity(ColumnDataType::Int64, 2);
1197        let values = values.i64_values;
1198        assert_eq!(2, values.capacity());
1199
1200        let values = values_with_capacity(ColumnDataType::Uint8, 2);
1201        let values = values.u8_values;
1202        assert_eq!(2, values.capacity());
1203
1204        let values = values_with_capacity(ColumnDataType::Uint32, 2);
1205        let values = values.u32_values;
1206        assert_eq!(2, values.capacity());
1207
1208        let values = values_with_capacity(ColumnDataType::Uint64, 2);
1209        let values = values.u64_values;
1210        assert_eq!(2, values.capacity());
1211
1212        let values = values_with_capacity(ColumnDataType::Float32, 2);
1213        let values = values.f32_values;
1214        assert_eq!(2, values.capacity());
1215
1216        let values = values_with_capacity(ColumnDataType::Float64, 2);
1217        let values = values.f64_values;
1218        assert_eq!(2, values.capacity());
1219
1220        let values = values_with_capacity(ColumnDataType::Binary, 2);
1221        let values = values.binary_values;
1222        assert_eq!(2, values.capacity());
1223
1224        let values = values_with_capacity(ColumnDataType::Boolean, 2);
1225        let values = values.bool_values;
1226        assert_eq!(2, values.capacity());
1227
1228        let values = values_with_capacity(ColumnDataType::String, 2);
1229        let values = values.string_values;
1230        assert_eq!(2, values.capacity());
1231
1232        let values = values_with_capacity(ColumnDataType::Date, 2);
1233        let values = values.date_values;
1234        assert_eq!(2, values.capacity());
1235
1236        let values = values_with_capacity(ColumnDataType::Datetime, 2);
1237        let values = values.datetime_values;
1238        assert_eq!(2, values.capacity());
1239
1240        let values = values_with_capacity(ColumnDataType::TimestampMillisecond, 2);
1241        let values = values.timestamp_millisecond_values;
1242        assert_eq!(2, values.capacity());
1243
1244        let values = values_with_capacity(ColumnDataType::TimeMillisecond, 2);
1245        let values = values.time_millisecond_values;
1246        assert_eq!(2, values.capacity());
1247
1248        let values = values_with_capacity(ColumnDataType::IntervalDayTime, 2);
1249        let values = values.interval_day_time_values;
1250        assert_eq!(2, values.capacity());
1251
1252        let values = values_with_capacity(ColumnDataType::IntervalMonthDayNano, 2);
1253        let values = values.interval_month_day_nano_values;
1254        assert_eq!(2, values.capacity());
1255
1256        let values = values_with_capacity(ColumnDataType::Decimal128, 2);
1257        let values = values.decimal128_values;
1258        assert_eq!(2, values.capacity());
1259
1260        let values = values_with_capacity(ColumnDataType::Vector, 2);
1261        let values = values.binary_values;
1262        assert_eq!(2, values.capacity());
1263    }
1264
1265    #[test]
1266    fn test_concrete_datatype_from_column_datatype() {
1267        assert_eq!(
1268            ConcreteDataType::boolean_datatype(),
1269            ColumnDataTypeWrapper::boolean_datatype().into()
1270        );
1271        assert_eq!(
1272            ConcreteDataType::int8_datatype(),
1273            ColumnDataTypeWrapper::int8_datatype().into()
1274        );
1275        assert_eq!(
1276            ConcreteDataType::int16_datatype(),
1277            ColumnDataTypeWrapper::int16_datatype().into()
1278        );
1279        assert_eq!(
1280            ConcreteDataType::int32_datatype(),
1281            ColumnDataTypeWrapper::int32_datatype().into()
1282        );
1283        assert_eq!(
1284            ConcreteDataType::int64_datatype(),
1285            ColumnDataTypeWrapper::int64_datatype().into()
1286        );
1287        assert_eq!(
1288            ConcreteDataType::uint8_datatype(),
1289            ColumnDataTypeWrapper::uint8_datatype().into()
1290        );
1291        assert_eq!(
1292            ConcreteDataType::uint16_datatype(),
1293            ColumnDataTypeWrapper::uint16_datatype().into()
1294        );
1295        assert_eq!(
1296            ConcreteDataType::uint32_datatype(),
1297            ColumnDataTypeWrapper::uint32_datatype().into()
1298        );
1299        assert_eq!(
1300            ConcreteDataType::uint64_datatype(),
1301            ColumnDataTypeWrapper::uint64_datatype().into()
1302        );
1303        assert_eq!(
1304            ConcreteDataType::float32_datatype(),
1305            ColumnDataTypeWrapper::float32_datatype().into()
1306        );
1307        assert_eq!(
1308            ConcreteDataType::float64_datatype(),
1309            ColumnDataTypeWrapper::float64_datatype().into()
1310        );
1311        assert_eq!(
1312            ConcreteDataType::binary_datatype(),
1313            ColumnDataTypeWrapper::binary_datatype().into()
1314        );
1315        assert_eq!(
1316            ConcreteDataType::string_datatype(),
1317            ColumnDataTypeWrapper::string_datatype().into()
1318        );
1319        assert_eq!(
1320            ConcreteDataType::date_datatype(),
1321            ColumnDataTypeWrapper::date_datatype().into()
1322        );
1323        assert_eq!(
1324            ConcreteDataType::timestamp_microsecond_datatype(),
1325            ColumnDataTypeWrapper::datetime_datatype().into()
1326        );
1327        assert_eq!(
1328            ConcreteDataType::timestamp_millisecond_datatype(),
1329            ColumnDataTypeWrapper::timestamp_millisecond_datatype().into()
1330        );
1331        assert_eq!(
1332            ConcreteDataType::time_datatype(TimeUnit::Millisecond),
1333            ColumnDataTypeWrapper::time_millisecond_datatype().into()
1334        );
1335        assert_eq!(
1336            ConcreteDataType::interval_datatype(IntervalUnit::DayTime),
1337            ColumnDataTypeWrapper::interval_day_time_datatype().into()
1338        );
1339        assert_eq!(
1340            ConcreteDataType::interval_datatype(IntervalUnit::YearMonth),
1341            ColumnDataTypeWrapper::interval_year_month_datatype().into()
1342        );
1343        assert_eq!(
1344            ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano),
1345            ColumnDataTypeWrapper::interval_month_day_nano_datatype().into()
1346        );
1347        assert_eq!(
1348            ConcreteDataType::decimal128_datatype(10, 2),
1349            ColumnDataTypeWrapper::decimal128_datatype(10, 2).into()
1350        );
1351        assert_eq!(
1352            ConcreteDataType::vector_datatype(3),
1353            ColumnDataTypeWrapper::vector_datatype(3).into()
1354        );
1355    }
1356
1357    #[test]
1358    fn test_column_datatype_from_concrete_datatype() {
1359        assert_eq!(
1360            ColumnDataTypeWrapper::boolean_datatype(),
1361            ConcreteDataType::boolean_datatype().try_into().unwrap()
1362        );
1363        assert_eq!(
1364            ColumnDataTypeWrapper::int8_datatype(),
1365            ConcreteDataType::int8_datatype().try_into().unwrap()
1366        );
1367        assert_eq!(
1368            ColumnDataTypeWrapper::int16_datatype(),
1369            ConcreteDataType::int16_datatype().try_into().unwrap()
1370        );
1371        assert_eq!(
1372            ColumnDataTypeWrapper::int32_datatype(),
1373            ConcreteDataType::int32_datatype().try_into().unwrap()
1374        );
1375        assert_eq!(
1376            ColumnDataTypeWrapper::int64_datatype(),
1377            ConcreteDataType::int64_datatype().try_into().unwrap()
1378        );
1379        assert_eq!(
1380            ColumnDataTypeWrapper::uint8_datatype(),
1381            ConcreteDataType::uint8_datatype().try_into().unwrap()
1382        );
1383        assert_eq!(
1384            ColumnDataTypeWrapper::uint16_datatype(),
1385            ConcreteDataType::uint16_datatype().try_into().unwrap()
1386        );
1387        assert_eq!(
1388            ColumnDataTypeWrapper::uint32_datatype(),
1389            ConcreteDataType::uint32_datatype().try_into().unwrap()
1390        );
1391        assert_eq!(
1392            ColumnDataTypeWrapper::uint64_datatype(),
1393            ConcreteDataType::uint64_datatype().try_into().unwrap()
1394        );
1395        assert_eq!(
1396            ColumnDataTypeWrapper::float32_datatype(),
1397            ConcreteDataType::float32_datatype().try_into().unwrap()
1398        );
1399        assert_eq!(
1400            ColumnDataTypeWrapper::float64_datatype(),
1401            ConcreteDataType::float64_datatype().try_into().unwrap()
1402        );
1403        assert_eq!(
1404            ColumnDataTypeWrapper::binary_datatype(),
1405            ConcreteDataType::binary_datatype().try_into().unwrap()
1406        );
1407        assert_eq!(
1408            ColumnDataTypeWrapper::string_datatype(),
1409            ConcreteDataType::string_datatype().try_into().unwrap()
1410        );
1411        assert_eq!(
1412            ColumnDataTypeWrapper::date_datatype(),
1413            ConcreteDataType::date_datatype().try_into().unwrap()
1414        );
1415        assert_eq!(
1416            ColumnDataTypeWrapper::timestamp_millisecond_datatype(),
1417            ConcreteDataType::timestamp_millisecond_datatype()
1418                .try_into()
1419                .unwrap()
1420        );
1421        assert_eq!(
1422            ColumnDataTypeWrapper::interval_year_month_datatype(),
1423            ConcreteDataType::interval_datatype(IntervalUnit::YearMonth)
1424                .try_into()
1425                .unwrap()
1426        );
1427        assert_eq!(
1428            ColumnDataTypeWrapper::interval_day_time_datatype(),
1429            ConcreteDataType::interval_datatype(IntervalUnit::DayTime)
1430                .try_into()
1431                .unwrap()
1432        );
1433        assert_eq!(
1434            ColumnDataTypeWrapper::interval_month_day_nano_datatype(),
1435            ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano)
1436                .try_into()
1437                .unwrap()
1438        );
1439
1440        assert_eq!(
1441            ColumnDataTypeWrapper::decimal128_datatype(10, 2),
1442            ConcreteDataType::decimal128_datatype(10, 2)
1443                .try_into()
1444                .unwrap()
1445        );
1446        assert_eq!(
1447            ColumnDataTypeWrapper::vector_datatype(3),
1448            ConcreteDataType::vector_datatype(3).try_into().unwrap()
1449        );
1450
1451        let result: Result<ColumnDataTypeWrapper> = ConcreteDataType::null_datatype().try_into();
1452        assert!(result.is_err());
1453        assert_eq!(
1454            result.unwrap_err().to_string(),
1455            "Failed to create column datatype from Null(NullType)"
1456        );
1457
1458        let result: Result<ColumnDataTypeWrapper> =
1459            ConcreteDataType::list_datatype(ConcreteDataType::boolean_datatype()).try_into();
1460        assert!(result.is_err());
1461        assert_eq!(
1462            result.unwrap_err().to_string(),
1463            "Failed to create column datatype from List(ListType { item_type: Boolean(BooleanType) })"
1464        );
1465    }
1466
1467    #[test]
1468    fn test_column_put_timestamp_values() {
1469        let mut column = Column {
1470            column_name: "test".to_string(),
1471            semantic_type: 0,
1472            values: Some(Values {
1473                ..Default::default()
1474            }),
1475            null_mask: vec![],
1476            datatype: 0,
1477            ..Default::default()
1478        };
1479
1480        let vector = Arc::new(TimestampNanosecondVector::from_vec(vec![1, 2, 3]));
1481        push_vals(&mut column, 3, vector);
1482        assert_eq!(
1483            vec![1, 2, 3],
1484            column.values.as_ref().unwrap().timestamp_nanosecond_values
1485        );
1486
1487        let vector = Arc::new(TimestampMillisecondVector::from_vec(vec![4, 5, 6]));
1488        push_vals(&mut column, 3, vector);
1489        assert_eq!(
1490            vec![4, 5, 6],
1491            column.values.as_ref().unwrap().timestamp_millisecond_values
1492        );
1493
1494        let vector = Arc::new(TimestampMicrosecondVector::from_vec(vec![7, 8, 9]));
1495        push_vals(&mut column, 3, vector);
1496        assert_eq!(
1497            vec![7, 8, 9],
1498            column.values.as_ref().unwrap().timestamp_microsecond_values
1499        );
1500
1501        let vector = Arc::new(TimestampSecondVector::from_vec(vec![10, 11, 12]));
1502        push_vals(&mut column, 3, vector);
1503        assert_eq!(
1504            vec![10, 11, 12],
1505            column.values.as_ref().unwrap().timestamp_second_values
1506        );
1507    }
1508
1509    #[test]
1510    fn test_column_put_time_values() {
1511        let mut column = Column {
1512            column_name: "test".to_string(),
1513            semantic_type: 0,
1514            values: Some(Values {
1515                ..Default::default()
1516            }),
1517            null_mask: vec![],
1518            datatype: 0,
1519            ..Default::default()
1520        };
1521
1522        let vector = Arc::new(TimeNanosecondVector::from_vec(vec![1, 2, 3]));
1523        push_vals(&mut column, 3, vector);
1524        assert_eq!(
1525            vec![1, 2, 3],
1526            column.values.as_ref().unwrap().time_nanosecond_values
1527        );
1528
1529        let vector = Arc::new(TimeMillisecondVector::from_vec(vec![4, 5, 6]));
1530        push_vals(&mut column, 3, vector);
1531        assert_eq!(
1532            vec![4, 5, 6],
1533            column.values.as_ref().unwrap().time_millisecond_values
1534        );
1535
1536        let vector = Arc::new(TimeMicrosecondVector::from_vec(vec![7, 8, 9]));
1537        push_vals(&mut column, 3, vector);
1538        assert_eq!(
1539            vec![7, 8, 9],
1540            column.values.as_ref().unwrap().time_microsecond_values
1541        );
1542
1543        let vector = Arc::new(TimeSecondVector::from_vec(vec![10, 11, 12]));
1544        push_vals(&mut column, 3, vector);
1545        assert_eq!(
1546            vec![10, 11, 12],
1547            column.values.as_ref().unwrap().time_second_values
1548        );
1549    }
1550
1551    #[test]
1552    fn test_column_put_interval_values() {
1553        let mut column = Column {
1554            column_name: "test".to_string(),
1555            semantic_type: 0,
1556            values: Some(Values {
1557                ..Default::default()
1558            }),
1559            null_mask: vec![],
1560            datatype: 0,
1561            ..Default::default()
1562        };
1563
1564        let vector = Arc::new(IntervalYearMonthVector::from_vec(vec![1, 2, 3]));
1565        push_vals(&mut column, 3, vector);
1566        assert_eq!(
1567            vec![1, 2, 3],
1568            column.values.as_ref().unwrap().interval_year_month_values
1569        );
1570
1571        let vector = Arc::new(IntervalDayTimeVector::from_vec(vec![
1572            IntervalDayTime::new(0, 4).into(),
1573            IntervalDayTime::new(0, 5).into(),
1574            IntervalDayTime::new(0, 6).into(),
1575        ]));
1576        push_vals(&mut column, 3, vector);
1577        assert_eq!(
1578            vec![4, 5, 6],
1579            column.values.as_ref().unwrap().interval_day_time_values
1580        );
1581
1582        let vector = Arc::new(IntervalMonthDayNanoVector::from_vec(vec![
1583            IntervalMonthDayNano::new(0, 0, 7).into(),
1584            IntervalMonthDayNano::new(0, 0, 8).into(),
1585            IntervalMonthDayNano::new(0, 0, 9).into(),
1586        ]));
1587        let len = vector.len();
1588        push_vals(&mut column, 3, vector);
1589        (0..len).for_each(|i| {
1590            assert_eq!(
1591                7 + i as i64,
1592                column
1593                    .values
1594                    .as_ref()
1595                    .unwrap()
1596                    .interval_month_day_nano_values
1597                    .get(i)
1598                    .unwrap()
1599                    .nanoseconds
1600            );
1601        });
1602    }
1603
1604    #[test]
1605    fn test_column_put_vector() {
1606        use crate::v1::SemanticType;
1607        // Some(false), None, Some(true), Some(true)
1608        let mut column = Column {
1609            column_name: "test".to_string(),
1610            semantic_type: SemanticType::Field as i32,
1611            values: Some(Values {
1612                bool_values: vec![false, true, true],
1613                ..Default::default()
1614            }),
1615            null_mask: vec![2],
1616            datatype: ColumnDataType::Boolean as i32,
1617            ..Default::default()
1618        };
1619        let row_count = 4;
1620
1621        let vector = Arc::new(BooleanVector::from(vec![Some(true), None, Some(false)]));
1622        push_vals(&mut column, row_count, vector);
1623        // Some(false), None, Some(true), Some(true), Some(true), None, Some(false)
1624        let bool_values = column.values.unwrap().bool_values;
1625        assert_eq!(vec![false, true, true, true, false], bool_values);
1626        let null_mask = column.null_mask;
1627        assert_eq!(34, null_mask[0]);
1628    }
1629
1630    #[test]
1631    fn test_convert_i128_to_interval() {
1632        let i128_val = 3;
1633        let interval = convert_month_day_nano_to_pb(IntervalMonthDayNano::from_i128(i128_val));
1634        assert_eq!(interval.months, 0);
1635        assert_eq!(interval.days, 0);
1636        assert_eq!(interval.nanoseconds, 3);
1637    }
1638
1639    #[test]
1640    fn test_convert_timestamp_values() {
1641        // second
1642        let actual = pb_values_to_values(
1643            &ConcreteDataType::Timestamp(TimestampType::Second(TimestampSecondType)),
1644            Values {
1645                timestamp_second_values: vec![1_i64, 2_i64, 3_i64],
1646                ..Default::default()
1647            },
1648        );
1649        let expect = vec![
1650            Value::Timestamp(Timestamp::new_second(1_i64)),
1651            Value::Timestamp(Timestamp::new_second(2_i64)),
1652            Value::Timestamp(Timestamp::new_second(3_i64)),
1653        ];
1654        assert_eq!(expect, actual);
1655
1656        // millisecond
1657        let actual = pb_values_to_values(
1658            &ConcreteDataType::Timestamp(TimestampType::Millisecond(TimestampMillisecondType)),
1659            Values {
1660                timestamp_millisecond_values: vec![1_i64, 2_i64, 3_i64],
1661                ..Default::default()
1662            },
1663        );
1664        let expect = vec![
1665            Value::Timestamp(Timestamp::new_millisecond(1_i64)),
1666            Value::Timestamp(Timestamp::new_millisecond(2_i64)),
1667            Value::Timestamp(Timestamp::new_millisecond(3_i64)),
1668        ];
1669        assert_eq!(expect, actual);
1670    }
1671
1672    #[test]
1673    fn test_convert_time_values() {
1674        // second
1675        let actual = pb_values_to_values(
1676            &ConcreteDataType::Time(TimeType::Second(TimeSecondType)),
1677            Values {
1678                time_second_values: vec![1_i64, 2_i64, 3_i64],
1679                ..Default::default()
1680            },
1681        );
1682        let expect = vec![
1683            Value::Time(Time::new_second(1_i64)),
1684            Value::Time(Time::new_second(2_i64)),
1685            Value::Time(Time::new_second(3_i64)),
1686        ];
1687        assert_eq!(expect, actual);
1688
1689        // millisecond
1690        let actual = pb_values_to_values(
1691            &ConcreteDataType::Time(TimeType::Millisecond(TimeMillisecondType)),
1692            Values {
1693                time_millisecond_values: vec![1_i64, 2_i64, 3_i64],
1694                ..Default::default()
1695            },
1696        );
1697        let expect = vec![
1698            Value::Time(Time::new_millisecond(1_i64)),
1699            Value::Time(Time::new_millisecond(2_i64)),
1700            Value::Time(Time::new_millisecond(3_i64)),
1701        ];
1702        assert_eq!(expect, actual);
1703    }
1704
1705    #[test]
1706    fn test_convert_interval_values() {
1707        // year_month
1708        let actual = pb_values_to_values(
1709            &ConcreteDataType::Interval(IntervalType::YearMonth(IntervalYearMonthType)),
1710            Values {
1711                interval_year_month_values: vec![1_i32, 2_i32, 3_i32],
1712                ..Default::default()
1713            },
1714        );
1715        let expect = vec![
1716            Value::IntervalYearMonth(IntervalYearMonth::new(1_i32)),
1717            Value::IntervalYearMonth(IntervalYearMonth::new(2_i32)),
1718            Value::IntervalYearMonth(IntervalYearMonth::new(3_i32)),
1719        ];
1720        assert_eq!(expect, actual);
1721
1722        // day_time
1723        let actual = pb_values_to_values(
1724            &ConcreteDataType::Interval(IntervalType::DayTime(IntervalDayTimeType)),
1725            Values {
1726                interval_day_time_values: vec![1_i64, 2_i64, 3_i64],
1727                ..Default::default()
1728            },
1729        );
1730        let expect = vec![
1731            Value::IntervalDayTime(IntervalDayTime::from_i64(1_i64)),
1732            Value::IntervalDayTime(IntervalDayTime::from_i64(2_i64)),
1733            Value::IntervalDayTime(IntervalDayTime::from_i64(3_i64)),
1734        ];
1735        assert_eq!(expect, actual);
1736
1737        // month_day_nano
1738        let actual = pb_values_to_values(
1739            &ConcreteDataType::Interval(IntervalType::MonthDayNano(IntervalMonthDayNanoType)),
1740            Values {
1741                interval_month_day_nano_values: vec![
1742                    v1::IntervalMonthDayNano {
1743                        months: 1,
1744                        days: 2,
1745                        nanoseconds: 3,
1746                    },
1747                    v1::IntervalMonthDayNano {
1748                        months: 5,
1749                        days: 6,
1750                        nanoseconds: 7,
1751                    },
1752                    v1::IntervalMonthDayNano {
1753                        months: 9,
1754                        days: 10,
1755                        nanoseconds: 11,
1756                    },
1757                ],
1758                ..Default::default()
1759            },
1760        );
1761        let expect = vec![
1762            Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
1763            Value::IntervalMonthDayNano(IntervalMonthDayNano::new(5, 6, 7)),
1764            Value::IntervalMonthDayNano(IntervalMonthDayNano::new(9, 10, 11)),
1765        ];
1766        assert_eq!(expect, actual);
1767    }
1768
1769    macro_rules! test_convert_values {
1770        ($grpc_data_type: ident, $values: expr,  $concrete_data_type: ident, $expected_ret: expr) => {
1771            paste! {
1772                #[test]
1773                fn [<test_convert_ $grpc_data_type _values>]() {
1774                    let values = Values {
1775                        [<$grpc_data_type _values>]: $values,
1776                        ..Default::default()
1777                    };
1778
1779                    let data_type = ConcreteDataType::[<$concrete_data_type _datatype>]();
1780                    let result = pb_values_to_values(&data_type, values);
1781
1782                    assert_eq!(
1783                        $expected_ret,
1784                        result
1785                    );
1786                }
1787            }
1788        };
1789    }
1790
1791    test_convert_values!(
1792        i8,
1793        vec![1_i32, 2, 3],
1794        int8,
1795        vec![Value::Int8(1), Value::Int8(2), Value::Int8(3)]
1796    );
1797
1798    test_convert_values!(
1799        u8,
1800        vec![1_u32, 2, 3],
1801        uint8,
1802        vec![Value::UInt8(1), Value::UInt8(2), Value::UInt8(3)]
1803    );
1804
1805    test_convert_values!(
1806        i16,
1807        vec![1_i32, 2, 3],
1808        int16,
1809        vec![Value::Int16(1), Value::Int16(2), Value::Int16(3)]
1810    );
1811
1812    test_convert_values!(
1813        u16,
1814        vec![1_u32, 2, 3],
1815        uint16,
1816        vec![Value::UInt16(1), Value::UInt16(2), Value::UInt16(3)]
1817    );
1818
1819    test_convert_values!(
1820        i32,
1821        vec![1, 2, 3],
1822        int32,
1823        vec![Value::Int32(1), Value::Int32(2), Value::Int32(3)]
1824    );
1825
1826    test_convert_values!(
1827        u32,
1828        vec![1, 2, 3],
1829        uint32,
1830        vec![Value::UInt32(1), Value::UInt32(2), Value::UInt32(3)]
1831    );
1832
1833    test_convert_values!(
1834        i64,
1835        vec![1, 2, 3],
1836        int64,
1837        vec![Value::Int64(1), Value::Int64(2), Value::Int64(3)]
1838    );
1839
1840    test_convert_values!(
1841        u64,
1842        vec![1, 2, 3],
1843        uint64,
1844        vec![Value::UInt64(1), Value::UInt64(2), Value::UInt64(3)]
1845    );
1846
1847    test_convert_values!(
1848        f32,
1849        vec![1.0, 2.0, 3.0],
1850        float32,
1851        vec![
1852            Value::Float32(1.0.into()),
1853            Value::Float32(2.0.into()),
1854            Value::Float32(3.0.into())
1855        ]
1856    );
1857
1858    test_convert_values!(
1859        f64,
1860        vec![1.0, 2.0, 3.0],
1861        float64,
1862        vec![
1863            Value::Float64(1.0.into()),
1864            Value::Float64(2.0.into()),
1865            Value::Float64(3.0.into())
1866        ]
1867    );
1868
1869    test_convert_values!(
1870        string,
1871        vec!["1".to_string(), "2".to_string(), "3".to_string()],
1872        string,
1873        vec![
1874            Value::String("1".into()),
1875            Value::String("2".into()),
1876            Value::String("3".into())
1877        ]
1878    );
1879
1880    test_convert_values!(
1881        binary,
1882        vec!["1".into(), "2".into(), "3".into()],
1883        binary,
1884        vec![
1885            Value::Binary(b"1".to_vec().into()),
1886            Value::Binary(b"2".to_vec().into()),
1887            Value::Binary(b"3".to_vec().into())
1888        ]
1889    );
1890
1891    test_convert_values!(
1892        date,
1893        vec![1, 2, 3],
1894        date,
1895        vec![
1896            Value::Date(1.into()),
1897            Value::Date(2.into()),
1898            Value::Date(3.into())
1899        ]
1900    );
1901
1902    #[test]
1903    fn test_vectors_to_rows_for_different_types() {
1904        let boolean_vec = BooleanVector::from_vec(vec![true, false, true]);
1905        let int8_vec = PrimitiveVector::<Int8Type>::from_iter_values(vec![1, 2, 3]);
1906        let int32_vec = PrimitiveVector::<Int32Type>::from_iter_values(vec![100, 200, 300]);
1907        let uint8_vec = PrimitiveVector::<UInt8Type>::from_iter_values(vec![10, 20, 30]);
1908        let uint32_vec = PrimitiveVector::<UInt32Type>::from_iter_values(vec![1000, 2000, 3000]);
1909        let float32_vec = Float32Vector::from_vec(vec![1.1, 2.2, 3.3]);
1910        let date_vec = DateVector::from_vec(vec![10, 20, 30]);
1911        let string_vec = StringVector::from_vec(vec!["a", "b", "c"]);
1912
1913        let vector_refs: Vec<VectorRef> = vec![
1914            Arc::new(boolean_vec),
1915            Arc::new(int8_vec),
1916            Arc::new(int32_vec),
1917            Arc::new(uint8_vec),
1918            Arc::new(uint32_vec),
1919            Arc::new(float32_vec),
1920            Arc::new(date_vec),
1921            Arc::new(string_vec),
1922        ];
1923
1924        let result = vectors_to_rows(vector_refs.iter(), 3);
1925
1926        assert_eq!(result.len(), 3);
1927
1928        assert_eq!(result[0].values.len(), 8);
1929        let values = result[0]
1930            .values
1931            .iter()
1932            .map(|v| v.value_data.clone().unwrap())
1933            .collect::<Vec<_>>();
1934        assert_eq!(values[0], ValueData::BoolValue(true));
1935        assert_eq!(values[1], ValueData::I8Value(1));
1936        assert_eq!(values[2], ValueData::I32Value(100));
1937        assert_eq!(values[3], ValueData::U8Value(10));
1938        assert_eq!(values[4], ValueData::U32Value(1000));
1939        assert_eq!(values[5], ValueData::F32Value(1.1));
1940        assert_eq!(values[6], ValueData::DateValue(10));
1941        assert_eq!(values[7], ValueData::StringValue("a".to_string()));
1942
1943        assert_eq!(result[1].values.len(), 8);
1944        let values = result[1]
1945            .values
1946            .iter()
1947            .map(|v| v.value_data.clone().unwrap())
1948            .collect::<Vec<_>>();
1949        assert_eq!(values[0], ValueData::BoolValue(false));
1950        assert_eq!(values[1], ValueData::I8Value(2));
1951        assert_eq!(values[2], ValueData::I32Value(200));
1952        assert_eq!(values[3], ValueData::U8Value(20));
1953        assert_eq!(values[4], ValueData::U32Value(2000));
1954        assert_eq!(values[5], ValueData::F32Value(2.2));
1955        assert_eq!(values[6], ValueData::DateValue(20));
1956        assert_eq!(values[7], ValueData::StringValue("b".to_string()));
1957
1958        assert_eq!(result[2].values.len(), 8);
1959        let values = result[2]
1960            .values
1961            .iter()
1962            .map(|v| v.value_data.clone().unwrap())
1963            .collect::<Vec<_>>();
1964        assert_eq!(values[0], ValueData::BoolValue(true));
1965        assert_eq!(values[1], ValueData::I8Value(3));
1966        assert_eq!(values[2], ValueData::I32Value(300));
1967        assert_eq!(values[3], ValueData::U8Value(30));
1968        assert_eq!(values[4], ValueData::U32Value(3000));
1969        assert_eq!(values[5], ValueData::F32Value(3.3));
1970        assert_eq!(values[6], ValueData::DateValue(30));
1971        assert_eq!(values[7], ValueData::StringValue("c".to_string()));
1972    }
1973
1974    #[test]
1975    fn test_is_column_type_value_eq() {
1976        // test column type eq
1977        let column1 = Column {
1978            column_name: "test".to_string(),
1979            semantic_type: 0,
1980            values: Some(Values {
1981                bool_values: vec![false, true, true],
1982                ..Default::default()
1983            }),
1984            null_mask: vec![2],
1985            datatype: ColumnDataType::Boolean as i32,
1986            datatype_extension: None,
1987            options: None,
1988        };
1989        assert!(is_column_type_value_eq(
1990            column1.datatype,
1991            column1.datatype_extension,
1992            &ConcreteDataType::boolean_datatype(),
1993        ));
1994    }
1995
1996    #[test]
1997    fn test_convert_to_pb_decimal128() {
1998        let decimal = Decimal128::new(123, 3, 1);
1999        let pb_decimal = convert_to_pb_decimal128(decimal);
2000        assert_eq!(pb_decimal.lo, 123);
2001        assert_eq!(pb_decimal.hi, 0);
2002    }
2003}