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