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