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