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