1use std::cmp::Ordering;
16use std::fmt::{Display, Formatter};
17use std::sync::Arc;
18
19use arrow_array::{Array, StructArray};
20use common_base::bytes::{Bytes, StringBytes};
21use common_decimal::Decimal128;
22use common_telemetry::error;
23use common_time::date::Date;
24use common_time::interval::IntervalUnit;
25use common_time::time::Time;
26use common_time::timestamp::{TimeUnit, Timestamp};
27use common_time::{Duration, IntervalDayTime, IntervalMonthDayNano, IntervalYearMonth, Timezone};
28use datafusion_common::ScalarValue;
29use datafusion_common::scalar::ScalarStructBuilder;
30pub use ordered_float::OrderedFloat;
31use serde::{Deserialize, Serialize, Serializer};
32use serde_json::Map;
33use snafu::{ResultExt, ensure};
34
35use crate::error::{
36 self, ConvertArrowArrayToScalarsSnafu, ConvertScalarToArrowArraySnafu, Error,
37 InconsistentStructFieldsAndItemsSnafu, Result, TryFromValueSnafu,
38};
39use crate::json::value::{JsonValue, JsonValueRef};
40use crate::prelude::*;
41use crate::type_id::LogicalTypeId;
42use crate::types::{IntervalType, ListType, StructType};
43use crate::vectors::{ListVector, StructVector};
44
45pub type OrderedF32 = OrderedFloat<f32>;
46pub type OrderedF64 = OrderedFloat<f64>;
47
48#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
52pub enum Value {
53 Null,
54
55 Boolean(bool),
57 UInt8(u8),
58 UInt16(u16),
59 UInt32(u32),
60 UInt64(u64),
61 Int8(i8),
62 Int16(i16),
63 Int32(i32),
64 Int64(i64),
65 Float32(OrderedF32),
66 Float64(OrderedF64),
67
68 Decimal128(Decimal128),
70
71 String(StringBytes),
73 Binary(Bytes),
74
75 Date(Date),
77 Timestamp(Timestamp),
78 Time(Time),
79 Duration(Duration),
80 IntervalYearMonth(IntervalYearMonth),
82 IntervalDayTime(IntervalDayTime),
83 IntervalMonthDayNano(IntervalMonthDayNano),
84
85 List(ListValue),
87 Struct(StructValue),
88
89 Json(Box<JsonValue>),
91}
92
93impl Display for Value {
94 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
95 match self {
96 Value::Null => write!(f, "{}", self.data_type().name()),
97 Value::Boolean(v) => write!(f, "{v}"),
98 Value::UInt8(v) => write!(f, "{v}"),
99 Value::UInt16(v) => write!(f, "{v}"),
100 Value::UInt32(v) => write!(f, "{v}"),
101 Value::UInt64(v) => write!(f, "{v}"),
102 Value::Int8(v) => write!(f, "{v}"),
103 Value::Int16(v) => write!(f, "{v}"),
104 Value::Int32(v) => write!(f, "{v}"),
105 Value::Int64(v) => write!(f, "{v}"),
106 Value::Float32(v) => write!(f, "{v}"),
107 Value::Float64(v) => write!(f, "{v}"),
108 Value::String(v) => write!(f, "{}", v.as_utf8()),
109 Value::Binary(v) => {
110 let hex = v
111 .iter()
112 .map(|b| format!("{b:02x}"))
113 .collect::<Vec<String>>()
114 .join("");
115 write!(f, "{hex}")
116 }
117 Value::Date(v) => write!(f, "{v}"),
118 Value::Timestamp(v) => write!(f, "{}", v.to_iso8601_string()),
119 Value::Time(t) => write!(f, "{}", t.to_iso8601_string()),
120 Value::IntervalYearMonth(v) => {
121 write!(f, "{}", v.to_iso8601_string())
122 }
123 Value::IntervalDayTime(v) => {
124 write!(f, "{}", v.to_iso8601_string())
125 }
126 Value::IntervalMonthDayNano(v) => {
127 write!(f, "{}", v.to_iso8601_string())
128 }
129 Value::Duration(d) => write!(f, "{d}"),
130 Value::List(v) => {
131 let items = v
132 .items()
133 .iter()
134 .map(|i| i.to_string())
135 .collect::<Vec<String>>()
136 .join(", ");
137 write!(f, "{}[{}]", v.datatype.name(), items)
138 }
139 Value::Decimal128(v) => write!(f, "{}", v),
140 Value::Struct(s) => {
141 let items = s
142 .fields
143 .fields()
144 .iter()
145 .map(|f| f.name())
146 .zip(s.items().iter())
147 .map(|(k, v)| format!("{k}: {v}"))
148 .collect::<Vec<String>>()
149 .join(", ");
150 write!(f, "{{ {items} }}")
151 }
152 Value::Json(json_data) => {
153 write!(f, "Json({})", json_data)
154 }
155 }
156 }
157}
158
159macro_rules! define_data_type_func {
160 ($struct: ident) => {
161 pub fn data_type(&self) -> ConcreteDataType {
166 match self {
167 $struct::Null => ConcreteDataType::null_datatype(),
168 $struct::Boolean(_) => ConcreteDataType::boolean_datatype(),
169 $struct::UInt8(_) => ConcreteDataType::uint8_datatype(),
170 $struct::UInt16(_) => ConcreteDataType::uint16_datatype(),
171 $struct::UInt32(_) => ConcreteDataType::uint32_datatype(),
172 $struct::UInt64(_) => ConcreteDataType::uint64_datatype(),
173 $struct::Int8(_) => ConcreteDataType::int8_datatype(),
174 $struct::Int16(_) => ConcreteDataType::int16_datatype(),
175 $struct::Int32(_) => ConcreteDataType::int32_datatype(),
176 $struct::Int64(_) => ConcreteDataType::int64_datatype(),
177 $struct::Float32(_) => ConcreteDataType::float32_datatype(),
178 $struct::Float64(_) => ConcreteDataType::float64_datatype(),
179 $struct::String(_) => ConcreteDataType::string_datatype(),
180 $struct::Binary(_) => ConcreteDataType::binary_datatype(),
181 $struct::Date(_) => ConcreteDataType::date_datatype(),
182 $struct::Time(t) => ConcreteDataType::time_datatype(*t.unit()),
183 $struct::Timestamp(v) => ConcreteDataType::timestamp_datatype(v.unit()),
184 $struct::IntervalYearMonth(_) => {
185 ConcreteDataType::interval_datatype(IntervalUnit::YearMonth)
186 }
187 $struct::IntervalDayTime(_) => {
188 ConcreteDataType::interval_datatype(IntervalUnit::DayTime)
189 }
190 $struct::IntervalMonthDayNano(_) => {
191 ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano)
192 }
193 $struct::List(list) => ConcreteDataType::list_datatype(list.datatype().clone()),
194 $struct::Duration(d) => ConcreteDataType::duration_datatype(d.unit()),
195 $struct::Decimal128(d) => {
196 ConcreteDataType::decimal128_datatype(d.precision(), d.scale())
197 }
198 $struct::Struct(struct_value) => {
199 ConcreteDataType::struct_datatype(struct_value.struct_type().clone())
200 }
201 $struct::Json(v) => v.data_type(),
202 }
203 }
204 };
205}
206
207impl Value {
208 define_data_type_func!(Value);
209
210 pub fn is_null(&self) -> bool {
212 match self {
213 Value::Null => true,
214 Value::Json(inner) => inner.is_null(),
215 _ => false,
216 }
217 }
218
219 pub fn as_list(&self) -> Result<Option<&ListValue>> {
221 match self {
222 Value::Null => Ok(None),
223 Value::List(v) => Ok(Some(v)),
224 other => error::CastTypeSnafu {
225 msg: format!("Failed to cast {other:?} to list value"),
226 }
227 .fail(),
228 }
229 }
230
231 pub fn as_struct(&self) -> Result<Option<&StructValue>> {
232 match self {
233 Value::Null => Ok(None),
234 Value::Struct(v) => Ok(Some(v)),
235 other => error::CastTypeSnafu {
236 msg: format!("Failed to cast {other:?} to struct value"),
237 }
238 .fail(),
239 }
240 }
241
242 pub fn as_value_ref(&self) -> ValueRef<'_> {
244 match self {
245 Value::Null => ValueRef::Null,
246 Value::Boolean(v) => ValueRef::Boolean(*v),
247 Value::UInt8(v) => ValueRef::UInt8(*v),
248 Value::UInt16(v) => ValueRef::UInt16(*v),
249 Value::UInt32(v) => ValueRef::UInt32(*v),
250 Value::UInt64(v) => ValueRef::UInt64(*v),
251 Value::Int8(v) => ValueRef::Int8(*v),
252 Value::Int16(v) => ValueRef::Int16(*v),
253 Value::Int32(v) => ValueRef::Int32(*v),
254 Value::Int64(v) => ValueRef::Int64(*v),
255 Value::Float32(v) => ValueRef::Float32(*v),
256 Value::Float64(v) => ValueRef::Float64(*v),
257 Value::String(v) => ValueRef::String(v.as_utf8()),
258 Value::Binary(v) => ValueRef::Binary(v),
259 Value::Date(v) => ValueRef::Date(*v),
260 Value::List(v) => ValueRef::List(ListValueRef::Ref { val: v }),
261 Value::Timestamp(v) => ValueRef::Timestamp(*v),
262 Value::Time(v) => ValueRef::Time(*v),
263 Value::IntervalYearMonth(v) => ValueRef::IntervalYearMonth(*v),
264 Value::IntervalDayTime(v) => ValueRef::IntervalDayTime(*v),
265 Value::IntervalMonthDayNano(v) => ValueRef::IntervalMonthDayNano(*v),
266 Value::Duration(v) => ValueRef::Duration(*v),
267 Value::Decimal128(v) => ValueRef::Decimal128(*v),
268 Value::Struct(v) => ValueRef::Struct(StructValueRef::Ref(v)),
269 Value::Json(v) => ValueRef::Json(Box::new((**v).as_ref())),
270 }
271 }
272
273 pub fn as_timestamp(&self) -> Option<Timestamp> {
275 match self {
276 Value::Timestamp(t) => Some(*t),
277 _ => None,
278 }
279 }
280
281 pub fn as_string(&self) -> Option<String> {
283 match self {
284 Value::String(bytes) => Some(bytes.as_utf8().to_string()),
285 _ => None,
286 }
287 }
288
289 pub fn as_date(&self) -> Option<Date> {
291 match self {
292 Value::Date(t) => Some(*t),
293 _ => None,
294 }
295 }
296
297 pub fn as_time(&self) -> Option<Time> {
299 match self {
300 Value::Time(t) => Some(*t),
301 _ => None,
302 }
303 }
304
305 pub fn as_interval_year_month(&self) -> Option<IntervalYearMonth> {
307 match self {
308 Value::IntervalYearMonth(v) => Some(*v),
309 _ => None,
310 }
311 }
312
313 pub fn as_interval_day_time(&self) -> Option<IntervalDayTime> {
315 match self {
316 Value::IntervalDayTime(v) => Some(*v),
317 _ => None,
318 }
319 }
320
321 pub fn as_interval_month_day_nano(&self) -> Option<IntervalMonthDayNano> {
323 match self {
324 Value::IntervalMonthDayNano(v) => Some(*v),
325 _ => None,
326 }
327 }
328
329 pub fn as_i64(&self) -> Option<i64> {
331 match self {
332 Value::Int8(v) => Some(*v as _),
333 Value::Int16(v) => Some(*v as _),
334 Value::Int32(v) => Some(*v as _),
335 Value::Int64(v) => Some(*v),
336 Value::UInt8(v) => Some(*v as _),
337 Value::UInt16(v) => Some(*v as _),
338 Value::UInt32(v) => Some(*v as _),
339 Value::Json(inner) => inner.as_i64(),
340 _ => None,
341 }
342 }
343
344 pub fn as_u64(&self) -> Option<u64> {
346 match self {
347 Value::UInt8(v) => Some(*v as _),
348 Value::UInt16(v) => Some(*v as _),
349 Value::UInt32(v) => Some(*v as _),
350 Value::UInt64(v) => Some(*v),
351 Value::Json(inner) => inner.as_u64(),
352 _ => None,
353 }
354 }
355 pub fn as_f64_lossy(&self) -> Option<f64> {
357 match self {
358 Value::Float32(v) => Some(v.0 as _),
359 Value::Float64(v) => Some(v.0),
360 Value::Int8(v) => Some(*v as _),
361 Value::Int16(v) => Some(*v as _),
362 Value::Int32(v) => Some(*v as _),
363 Value::Int64(v) => Some(*v as _),
364 Value::UInt8(v) => Some(*v as _),
365 Value::UInt16(v) => Some(*v as _),
366 Value::UInt32(v) => Some(*v as _),
367 Value::UInt64(v) => Some(*v as _),
368 Value::Json(inner) => inner.as_f64_lossy(),
369 _ => None,
370 }
371 }
372
373 pub fn as_duration(&self) -> Option<Duration> {
375 match self {
376 Value::Duration(d) => Some(*d),
377 _ => None,
378 }
379 }
380
381 pub fn as_bool(&self) -> Option<bool> {
383 match self {
384 Value::Boolean(b) => Some(*b),
385 Value::Json(inner) => inner.as_bool(),
386 _ => None,
387 }
388 }
389
390 pub fn into_json_inner(self) -> Option<Value> {
392 match self {
393 Value::Json(v) => Some((*v).into_value()),
394 _ => None,
395 }
396 }
397
398 pub fn logical_type_id(&self) -> LogicalTypeId {
400 match self {
401 Value::Null => LogicalTypeId::Null,
402 Value::Boolean(_) => LogicalTypeId::Boolean,
403 Value::UInt8(_) => LogicalTypeId::UInt8,
404 Value::UInt16(_) => LogicalTypeId::UInt16,
405 Value::UInt32(_) => LogicalTypeId::UInt32,
406 Value::UInt64(_) => LogicalTypeId::UInt64,
407 Value::Int8(_) => LogicalTypeId::Int8,
408 Value::Int16(_) => LogicalTypeId::Int16,
409 Value::Int32(_) => LogicalTypeId::Int32,
410 Value::Int64(_) => LogicalTypeId::Int64,
411 Value::Float32(_) => LogicalTypeId::Float32,
412 Value::Float64(_) => LogicalTypeId::Float64,
413 Value::String(_) => LogicalTypeId::String,
414 Value::Binary(_) => LogicalTypeId::Binary,
415 Value::List(_) => LogicalTypeId::List,
416 Value::Date(_) => LogicalTypeId::Date,
417 Value::Timestamp(t) => match t.unit() {
418 TimeUnit::Second => LogicalTypeId::TimestampSecond,
419 TimeUnit::Millisecond => LogicalTypeId::TimestampMillisecond,
420 TimeUnit::Microsecond => LogicalTypeId::TimestampMicrosecond,
421 TimeUnit::Nanosecond => LogicalTypeId::TimestampNanosecond,
422 },
423 Value::Time(t) => match t.unit() {
424 TimeUnit::Second => LogicalTypeId::TimeSecond,
425 TimeUnit::Millisecond => LogicalTypeId::TimeMillisecond,
426 TimeUnit::Microsecond => LogicalTypeId::TimeMicrosecond,
427 TimeUnit::Nanosecond => LogicalTypeId::TimeNanosecond,
428 },
429 Value::IntervalYearMonth(_) => LogicalTypeId::IntervalYearMonth,
430 Value::IntervalDayTime(_) => LogicalTypeId::IntervalDayTime,
431 Value::IntervalMonthDayNano(_) => LogicalTypeId::IntervalMonthDayNano,
432 Value::Duration(d) => match d.unit() {
433 TimeUnit::Second => LogicalTypeId::DurationSecond,
434 TimeUnit::Millisecond => LogicalTypeId::DurationMillisecond,
435 TimeUnit::Microsecond => LogicalTypeId::DurationMicrosecond,
436 TimeUnit::Nanosecond => LogicalTypeId::DurationNanosecond,
437 },
438 Value::Decimal128(_) => LogicalTypeId::Decimal128,
439 Value::Struct(_) => LogicalTypeId::Struct,
440 Value::Json(_) => LogicalTypeId::Json,
441 }
442 }
443
444 pub fn try_to_scalar_value(&self, output_type: &ConcreteDataType) -> Result<ScalarValue> {
446 let value_type_id = self.logical_type_id();
448 let output_type_id = output_type.logical_type_id();
449 ensure!(
450 output_type_id == value_type_id
451 || self.is_null()
452 || (output_type_id == LogicalTypeId::Json
453 && (value_type_id == LogicalTypeId::Binary
454 || value_type_id == LogicalTypeId::Json)),
455 error::ToScalarValueSnafu {
456 reason: format!(
457 "expect value to return output_type {output_type_id:?}, actual: {value_type_id:?}",
458 ),
459 }
460 );
461
462 let scalar_value = match self {
463 Value::Boolean(v) => ScalarValue::Boolean(Some(*v)),
464 Value::UInt8(v) => ScalarValue::UInt8(Some(*v)),
465 Value::UInt16(v) => ScalarValue::UInt16(Some(*v)),
466 Value::UInt32(v) => ScalarValue::UInt32(Some(*v)),
467 Value::UInt64(v) => ScalarValue::UInt64(Some(*v)),
468 Value::Int8(v) => ScalarValue::Int8(Some(*v)),
469 Value::Int16(v) => ScalarValue::Int16(Some(*v)),
470 Value::Int32(v) => ScalarValue::Int32(Some(*v)),
471 Value::Int64(v) => ScalarValue::Int64(Some(*v)),
472 Value::Float32(v) => ScalarValue::Float32(Some(v.0)),
473 Value::Float64(v) => ScalarValue::Float64(Some(v.0)),
474 Value::String(v) => {
475 let s = v.as_utf8().to_string();
476 match output_type {
477 ConcreteDataType::String(t) if t.is_large() => ScalarValue::LargeUtf8(Some(s)),
478 _ => ScalarValue::Utf8(Some(s)),
479 }
480 }
481 Value::Binary(v) => ScalarValue::Binary(Some(v.to_vec())),
482 Value::Date(v) => ScalarValue::Date32(Some(v.val())),
483 Value::Null => to_null_scalar_value(output_type)?,
484 Value::List(list) => {
485 let list_type = output_type.as_list().unwrap();
487 list.try_to_scalar_value(list_type)?
488 }
489 Value::Timestamp(t) => timestamp_to_scalar_value(t.unit(), Some(t.value())),
490 Value::Time(t) => time_to_scalar_value(*t.unit(), Some(t.value()))?,
491 Value::IntervalYearMonth(v) => ScalarValue::IntervalYearMonth(Some(v.to_i32())),
492 Value::IntervalDayTime(v) => ScalarValue::IntervalDayTime(Some((*v).into())),
493 Value::IntervalMonthDayNano(v) => ScalarValue::IntervalMonthDayNano(Some((*v).into())),
494 Value::Duration(d) => duration_to_scalar_value(d.unit(), Some(d.value())),
495 Value::Decimal128(d) => {
496 let (v, p, s) = d.to_scalar_value();
497 ScalarValue::Decimal128(v, p, s)
498 }
499 Value::Struct(struct_value) => {
500 let struct_type = output_type.as_struct().unwrap();
501 struct_value.try_to_scalar_value(struct_type)?
502 }
503 Value::Json(_) => {
504 return error::ToScalarValueSnafu {
505 reason: "unsupported for json value",
506 }
507 .fail();
508 }
509 };
510
511 Ok(scalar_value)
512 }
513
514 pub fn try_negative(&self) -> Option<Self> {
516 match self {
517 Value::Null => Some(Value::Null),
518 Value::UInt8(x) => {
519 if *x == 0 {
520 Some(Value::UInt8(*x))
521 } else {
522 None
523 }
524 }
525 Value::UInt16(x) => {
526 if *x == 0 {
527 Some(Value::UInt16(*x))
528 } else {
529 None
530 }
531 }
532 Value::UInt32(x) => {
533 if *x == 0 {
534 Some(Value::UInt32(*x))
535 } else {
536 None
537 }
538 }
539 Value::UInt64(x) => {
540 if *x == 0 {
541 Some(Value::UInt64(*x))
542 } else {
543 None
544 }
545 }
546 Value::Int8(x) => Some(Value::Int8(-*x)),
547 Value::Int16(x) => Some(Value::Int16(-*x)),
548 Value::Int32(x) => Some(Value::Int32(-*x)),
549 Value::Int64(x) => Some(Value::Int64(-*x)),
550 Value::Float32(x) => Some(Value::Float32(-*x)),
551 Value::Float64(x) => Some(Value::Float64(-*x)),
552 Value::Decimal128(x) => Some(Value::Decimal128(x.negative())),
553 Value::Date(x) => Some(Value::Date(x.negative())),
554 Value::Timestamp(x) => Some(Value::Timestamp(x.negative())),
555 Value::Time(x) => Some(Value::Time(x.negative())),
556 Value::Duration(x) => Some(Value::Duration(x.negative())),
557 Value::IntervalYearMonth(x) => Some(Value::IntervalYearMonth(x.negative())),
558 Value::IntervalDayTime(x) => Some(Value::IntervalDayTime(x.negative())),
559 Value::IntervalMonthDayNano(x) => Some(Value::IntervalMonthDayNano(x.negative())),
560
561 Value::Binary(_)
562 | Value::String(_)
563 | Value::Boolean(_)
564 | Value::List(_)
565 | Value::Struct(_)
566 | Value::Json(_) => None,
567 }
568 }
569}
570
571pub trait TryAsPrimitive<T: LogicalPrimitiveType> {
572 fn try_as_primitive(&self) -> Option<T::Native>;
573}
574
575macro_rules! impl_try_as_primitive {
576 ($Type: ident, $Variant: ident) => {
577 impl TryAsPrimitive<crate::types::$Type> for Value {
578 fn try_as_primitive(
579 &self,
580 ) -> Option<<crate::types::$Type as crate::types::LogicalPrimitiveType>::Native> {
581 match self {
582 Value::$Variant(v) => Some((*v).into()),
583 _ => None,
584 }
585 }
586 }
587 };
588}
589
590impl_try_as_primitive!(Int8Type, Int8);
591impl_try_as_primitive!(Int16Type, Int16);
592impl_try_as_primitive!(Int32Type, Int32);
593impl_try_as_primitive!(Int64Type, Int64);
594impl_try_as_primitive!(UInt8Type, UInt8);
595impl_try_as_primitive!(UInt16Type, UInt16);
596impl_try_as_primitive!(UInt32Type, UInt32);
597impl_try_as_primitive!(UInt64Type, UInt64);
598impl_try_as_primitive!(Float32Type, Float32);
599impl_try_as_primitive!(Float64Type, Float64);
600
601pub fn to_null_scalar_value(output_type: &ConcreteDataType) -> Result<ScalarValue> {
602 Ok(match output_type {
603 ConcreteDataType::Null(_) => ScalarValue::Null,
604 ConcreteDataType::Boolean(_) => ScalarValue::Boolean(None),
605 ConcreteDataType::Int8(_) => ScalarValue::Int8(None),
606 ConcreteDataType::Int16(_) => ScalarValue::Int16(None),
607 ConcreteDataType::Int32(_) => ScalarValue::Int32(None),
608 ConcreteDataType::Int64(_) => ScalarValue::Int64(None),
609 ConcreteDataType::UInt8(_) => ScalarValue::UInt8(None),
610 ConcreteDataType::UInt16(_) => ScalarValue::UInt16(None),
611 ConcreteDataType::UInt32(_) => ScalarValue::UInt32(None),
612 ConcreteDataType::UInt64(_) => ScalarValue::UInt64(None),
613 ConcreteDataType::Float32(_) => ScalarValue::Float32(None),
614 ConcreteDataType::Float64(_) => ScalarValue::Float64(None),
615 ConcreteDataType::Binary(_) | ConcreteDataType::Json(_) | ConcreteDataType::Vector(_) => {
616 ScalarValue::Binary(None)
617 }
618 ConcreteDataType::String(t) => {
619 if t.is_large() {
620 ScalarValue::LargeUtf8(None)
621 } else {
622 ScalarValue::Utf8(None)
623 }
624 }
625 ConcreteDataType::Date(_) => ScalarValue::Date32(None),
626 ConcreteDataType::Timestamp(t) => timestamp_to_scalar_value(t.unit(), None),
627 ConcreteDataType::Interval(v) => match v {
628 IntervalType::YearMonth(_) => ScalarValue::IntervalYearMonth(None),
629 IntervalType::DayTime(_) => ScalarValue::IntervalDayTime(None),
630 IntervalType::MonthDayNano(_) => ScalarValue::IntervalMonthDayNano(None),
631 },
632 ConcreteDataType::List(list_type) => {
633 ScalarValue::new_null_list(list_type.item_type().as_arrow_type(), true, 1)
634 }
635 ConcreteDataType::Struct(fields) => {
636 let fields = fields.as_arrow_fields();
637 ScalarStructBuilder::new_null(fields)
638 }
639 ConcreteDataType::Dictionary(dict) => ScalarValue::Dictionary(
640 Box::new(dict.key_type().as_arrow_type()),
641 Box::new(to_null_scalar_value(dict.value_type())?),
642 ),
643 ConcreteDataType::Time(t) => time_to_scalar_value(t.unit(), None)?,
644 ConcreteDataType::Duration(d) => duration_to_scalar_value(d.unit(), None),
645 ConcreteDataType::Decimal128(d) => ScalarValue::Decimal128(None, d.precision(), d.scale()),
646 })
647}
648
649pub fn timestamp_to_scalar_value(unit: TimeUnit, val: Option<i64>) -> ScalarValue {
650 match unit {
651 TimeUnit::Second => ScalarValue::TimestampSecond(val, None),
652 TimeUnit::Millisecond => ScalarValue::TimestampMillisecond(val, None),
653 TimeUnit::Microsecond => ScalarValue::TimestampMicrosecond(val, None),
654 TimeUnit::Nanosecond => ScalarValue::TimestampNanosecond(val, None),
655 }
656}
657
658pub fn time_to_scalar_value(unit: TimeUnit, val: Option<i64>) -> Result<ScalarValue> {
660 Ok(match unit {
661 TimeUnit::Second => ScalarValue::Time32Second(
662 val.map(|i| i.try_into().context(error::CastTimeTypeSnafu))
663 .transpose()?,
664 ),
665 TimeUnit::Millisecond => ScalarValue::Time32Millisecond(
666 val.map(|i| i.try_into().context(error::CastTimeTypeSnafu))
667 .transpose()?,
668 ),
669 TimeUnit::Microsecond => ScalarValue::Time64Microsecond(val),
670 TimeUnit::Nanosecond => ScalarValue::Time64Nanosecond(val),
671 })
672}
673
674pub fn duration_to_scalar_value(unit: TimeUnit, val: Option<i64>) -> ScalarValue {
676 match unit {
677 TimeUnit::Second => ScalarValue::DurationSecond(val),
678 TimeUnit::Millisecond => ScalarValue::DurationMillisecond(val),
679 TimeUnit::Microsecond => ScalarValue::DurationMicrosecond(val),
680 TimeUnit::Nanosecond => ScalarValue::DurationNanosecond(val),
681 }
682}
683
684pub fn scalar_value_to_timestamp(
688 scalar: &ScalarValue,
689 timezone: Option<&Timezone>,
690) -> Option<Timestamp> {
691 match scalar {
692 ScalarValue::Utf8(Some(s)) => match Timestamp::from_str(s, timezone) {
693 Ok(t) => Some(t),
694 Err(e) => {
695 error!(e;"Failed to convert string literal {s} to timestamp");
696 None
697 }
698 },
699 ScalarValue::TimestampSecond(v, _) => v.map(Timestamp::new_second),
700 ScalarValue::TimestampMillisecond(v, _) => v.map(Timestamp::new_millisecond),
701 ScalarValue::TimestampMicrosecond(v, _) => v.map(Timestamp::new_microsecond),
702 ScalarValue::TimestampNanosecond(v, _) => v.map(Timestamp::new_nanosecond),
703 _ => None,
704 }
705}
706
707macro_rules! impl_ord_for_value_like {
708 ($Type: ident, $left: ident, $right: ident) => {
709 if $left.is_null() && !$right.is_null() {
710 return Ordering::Less;
711 } else if !$left.is_null() && $right.is_null() {
712 return Ordering::Greater;
713 } else {
714 match ($left, $right) {
715 ($Type::Null, $Type::Null) => Ordering::Equal,
716 ($Type::Boolean(v1), $Type::Boolean(v2)) => v1.cmp(v2),
717 ($Type::UInt8(v1), $Type::UInt8(v2)) => v1.cmp(v2),
718 ($Type::UInt16(v1), $Type::UInt16(v2)) => v1.cmp(v2),
719 ($Type::UInt32(v1), $Type::UInt32(v2)) => v1.cmp(v2),
720 ($Type::UInt64(v1), $Type::UInt64(v2)) => v1.cmp(v2),
721 ($Type::Int8(v1), $Type::Int8(v2)) => v1.cmp(v2),
722 ($Type::Int16(v1), $Type::Int16(v2)) => v1.cmp(v2),
723 ($Type::Int32(v1), $Type::Int32(v2)) => v1.cmp(v2),
724 ($Type::Int64(v1), $Type::Int64(v2)) => v1.cmp(v2),
725 ($Type::Float32(v1), $Type::Float32(v2)) => v1.cmp(v2),
726 ($Type::Float64(v1), $Type::Float64(v2)) => v1.cmp(v2),
727 ($Type::String(v1), $Type::String(v2)) => v1.cmp(v2),
728 ($Type::Binary(v1), $Type::Binary(v2)) => v1.cmp(v2),
729 ($Type::Date(v1), $Type::Date(v2)) => v1.cmp(v2),
730 ($Type::Timestamp(v1), $Type::Timestamp(v2)) => v1.cmp(v2),
731 ($Type::Time(v1), $Type::Time(v2)) => v1.cmp(v2),
732 ($Type::IntervalYearMonth(v1), $Type::IntervalYearMonth(v2)) => v1.cmp(v2),
733 ($Type::IntervalDayTime(v1), $Type::IntervalDayTime(v2)) => v1.cmp(v2),
734 ($Type::IntervalMonthDayNano(v1), $Type::IntervalMonthDayNano(v2)) => v1.cmp(v2),
735 ($Type::Duration(v1), $Type::Duration(v2)) => v1.cmp(v2),
736 ($Type::List(v1), $Type::List(v2)) => v1.cmp(v2),
737 _ => panic!(
738 "Cannot compare different values {:?} and {:?}",
739 $left, $right
740 ),
741 }
742 }
743 };
744}
745
746impl PartialOrd for Value {
747 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
748 Some(self.cmp(other))
749 }
750}
751
752impl Ord for Value {
753 fn cmp(&self, other: &Self) -> Ordering {
754 impl_ord_for_value_like!(Value, self, other)
755 }
756}
757
758macro_rules! impl_try_from_value {
759 ($Variant: ident, $Type: ident) => {
760 impl TryFrom<Value> for $Type {
761 type Error = Error;
762
763 #[inline]
764 fn try_from(from: Value) -> std::result::Result<Self, Self::Error> {
765 match from {
766 Value::$Variant(v) => Ok(v.into()),
767 _ => TryFromValueSnafu {
768 reason: format!("{:?} is not a {}", from, stringify!($Type)),
769 }
770 .fail(),
771 }
772 }
773 }
774
775 impl TryFrom<Value> for Option<$Type> {
776 type Error = Error;
777
778 #[inline]
779 fn try_from(from: Value) -> std::result::Result<Self, Self::Error> {
780 match from {
781 Value::$Variant(v) => Ok(Some(v.into())),
782 Value::Null => Ok(None),
783 _ => TryFromValueSnafu {
784 reason: format!("{:?} is not a {}", from, stringify!($Type)),
785 }
786 .fail(),
787 }
788 }
789 }
790 };
791}
792
793impl_try_from_value!(Boolean, bool);
794impl_try_from_value!(UInt8, u8);
795impl_try_from_value!(UInt16, u16);
796impl_try_from_value!(UInt32, u32);
797impl_try_from_value!(UInt64, u64);
798impl_try_from_value!(Int8, i8);
799impl_try_from_value!(Int16, i16);
800impl_try_from_value!(Int32, i32);
801impl_try_from_value!(Int64, i64);
802impl_try_from_value!(Float32, f32);
803impl_try_from_value!(Float64, f64);
804impl_try_from_value!(Float32, OrderedF32);
805impl_try_from_value!(Float64, OrderedF64);
806impl_try_from_value!(String, StringBytes);
807impl_try_from_value!(Binary, Bytes);
808impl_try_from_value!(Date, Date);
809impl_try_from_value!(Time, Time);
810impl_try_from_value!(Timestamp, Timestamp);
811impl_try_from_value!(IntervalYearMonth, IntervalYearMonth);
812impl_try_from_value!(IntervalDayTime, IntervalDayTime);
813impl_try_from_value!(IntervalMonthDayNano, IntervalMonthDayNano);
814impl_try_from_value!(Duration, Duration);
815impl_try_from_value!(Decimal128, Decimal128);
816
817macro_rules! impl_value_from {
818 ($Variant: ident, $Type: ident) => {
819 impl From<$Type> for Value {
820 fn from(value: $Type) -> Self {
821 Value::$Variant(value.into())
822 }
823 }
824
825 impl From<Option<$Type>> for Value {
826 fn from(value: Option<$Type>) -> Self {
827 match value {
828 Some(v) => Value::$Variant(v.into()),
829 None => Value::Null,
830 }
831 }
832 }
833 };
834}
835
836impl_value_from!(Boolean, bool);
837impl_value_from!(UInt8, u8);
838impl_value_from!(UInt16, u16);
839impl_value_from!(UInt32, u32);
840impl_value_from!(UInt64, u64);
841impl_value_from!(Int8, i8);
842impl_value_from!(Int16, i16);
843impl_value_from!(Int32, i32);
844impl_value_from!(Int64, i64);
845impl_value_from!(Float32, f32);
846impl_value_from!(Float64, f64);
847impl_value_from!(Float32, OrderedF32);
848impl_value_from!(Float64, OrderedF64);
849impl_value_from!(String, StringBytes);
850impl_value_from!(Binary, Bytes);
851impl_value_from!(Date, Date);
852impl_value_from!(Time, Time);
853impl_value_from!(Timestamp, Timestamp);
854impl_value_from!(IntervalYearMonth, IntervalYearMonth);
855impl_value_from!(IntervalDayTime, IntervalDayTime);
856impl_value_from!(IntervalMonthDayNano, IntervalMonthDayNano);
857impl_value_from!(Duration, Duration);
858impl_value_from!(String, String);
859impl_value_from!(Decimal128, Decimal128);
860
861impl From<&str> for Value {
862 fn from(string: &str) -> Value {
863 Value::String(string.into())
864 }
865}
866
867impl From<Vec<u8>> for Value {
868 fn from(bytes: Vec<u8>) -> Value {
869 Value::Binary(bytes.into())
870 }
871}
872
873impl From<&[u8]> for Value {
874 fn from(bytes: &[u8]) -> Value {
875 Value::Binary(bytes.into())
876 }
877}
878
879impl From<()> for Value {
880 fn from(_: ()) -> Self {
881 Value::Null
882 }
883}
884
885impl TryFrom<Value> for serde_json::Value {
886 type Error = serde_json::Error;
887
888 fn try_from(value: Value) -> serde_json::Result<serde_json::Value> {
889 let json_value = match value {
890 Value::Null => serde_json::Value::Null,
891 Value::Boolean(v) => serde_json::Value::Bool(v),
892 Value::UInt8(v) => serde_json::Value::from(v),
893 Value::UInt16(v) => serde_json::Value::from(v),
894 Value::UInt32(v) => serde_json::Value::from(v),
895 Value::UInt64(v) => serde_json::Value::from(v),
896 Value::Int8(v) => serde_json::Value::from(v),
897 Value::Int16(v) => serde_json::Value::from(v),
898 Value::Int32(v) => serde_json::Value::from(v),
899 Value::Int64(v) => serde_json::Value::from(v),
900 Value::Float32(v) => serde_json::Value::from(v.0),
901 Value::Float64(v) => serde_json::Value::from(v.0),
902 Value::String(bytes) => serde_json::Value::String(bytes.into_string()),
903 Value::Binary(bytes) => serde_json::to_value(bytes)?,
904 Value::Date(v) => serde_json::Value::Number(v.val().into()),
905 Value::List(v) => {
906 let items = v
907 .take_items()
908 .into_iter()
909 .map(serde_json::Value::try_from)
910 .collect::<serde_json::Result<Vec<_>>>()?;
911 serde_json::Value::Array(items)
912 }
913 Value::Timestamp(v) => serde_json::to_value(v.value())?,
914 Value::Time(v) => serde_json::to_value(v.value())?,
915 Value::IntervalYearMonth(v) => serde_json::to_value(v.to_i32())?,
916 Value::IntervalDayTime(v) => serde_json::to_value(v.to_i64())?,
917 Value::IntervalMonthDayNano(v) => serde_json::to_value(v.to_i128())?,
918 Value::Duration(v) => serde_json::to_value(v.value())?,
919 Value::Decimal128(v) => serde_json::to_value(v.to_string())?,
920 Value::Struct(v) => {
921 let (items, struct_type) = v.into_parts();
922 let map = struct_type
923 .fields()
924 .iter()
925 .zip(items.into_iter())
926 .map(|(field, value)| {
927 Ok((
928 field.name().to_string(),
929 serde_json::Value::try_from(value)?,
930 ))
931 })
932 .collect::<serde_json::Result<Map<String, serde_json::Value>>>()?;
933 serde_json::Value::Object(map)
934 }
935 Value::Json(v) => (*v).into(),
936 };
937
938 Ok(json_value)
939 }
940}
941
942#[derive(Debug, Clone, PartialEq, Hash, Serialize, Deserialize)]
945pub struct ListValue {
946 items: Vec<Value>,
947 datatype: Arc<ConcreteDataType>,
950}
951
952impl Eq for ListValue {}
953
954impl ListValue {
955 pub fn new(items: Vec<Value>, datatype: Arc<ConcreteDataType>) -> Self {
956 Self { items, datatype }
957 }
958
959 pub fn items(&self) -> &[Value] {
960 &self.items
961 }
962
963 pub fn take_items(self) -> Vec<Value> {
964 self.items
965 }
966
967 pub fn into_parts(self) -> (Vec<Value>, Arc<ConcreteDataType>) {
968 (self.items, self.datatype)
969 }
970
971 pub fn datatype(&self) -> Arc<ConcreteDataType> {
973 self.datatype.clone()
974 }
975
976 pub fn len(&self) -> usize {
977 self.items.len()
978 }
979
980 pub fn is_empty(&self) -> bool {
981 self.items.is_empty()
982 }
983
984 pub fn try_to_scalar_value(&self, output_type: &ListType) -> Result<ScalarValue> {
985 let vs = self
986 .items
987 .iter()
988 .map(|v| v.try_to_scalar_value(output_type.item_type()))
989 .collect::<Result<Vec<_>>>()?;
990 Ok(ScalarValue::List(ScalarValue::new_list(
991 &vs,
992 &self.datatype.as_arrow_type(),
993 true,
994 )))
995 }
996
997 fn estimated_size(&self) -> usize {
1000 self.items
1001 .first()
1002 .map(|x| x.as_value_ref().data_size() * self.items.len())
1003 .unwrap_or(0)
1004 + std::mem::size_of::<Arc<ConcreteDataType>>()
1005 }
1006}
1007
1008impl Default for ListValue {
1009 fn default() -> ListValue {
1010 ListValue::new(vec![], Arc::new(ConcreteDataType::null_datatype()))
1011 }
1012}
1013
1014impl PartialOrd for ListValue {
1015 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1016 Some(self.cmp(other))
1017 }
1018}
1019
1020impl Ord for ListValue {
1021 fn cmp(&self, other: &Self) -> Ordering {
1022 assert_eq!(
1023 self.datatype, other.datatype,
1024 "Cannot compare different datatypes!"
1025 );
1026 self.items.cmp(&other.items)
1027 }
1028}
1029
1030#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
1031pub struct StructValue {
1032 items: Vec<Value>,
1033 fields: StructType,
1034}
1035
1036impl StructValue {
1037 pub fn try_new(items: Vec<Value>, fields: StructType) -> Result<Self> {
1038 ensure!(
1039 items.len() == fields.fields().len(),
1040 InconsistentStructFieldsAndItemsSnafu {
1041 field_len: fields.fields().len(),
1042 item_len: items.len()
1043 }
1044 );
1045 Ok(Self { items, fields })
1046 }
1047
1048 pub fn new(items: Vec<Value>, fields: StructType) -> Self {
1052 Self::try_new(items, fields).unwrap()
1053 }
1054
1055 pub fn items(&self) -> &[Value] {
1056 &self.items
1057 }
1058
1059 pub fn take_items(self) -> Vec<Value> {
1060 self.items
1061 }
1062
1063 pub fn into_parts(self) -> (Vec<Value>, StructType) {
1064 (self.items, self.fields)
1065 }
1066
1067 pub fn struct_type(&self) -> &StructType {
1068 &self.fields
1069 }
1070
1071 pub fn len(&self) -> usize {
1072 self.items.len()
1073 }
1074
1075 pub fn is_empty(&self) -> bool {
1076 self.items.is_empty()
1077 }
1078
1079 fn estimated_size(&self) -> usize {
1080 self.items
1081 .iter()
1082 .map(|x| x.as_value_ref().data_size())
1083 .sum::<usize>()
1084 + std::mem::size_of::<StructType>()
1085 }
1086
1087 fn try_to_scalar_value(&self, output_type: &StructType) -> Result<ScalarValue> {
1088 let arrays = self
1089 .items
1090 .iter()
1091 .map(|value| {
1092 let scalar_value = value.try_to_scalar_value(&value.data_type())?;
1093 scalar_value
1094 .to_array()
1095 .context(ConvertScalarToArrowArraySnafu)
1096 })
1097 .collect::<Result<Vec<Arc<dyn Array>>>>()?;
1098
1099 let fields = output_type.as_arrow_fields();
1100 let struct_array = StructArray::new(fields, arrays, None);
1101 Ok(ScalarValue::Struct(Arc::new(struct_array)))
1102 }
1103}
1104
1105impl Default for StructValue {
1106 fn default() -> StructValue {
1107 StructValue::try_new(vec![], StructType::new(Arc::new(vec![]))).unwrap()
1108 }
1109}
1110
1111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1114pub struct DictionaryValue {
1115 key_type: ConcreteDataType,
1117 value_type: ConcreteDataType,
1118}
1119
1120impl Eq for DictionaryValue {}
1121
1122impl TryFrom<ScalarValue> for Value {
1123 type Error = error::Error;
1124
1125 fn try_from(v: ScalarValue) -> Result<Self> {
1126 let v = match v {
1127 ScalarValue::Null => Value::Null,
1128 ScalarValue::Boolean(b) => Value::from(b),
1129 ScalarValue::Float32(f) => Value::from(f),
1130 ScalarValue::Float64(f) => Value::from(f),
1131 ScalarValue::Int8(i) => Value::from(i),
1132 ScalarValue::Int16(i) => Value::from(i),
1133 ScalarValue::Int32(i) => Value::from(i),
1134 ScalarValue::Int64(i) => Value::from(i),
1135 ScalarValue::UInt8(u) => Value::from(u),
1136 ScalarValue::UInt16(u) => Value::from(u),
1137 ScalarValue::UInt32(u) => Value::from(u),
1138 ScalarValue::UInt64(u) => Value::from(u),
1139 ScalarValue::Utf8(s) | ScalarValue::LargeUtf8(s) => {
1140 Value::from(s.map(StringBytes::from))
1141 }
1142 ScalarValue::Binary(b)
1143 | ScalarValue::LargeBinary(b)
1144 | ScalarValue::FixedSizeBinary(_, b) => Value::from(b.map(Bytes::from)),
1145 ScalarValue::List(array) => {
1146 let datatype = ConcreteDataType::try_from(&array.value_type())?;
1148 let scalar_values = ScalarValue::convert_array_to_scalar_vec(array.as_ref())
1149 .context(ConvertArrowArrayToScalarsSnafu)?;
1150 let items = scalar_values
1151 .into_iter()
1152 .flat_map(|v| v.unwrap_or_else(|| vec![ScalarValue::Null]))
1153 .map(|x| x.try_into())
1154 .collect::<Result<Vec<Value>>>()?;
1155 Value::List(ListValue::new(items, Arc::new(datatype)))
1156 }
1157 ScalarValue::Date32(d) => d.map(|x| Value::Date(Date::new(x))).unwrap_or(Value::Null),
1158 ScalarValue::TimestampSecond(t, _) => t
1159 .map(|x| Value::Timestamp(Timestamp::new(x, TimeUnit::Second)))
1160 .unwrap_or(Value::Null),
1161 ScalarValue::TimestampMillisecond(t, _) => t
1162 .map(|x| Value::Timestamp(Timestamp::new(x, TimeUnit::Millisecond)))
1163 .unwrap_or(Value::Null),
1164 ScalarValue::TimestampMicrosecond(t, _) => t
1165 .map(|x| Value::Timestamp(Timestamp::new(x, TimeUnit::Microsecond)))
1166 .unwrap_or(Value::Null),
1167 ScalarValue::TimestampNanosecond(t, _) => t
1168 .map(|x| Value::Timestamp(Timestamp::new(x, TimeUnit::Nanosecond)))
1169 .unwrap_or(Value::Null),
1170 ScalarValue::Time32Second(t) => t
1171 .map(|x| Value::Time(Time::new(x as i64, TimeUnit::Second)))
1172 .unwrap_or(Value::Null),
1173 ScalarValue::Time32Millisecond(t) => t
1174 .map(|x| Value::Time(Time::new(x as i64, TimeUnit::Millisecond)))
1175 .unwrap_or(Value::Null),
1176 ScalarValue::Time64Microsecond(t) => t
1177 .map(|x| Value::Time(Time::new(x, TimeUnit::Microsecond)))
1178 .unwrap_or(Value::Null),
1179 ScalarValue::Time64Nanosecond(t) => t
1180 .map(|x| Value::Time(Time::new(x, TimeUnit::Nanosecond)))
1181 .unwrap_or(Value::Null),
1182
1183 ScalarValue::IntervalYearMonth(t) => t
1184 .map(|x| Value::IntervalYearMonth(IntervalYearMonth::from_i32(x)))
1185 .unwrap_or(Value::Null),
1186 ScalarValue::IntervalDayTime(t) => t
1187 .map(|x| Value::IntervalDayTime(IntervalDayTime::from(x)))
1188 .unwrap_or(Value::Null),
1189 ScalarValue::IntervalMonthDayNano(t) => t
1190 .map(|x| Value::IntervalMonthDayNano(IntervalMonthDayNano::from(x)))
1191 .unwrap_or(Value::Null),
1192 ScalarValue::DurationSecond(d) => d
1193 .map(|x| Value::Duration(Duration::new(x, TimeUnit::Second)))
1194 .unwrap_or(Value::Null),
1195 ScalarValue::DurationMillisecond(d) => d
1196 .map(|x| Value::Duration(Duration::new(x, TimeUnit::Millisecond)))
1197 .unwrap_or(Value::Null),
1198 ScalarValue::DurationMicrosecond(d) => d
1199 .map(|x| Value::Duration(Duration::new(x, TimeUnit::Microsecond)))
1200 .unwrap_or(Value::Null),
1201 ScalarValue::DurationNanosecond(d) => d
1202 .map(|x| Value::Duration(Duration::new(x, TimeUnit::Nanosecond)))
1203 .unwrap_or(Value::Null),
1204 ScalarValue::Decimal128(v, p, s) => v
1205 .map(|v| Value::Decimal128(Decimal128::new(v, p, s)))
1206 .unwrap_or(Value::Null),
1207 ScalarValue::Struct(struct_array) => {
1208 let struct_type: StructType = (struct_array.fields()).try_into()?;
1209 let items = struct_array
1210 .columns()
1211 .iter()
1212 .map(|array| {
1213 let field_scalar_value = ScalarValue::try_from_array(array.as_ref(), 0)
1215 .context(ConvertArrowArrayToScalarsSnafu)?;
1216 field_scalar_value.try_into()
1217 })
1218 .collect::<Result<Vec<Value>>>()?;
1219 Value::Struct(StructValue::try_new(items, struct_type)?)
1220 }
1221 ScalarValue::Decimal32(_, _, _)
1222 | ScalarValue::Decimal64(_, _, _)
1223 | ScalarValue::Decimal256(_, _, _)
1224 | ScalarValue::FixedSizeList(_)
1225 | ScalarValue::LargeList(_)
1226 | ScalarValue::Dictionary(_, _)
1227 | ScalarValue::Union(_, _, _)
1228 | ScalarValue::Float16(_)
1229 | ScalarValue::Utf8View(_)
1230 | ScalarValue::BinaryView(_)
1231 | ScalarValue::Map(_)
1232 | ScalarValue::Date64(_) => {
1233 return error::UnsupportedArrowTypeSnafu {
1234 arrow_type: v.data_type(),
1235 }
1236 .fail();
1237 }
1238 };
1239 Ok(v)
1240 }
1241}
1242
1243impl From<ValueRef<'_>> for Value {
1244 fn from(value: ValueRef<'_>) -> Self {
1245 match value {
1246 ValueRef::Null => Value::Null,
1247 ValueRef::Boolean(v) => Value::Boolean(v),
1248 ValueRef::UInt8(v) => Value::UInt8(v),
1249 ValueRef::UInt16(v) => Value::UInt16(v),
1250 ValueRef::UInt32(v) => Value::UInt32(v),
1251 ValueRef::UInt64(v) => Value::UInt64(v),
1252 ValueRef::Int8(v) => Value::Int8(v),
1253 ValueRef::Int16(v) => Value::Int16(v),
1254 ValueRef::Int32(v) => Value::Int32(v),
1255 ValueRef::Int64(v) => Value::Int64(v),
1256 ValueRef::Float32(v) => Value::Float32(v),
1257 ValueRef::Float64(v) => Value::Float64(v),
1258 ValueRef::String(v) => Value::String(v.into()),
1259 ValueRef::Binary(v) => Value::Binary(v.into()),
1260 ValueRef::Date(v) => Value::Date(v),
1261 ValueRef::Timestamp(v) => Value::Timestamp(v),
1262 ValueRef::Time(v) => Value::Time(v),
1263 ValueRef::IntervalYearMonth(v) => Value::IntervalYearMonth(v),
1264 ValueRef::IntervalDayTime(v) => Value::IntervalDayTime(v),
1265 ValueRef::IntervalMonthDayNano(v) => Value::IntervalMonthDayNano(v),
1266 ValueRef::Duration(v) => Value::Duration(v),
1267 ValueRef::List(v) => v.to_value(),
1268 ValueRef::Decimal128(v) => Value::Decimal128(v),
1269 ValueRef::Struct(v) => v.to_value(),
1270 ValueRef::Json(v) => Value::Json(Box::new(JsonValue::from(*v))),
1271 }
1272 }
1273}
1274
1275#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
1277pub enum ValueRef<'a> {
1278 Null,
1279
1280 Boolean(bool),
1282 UInt8(u8),
1283 UInt16(u16),
1284 UInt32(u32),
1285 UInt64(u64),
1286 Int8(i8),
1287 Int16(i16),
1288 Int32(i32),
1289 Int64(i64),
1290 Float32(OrderedF32),
1291 Float64(OrderedF64),
1292
1293 Decimal128(Decimal128),
1295
1296 String(&'a str),
1298 Binary(&'a [u8]),
1299
1300 Date(Date),
1302 Timestamp(Timestamp),
1303 Time(Time),
1304 Duration(Duration),
1305 IntervalYearMonth(IntervalYearMonth),
1307 IntervalDayTime(IntervalDayTime),
1308 IntervalMonthDayNano(IntervalMonthDayNano),
1309
1310 List(ListValueRef<'a>),
1312 Struct(StructValueRef<'a>),
1313
1314 Json(Box<JsonValueRef<'a>>),
1315}
1316
1317macro_rules! impl_as_for_value_ref {
1318 ($value: ident, $Variant: ident) => {
1319 match $value {
1320 ValueRef::Null => Ok(None),
1321 ValueRef::$Variant(v) => Ok(Some(v.clone())),
1322 other => error::CastTypeSnafu {
1323 msg: format!(
1324 "Failed to cast value ref {:?} to {}",
1325 other,
1326 stringify!($Variant)
1327 ),
1328 }
1329 .fail(),
1330 }
1331 };
1332}
1333
1334impl<'a> ValueRef<'a> {
1335 define_data_type_func!(ValueRef);
1336
1337 pub fn is_null(&self) -> bool {
1339 match self {
1340 ValueRef::Null => true,
1341 ValueRef::Json(v) => v.is_null(),
1342 _ => false,
1343 }
1344 }
1345
1346 pub fn try_into_binary(&self) -> Result<Option<&'a [u8]>> {
1348 impl_as_for_value_ref!(self, Binary)
1349 }
1350
1351 pub fn try_into_string(&self) -> Result<Option<&'a str>> {
1353 impl_as_for_value_ref!(self, String)
1354 }
1355
1356 pub fn try_into_boolean(&self) -> Result<Option<bool>> {
1358 impl_as_for_value_ref!(self, Boolean)
1359 }
1360
1361 pub fn try_into_i8(&self) -> Result<Option<i8>> {
1362 impl_as_for_value_ref!(self, Int8)
1363 }
1364
1365 pub fn try_into_u8(&self) -> Result<Option<u8>> {
1366 impl_as_for_value_ref!(self, UInt8)
1367 }
1368
1369 pub fn try_into_i16(&self) -> Result<Option<i16>> {
1370 impl_as_for_value_ref!(self, Int16)
1371 }
1372
1373 pub fn try_into_u16(&self) -> Result<Option<u16>> {
1374 impl_as_for_value_ref!(self, UInt16)
1375 }
1376
1377 pub fn try_into_i32(&self) -> Result<Option<i32>> {
1378 impl_as_for_value_ref!(self, Int32)
1379 }
1380
1381 pub fn try_into_u32(&self) -> Result<Option<u32>> {
1382 impl_as_for_value_ref!(self, UInt32)
1383 }
1384
1385 pub fn try_into_i64(&self) -> Result<Option<i64>> {
1386 impl_as_for_value_ref!(self, Int64)
1387 }
1388
1389 pub fn try_into_u64(&self) -> Result<Option<u64>> {
1390 impl_as_for_value_ref!(self, UInt64)
1391 }
1392
1393 pub fn try_into_f32(&self) -> Result<Option<f32>> {
1394 match self {
1395 ValueRef::Null => Ok(None),
1396 ValueRef::Float32(f) => Ok(Some(f.0)),
1397 ValueRef::Json(v) => Ok(v.as_f32()),
1398 other => error::CastTypeSnafu {
1399 msg: format!("Failed to cast value ref {:?} to ValueRef::Float32", other,),
1400 }
1401 .fail(),
1402 }
1403 }
1404
1405 pub fn try_into_f64(&self) -> Result<Option<f64>> {
1406 match self {
1407 ValueRef::Null => Ok(None),
1408 ValueRef::Float64(f) => Ok(Some(f.0)),
1409 ValueRef::Json(v) => Ok(v.as_f64()),
1410 other => error::CastTypeSnafu {
1411 msg: format!("Failed to cast value ref {:?} to ValueRef::Float64", other,),
1412 }
1413 .fail(),
1414 }
1415 }
1416
1417 pub fn try_into_date(&self) -> Result<Option<Date>> {
1419 impl_as_for_value_ref!(self, Date)
1420 }
1421
1422 pub fn try_into_timestamp(&self) -> Result<Option<Timestamp>> {
1424 impl_as_for_value_ref!(self, Timestamp)
1425 }
1426
1427 pub fn try_into_time(&self) -> Result<Option<Time>> {
1429 impl_as_for_value_ref!(self, Time)
1430 }
1431
1432 pub fn try_into_duration(&self) -> Result<Option<Duration>> {
1433 impl_as_for_value_ref!(self, Duration)
1434 }
1435
1436 pub fn try_into_interval_year_month(&self) -> Result<Option<IntervalYearMonth>> {
1438 impl_as_for_value_ref!(self, IntervalYearMonth)
1439 }
1440
1441 pub fn try_into_interval_day_time(&self) -> Result<Option<IntervalDayTime>> {
1443 impl_as_for_value_ref!(self, IntervalDayTime)
1444 }
1445
1446 pub fn try_into_interval_month_day_nano(&self) -> Result<Option<IntervalMonthDayNano>> {
1448 impl_as_for_value_ref!(self, IntervalMonthDayNano)
1449 }
1450
1451 pub fn try_into_list(&self) -> Result<Option<ListValueRef<'_>>> {
1453 impl_as_for_value_ref!(self, List)
1454 }
1455
1456 pub fn try_into_struct(&self) -> Result<Option<StructValueRef<'_>>> {
1458 impl_as_for_value_ref!(self, Struct)
1459 }
1460
1461 pub fn try_into_decimal128(&self) -> Result<Option<Decimal128>> {
1463 impl_as_for_value_ref!(self, Decimal128)
1464 }
1465}
1466
1467impl PartialOrd for ValueRef<'_> {
1468 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1469 Some(self.cmp(other))
1470 }
1471}
1472
1473impl Ord for ValueRef<'_> {
1474 fn cmp(&self, other: &Self) -> Ordering {
1475 impl_ord_for_value_like!(ValueRef, self, other)
1476 }
1477}
1478
1479macro_rules! impl_value_ref_from {
1480 ($Variant:ident, $Type:ident) => {
1481 impl From<$Type> for ValueRef<'_> {
1482 fn from(value: $Type) -> Self {
1483 ValueRef::$Variant(value.into())
1484 }
1485 }
1486
1487 impl From<Option<$Type>> for ValueRef<'_> {
1488 fn from(value: Option<$Type>) -> Self {
1489 match value {
1490 Some(v) => ValueRef::$Variant(v.into()),
1491 None => ValueRef::Null,
1492 }
1493 }
1494 }
1495 };
1496}
1497
1498impl_value_ref_from!(Boolean, bool);
1499impl_value_ref_from!(UInt8, u8);
1500impl_value_ref_from!(UInt16, u16);
1501impl_value_ref_from!(UInt32, u32);
1502impl_value_ref_from!(UInt64, u64);
1503impl_value_ref_from!(Int8, i8);
1504impl_value_ref_from!(Int16, i16);
1505impl_value_ref_from!(Int32, i32);
1506impl_value_ref_from!(Int64, i64);
1507impl_value_ref_from!(Float32, f32);
1508impl_value_ref_from!(Float64, f64);
1509impl_value_ref_from!(Date, Date);
1510impl_value_ref_from!(Timestamp, Timestamp);
1511impl_value_ref_from!(Time, Time);
1512impl_value_ref_from!(IntervalYearMonth, IntervalYearMonth);
1513impl_value_ref_from!(IntervalDayTime, IntervalDayTime);
1514impl_value_ref_from!(IntervalMonthDayNano, IntervalMonthDayNano);
1515impl_value_ref_from!(Duration, Duration);
1516impl_value_ref_from!(Decimal128, Decimal128);
1517
1518impl<'a> From<&'a str> for ValueRef<'a> {
1519 fn from(string: &'a str) -> ValueRef<'a> {
1520 ValueRef::String(string)
1521 }
1522}
1523
1524impl<'a> From<&'a [u8]> for ValueRef<'a> {
1525 fn from(bytes: &'a [u8]) -> ValueRef<'a> {
1526 ValueRef::Binary(bytes)
1527 }
1528}
1529
1530impl<'a> From<Option<ListValueRef<'a>>> for ValueRef<'a> {
1531 fn from(list: Option<ListValueRef>) -> ValueRef {
1532 match list {
1533 Some(v) => ValueRef::List(v),
1534 None => ValueRef::Null,
1535 }
1536 }
1537}
1538
1539#[derive(Debug, Clone)]
1545pub enum ListValueRef<'a> {
1546 Indexed {
1548 vector: &'a ListVector,
1549 idx: usize,
1550 },
1551 Ref {
1552 val: &'a ListValue,
1553 },
1554 RefList {
1555 val: Vec<ValueRef<'a>>,
1556 item_datatype: Arc<ConcreteDataType>,
1557 },
1558}
1559
1560impl ListValueRef<'_> {
1561 fn to_value(&self) -> Value {
1563 match self {
1564 ListValueRef::Indexed { vector, idx } => vector.get(*idx),
1565 ListValueRef::Ref { val } => Value::List((*val).clone()),
1566 ListValueRef::RefList { val, item_datatype } => Value::List(ListValue::new(
1567 val.iter().map(|v| Value::from(v.clone())).collect(),
1568 item_datatype.clone(),
1569 )),
1570 }
1571 }
1572 fn datatype(&self) -> Arc<ConcreteDataType> {
1574 match self {
1575 ListValueRef::Indexed { vector, .. } => vector.item_type(),
1576 ListValueRef::Ref { val } => val.datatype().clone(),
1577 ListValueRef::RefList { item_datatype, .. } => item_datatype.clone(),
1578 }
1579 }
1580}
1581
1582impl Serialize for ListValueRef<'_> {
1583 fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
1584 match self {
1585 ListValueRef::Indexed { vector, idx } => match vector.get(*idx) {
1586 Value::List(v) => v.serialize(serializer),
1587 _ => unreachable!(),
1588 },
1589 ListValueRef::Ref { val } => val.serialize(serializer),
1590 ListValueRef::RefList { val, .. } => val.serialize(serializer),
1591 }
1592 }
1593}
1594
1595impl PartialEq for ListValueRef<'_> {
1596 fn eq(&self, other: &Self) -> bool {
1597 self.to_value().eq(&other.to_value())
1598 }
1599}
1600
1601impl Eq for ListValueRef<'_> {}
1602
1603impl Ord for ListValueRef<'_> {
1604 fn cmp(&self, other: &Self) -> Ordering {
1605 self.to_value().cmp(&other.to_value())
1607 }
1608}
1609
1610impl PartialOrd for ListValueRef<'_> {
1611 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1612 Some(self.cmp(other))
1613 }
1614}
1615
1616#[derive(Debug, Clone)]
1617pub enum StructValueRef<'a> {
1618 Indexed {
1619 vector: &'a StructVector,
1620 idx: usize,
1621 },
1622 Ref(&'a StructValue),
1623 RefList {
1624 val: Vec<ValueRef<'a>>,
1625 fields: StructType,
1626 },
1627}
1628
1629impl<'a> StructValueRef<'a> {
1630 pub fn to_value(&self) -> Value {
1631 match self {
1632 StructValueRef::Indexed { vector, idx } => vector.get(*idx),
1633 StructValueRef::Ref(val) => Value::Struct((*val).clone()),
1634 StructValueRef::RefList { val, fields } => {
1635 let items = val.iter().map(|v| Value::from(v.clone())).collect();
1636 Value::Struct(StructValue::try_new(items, fields.clone()).unwrap())
1637 }
1638 }
1639 }
1640
1641 pub fn struct_type(&self) -> &StructType {
1642 match self {
1643 StructValueRef::Indexed { vector, .. } => vector.struct_type(),
1644 StructValueRef::Ref(val) => val.struct_type(),
1645 StructValueRef::RefList { fields, .. } => fields,
1646 }
1647 }
1648}
1649
1650impl Serialize for StructValueRef<'_> {
1651 fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
1652 match self {
1653 StructValueRef::Indexed { vector, idx } => match vector.get(*idx) {
1654 Value::Struct(v) => v.serialize(serializer),
1655 _ => unreachable!(),
1656 },
1657 StructValueRef::Ref(val) => val.serialize(serializer),
1658 StructValueRef::RefList { val, .. } => val.serialize(serializer),
1659 }
1660 }
1661}
1662
1663impl PartialEq for StructValueRef<'_> {
1664 fn eq(&self, other: &Self) -> bool {
1665 self.to_value().eq(&other.to_value())
1666 }
1667}
1668
1669impl Eq for StructValueRef<'_> {}
1670
1671impl Ord for StructValueRef<'_> {
1672 fn cmp(&self, other: &Self) -> Ordering {
1673 self.to_value().cmp(&other.to_value())
1675 }
1676}
1677
1678impl PartialOrd for StructValueRef<'_> {
1679 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1680 Some(self.cmp(other))
1681 }
1682}
1683
1684impl ValueRef<'_> {
1685 pub fn data_size(&self) -> usize {
1688 match self {
1689 ValueRef::Null => 8,
1692 ValueRef::Boolean(_) => 1,
1693 ValueRef::UInt8(_) => 1,
1694 ValueRef::UInt16(_) => 2,
1695 ValueRef::UInt32(_) => 4,
1696 ValueRef::UInt64(_) => 8,
1697 ValueRef::Int8(_) => 1,
1698 ValueRef::Int16(_) => 2,
1699 ValueRef::Int32(_) => 4,
1700 ValueRef::Int64(_) => 8,
1701 ValueRef::Float32(_) => 4,
1702 ValueRef::Float64(_) => 8,
1703 ValueRef::String(v) => std::mem::size_of_val(*v),
1704 ValueRef::Binary(v) => std::mem::size_of_val(*v),
1705 ValueRef::Date(_) => 4,
1706 ValueRef::Timestamp(_) => 16,
1707 ValueRef::Time(_) => 16,
1708 ValueRef::Duration(_) => 16,
1709 ValueRef::IntervalYearMonth(_) => 4,
1710 ValueRef::IntervalDayTime(_) => 8,
1711 ValueRef::IntervalMonthDayNano(_) => 16,
1712 ValueRef::Decimal128(_) => 32,
1713 ValueRef::List(v) => match v {
1714 ListValueRef::Indexed { vector, .. } => vector.memory_size() / vector.len(),
1715 ListValueRef::Ref { val } => val.estimated_size(),
1716 ListValueRef::RefList { val, .. } => {
1717 val.iter().map(|v| v.data_size()).sum::<usize>()
1718 + std::mem::size_of::<Arc<ConcreteDataType>>()
1719 }
1720 },
1721 ValueRef::Struct(val) => match val {
1722 StructValueRef::Indexed { vector, .. } => vector.memory_size() / vector.len(),
1723 StructValueRef::Ref(val) => val.estimated_size(),
1724 StructValueRef::RefList { val, .. } => {
1725 val.iter().map(|v| v.data_size()).sum::<usize>()
1726 + std::mem::size_of::<StructType>()
1727 }
1728 },
1729 ValueRef::Json(v) => v.data_size(),
1730 }
1731 }
1732}
1733
1734#[cfg(test)]
1735pub(crate) mod tests {
1736 use arrow::datatypes::{DataType as ArrowDataType, Field};
1737 use common_time::timezone::set_default_timezone;
1738 use num_traits::Float;
1739
1740 use super::*;
1741 use crate::json::value::{JsonVariant, JsonVariantRef};
1742 use crate::types::StructField;
1743 use crate::vectors::ListVectorBuilder;
1744
1745 pub(crate) fn build_struct_type() -> StructType {
1746 StructType::new(Arc::new(vec![
1747 StructField::new("id".to_string(), ConcreteDataType::int32_datatype(), false),
1748 StructField::new(
1749 "name".to_string(),
1750 ConcreteDataType::string_datatype(),
1751 true,
1752 ),
1753 StructField::new("age".to_string(), ConcreteDataType::uint8_datatype(), true),
1754 StructField::new(
1755 "address".to_string(),
1756 ConcreteDataType::string_datatype(),
1757 true,
1758 ),
1759 StructField::new(
1760 "awards".to_string(),
1761 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::boolean_datatype())),
1762 true,
1763 ),
1764 ]))
1765 }
1766
1767 pub(crate) fn build_struct_value() -> StructValue {
1768 let struct_type = build_struct_type();
1769
1770 let struct_items = vec![
1771 Value::Int32(1),
1772 Value::String("tom".into()),
1773 Value::UInt8(25),
1774 Value::String("94038".into()),
1775 Value::List(build_list_value()),
1776 ];
1777 StructValue::try_new(struct_items, struct_type).unwrap()
1778 }
1779
1780 pub(crate) fn build_scalar_struct_value() -> ScalarValue {
1781 let struct_type = build_struct_type();
1782 let arrays = vec![
1783 ScalarValue::Int32(Some(1)).to_array().unwrap(),
1784 ScalarValue::Utf8(Some("tom".into())).to_array().unwrap(),
1785 ScalarValue::UInt8(Some(25)).to_array().unwrap(),
1786 ScalarValue::Utf8(Some("94038".into())).to_array().unwrap(),
1787 build_scalar_list_value().to_array().unwrap(),
1788 ];
1789 let struct_arrow_array = StructArray::new(struct_type.as_arrow_fields(), arrays, None);
1790 ScalarValue::Struct(Arc::new(struct_arrow_array))
1791 }
1792
1793 pub fn build_list_type() -> ConcreteDataType {
1794 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::boolean_datatype()))
1795 }
1796
1797 pub(crate) fn build_list_value() -> ListValue {
1798 let items = vec![Value::Boolean(true), Value::Boolean(false)];
1799 ListValue::new(items, Arc::new(ConcreteDataType::boolean_datatype()))
1800 }
1801
1802 pub(crate) fn build_scalar_list_value() -> ScalarValue {
1803 let items = vec![
1804 ScalarValue::Boolean(Some(true)),
1805 ScalarValue::Boolean(Some(false)),
1806 ];
1807 ScalarValue::List(ScalarValue::new_list(&items, &ArrowDataType::Boolean, true))
1808 }
1809
1810 #[test]
1811 fn test_try_from_scalar_value() {
1812 assert_eq!(
1813 Value::Boolean(true),
1814 ScalarValue::Boolean(Some(true)).try_into().unwrap()
1815 );
1816 assert_eq!(
1817 Value::Boolean(false),
1818 ScalarValue::Boolean(Some(false)).try_into().unwrap()
1819 );
1820 assert_eq!(Value::Null, ScalarValue::Boolean(None).try_into().unwrap());
1821
1822 assert_eq!(
1823 Value::Float32(1.0f32.into()),
1824 ScalarValue::Float32(Some(1.0f32)).try_into().unwrap()
1825 );
1826 assert_eq!(Value::Null, ScalarValue::Float32(None).try_into().unwrap());
1827
1828 assert_eq!(
1829 Value::Float64(2.0f64.into()),
1830 ScalarValue::Float64(Some(2.0f64)).try_into().unwrap()
1831 );
1832 assert_eq!(Value::Null, ScalarValue::Float64(None).try_into().unwrap());
1833
1834 assert_eq!(
1835 Value::Int8(i8::MAX),
1836 ScalarValue::Int8(Some(i8::MAX)).try_into().unwrap()
1837 );
1838 assert_eq!(Value::Null, ScalarValue::Int8(None).try_into().unwrap());
1839
1840 assert_eq!(
1841 Value::Int16(i16::MAX),
1842 ScalarValue::Int16(Some(i16::MAX)).try_into().unwrap()
1843 );
1844 assert_eq!(Value::Null, ScalarValue::Int16(None).try_into().unwrap());
1845
1846 assert_eq!(
1847 Value::Int32(i32::MAX),
1848 ScalarValue::Int32(Some(i32::MAX)).try_into().unwrap()
1849 );
1850 assert_eq!(Value::Null, ScalarValue::Int32(None).try_into().unwrap());
1851
1852 assert_eq!(
1853 Value::Int64(i64::MAX),
1854 ScalarValue::Int64(Some(i64::MAX)).try_into().unwrap()
1855 );
1856 assert_eq!(Value::Null, ScalarValue::Int64(None).try_into().unwrap());
1857
1858 assert_eq!(
1859 Value::UInt8(u8::MAX),
1860 ScalarValue::UInt8(Some(u8::MAX)).try_into().unwrap()
1861 );
1862 assert_eq!(Value::Null, ScalarValue::UInt8(None).try_into().unwrap());
1863
1864 assert_eq!(
1865 Value::UInt16(u16::MAX),
1866 ScalarValue::UInt16(Some(u16::MAX)).try_into().unwrap()
1867 );
1868 assert_eq!(Value::Null, ScalarValue::UInt16(None).try_into().unwrap());
1869
1870 assert_eq!(
1871 Value::UInt32(u32::MAX),
1872 ScalarValue::UInt32(Some(u32::MAX)).try_into().unwrap()
1873 );
1874 assert_eq!(Value::Null, ScalarValue::UInt32(None).try_into().unwrap());
1875
1876 assert_eq!(
1877 Value::UInt64(u64::MAX),
1878 ScalarValue::UInt64(Some(u64::MAX)).try_into().unwrap()
1879 );
1880 assert_eq!(Value::Null, ScalarValue::UInt64(None).try_into().unwrap());
1881
1882 assert_eq!(
1883 Value::from("hello"),
1884 ScalarValue::Utf8(Some("hello".to_string()))
1885 .try_into()
1886 .unwrap()
1887 );
1888 assert_eq!(Value::Null, ScalarValue::Utf8(None).try_into().unwrap());
1889
1890 assert_eq!(
1891 Value::from("large_hello"),
1892 ScalarValue::LargeUtf8(Some("large_hello".to_string()))
1893 .try_into()
1894 .unwrap()
1895 );
1896 assert_eq!(
1897 Value::Null,
1898 ScalarValue::LargeUtf8(None).try_into().unwrap()
1899 );
1900
1901 assert_eq!(
1902 Value::from("world".as_bytes()),
1903 ScalarValue::Binary(Some("world".as_bytes().to_vec()))
1904 .try_into()
1905 .unwrap()
1906 );
1907 assert_eq!(Value::Null, ScalarValue::Binary(None).try_into().unwrap());
1908
1909 assert_eq!(
1910 Value::from("large_world".as_bytes()),
1911 ScalarValue::LargeBinary(Some("large_world".as_bytes().to_vec()))
1912 .try_into()
1913 .unwrap()
1914 );
1915 assert_eq!(
1916 Value::Null,
1917 ScalarValue::LargeBinary(None).try_into().unwrap()
1918 );
1919
1920 assert_eq!(
1921 Value::List(build_list_value()),
1922 build_scalar_list_value().try_into().unwrap()
1923 );
1924 assert_eq!(
1925 Value::List(ListValue::new(
1926 vec![],
1927 Arc::new(ConcreteDataType::uint32_datatype())
1928 )),
1929 ScalarValue::List(ScalarValue::new_list(&[], &ArrowDataType::UInt32, true))
1930 .try_into()
1931 .unwrap()
1932 );
1933
1934 assert_eq!(
1935 Value::Date(Date::new(123)),
1936 ScalarValue::Date32(Some(123)).try_into().unwrap()
1937 );
1938 assert_eq!(Value::Null, ScalarValue::Date32(None).try_into().unwrap());
1939
1940 assert_eq!(
1941 Value::Timestamp(Timestamp::new(1, TimeUnit::Second)),
1942 ScalarValue::TimestampSecond(Some(1), None)
1943 .try_into()
1944 .unwrap()
1945 );
1946 assert_eq!(
1947 Value::Null,
1948 ScalarValue::TimestampSecond(None, None).try_into().unwrap()
1949 );
1950
1951 assert_eq!(
1952 Value::Timestamp(Timestamp::new(1, TimeUnit::Millisecond)),
1953 ScalarValue::TimestampMillisecond(Some(1), None)
1954 .try_into()
1955 .unwrap()
1956 );
1957 assert_eq!(
1958 Value::Null,
1959 ScalarValue::TimestampMillisecond(None, None)
1960 .try_into()
1961 .unwrap()
1962 );
1963
1964 assert_eq!(
1965 Value::Timestamp(Timestamp::new(1, TimeUnit::Microsecond)),
1966 ScalarValue::TimestampMicrosecond(Some(1), None)
1967 .try_into()
1968 .unwrap()
1969 );
1970 assert_eq!(
1971 Value::Null,
1972 ScalarValue::TimestampMicrosecond(None, None)
1973 .try_into()
1974 .unwrap()
1975 );
1976
1977 assert_eq!(
1978 Value::Timestamp(Timestamp::new(1, TimeUnit::Nanosecond)),
1979 ScalarValue::TimestampNanosecond(Some(1), None)
1980 .try_into()
1981 .unwrap()
1982 );
1983 assert_eq!(
1984 Value::Null,
1985 ScalarValue::TimestampNanosecond(None, None)
1986 .try_into()
1987 .unwrap()
1988 );
1989 assert_eq!(
1990 Value::Null,
1991 ScalarValue::IntervalMonthDayNano(None).try_into().unwrap()
1992 );
1993 assert_eq!(
1994 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 1, 1)),
1995 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::new(1, 1, 1).into()))
1996 .try_into()
1997 .unwrap()
1998 );
1999
2000 assert_eq!(
2001 Value::Time(Time::new(1, TimeUnit::Second)),
2002 ScalarValue::Time32Second(Some(1)).try_into().unwrap()
2003 );
2004 assert_eq!(
2005 Value::Null,
2006 ScalarValue::Time32Second(None).try_into().unwrap()
2007 );
2008
2009 assert_eq!(
2010 Value::Time(Time::new(1, TimeUnit::Millisecond)),
2011 ScalarValue::Time32Millisecond(Some(1)).try_into().unwrap()
2012 );
2013 assert_eq!(
2014 Value::Null,
2015 ScalarValue::Time32Millisecond(None).try_into().unwrap()
2016 );
2017
2018 assert_eq!(
2019 Value::Time(Time::new(1, TimeUnit::Microsecond)),
2020 ScalarValue::Time64Microsecond(Some(1)).try_into().unwrap()
2021 );
2022 assert_eq!(
2023 Value::Null,
2024 ScalarValue::Time64Microsecond(None).try_into().unwrap()
2025 );
2026
2027 assert_eq!(
2028 Value::Time(Time::new(1, TimeUnit::Nanosecond)),
2029 ScalarValue::Time64Nanosecond(Some(1)).try_into().unwrap()
2030 );
2031 assert_eq!(
2032 Value::Null,
2033 ScalarValue::Time64Nanosecond(None).try_into().unwrap()
2034 );
2035
2036 assert_eq!(
2037 Value::Duration(Duration::new_second(1)),
2038 ScalarValue::DurationSecond(Some(1)).try_into().unwrap()
2039 );
2040 assert_eq!(
2041 Value::Null,
2042 ScalarValue::DurationSecond(None).try_into().unwrap()
2043 );
2044
2045 assert_eq!(
2046 Value::Duration(Duration::new_millisecond(1)),
2047 ScalarValue::DurationMillisecond(Some(1))
2048 .try_into()
2049 .unwrap()
2050 );
2051 assert_eq!(
2052 Value::Null,
2053 ScalarValue::DurationMillisecond(None).try_into().unwrap()
2054 );
2055
2056 assert_eq!(
2057 Value::Duration(Duration::new_microsecond(1)),
2058 ScalarValue::DurationMicrosecond(Some(1))
2059 .try_into()
2060 .unwrap()
2061 );
2062 assert_eq!(
2063 Value::Null,
2064 ScalarValue::DurationMicrosecond(None).try_into().unwrap()
2065 );
2066
2067 assert_eq!(
2068 Value::Duration(Duration::new_nanosecond(1)),
2069 ScalarValue::DurationNanosecond(Some(1)).try_into().unwrap()
2070 );
2071 assert_eq!(
2072 Value::Null,
2073 ScalarValue::DurationNanosecond(None).try_into().unwrap()
2074 );
2075
2076 assert_eq!(
2077 Value::Decimal128(Decimal128::new(1, 38, 10)),
2078 ScalarValue::Decimal128(Some(1), 38, 10).try_into().unwrap()
2079 );
2080 assert_eq!(
2081 Value::Null,
2082 ScalarValue::Decimal128(None, 0, 0).try_into().unwrap()
2083 );
2084
2085 let struct_value = build_struct_value();
2086 let scalar_struct_value = build_scalar_struct_value();
2087 assert_eq!(
2088 Value::Struct(struct_value),
2089 scalar_struct_value.try_into().unwrap()
2090 );
2091 }
2092
2093 #[test]
2094 fn test_value_from_inner() {
2095 assert_eq!(Value::Boolean(true), Value::from(true));
2096 assert_eq!(Value::Boolean(false), Value::from(false));
2097
2098 assert_eq!(Value::UInt8(u8::MIN), Value::from(u8::MIN));
2099 assert_eq!(Value::UInt8(u8::MAX), Value::from(u8::MAX));
2100
2101 assert_eq!(Value::UInt16(u16::MIN), Value::from(u16::MIN));
2102 assert_eq!(Value::UInt16(u16::MAX), Value::from(u16::MAX));
2103
2104 assert_eq!(Value::UInt32(u32::MIN), Value::from(u32::MIN));
2105 assert_eq!(Value::UInt32(u32::MAX), Value::from(u32::MAX));
2106
2107 assert_eq!(Value::UInt64(u64::MIN), Value::from(u64::MIN));
2108 assert_eq!(Value::UInt64(u64::MAX), Value::from(u64::MAX));
2109
2110 assert_eq!(Value::Int8(i8::MIN), Value::from(i8::MIN));
2111 assert_eq!(Value::Int8(i8::MAX), Value::from(i8::MAX));
2112
2113 assert_eq!(Value::Int16(i16::MIN), Value::from(i16::MIN));
2114 assert_eq!(Value::Int16(i16::MAX), Value::from(i16::MAX));
2115
2116 assert_eq!(Value::Int32(i32::MIN), Value::from(i32::MIN));
2117 assert_eq!(Value::Int32(i32::MAX), Value::from(i32::MAX));
2118
2119 assert_eq!(Value::Int64(i64::MIN), Value::from(i64::MIN));
2120 assert_eq!(Value::Int64(i64::MAX), Value::from(i64::MAX));
2121
2122 assert_eq!(
2123 Value::Float32(OrderedFloat(f32::MIN)),
2124 Value::from(f32::MIN)
2125 );
2126 assert_eq!(
2127 Value::Float32(OrderedFloat(f32::MAX)),
2128 Value::from(f32::MAX)
2129 );
2130
2131 assert_eq!(
2132 Value::Float64(OrderedFloat(f64::MIN)),
2133 Value::from(f64::MIN)
2134 );
2135 assert_eq!(
2136 Value::Float64(OrderedFloat(f64::MAX)),
2137 Value::from(f64::MAX)
2138 );
2139
2140 let string_bytes = StringBytes::from("hello");
2141 assert_eq!(
2142 Value::String(string_bytes.clone()),
2143 Value::from(string_bytes)
2144 );
2145
2146 let bytes = Bytes::from(b"world".as_slice());
2147 assert_eq!(Value::Binary(bytes.clone()), Value::from(bytes));
2148 }
2149
2150 fn check_type_and_value(data_type: &ConcreteDataType, value: &Value) {
2151 assert_eq!(*data_type, value.data_type());
2152 assert_eq!(data_type.logical_type_id(), value.logical_type_id());
2153 }
2154
2155 #[test]
2156 fn test_value_datatype() {
2157 check_type_and_value(&ConcreteDataType::boolean_datatype(), &Value::Boolean(true));
2158 check_type_and_value(&ConcreteDataType::uint8_datatype(), &Value::UInt8(u8::MIN));
2159 check_type_and_value(
2160 &ConcreteDataType::uint16_datatype(),
2161 &Value::UInt16(u16::MIN),
2162 );
2163 check_type_and_value(
2164 &ConcreteDataType::uint16_datatype(),
2165 &Value::UInt16(u16::MAX),
2166 );
2167 check_type_and_value(
2168 &ConcreteDataType::uint32_datatype(),
2169 &Value::UInt32(u32::MIN),
2170 );
2171 check_type_and_value(
2172 &ConcreteDataType::uint64_datatype(),
2173 &Value::UInt64(u64::MIN),
2174 );
2175 check_type_and_value(&ConcreteDataType::int8_datatype(), &Value::Int8(i8::MIN));
2176 check_type_and_value(&ConcreteDataType::int16_datatype(), &Value::Int16(i16::MIN));
2177 check_type_and_value(&ConcreteDataType::int32_datatype(), &Value::Int32(i32::MIN));
2178 check_type_and_value(&ConcreteDataType::int64_datatype(), &Value::Int64(i64::MIN));
2179 check_type_and_value(
2180 &ConcreteDataType::float32_datatype(),
2181 &Value::Float32(OrderedFloat(f32::MIN)),
2182 );
2183 check_type_and_value(
2184 &ConcreteDataType::float64_datatype(),
2185 &Value::Float64(OrderedFloat(f64::MIN)),
2186 );
2187 check_type_and_value(
2188 &ConcreteDataType::string_datatype(),
2189 &Value::String(StringBytes::from("hello")),
2190 );
2191 check_type_and_value(
2192 &ConcreteDataType::binary_datatype(),
2193 &Value::Binary(Bytes::from(b"world".as_slice())),
2194 );
2195 let item_type = Arc::new(ConcreteDataType::int32_datatype());
2196 check_type_and_value(
2197 &ConcreteDataType::list_datatype(item_type.clone()),
2198 &Value::List(ListValue::new(vec![Value::Int32(10)], item_type.clone())),
2199 );
2200 check_type_and_value(
2201 &ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::null_datatype())),
2202 &Value::List(ListValue::default()),
2203 );
2204 check_type_and_value(
2205 &ConcreteDataType::date_datatype(),
2206 &Value::Date(Date::new(1)),
2207 );
2208 check_type_and_value(
2209 &ConcreteDataType::timestamp_millisecond_datatype(),
2210 &Value::Timestamp(Timestamp::new_millisecond(1)),
2211 );
2212 check_type_and_value(
2213 &ConcreteDataType::time_second_datatype(),
2214 &Value::Time(Time::new_second(1)),
2215 );
2216 check_type_and_value(
2217 &ConcreteDataType::time_millisecond_datatype(),
2218 &Value::Time(Time::new_millisecond(1)),
2219 );
2220 check_type_and_value(
2221 &ConcreteDataType::time_microsecond_datatype(),
2222 &Value::Time(Time::new_microsecond(1)),
2223 );
2224 check_type_and_value(
2225 &ConcreteDataType::time_nanosecond_datatype(),
2226 &Value::Time(Time::new_nanosecond(1)),
2227 );
2228 check_type_and_value(
2229 &ConcreteDataType::interval_year_month_datatype(),
2230 &Value::IntervalYearMonth(IntervalYearMonth::new(1)),
2231 );
2232 check_type_and_value(
2233 &ConcreteDataType::interval_day_time_datatype(),
2234 &Value::IntervalDayTime(IntervalDayTime::new(1, 2)),
2235 );
2236 check_type_and_value(
2237 &ConcreteDataType::interval_month_day_nano_datatype(),
2238 &Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
2239 );
2240 check_type_and_value(
2241 &ConcreteDataType::duration_second_datatype(),
2242 &Value::Duration(Duration::new_second(1)),
2243 );
2244 check_type_and_value(
2245 &ConcreteDataType::duration_millisecond_datatype(),
2246 &Value::Duration(Duration::new_millisecond(1)),
2247 );
2248 check_type_and_value(
2249 &ConcreteDataType::duration_microsecond_datatype(),
2250 &Value::Duration(Duration::new_microsecond(1)),
2251 );
2252 check_type_and_value(
2253 &ConcreteDataType::duration_nanosecond_datatype(),
2254 &Value::Duration(Duration::new_nanosecond(1)),
2255 );
2256 check_type_and_value(
2257 &ConcreteDataType::decimal128_datatype(38, 10),
2258 &Value::Decimal128(Decimal128::new(1, 38, 10)),
2259 );
2260
2261 let item_type = Arc::new(ConcreteDataType::boolean_datatype());
2262 check_type_and_value(
2263 &ConcreteDataType::list_datatype(item_type.clone()),
2264 &Value::List(ListValue::new(
2265 vec![Value::Boolean(true)],
2266 item_type.clone(),
2267 )),
2268 );
2269
2270 check_type_and_value(
2271 &ConcreteDataType::struct_datatype(build_struct_type()),
2272 &Value::Struct(build_struct_value()),
2273 );
2274
2275 check_type_and_value(
2276 &ConcreteDataType::json_native_datatype(ConcreteDataType::boolean_datatype()),
2277 &Value::Json(Box::new(true.into())),
2278 );
2279
2280 check_type_and_value(
2281 &ConcreteDataType::json_native_datatype(build_list_type()),
2282 &Value::Json(Box::new([true].into())),
2283 );
2284
2285 check_type_and_value(
2286 &ConcreteDataType::json_native_datatype(ConcreteDataType::struct_datatype(
2287 StructType::new(Arc::new(vec![
2288 StructField::new(
2289 "address".to_string(),
2290 ConcreteDataType::string_datatype(),
2291 true,
2292 ),
2293 StructField::new("age".to_string(), ConcreteDataType::uint64_datatype(), true),
2294 StructField::new(
2295 "awards".to_string(),
2296 ConcreteDataType::list_datatype(Arc::new(
2297 ConcreteDataType::boolean_datatype(),
2298 )),
2299 true,
2300 ),
2301 StructField::new("id".to_string(), ConcreteDataType::int64_datatype(), true),
2302 StructField::new(
2303 "name".to_string(),
2304 ConcreteDataType::string_datatype(),
2305 true,
2306 ),
2307 ])),
2308 )),
2309 &Value::Json(Box::new(
2310 [
2311 ("id", JsonVariant::from(1i64)),
2312 ("name", "Alice".into()),
2313 ("age", 1u64.into()),
2314 ("address", "blah".into()),
2315 ("awards", [true, false].into()),
2316 ]
2317 .into(),
2318 )),
2319 );
2320 }
2321
2322 #[test]
2323 fn test_value_from_string() {
2324 let hello = "hello".to_string();
2325 assert_eq!(
2326 Value::String(StringBytes::from(hello.clone())),
2327 Value::from(hello)
2328 );
2329
2330 let world = "world";
2331 assert_eq!(Value::String(StringBytes::from(world)), Value::from(world));
2332 }
2333
2334 #[test]
2335 fn test_value_from_bytes() {
2336 let hello = b"hello".to_vec();
2337 assert_eq!(
2338 Value::Binary(Bytes::from(hello.clone())),
2339 Value::from(hello)
2340 );
2341
2342 let world: &[u8] = b"world";
2343 assert_eq!(Value::Binary(Bytes::from(world)), Value::from(world));
2344 }
2345
2346 fn to_json(value: Value) -> serde_json::Value {
2347 value.try_into().unwrap()
2348 }
2349
2350 #[test]
2351 fn test_to_json_value() {
2352 assert_eq!(serde_json::Value::Null, to_json(Value::Null));
2353 assert_eq!(serde_json::Value::Bool(true), to_json(Value::Boolean(true)));
2354 assert_eq!(
2355 serde_json::Value::Number(20u8.into()),
2356 to_json(Value::UInt8(20))
2357 );
2358 assert_eq!(
2359 serde_json::Value::Number(20i8.into()),
2360 to_json(Value::Int8(20))
2361 );
2362 assert_eq!(
2363 serde_json::Value::Number(2000u16.into()),
2364 to_json(Value::UInt16(2000))
2365 );
2366 assert_eq!(
2367 serde_json::Value::Number(2000i16.into()),
2368 to_json(Value::Int16(2000))
2369 );
2370 assert_eq!(
2371 serde_json::Value::Number(3000u32.into()),
2372 to_json(Value::UInt32(3000))
2373 );
2374 assert_eq!(
2375 serde_json::Value::Number(3000i32.into()),
2376 to_json(Value::Int32(3000))
2377 );
2378 assert_eq!(
2379 serde_json::Value::Number(4000u64.into()),
2380 to_json(Value::UInt64(4000))
2381 );
2382 assert_eq!(
2383 serde_json::Value::Number(4000i64.into()),
2384 to_json(Value::Int64(4000))
2385 );
2386 assert_eq!(
2387 serde_json::Value::from(125.0f32),
2388 to_json(Value::Float32(125.0.into()))
2389 );
2390 assert_eq!(
2391 serde_json::Value::from(125.0f64),
2392 to_json(Value::Float64(125.0.into()))
2393 );
2394 assert_eq!(
2395 serde_json::Value::String(String::from("hello")),
2396 to_json(Value::String(StringBytes::from("hello")))
2397 );
2398 assert_eq!(
2399 serde_json::Value::from(b"world".as_slice()),
2400 to_json(Value::Binary(Bytes::from(b"world".as_slice())))
2401 );
2402 assert_eq!(
2403 serde_json::Value::Number(5000i32.into()),
2404 to_json(Value::Date(Date::new(5000)))
2405 );
2406 assert_eq!(
2407 serde_json::Value::Number(1.into()),
2408 to_json(Value::Timestamp(Timestamp::new_millisecond(1)))
2409 );
2410 assert_eq!(
2411 serde_json::Value::Number(1.into()),
2412 to_json(Value::Time(Time::new_millisecond(1)))
2413 );
2414 assert_eq!(
2415 serde_json::Value::Number(1.into()),
2416 to_json(Value::Duration(Duration::new_millisecond(1)))
2417 );
2418
2419 let json_value: serde_json::Value = serde_json::from_str(r#"[123]"#).unwrap();
2420 assert_eq!(
2421 json_value,
2422 to_json(Value::List(ListValue {
2423 items: vec![Value::Int32(123)],
2424 datatype: Arc::new(ConcreteDataType::int32_datatype()),
2425 }))
2426 );
2427
2428 let struct_value = StructValue::try_new(
2429 vec![
2430 Value::Int64(42),
2431 Value::String("tomcat".into()),
2432 Value::Boolean(true),
2433 ],
2434 StructType::new(Arc::new(vec![
2435 StructField::new("num".to_string(), ConcreteDataType::int64_datatype(), true),
2436 StructField::new(
2437 "name".to_string(),
2438 ConcreteDataType::string_datatype(),
2439 true,
2440 ),
2441 StructField::new(
2442 "yes_or_no".to_string(),
2443 ConcreteDataType::boolean_datatype(),
2444 true,
2445 ),
2446 ])),
2447 )
2448 .unwrap();
2449 assert_eq!(
2450 serde_json::Value::try_from(Value::Struct(struct_value.clone())).unwrap(),
2451 serde_json::json!({
2452 "num": 42,
2453 "name": "tomcat",
2454 "yes_or_no": true
2455 })
2456 );
2457
2458 assert_eq!(
2460 serde_json::Value::try_from(Value::Json(Box::new("hello".into()))).unwrap(),
2461 serde_json::json!("hello")
2462 );
2463
2464 assert_eq!(
2466 serde_json::Value::try_from(Value::Json(Box::new([1i64, 2, 3,].into()))).unwrap(),
2467 serde_json::json!([1, 2, 3])
2468 );
2469
2470 assert_eq!(
2472 serde_json::Value::try_from(Value::Json(Box::new(
2473 [
2474 ("num".to_string(), JsonVariant::from(42i64)),
2475 ("name".to_string(), "tomcat".into()),
2476 ("yes_or_no".to_string(), true.into()),
2477 ]
2478 .into()
2479 )))
2480 .unwrap(),
2481 serde_json::json!({
2482 "num": 42,
2483 "name": "tomcat",
2484 "yes_or_no": true
2485 })
2486 );
2487 }
2488
2489 #[test]
2490 fn test_null_value() {
2491 assert!(Value::Null.is_null());
2492 assert!(Value::Json(Box::new(JsonValue::null())).is_null());
2493 assert!(!Value::Boolean(true).is_null());
2494 assert!(Value::Null < Value::Boolean(false));
2495 assert!(Value::Boolean(true) > Value::Null);
2496 assert!(Value::Null < Value::Int32(10));
2497 assert!(Value::Int32(10) > Value::Null);
2498 }
2499
2500 #[test]
2501 fn test_null_value_ref() {
2502 assert!(ValueRef::Null.is_null());
2503 assert!(!ValueRef::Boolean(true).is_null());
2504 assert!(ValueRef::Null < ValueRef::Boolean(false));
2505 assert!(ValueRef::Boolean(true) > ValueRef::Null);
2506 assert!(ValueRef::Null < ValueRef::Int32(10));
2507 assert!(ValueRef::Int32(10) > ValueRef::Null);
2508 }
2509
2510 #[test]
2511 fn test_as_value_ref() {
2512 macro_rules! check_as_value_ref {
2513 ($Variant: ident, $data: expr) => {
2514 let value = Value::$Variant($data);
2515 let value_ref = value.as_value_ref();
2516 let expect_ref = ValueRef::$Variant($data);
2517
2518 assert_eq!(expect_ref, value_ref);
2519 };
2520 }
2521
2522 assert_eq!(ValueRef::Null, Value::Null.as_value_ref());
2523 check_as_value_ref!(Boolean, true);
2524 check_as_value_ref!(UInt8, 123);
2525 check_as_value_ref!(UInt16, 123);
2526 check_as_value_ref!(UInt32, 123);
2527 check_as_value_ref!(UInt64, 123);
2528 check_as_value_ref!(Int8, -12);
2529 check_as_value_ref!(Int16, -12);
2530 check_as_value_ref!(Int32, -12);
2531 check_as_value_ref!(Int64, -12);
2532 check_as_value_ref!(Float32, OrderedF32::from(16.0));
2533 check_as_value_ref!(Float64, OrderedF64::from(16.0));
2534 check_as_value_ref!(Timestamp, Timestamp::new_millisecond(1));
2535 check_as_value_ref!(Time, Time::new_millisecond(1));
2536 check_as_value_ref!(IntervalYearMonth, IntervalYearMonth::new(1));
2537 check_as_value_ref!(IntervalDayTime, IntervalDayTime::new(1, 2));
2538 check_as_value_ref!(IntervalMonthDayNano, IntervalMonthDayNano::new(1, 2, 3));
2539 check_as_value_ref!(Duration, Duration::new_millisecond(1));
2540
2541 assert_eq!(
2542 ValueRef::String("hello"),
2543 Value::String("hello".into()).as_value_ref()
2544 );
2545 assert_eq!(
2546 ValueRef::Binary(b"hello"),
2547 Value::Binary("hello".as_bytes().into()).as_value_ref()
2548 );
2549
2550 check_as_value_ref!(Date, Date::new(103));
2551
2552 let list = build_list_value();
2553 assert_eq!(
2554 ValueRef::List(ListValueRef::Ref { val: &list }),
2555 Value::List(list.clone()).as_value_ref()
2556 );
2557
2558 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2559 .unwrap()
2560 .to_vec();
2561 assert_eq!(
2562 ValueRef::Binary(jsonb_value.clone().as_slice()),
2563 Value::Binary(jsonb_value.into()).as_value_ref()
2564 );
2565
2566 let struct_value = build_struct_value();
2567 assert_eq!(
2568 ValueRef::Struct(StructValueRef::Ref(&struct_value)),
2569 Value::Struct(struct_value.clone()).as_value_ref()
2570 );
2571 }
2572
2573 #[test]
2574 fn test_value_ref_as() {
2575 macro_rules! check_as_null {
2576 ($method: ident) => {
2577 assert_eq!(None, ValueRef::Null.$method().unwrap());
2578 };
2579 }
2580
2581 check_as_null!(try_into_binary);
2582 check_as_null!(try_into_string);
2583 check_as_null!(try_into_boolean);
2584 check_as_null!(try_into_list);
2585 check_as_null!(try_into_struct);
2586
2587 macro_rules! check_as_correct {
2588 ($data: expr, $Variant: ident, $method: ident) => {
2589 assert_eq!(Some($data), ValueRef::$Variant($data).$method().unwrap());
2590 };
2591 }
2592
2593 check_as_correct!("hello", String, try_into_string);
2594 check_as_correct!("hello".as_bytes(), Binary, try_into_binary);
2595 check_as_correct!(true, Boolean, try_into_boolean);
2596 check_as_correct!(Date::new(123), Date, try_into_date);
2597 check_as_correct!(Time::new_second(12), Time, try_into_time);
2598 check_as_correct!(Duration::new_second(12), Duration, try_into_duration);
2599
2600 let list = build_list_value();
2601 check_as_correct!(ListValueRef::Ref { val: &list }, List, try_into_list);
2602
2603 let struct_value = build_struct_value();
2604 check_as_correct!(StructValueRef::Ref(&struct_value), Struct, try_into_struct);
2605
2606 let wrong_value = ValueRef::Int32(12345);
2607 assert!(wrong_value.try_into_binary().is_err());
2608 assert!(wrong_value.try_into_string().is_err());
2609 assert!(wrong_value.try_into_boolean().is_err());
2610 assert!(wrong_value.try_into_list().is_err());
2611 assert!(wrong_value.try_into_struct().is_err());
2612 assert!(wrong_value.try_into_date().is_err());
2613 assert!(wrong_value.try_into_time().is_err());
2614 assert!(wrong_value.try_into_timestamp().is_err());
2615 assert!(wrong_value.try_into_duration().is_err());
2616 }
2617
2618 #[test]
2619 fn test_display() {
2620 set_default_timezone(Some("Asia/Shanghai")).unwrap();
2621 assert_eq!(Value::Null.to_string(), "Null");
2622 assert_eq!(Value::UInt8(8).to_string(), "8");
2623 assert_eq!(Value::UInt16(16).to_string(), "16");
2624 assert_eq!(Value::UInt32(32).to_string(), "32");
2625 assert_eq!(Value::UInt64(64).to_string(), "64");
2626 assert_eq!(Value::Int8(-8).to_string(), "-8");
2627 assert_eq!(Value::Int16(-16).to_string(), "-16");
2628 assert_eq!(Value::Int32(-32).to_string(), "-32");
2629 assert_eq!(Value::Int64(-64).to_string(), "-64");
2630 assert_eq!(Value::Float32((-32.123).into()).to_string(), "-32.123");
2631 assert_eq!(Value::Float64((-64.123).into()).to_string(), "-64.123");
2632 assert_eq!(Value::Float64(OrderedF64::infinity()).to_string(), "inf");
2633 assert_eq!(Value::Float64(OrderedF64::nan()).to_string(), "NaN");
2634 assert_eq!(Value::String(StringBytes::from("123")).to_string(), "123");
2635 assert_eq!(
2636 Value::Binary(Bytes::from(vec![1, 2, 3])).to_string(),
2637 "010203"
2638 );
2639 assert_eq!(Value::Date(Date::new(0)).to_string(), "1970-01-01");
2640 assert_eq!(
2641 Value::Timestamp(Timestamp::new(1000, TimeUnit::Millisecond)).to_string(),
2642 "1970-01-01 08:00:01+0800"
2643 );
2644 assert_eq!(
2645 Value::Time(Time::new(1000, TimeUnit::Millisecond)).to_string(),
2646 "08:00:01+0800"
2647 );
2648 assert_eq!(
2649 Value::Duration(Duration::new_millisecond(1000)).to_string(),
2650 "1000ms"
2651 );
2652 assert_eq!(
2653 Value::List(build_list_value()).to_string(),
2654 "Boolean[true, false]"
2655 );
2656 assert_eq!(
2657 Value::List(ListValue::new(
2658 vec![],
2659 Arc::new(ConcreteDataType::timestamp_second_datatype()),
2660 ))
2661 .to_string(),
2662 "TimestampSecond[]"
2663 );
2664 assert_eq!(
2665 Value::List(ListValue::new(
2666 vec![],
2667 Arc::new(ConcreteDataType::timestamp_millisecond_datatype()),
2668 ))
2669 .to_string(),
2670 "TimestampMillisecond[]"
2671 );
2672 assert_eq!(
2673 Value::List(ListValue::new(
2674 vec![],
2675 Arc::new(ConcreteDataType::timestamp_microsecond_datatype()),
2676 ))
2677 .to_string(),
2678 "TimestampMicrosecond[]"
2679 );
2680 assert_eq!(
2681 Value::List(ListValue::new(
2682 vec![],
2683 Arc::new(ConcreteDataType::timestamp_nanosecond_datatype()),
2684 ))
2685 .to_string(),
2686 "TimestampNanosecond[]"
2687 );
2688
2689 assert_eq!(
2690 Value::Struct(build_struct_value()).to_string(),
2691 "{ id: 1, name: tom, age: 25, address: 94038, awards: Boolean[true, false] }"
2692 );
2693
2694 assert_eq!(
2695 Value::Json(Box::new(
2696 [
2697 ("id", JsonVariant::from(1i64)),
2698 ("name", "tom".into()),
2699 ("age", 25u64.into()),
2700 ("address", "94038".into()),
2701 ("awards", [true, false].into()),
2702 ]
2703 .into()
2704 ))
2705 .to_string(),
2706 "Json({ address: 94038, age: 25, awards: [true, false], id: 1, name: tom })"
2707 )
2708 }
2709
2710 #[test]
2711 fn test_not_null_value_to_scalar_value() {
2712 assert_eq!(
2713 ScalarValue::Boolean(Some(true)),
2714 Value::Boolean(true)
2715 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2716 .unwrap()
2717 );
2718 assert_eq!(
2719 ScalarValue::Boolean(Some(false)),
2720 Value::Boolean(false)
2721 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2722 .unwrap()
2723 );
2724 assert_eq!(
2725 ScalarValue::UInt8(Some(u8::MIN + 1)),
2726 Value::UInt8(u8::MIN + 1)
2727 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2728 .unwrap()
2729 );
2730 assert_eq!(
2731 ScalarValue::UInt16(Some(u16::MIN + 2)),
2732 Value::UInt16(u16::MIN + 2)
2733 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2734 .unwrap()
2735 );
2736 assert_eq!(
2737 ScalarValue::UInt32(Some(u32::MIN + 3)),
2738 Value::UInt32(u32::MIN + 3)
2739 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2740 .unwrap()
2741 );
2742 assert_eq!(
2743 ScalarValue::UInt64(Some(u64::MIN + 4)),
2744 Value::UInt64(u64::MIN + 4)
2745 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2746 .unwrap()
2747 );
2748 assert_eq!(
2749 ScalarValue::Int8(Some(i8::MIN + 4)),
2750 Value::Int8(i8::MIN + 4)
2751 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2752 .unwrap()
2753 );
2754 assert_eq!(
2755 ScalarValue::Int16(Some(i16::MIN + 5)),
2756 Value::Int16(i16::MIN + 5)
2757 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2758 .unwrap()
2759 );
2760 assert_eq!(
2761 ScalarValue::Int32(Some(i32::MIN + 6)),
2762 Value::Int32(i32::MIN + 6)
2763 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2764 .unwrap()
2765 );
2766 assert_eq!(
2767 ScalarValue::Int64(Some(i64::MIN + 7)),
2768 Value::Int64(i64::MIN + 7)
2769 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2770 .unwrap()
2771 );
2772 assert_eq!(
2773 ScalarValue::Float32(Some(8.0f32)),
2774 Value::Float32(OrderedFloat(8.0f32))
2775 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2776 .unwrap()
2777 );
2778 assert_eq!(
2779 ScalarValue::Float64(Some(9.0f64)),
2780 Value::Float64(OrderedFloat(9.0f64))
2781 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2782 .unwrap()
2783 );
2784 assert_eq!(
2785 ScalarValue::Utf8(Some("hello".to_string())),
2786 Value::String(StringBytes::from("hello"))
2787 .try_to_scalar_value(&ConcreteDataType::string_datatype(),)
2788 .unwrap()
2789 );
2790 assert_eq!(
2791 ScalarValue::Binary(Some("world".as_bytes().to_vec())),
2792 Value::Binary(Bytes::from("world".as_bytes()))
2793 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2794 .unwrap()
2795 );
2796
2797 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2798 .unwrap()
2799 .to_vec();
2800 assert_eq!(
2801 ScalarValue::Binary(Some(jsonb_value.clone())),
2802 Value::Binary(jsonb_value.into())
2803 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2804 .unwrap()
2805 );
2806
2807 assert_eq!(
2808 build_scalar_struct_value(),
2809 Value::Struct(build_struct_value())
2810 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
2811 .unwrap()
2812 );
2813
2814 assert_eq!(
2815 build_scalar_list_value(),
2816 Value::List(build_list_value())
2817 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
2818 ConcreteDataType::boolean_datatype()
2819 )))
2820 .unwrap()
2821 );
2822 }
2823
2824 #[test]
2825 fn test_null_value_to_scalar_value() {
2826 assert_eq!(
2827 ScalarValue::Boolean(None),
2828 Value::Null
2829 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2830 .unwrap()
2831 );
2832 assert_eq!(
2833 ScalarValue::UInt8(None),
2834 Value::Null
2835 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2836 .unwrap()
2837 );
2838 assert_eq!(
2839 ScalarValue::UInt16(None),
2840 Value::Null
2841 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2842 .unwrap()
2843 );
2844 assert_eq!(
2845 ScalarValue::UInt32(None),
2846 Value::Null
2847 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2848 .unwrap()
2849 );
2850 assert_eq!(
2851 ScalarValue::UInt64(None),
2852 Value::Null
2853 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2854 .unwrap()
2855 );
2856 assert_eq!(
2857 ScalarValue::Int8(None),
2858 Value::Null
2859 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2860 .unwrap()
2861 );
2862 assert_eq!(
2863 ScalarValue::Int16(None),
2864 Value::Null
2865 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2866 .unwrap()
2867 );
2868 assert_eq!(
2869 ScalarValue::Int32(None),
2870 Value::Null
2871 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2872 .unwrap()
2873 );
2874 assert_eq!(
2875 ScalarValue::Int64(None),
2876 Value::Null
2877 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2878 .unwrap()
2879 );
2880 assert_eq!(
2881 ScalarValue::Float32(None),
2882 Value::Null
2883 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2884 .unwrap()
2885 );
2886 assert_eq!(
2887 ScalarValue::Float64(None),
2888 Value::Null
2889 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2890 .unwrap()
2891 );
2892 assert_eq!(
2893 ScalarValue::Utf8(None),
2894 Value::Null
2895 .try_to_scalar_value(&ConcreteDataType::string_datatype())
2896 .unwrap()
2897 );
2898 assert_eq!(
2899 ScalarValue::Binary(None),
2900 Value::Null
2901 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2902 .unwrap()
2903 );
2904
2905 assert_eq!(
2906 ScalarValue::Time32Second(None),
2907 Value::Null
2908 .try_to_scalar_value(&ConcreteDataType::time_second_datatype())
2909 .unwrap()
2910 );
2911 assert_eq!(
2912 ScalarValue::Time32Millisecond(None),
2913 Value::Null
2914 .try_to_scalar_value(&ConcreteDataType::time_millisecond_datatype())
2915 .unwrap()
2916 );
2917 assert_eq!(
2918 ScalarValue::Time64Microsecond(None),
2919 Value::Null
2920 .try_to_scalar_value(&ConcreteDataType::time_microsecond_datatype())
2921 .unwrap()
2922 );
2923 assert_eq!(
2924 ScalarValue::Time64Nanosecond(None),
2925 Value::Null
2926 .try_to_scalar_value(&ConcreteDataType::time_nanosecond_datatype())
2927 .unwrap()
2928 );
2929
2930 assert_eq!(
2931 ScalarValue::DurationSecond(None),
2932 Value::Null
2933 .try_to_scalar_value(&ConcreteDataType::duration_second_datatype())
2934 .unwrap()
2935 );
2936 assert_eq!(
2937 ScalarValue::DurationMillisecond(None),
2938 Value::Null
2939 .try_to_scalar_value(&ConcreteDataType::duration_millisecond_datatype())
2940 .unwrap()
2941 );
2942 assert_eq!(
2943 ScalarValue::DurationMicrosecond(None),
2944 Value::Null
2945 .try_to_scalar_value(&ConcreteDataType::duration_microsecond_datatype())
2946 .unwrap()
2947 );
2948 assert_eq!(
2949 ScalarValue::DurationNanosecond(None),
2950 Value::Null
2951 .try_to_scalar_value(&ConcreteDataType::duration_nanosecond_datatype())
2952 .unwrap()
2953 );
2954 assert_eq!(
2955 ScalarValue::Binary(None),
2956 Value::Null
2957 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2958 .unwrap()
2959 );
2960
2961 assert_eq!(
2962 ScalarValue::new_null_list(ArrowDataType::Boolean, true, 1),
2963 Value::Null
2964 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
2965 ConcreteDataType::boolean_datatype()
2966 )))
2967 .unwrap()
2968 );
2969
2970 assert_eq!(
2971 ScalarStructBuilder::new_null(build_struct_type().as_arrow_fields()),
2972 Value::Null
2973 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
2974 .unwrap()
2975 );
2976 }
2977
2978 #[test]
2979 fn test_list_value_to_scalar_value() {
2980 let items = vec![Value::Int32(-1), Value::Null];
2981 let item_type = Arc::new(ConcreteDataType::int32_datatype());
2982 let list = Value::List(ListValue::new(items, item_type.clone()));
2983 let df_list = list
2984 .try_to_scalar_value(&ConcreteDataType::list_datatype(item_type.clone()))
2985 .unwrap();
2986 assert!(matches!(df_list, ScalarValue::List(_)));
2987 match df_list {
2988 ScalarValue::List(vs) => {
2989 assert_eq!(
2990 ArrowDataType::List(Arc::new(Field::new_list_field(
2991 ArrowDataType::Int32,
2992 true
2993 ))),
2994 *vs.data_type()
2995 );
2996
2997 let vs = ScalarValue::convert_array_to_scalar_vec(vs.as_ref())
2998 .unwrap()
2999 .into_iter()
3000 .flatten()
3001 .flatten()
3002 .collect::<Vec<_>>();
3003 assert_eq!(
3004 vs,
3005 vec![ScalarValue::Int32(Some(-1)), ScalarValue::Int32(None)]
3006 );
3007 }
3008 _ => unreachable!(),
3009 }
3010 }
3011
3012 #[test]
3013 fn test_struct_value_to_scalar_value() {
3014 let struct_value = build_struct_value();
3015 let scalar_value = struct_value
3016 .try_to_scalar_value(&build_struct_type())
3017 .unwrap();
3018
3019 assert_eq!(scalar_value, build_scalar_struct_value());
3020
3021 assert!(matches!(scalar_value, ScalarValue::Struct(_)));
3022 match scalar_value {
3023 ScalarValue::Struct(values) => {
3024 assert_eq!(&build_struct_type().as_arrow_fields(), values.fields());
3025
3026 assert_eq!(
3027 ScalarValue::try_from_array(values.column(0), 0).unwrap(),
3028 ScalarValue::Int32(Some(1))
3029 );
3030 assert_eq!(
3031 ScalarValue::try_from_array(values.column(1), 0).unwrap(),
3032 ScalarValue::Utf8(Some("tom".into()))
3033 );
3034 assert_eq!(
3035 ScalarValue::try_from_array(values.column(2), 0).unwrap(),
3036 ScalarValue::UInt8(Some(25))
3037 );
3038 assert_eq!(
3039 ScalarValue::try_from_array(values.column(3), 0).unwrap(),
3040 ScalarValue::Utf8(Some("94038".into()))
3041 );
3042 }
3043 _ => panic!("Unexpected value type"),
3044 }
3045 }
3046
3047 #[test]
3048 fn test_timestamp_to_scalar_value() {
3049 assert_eq!(
3050 ScalarValue::TimestampSecond(Some(1), None),
3051 timestamp_to_scalar_value(TimeUnit::Second, Some(1))
3052 );
3053 assert_eq!(
3054 ScalarValue::TimestampMillisecond(Some(1), None),
3055 timestamp_to_scalar_value(TimeUnit::Millisecond, Some(1))
3056 );
3057 assert_eq!(
3058 ScalarValue::TimestampMicrosecond(Some(1), None),
3059 timestamp_to_scalar_value(TimeUnit::Microsecond, Some(1))
3060 );
3061 assert_eq!(
3062 ScalarValue::TimestampNanosecond(Some(1), None),
3063 timestamp_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3064 );
3065 }
3066
3067 #[test]
3068 fn test_time_to_scalar_value() {
3069 assert_eq!(
3070 ScalarValue::Time32Second(Some(1)),
3071 time_to_scalar_value(TimeUnit::Second, Some(1)).unwrap()
3072 );
3073 assert_eq!(
3074 ScalarValue::Time32Millisecond(Some(1)),
3075 time_to_scalar_value(TimeUnit::Millisecond, Some(1)).unwrap()
3076 );
3077 assert_eq!(
3078 ScalarValue::Time64Microsecond(Some(1)),
3079 time_to_scalar_value(TimeUnit::Microsecond, Some(1)).unwrap()
3080 );
3081 assert_eq!(
3082 ScalarValue::Time64Nanosecond(Some(1)),
3083 time_to_scalar_value(TimeUnit::Nanosecond, Some(1)).unwrap()
3084 );
3085 }
3086
3087 #[test]
3088 fn test_duration_to_scalar_value() {
3089 assert_eq!(
3090 ScalarValue::DurationSecond(Some(1)),
3091 duration_to_scalar_value(TimeUnit::Second, Some(1))
3092 );
3093 assert_eq!(
3094 ScalarValue::DurationMillisecond(Some(1)),
3095 duration_to_scalar_value(TimeUnit::Millisecond, Some(1))
3096 );
3097 assert_eq!(
3098 ScalarValue::DurationMicrosecond(Some(1)),
3099 duration_to_scalar_value(TimeUnit::Microsecond, Some(1))
3100 );
3101 assert_eq!(
3102 ScalarValue::DurationNanosecond(Some(1)),
3103 duration_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3104 );
3105 }
3106
3107 fn check_value_ref_size_eq(value_ref: &ValueRef, size: usize) {
3108 assert_eq!(value_ref.data_size(), size);
3109 }
3110
3111 #[test]
3112 fn test_value_ref_estimated_size() {
3113 check_value_ref_size_eq(&ValueRef::Null, 8);
3114 check_value_ref_size_eq(&ValueRef::Boolean(true), 1);
3115 check_value_ref_size_eq(&ValueRef::UInt8(1), 1);
3116 check_value_ref_size_eq(&ValueRef::UInt16(1), 2);
3117 check_value_ref_size_eq(&ValueRef::UInt32(1), 4);
3118 check_value_ref_size_eq(&ValueRef::UInt64(1), 8);
3119 check_value_ref_size_eq(&ValueRef::Int8(1), 1);
3120 check_value_ref_size_eq(&ValueRef::Int16(1), 2);
3121 check_value_ref_size_eq(&ValueRef::Int32(1), 4);
3122 check_value_ref_size_eq(&ValueRef::Int64(1), 8);
3123 check_value_ref_size_eq(&ValueRef::Float32(1.0.into()), 4);
3124 check_value_ref_size_eq(&ValueRef::Float64(1.0.into()), 8);
3125 check_value_ref_size_eq(&ValueRef::String("greptimedb"), 10);
3126 check_value_ref_size_eq(&ValueRef::Binary(b"greptimedb"), 10);
3127 check_value_ref_size_eq(&ValueRef::Date(Date::new(1)), 4);
3128 check_value_ref_size_eq(&ValueRef::Timestamp(Timestamp::new_millisecond(1)), 16);
3129 check_value_ref_size_eq(&ValueRef::Time(Time::new_millisecond(1)), 16);
3130 check_value_ref_size_eq(&ValueRef::IntervalYearMonth(IntervalYearMonth::new(1)), 4);
3131 check_value_ref_size_eq(&ValueRef::IntervalDayTime(IntervalDayTime::new(1, 2)), 8);
3132 check_value_ref_size_eq(
3133 &ValueRef::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
3134 16,
3135 );
3136 check_value_ref_size_eq(&ValueRef::Duration(Duration::new_millisecond(1)), 16);
3137 check_value_ref_size_eq(
3138 &ValueRef::List(ListValueRef::Ref {
3139 val: &ListValue {
3140 items: vec![
3141 Value::String("hello world".into()),
3142 Value::String("greptimedb".into()),
3143 ],
3144 datatype: Arc::new(ConcreteDataType::string_datatype()),
3145 },
3146 }),
3147 30,
3148 );
3149
3150 let data = vec![
3151 Some(vec![Some(1), Some(2), Some(3)]),
3152 None,
3153 Some(vec![Some(4), None, Some(6)]),
3154 ];
3155 let item_type = Arc::new(ConcreteDataType::int32_datatype());
3156 let mut builder = ListVectorBuilder::with_type_capacity(item_type.clone(), 8);
3157 for vec_opt in &data {
3158 if let Some(vec) = vec_opt {
3159 let values = vec.iter().map(|v| Value::from(*v)).collect();
3160 let list_value = ListValue::new(values, item_type.clone());
3161
3162 builder.push(Some(ListValueRef::Ref { val: &list_value }));
3163 } else {
3164 builder.push(None);
3165 }
3166 }
3167 let vector = builder.finish();
3168
3169 check_value_ref_size_eq(
3170 &ValueRef::List(ListValueRef::Indexed {
3171 vector: &vector,
3172 idx: 0,
3173 }),
3174 74,
3175 );
3176 check_value_ref_size_eq(
3177 &ValueRef::List(ListValueRef::Indexed {
3178 vector: &vector,
3179 idx: 1,
3180 }),
3181 74,
3182 );
3183 check_value_ref_size_eq(
3184 &ValueRef::List(ListValueRef::Indexed {
3185 vector: &vector,
3186 idx: 2,
3187 }),
3188 74,
3189 );
3190 check_value_ref_size_eq(&ValueRef::Decimal128(Decimal128::new(1234, 3, 1)), 32);
3191
3192 check_value_ref_size_eq(
3193 &ValueRef::Struct(StructValueRef::Ref(&build_struct_value())),
3194 31,
3195 );
3196
3197 check_value_ref_size_eq(
3198 &ValueRef::Json(Box::new(
3199 [
3200 ("id", JsonVariantRef::from(1i64)),
3201 ("name", "tom".into()),
3202 ("age", 25u64.into()),
3203 ("address", "94038".into()),
3204 ("awards", [true, false].into()),
3205 ]
3206 .into(),
3207 )),
3208 48,
3209 );
3210 }
3211
3212 #[test]
3213 fn test_incorrect_default_value_issue_3479() {
3214 let value = OrderedF64::from(0.047318541668048164);
3215 let serialized = serde_json::to_string(&value).unwrap();
3216 let deserialized: OrderedF64 = serde_json::from_str(&serialized).unwrap();
3217 assert_eq!(value, deserialized);
3218 }
3219}