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)
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).try_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::from(struct_array.fields());
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 | ScalarValue::RunEndEncoded(_, _, _) => {
1234 return error::UnsupportedArrowTypeSnafu {
1235 arrow_type: v.data_type(),
1236 }
1237 .fail();
1238 }
1239 };
1240 Ok(v)
1241 }
1242}
1243
1244impl From<ValueRef<'_>> for Value {
1245 fn from(value: ValueRef<'_>) -> Self {
1246 match value {
1247 ValueRef::Null => Value::Null,
1248 ValueRef::Boolean(v) => Value::Boolean(v),
1249 ValueRef::UInt8(v) => Value::UInt8(v),
1250 ValueRef::UInt16(v) => Value::UInt16(v),
1251 ValueRef::UInt32(v) => Value::UInt32(v),
1252 ValueRef::UInt64(v) => Value::UInt64(v),
1253 ValueRef::Int8(v) => Value::Int8(v),
1254 ValueRef::Int16(v) => Value::Int16(v),
1255 ValueRef::Int32(v) => Value::Int32(v),
1256 ValueRef::Int64(v) => Value::Int64(v),
1257 ValueRef::Float32(v) => Value::Float32(v),
1258 ValueRef::Float64(v) => Value::Float64(v),
1259 ValueRef::String(v) => Value::String(v.into()),
1260 ValueRef::Binary(v) => Value::Binary(v.into()),
1261 ValueRef::Date(v) => Value::Date(v),
1262 ValueRef::Timestamp(v) => Value::Timestamp(v),
1263 ValueRef::Time(v) => Value::Time(v),
1264 ValueRef::IntervalYearMonth(v) => Value::IntervalYearMonth(v),
1265 ValueRef::IntervalDayTime(v) => Value::IntervalDayTime(v),
1266 ValueRef::IntervalMonthDayNano(v) => Value::IntervalMonthDayNano(v),
1267 ValueRef::Duration(v) => Value::Duration(v),
1268 ValueRef::List(v) => v.to_value(),
1269 ValueRef::Decimal128(v) => Value::Decimal128(v),
1270 ValueRef::Struct(v) => v.to_value(),
1271 ValueRef::Json(v) => Value::Json(Box::new(JsonValue::from(*v))),
1272 }
1273 }
1274}
1275
1276#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
1278pub enum ValueRef<'a> {
1279 Null,
1280
1281 Boolean(bool),
1283 UInt8(u8),
1284 UInt16(u16),
1285 UInt32(u32),
1286 UInt64(u64),
1287 Int8(i8),
1288 Int16(i16),
1289 Int32(i32),
1290 Int64(i64),
1291 Float32(OrderedF32),
1292 Float64(OrderedF64),
1293
1294 Decimal128(Decimal128),
1296
1297 String(&'a str),
1299 Binary(&'a [u8]),
1300
1301 Date(Date),
1303 Timestamp(Timestamp),
1304 Time(Time),
1305 Duration(Duration),
1306 IntervalYearMonth(IntervalYearMonth),
1308 IntervalDayTime(IntervalDayTime),
1309 IntervalMonthDayNano(IntervalMonthDayNano),
1310
1311 List(ListValueRef<'a>),
1313 Struct(StructValueRef<'a>),
1314
1315 Json(Box<JsonValueRef<'a>>),
1316}
1317
1318macro_rules! impl_as_for_value_ref {
1319 ($value: ident, $Variant: ident) => {
1320 match $value {
1321 ValueRef::Null => Ok(None),
1322 ValueRef::$Variant(v) => Ok(Some(v.clone())),
1323 other => error::CastTypeSnafu {
1324 msg: format!(
1325 "Failed to cast value ref {:?} to {}",
1326 other,
1327 stringify!($Variant)
1328 ),
1329 }
1330 .fail(),
1331 }
1332 };
1333}
1334
1335impl<'a> ValueRef<'a> {
1336 define_data_type_func!(ValueRef);
1337
1338 pub fn is_null(&self) -> bool {
1340 match self {
1341 ValueRef::Null => true,
1342 ValueRef::Json(v) => v.is_null(),
1343 _ => false,
1344 }
1345 }
1346
1347 pub fn try_into_binary(&self) -> Result<Option<&'a [u8]>> {
1349 impl_as_for_value_ref!(self, Binary)
1350 }
1351
1352 pub fn try_into_string(&self) -> Result<Option<&'a str>> {
1354 impl_as_for_value_ref!(self, String)
1355 }
1356
1357 pub fn try_into_boolean(&self) -> Result<Option<bool>> {
1359 impl_as_for_value_ref!(self, Boolean)
1360 }
1361
1362 pub fn try_into_i8(&self) -> Result<Option<i8>> {
1363 impl_as_for_value_ref!(self, Int8)
1364 }
1365
1366 pub fn try_into_u8(&self) -> Result<Option<u8>> {
1367 impl_as_for_value_ref!(self, UInt8)
1368 }
1369
1370 pub fn try_into_i16(&self) -> Result<Option<i16>> {
1371 impl_as_for_value_ref!(self, Int16)
1372 }
1373
1374 pub fn try_into_u16(&self) -> Result<Option<u16>> {
1375 impl_as_for_value_ref!(self, UInt16)
1376 }
1377
1378 pub fn try_into_i32(&self) -> Result<Option<i32>> {
1379 impl_as_for_value_ref!(self, Int32)
1380 }
1381
1382 pub fn try_into_u32(&self) -> Result<Option<u32>> {
1383 impl_as_for_value_ref!(self, UInt32)
1384 }
1385
1386 pub fn try_into_i64(&self) -> Result<Option<i64>> {
1387 impl_as_for_value_ref!(self, Int64)
1388 }
1389
1390 pub fn try_into_u64(&self) -> Result<Option<u64>> {
1391 impl_as_for_value_ref!(self, UInt64)
1392 }
1393
1394 pub fn try_into_f32(&self) -> Result<Option<f32>> {
1395 match self {
1396 ValueRef::Null => Ok(None),
1397 ValueRef::Float32(f) => Ok(Some(f.0)),
1398 ValueRef::Json(v) => Ok(v.as_f32()),
1399 other => error::CastTypeSnafu {
1400 msg: format!("Failed to cast value ref {:?} to ValueRef::Float32", other,),
1401 }
1402 .fail(),
1403 }
1404 }
1405
1406 pub fn try_into_f64(&self) -> Result<Option<f64>> {
1407 match self {
1408 ValueRef::Null => Ok(None),
1409 ValueRef::Float64(f) => Ok(Some(f.0)),
1410 ValueRef::Json(v) => Ok(v.as_f64()),
1411 other => error::CastTypeSnafu {
1412 msg: format!("Failed to cast value ref {:?} to ValueRef::Float64", other,),
1413 }
1414 .fail(),
1415 }
1416 }
1417
1418 pub fn try_into_date(&self) -> Result<Option<Date>> {
1420 impl_as_for_value_ref!(self, Date)
1421 }
1422
1423 pub fn try_into_timestamp(&self) -> Result<Option<Timestamp>> {
1425 impl_as_for_value_ref!(self, Timestamp)
1426 }
1427
1428 pub fn try_into_time(&self) -> Result<Option<Time>> {
1430 impl_as_for_value_ref!(self, Time)
1431 }
1432
1433 pub fn try_into_duration(&self) -> Result<Option<Duration>> {
1434 impl_as_for_value_ref!(self, Duration)
1435 }
1436
1437 pub fn try_into_interval_year_month(&self) -> Result<Option<IntervalYearMonth>> {
1439 impl_as_for_value_ref!(self, IntervalYearMonth)
1440 }
1441
1442 pub fn try_into_interval_day_time(&self) -> Result<Option<IntervalDayTime>> {
1444 impl_as_for_value_ref!(self, IntervalDayTime)
1445 }
1446
1447 pub fn try_into_interval_month_day_nano(&self) -> Result<Option<IntervalMonthDayNano>> {
1449 impl_as_for_value_ref!(self, IntervalMonthDayNano)
1450 }
1451
1452 pub fn try_into_list(&self) -> Result<Option<ListValueRef<'_>>> {
1454 impl_as_for_value_ref!(self, List)
1455 }
1456
1457 pub fn try_into_struct(&self) -> Result<Option<StructValueRef<'_>>> {
1459 impl_as_for_value_ref!(self, Struct)
1460 }
1461
1462 pub fn try_into_decimal128(&self) -> Result<Option<Decimal128>> {
1464 impl_as_for_value_ref!(self, Decimal128)
1465 }
1466}
1467
1468impl PartialOrd for ValueRef<'_> {
1469 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1470 Some(self.cmp(other))
1471 }
1472}
1473
1474impl Ord for ValueRef<'_> {
1475 fn cmp(&self, other: &Self) -> Ordering {
1476 impl_ord_for_value_like!(ValueRef, self, other)
1477 }
1478}
1479
1480macro_rules! impl_value_ref_from {
1481 ($Variant:ident, $Type:ident) => {
1482 impl From<$Type> for ValueRef<'_> {
1483 fn from(value: $Type) -> Self {
1484 ValueRef::$Variant(value.into())
1485 }
1486 }
1487
1488 impl From<Option<$Type>> for ValueRef<'_> {
1489 fn from(value: Option<$Type>) -> Self {
1490 match value {
1491 Some(v) => ValueRef::$Variant(v.into()),
1492 None => ValueRef::Null,
1493 }
1494 }
1495 }
1496 };
1497}
1498
1499impl_value_ref_from!(Boolean, bool);
1500impl_value_ref_from!(UInt8, u8);
1501impl_value_ref_from!(UInt16, u16);
1502impl_value_ref_from!(UInt32, u32);
1503impl_value_ref_from!(UInt64, u64);
1504impl_value_ref_from!(Int8, i8);
1505impl_value_ref_from!(Int16, i16);
1506impl_value_ref_from!(Int32, i32);
1507impl_value_ref_from!(Int64, i64);
1508impl_value_ref_from!(Float32, f32);
1509impl_value_ref_from!(Float64, f64);
1510impl_value_ref_from!(Date, Date);
1511impl_value_ref_from!(Timestamp, Timestamp);
1512impl_value_ref_from!(Time, Time);
1513impl_value_ref_from!(IntervalYearMonth, IntervalYearMonth);
1514impl_value_ref_from!(IntervalDayTime, IntervalDayTime);
1515impl_value_ref_from!(IntervalMonthDayNano, IntervalMonthDayNano);
1516impl_value_ref_from!(Duration, Duration);
1517impl_value_ref_from!(Decimal128, Decimal128);
1518
1519impl<'a> From<&'a str> for ValueRef<'a> {
1520 fn from(string: &'a str) -> ValueRef<'a> {
1521 ValueRef::String(string)
1522 }
1523}
1524
1525impl<'a> From<&'a [u8]> for ValueRef<'a> {
1526 fn from(bytes: &'a [u8]) -> ValueRef<'a> {
1527 ValueRef::Binary(bytes)
1528 }
1529}
1530
1531impl<'a> From<Option<ListValueRef<'a>>> for ValueRef<'a> {
1532 fn from(list: Option<ListValueRef>) -> ValueRef {
1533 match list {
1534 Some(v) => ValueRef::List(v),
1535 None => ValueRef::Null,
1536 }
1537 }
1538}
1539
1540#[derive(Debug, Clone)]
1546pub enum ListValueRef<'a> {
1547 Indexed {
1549 vector: &'a ListVector,
1550 idx: usize,
1551 },
1552 Ref {
1553 val: &'a ListValue,
1554 },
1555 RefList {
1556 val: Vec<ValueRef<'a>>,
1557 item_datatype: Arc<ConcreteDataType>,
1558 },
1559}
1560
1561impl ListValueRef<'_> {
1562 fn to_value(&self) -> Value {
1564 match self {
1565 ListValueRef::Indexed { vector, idx } => vector.get(*idx),
1566 ListValueRef::Ref { val } => Value::List((*val).clone()),
1567 ListValueRef::RefList { val, item_datatype } => Value::List(ListValue::new(
1568 val.iter().map(|v| Value::from(v.clone())).collect(),
1569 item_datatype.clone(),
1570 )),
1571 }
1572 }
1573 fn datatype(&self) -> Arc<ConcreteDataType> {
1575 match self {
1576 ListValueRef::Indexed { vector, .. } => vector.item_type(),
1577 ListValueRef::Ref { val } => val.datatype().clone(),
1578 ListValueRef::RefList { item_datatype, .. } => item_datatype.clone(),
1579 }
1580 }
1581}
1582
1583impl Serialize for ListValueRef<'_> {
1584 fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
1585 match self {
1586 ListValueRef::Indexed { vector, idx } => match vector.get(*idx) {
1587 Value::List(v) => v.serialize(serializer),
1588 _ => unreachable!(),
1589 },
1590 ListValueRef::Ref { val } => val.serialize(serializer),
1591 ListValueRef::RefList { val, .. } => val.serialize(serializer),
1592 }
1593 }
1594}
1595
1596impl PartialEq for ListValueRef<'_> {
1597 fn eq(&self, other: &Self) -> bool {
1598 self.to_value().eq(&other.to_value())
1599 }
1600}
1601
1602impl Eq for ListValueRef<'_> {}
1603
1604impl Ord for ListValueRef<'_> {
1605 fn cmp(&self, other: &Self) -> Ordering {
1606 self.to_value().cmp(&other.to_value())
1608 }
1609}
1610
1611impl PartialOrd for ListValueRef<'_> {
1612 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1613 Some(self.cmp(other))
1614 }
1615}
1616
1617#[derive(Debug, Clone)]
1618pub enum StructValueRef<'a> {
1619 Indexed {
1620 vector: &'a StructVector,
1621 idx: usize,
1622 },
1623 Ref(&'a StructValue),
1624 RefList {
1625 val: Vec<ValueRef<'a>>,
1626 fields: StructType,
1627 },
1628}
1629
1630impl<'a> StructValueRef<'a> {
1631 pub fn to_value(&self) -> Value {
1632 match self {
1633 StructValueRef::Indexed { vector, idx } => vector.get(*idx),
1634 StructValueRef::Ref(val) => Value::Struct((*val).clone()),
1635 StructValueRef::RefList { val, fields } => {
1636 let items = val.iter().map(|v| Value::from(v.clone())).collect();
1637 Value::Struct(StructValue::try_new(items, fields.clone()).unwrap())
1638 }
1639 }
1640 }
1641
1642 pub fn struct_type(&self) -> &StructType {
1643 match self {
1644 StructValueRef::Indexed { vector, .. } => vector.struct_type(),
1645 StructValueRef::Ref(val) => val.struct_type(),
1646 StructValueRef::RefList { fields, .. } => fields,
1647 }
1648 }
1649}
1650
1651impl Serialize for StructValueRef<'_> {
1652 fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
1653 match self {
1654 StructValueRef::Indexed { vector, idx } => match vector.get(*idx) {
1655 Value::Struct(v) => v.serialize(serializer),
1656 _ => unreachable!(),
1657 },
1658 StructValueRef::Ref(val) => val.serialize(serializer),
1659 StructValueRef::RefList { val, .. } => val.serialize(serializer),
1660 }
1661 }
1662}
1663
1664impl PartialEq for StructValueRef<'_> {
1665 fn eq(&self, other: &Self) -> bool {
1666 self.to_value().eq(&other.to_value())
1667 }
1668}
1669
1670impl Eq for StructValueRef<'_> {}
1671
1672impl Ord for StructValueRef<'_> {
1673 fn cmp(&self, other: &Self) -> Ordering {
1674 self.to_value().cmp(&other.to_value())
1676 }
1677}
1678
1679impl PartialOrd for StructValueRef<'_> {
1680 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1681 Some(self.cmp(other))
1682 }
1683}
1684
1685impl ValueRef<'_> {
1686 pub fn data_size(&self) -> usize {
1689 match self {
1690 ValueRef::Null => 8,
1693 ValueRef::Boolean(_) => 1,
1694 ValueRef::UInt8(_) => 1,
1695 ValueRef::UInt16(_) => 2,
1696 ValueRef::UInt32(_) => 4,
1697 ValueRef::UInt64(_) => 8,
1698 ValueRef::Int8(_) => 1,
1699 ValueRef::Int16(_) => 2,
1700 ValueRef::Int32(_) => 4,
1701 ValueRef::Int64(_) => 8,
1702 ValueRef::Float32(_) => 4,
1703 ValueRef::Float64(_) => 8,
1704 ValueRef::String(v) => std::mem::size_of_val(*v),
1705 ValueRef::Binary(v) => std::mem::size_of_val(*v),
1706 ValueRef::Date(_) => 4,
1707 ValueRef::Timestamp(_) => 16,
1708 ValueRef::Time(_) => 16,
1709 ValueRef::Duration(_) => 16,
1710 ValueRef::IntervalYearMonth(_) => 4,
1711 ValueRef::IntervalDayTime(_) => 8,
1712 ValueRef::IntervalMonthDayNano(_) => 16,
1713 ValueRef::Decimal128(_) => 32,
1714 ValueRef::List(v) => match v {
1715 ListValueRef::Indexed { vector, .. } => vector.memory_size() / vector.len(),
1716 ListValueRef::Ref { val } => val.estimated_size(),
1717 ListValueRef::RefList { val, .. } => {
1718 val.iter().map(|v| v.data_size()).sum::<usize>()
1719 + std::mem::size_of::<Arc<ConcreteDataType>>()
1720 }
1721 },
1722 ValueRef::Struct(val) => match val {
1723 StructValueRef::Indexed { vector, .. } => vector.memory_size() / vector.len(),
1724 StructValueRef::Ref(val) => val.estimated_size(),
1725 StructValueRef::RefList { val, .. } => {
1726 val.iter().map(|v| v.data_size()).sum::<usize>()
1727 + std::mem::size_of::<StructType>()
1728 }
1729 },
1730 ValueRef::Json(v) => v.data_size(),
1731 }
1732 }
1733}
1734
1735#[cfg(test)]
1736pub(crate) mod tests {
1737 use arrow::datatypes::{DataType as ArrowDataType, Field};
1738 use common_time::timezone::set_default_timezone;
1739 use num_traits::Float;
1740
1741 use super::*;
1742 use crate::json::value::{JsonVariant, JsonVariantRef};
1743 use crate::types::StructField;
1744 use crate::types::json_type::{JsonNativeType, JsonObjectType};
1745 use crate::vectors::ListVectorBuilder;
1746
1747 pub(crate) fn build_struct_type() -> StructType {
1748 StructType::new(Arc::new(vec![
1749 StructField::new("id".to_string(), ConcreteDataType::int32_datatype(), false),
1750 StructField::new(
1751 "name".to_string(),
1752 ConcreteDataType::string_datatype(),
1753 true,
1754 ),
1755 StructField::new("age".to_string(), ConcreteDataType::uint8_datatype(), true),
1756 StructField::new(
1757 "address".to_string(),
1758 ConcreteDataType::string_datatype(),
1759 true,
1760 ),
1761 StructField::new(
1762 "awards".to_string(),
1763 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::boolean_datatype())),
1764 true,
1765 ),
1766 ]))
1767 }
1768
1769 pub(crate) fn build_struct_value() -> StructValue {
1770 let struct_type = build_struct_type();
1771
1772 let struct_items = vec![
1773 Value::Int32(1),
1774 Value::String("tom".into()),
1775 Value::UInt8(25),
1776 Value::String("94038".into()),
1777 Value::List(build_list_value()),
1778 ];
1779 StructValue::try_new(struct_items, struct_type).unwrap()
1780 }
1781
1782 pub(crate) fn build_scalar_struct_value() -> ScalarValue {
1783 let struct_type = build_struct_type();
1784 let arrays = vec![
1785 ScalarValue::Int32(Some(1)).to_array().unwrap(),
1786 ScalarValue::Utf8(Some("tom".into())).to_array().unwrap(),
1787 ScalarValue::UInt8(Some(25)).to_array().unwrap(),
1788 ScalarValue::Utf8(Some("94038".into())).to_array().unwrap(),
1789 build_scalar_list_value().to_array().unwrap(),
1790 ];
1791 let struct_arrow_array = StructArray::new(struct_type.as_arrow_fields(), arrays, None);
1792 ScalarValue::Struct(Arc::new(struct_arrow_array))
1793 }
1794
1795 pub(crate) fn build_list_value() -> ListValue {
1796 let items = vec![Value::Boolean(true), Value::Boolean(false)];
1797 ListValue::new(items, Arc::new(ConcreteDataType::boolean_datatype()))
1798 }
1799
1800 pub(crate) fn build_scalar_list_value() -> ScalarValue {
1801 let items = vec![
1802 ScalarValue::Boolean(Some(true)),
1803 ScalarValue::Boolean(Some(false)),
1804 ];
1805 ScalarValue::List(ScalarValue::new_list(&items, &ArrowDataType::Boolean, true))
1806 }
1807
1808 #[test]
1809 fn test_try_from_scalar_value() {
1810 assert_eq!(
1811 Value::Boolean(true),
1812 ScalarValue::Boolean(Some(true)).try_into().unwrap()
1813 );
1814 assert_eq!(
1815 Value::Boolean(false),
1816 ScalarValue::Boolean(Some(false)).try_into().unwrap()
1817 );
1818 assert_eq!(Value::Null, ScalarValue::Boolean(None).try_into().unwrap());
1819
1820 assert_eq!(
1821 Value::Float32(1.0f32.into()),
1822 ScalarValue::Float32(Some(1.0f32)).try_into().unwrap()
1823 );
1824 assert_eq!(Value::Null, ScalarValue::Float32(None).try_into().unwrap());
1825
1826 assert_eq!(
1827 Value::Float64(2.0f64.into()),
1828 ScalarValue::Float64(Some(2.0f64)).try_into().unwrap()
1829 );
1830 assert_eq!(Value::Null, ScalarValue::Float64(None).try_into().unwrap());
1831
1832 assert_eq!(
1833 Value::Int8(i8::MAX),
1834 ScalarValue::Int8(Some(i8::MAX)).try_into().unwrap()
1835 );
1836 assert_eq!(Value::Null, ScalarValue::Int8(None).try_into().unwrap());
1837
1838 assert_eq!(
1839 Value::Int16(i16::MAX),
1840 ScalarValue::Int16(Some(i16::MAX)).try_into().unwrap()
1841 );
1842 assert_eq!(Value::Null, ScalarValue::Int16(None).try_into().unwrap());
1843
1844 assert_eq!(
1845 Value::Int32(i32::MAX),
1846 ScalarValue::Int32(Some(i32::MAX)).try_into().unwrap()
1847 );
1848 assert_eq!(Value::Null, ScalarValue::Int32(None).try_into().unwrap());
1849
1850 assert_eq!(
1851 Value::Int64(i64::MAX),
1852 ScalarValue::Int64(Some(i64::MAX)).try_into().unwrap()
1853 );
1854 assert_eq!(Value::Null, ScalarValue::Int64(None).try_into().unwrap());
1855
1856 assert_eq!(
1857 Value::UInt8(u8::MAX),
1858 ScalarValue::UInt8(Some(u8::MAX)).try_into().unwrap()
1859 );
1860 assert_eq!(Value::Null, ScalarValue::UInt8(None).try_into().unwrap());
1861
1862 assert_eq!(
1863 Value::UInt16(u16::MAX),
1864 ScalarValue::UInt16(Some(u16::MAX)).try_into().unwrap()
1865 );
1866 assert_eq!(Value::Null, ScalarValue::UInt16(None).try_into().unwrap());
1867
1868 assert_eq!(
1869 Value::UInt32(u32::MAX),
1870 ScalarValue::UInt32(Some(u32::MAX)).try_into().unwrap()
1871 );
1872 assert_eq!(Value::Null, ScalarValue::UInt32(None).try_into().unwrap());
1873
1874 assert_eq!(
1875 Value::UInt64(u64::MAX),
1876 ScalarValue::UInt64(Some(u64::MAX)).try_into().unwrap()
1877 );
1878 assert_eq!(Value::Null, ScalarValue::UInt64(None).try_into().unwrap());
1879
1880 assert_eq!(
1881 Value::from("hello"),
1882 ScalarValue::Utf8(Some("hello".to_string()))
1883 .try_into()
1884 .unwrap()
1885 );
1886 assert_eq!(Value::Null, ScalarValue::Utf8(None).try_into().unwrap());
1887
1888 assert_eq!(
1889 Value::from("large_hello"),
1890 ScalarValue::LargeUtf8(Some("large_hello".to_string()))
1891 .try_into()
1892 .unwrap()
1893 );
1894 assert_eq!(
1895 Value::Null,
1896 ScalarValue::LargeUtf8(None).try_into().unwrap()
1897 );
1898
1899 assert_eq!(
1900 Value::from("world".as_bytes()),
1901 ScalarValue::Binary(Some("world".as_bytes().to_vec()))
1902 .try_into()
1903 .unwrap()
1904 );
1905 assert_eq!(Value::Null, ScalarValue::Binary(None).try_into().unwrap());
1906
1907 assert_eq!(
1908 Value::from("large_world".as_bytes()),
1909 ScalarValue::LargeBinary(Some("large_world".as_bytes().to_vec()))
1910 .try_into()
1911 .unwrap()
1912 );
1913 assert_eq!(
1914 Value::Null,
1915 ScalarValue::LargeBinary(None).try_into().unwrap()
1916 );
1917
1918 assert_eq!(
1919 Value::List(build_list_value()),
1920 build_scalar_list_value().try_into().unwrap()
1921 );
1922 assert_eq!(
1923 Value::List(ListValue::new(
1924 vec![],
1925 Arc::new(ConcreteDataType::uint32_datatype())
1926 )),
1927 ScalarValue::List(ScalarValue::new_list(&[], &ArrowDataType::UInt32, true))
1928 .try_into()
1929 .unwrap()
1930 );
1931
1932 assert_eq!(
1933 Value::Date(Date::new(123)),
1934 ScalarValue::Date32(Some(123)).try_into().unwrap()
1935 );
1936 assert_eq!(Value::Null, ScalarValue::Date32(None).try_into().unwrap());
1937
1938 assert_eq!(
1939 Value::Timestamp(Timestamp::new(1, TimeUnit::Second)),
1940 ScalarValue::TimestampSecond(Some(1), None)
1941 .try_into()
1942 .unwrap()
1943 );
1944 assert_eq!(
1945 Value::Null,
1946 ScalarValue::TimestampSecond(None, None).try_into().unwrap()
1947 );
1948
1949 assert_eq!(
1950 Value::Timestamp(Timestamp::new(1, TimeUnit::Millisecond)),
1951 ScalarValue::TimestampMillisecond(Some(1), None)
1952 .try_into()
1953 .unwrap()
1954 );
1955 assert_eq!(
1956 Value::Null,
1957 ScalarValue::TimestampMillisecond(None, None)
1958 .try_into()
1959 .unwrap()
1960 );
1961
1962 assert_eq!(
1963 Value::Timestamp(Timestamp::new(1, TimeUnit::Microsecond)),
1964 ScalarValue::TimestampMicrosecond(Some(1), None)
1965 .try_into()
1966 .unwrap()
1967 );
1968 assert_eq!(
1969 Value::Null,
1970 ScalarValue::TimestampMicrosecond(None, None)
1971 .try_into()
1972 .unwrap()
1973 );
1974
1975 assert_eq!(
1976 Value::Timestamp(Timestamp::new(1, TimeUnit::Nanosecond)),
1977 ScalarValue::TimestampNanosecond(Some(1), None)
1978 .try_into()
1979 .unwrap()
1980 );
1981 assert_eq!(
1982 Value::Null,
1983 ScalarValue::TimestampNanosecond(None, None)
1984 .try_into()
1985 .unwrap()
1986 );
1987 assert_eq!(
1988 Value::Null,
1989 ScalarValue::IntervalMonthDayNano(None).try_into().unwrap()
1990 );
1991 assert_eq!(
1992 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 1, 1)),
1993 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::new(1, 1, 1).into()))
1994 .try_into()
1995 .unwrap()
1996 );
1997
1998 assert_eq!(
1999 Value::Time(Time::new(1, TimeUnit::Second)),
2000 ScalarValue::Time32Second(Some(1)).try_into().unwrap()
2001 );
2002 assert_eq!(
2003 Value::Null,
2004 ScalarValue::Time32Second(None).try_into().unwrap()
2005 );
2006
2007 assert_eq!(
2008 Value::Time(Time::new(1, TimeUnit::Millisecond)),
2009 ScalarValue::Time32Millisecond(Some(1)).try_into().unwrap()
2010 );
2011 assert_eq!(
2012 Value::Null,
2013 ScalarValue::Time32Millisecond(None).try_into().unwrap()
2014 );
2015
2016 assert_eq!(
2017 Value::Time(Time::new(1, TimeUnit::Microsecond)),
2018 ScalarValue::Time64Microsecond(Some(1)).try_into().unwrap()
2019 );
2020 assert_eq!(
2021 Value::Null,
2022 ScalarValue::Time64Microsecond(None).try_into().unwrap()
2023 );
2024
2025 assert_eq!(
2026 Value::Time(Time::new(1, TimeUnit::Nanosecond)),
2027 ScalarValue::Time64Nanosecond(Some(1)).try_into().unwrap()
2028 );
2029 assert_eq!(
2030 Value::Null,
2031 ScalarValue::Time64Nanosecond(None).try_into().unwrap()
2032 );
2033
2034 assert_eq!(
2035 Value::Duration(Duration::new_second(1)),
2036 ScalarValue::DurationSecond(Some(1)).try_into().unwrap()
2037 );
2038 assert_eq!(
2039 Value::Null,
2040 ScalarValue::DurationSecond(None).try_into().unwrap()
2041 );
2042
2043 assert_eq!(
2044 Value::Duration(Duration::new_millisecond(1)),
2045 ScalarValue::DurationMillisecond(Some(1))
2046 .try_into()
2047 .unwrap()
2048 );
2049 assert_eq!(
2050 Value::Null,
2051 ScalarValue::DurationMillisecond(None).try_into().unwrap()
2052 );
2053
2054 assert_eq!(
2055 Value::Duration(Duration::new_microsecond(1)),
2056 ScalarValue::DurationMicrosecond(Some(1))
2057 .try_into()
2058 .unwrap()
2059 );
2060 assert_eq!(
2061 Value::Null,
2062 ScalarValue::DurationMicrosecond(None).try_into().unwrap()
2063 );
2064
2065 assert_eq!(
2066 Value::Duration(Duration::new_nanosecond(1)),
2067 ScalarValue::DurationNanosecond(Some(1)).try_into().unwrap()
2068 );
2069 assert_eq!(
2070 Value::Null,
2071 ScalarValue::DurationNanosecond(None).try_into().unwrap()
2072 );
2073
2074 assert_eq!(
2075 Value::Decimal128(Decimal128::new(1, 38, 10)),
2076 ScalarValue::Decimal128(Some(1), 38, 10).try_into().unwrap()
2077 );
2078 assert_eq!(
2079 Value::Null,
2080 ScalarValue::Decimal128(None, 0, 0).try_into().unwrap()
2081 );
2082
2083 let struct_value = build_struct_value();
2084 let scalar_struct_value = build_scalar_struct_value();
2085 assert_eq!(
2086 Value::Struct(struct_value),
2087 scalar_struct_value.try_into().unwrap()
2088 );
2089 }
2090
2091 #[test]
2092 fn test_value_from_inner() {
2093 assert_eq!(Value::Boolean(true), Value::from(true));
2094 assert_eq!(Value::Boolean(false), Value::from(false));
2095
2096 assert_eq!(Value::UInt8(u8::MIN), Value::from(u8::MIN));
2097 assert_eq!(Value::UInt8(u8::MAX), Value::from(u8::MAX));
2098
2099 assert_eq!(Value::UInt16(u16::MIN), Value::from(u16::MIN));
2100 assert_eq!(Value::UInt16(u16::MAX), Value::from(u16::MAX));
2101
2102 assert_eq!(Value::UInt32(u32::MIN), Value::from(u32::MIN));
2103 assert_eq!(Value::UInt32(u32::MAX), Value::from(u32::MAX));
2104
2105 assert_eq!(Value::UInt64(u64::MIN), Value::from(u64::MIN));
2106 assert_eq!(Value::UInt64(u64::MAX), Value::from(u64::MAX));
2107
2108 assert_eq!(Value::Int8(i8::MIN), Value::from(i8::MIN));
2109 assert_eq!(Value::Int8(i8::MAX), Value::from(i8::MAX));
2110
2111 assert_eq!(Value::Int16(i16::MIN), Value::from(i16::MIN));
2112 assert_eq!(Value::Int16(i16::MAX), Value::from(i16::MAX));
2113
2114 assert_eq!(Value::Int32(i32::MIN), Value::from(i32::MIN));
2115 assert_eq!(Value::Int32(i32::MAX), Value::from(i32::MAX));
2116
2117 assert_eq!(Value::Int64(i64::MIN), Value::from(i64::MIN));
2118 assert_eq!(Value::Int64(i64::MAX), Value::from(i64::MAX));
2119
2120 assert_eq!(
2121 Value::Float32(OrderedFloat(f32::MIN)),
2122 Value::from(f32::MIN)
2123 );
2124 assert_eq!(
2125 Value::Float32(OrderedFloat(f32::MAX)),
2126 Value::from(f32::MAX)
2127 );
2128
2129 assert_eq!(
2130 Value::Float64(OrderedFloat(f64::MIN)),
2131 Value::from(f64::MIN)
2132 );
2133 assert_eq!(
2134 Value::Float64(OrderedFloat(f64::MAX)),
2135 Value::from(f64::MAX)
2136 );
2137
2138 let string_bytes = StringBytes::from("hello");
2139 assert_eq!(
2140 Value::String(string_bytes.clone()),
2141 Value::from(string_bytes)
2142 );
2143
2144 let bytes = Bytes::from(b"world".as_slice());
2145 assert_eq!(Value::Binary(bytes.clone()), Value::from(bytes));
2146 }
2147
2148 fn check_type_and_value(data_type: &ConcreteDataType, value: &Value) {
2149 assert_eq!(*data_type, value.data_type());
2150 assert_eq!(data_type.logical_type_id(), value.logical_type_id());
2151 }
2152
2153 #[test]
2154 fn test_value_datatype() {
2155 check_type_and_value(&ConcreteDataType::boolean_datatype(), &Value::Boolean(true));
2156 check_type_and_value(&ConcreteDataType::uint8_datatype(), &Value::UInt8(u8::MIN));
2157 check_type_and_value(
2158 &ConcreteDataType::uint16_datatype(),
2159 &Value::UInt16(u16::MIN),
2160 );
2161 check_type_and_value(
2162 &ConcreteDataType::uint16_datatype(),
2163 &Value::UInt16(u16::MAX),
2164 );
2165 check_type_and_value(
2166 &ConcreteDataType::uint32_datatype(),
2167 &Value::UInt32(u32::MIN),
2168 );
2169 check_type_and_value(
2170 &ConcreteDataType::uint64_datatype(),
2171 &Value::UInt64(u64::MIN),
2172 );
2173 check_type_and_value(&ConcreteDataType::int8_datatype(), &Value::Int8(i8::MIN));
2174 check_type_and_value(&ConcreteDataType::int16_datatype(), &Value::Int16(i16::MIN));
2175 check_type_and_value(&ConcreteDataType::int32_datatype(), &Value::Int32(i32::MIN));
2176 check_type_and_value(&ConcreteDataType::int64_datatype(), &Value::Int64(i64::MIN));
2177 check_type_and_value(
2178 &ConcreteDataType::float32_datatype(),
2179 &Value::Float32(OrderedFloat(f32::MIN)),
2180 );
2181 check_type_and_value(
2182 &ConcreteDataType::float64_datatype(),
2183 &Value::Float64(OrderedFloat(f64::MIN)),
2184 );
2185 check_type_and_value(
2186 &ConcreteDataType::string_datatype(),
2187 &Value::String(StringBytes::from("hello")),
2188 );
2189 check_type_and_value(
2190 &ConcreteDataType::binary_datatype(),
2191 &Value::Binary(Bytes::from(b"world".as_slice())),
2192 );
2193 let item_type = Arc::new(ConcreteDataType::int32_datatype());
2194 check_type_and_value(
2195 &ConcreteDataType::list_datatype(item_type.clone()),
2196 &Value::List(ListValue::new(vec![Value::Int32(10)], item_type.clone())),
2197 );
2198 check_type_and_value(
2199 &ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::null_datatype())),
2200 &Value::List(ListValue::default()),
2201 );
2202 check_type_and_value(
2203 &ConcreteDataType::date_datatype(),
2204 &Value::Date(Date::new(1)),
2205 );
2206 check_type_and_value(
2207 &ConcreteDataType::timestamp_millisecond_datatype(),
2208 &Value::Timestamp(Timestamp::new_millisecond(1)),
2209 );
2210 check_type_and_value(
2211 &ConcreteDataType::time_second_datatype(),
2212 &Value::Time(Time::new_second(1)),
2213 );
2214 check_type_and_value(
2215 &ConcreteDataType::time_millisecond_datatype(),
2216 &Value::Time(Time::new_millisecond(1)),
2217 );
2218 check_type_and_value(
2219 &ConcreteDataType::time_microsecond_datatype(),
2220 &Value::Time(Time::new_microsecond(1)),
2221 );
2222 check_type_and_value(
2223 &ConcreteDataType::time_nanosecond_datatype(),
2224 &Value::Time(Time::new_nanosecond(1)),
2225 );
2226 check_type_and_value(
2227 &ConcreteDataType::interval_year_month_datatype(),
2228 &Value::IntervalYearMonth(IntervalYearMonth::new(1)),
2229 );
2230 check_type_and_value(
2231 &ConcreteDataType::interval_day_time_datatype(),
2232 &Value::IntervalDayTime(IntervalDayTime::new(1, 2)),
2233 );
2234 check_type_and_value(
2235 &ConcreteDataType::interval_month_day_nano_datatype(),
2236 &Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
2237 );
2238 check_type_and_value(
2239 &ConcreteDataType::duration_second_datatype(),
2240 &Value::Duration(Duration::new_second(1)),
2241 );
2242 check_type_and_value(
2243 &ConcreteDataType::duration_millisecond_datatype(),
2244 &Value::Duration(Duration::new_millisecond(1)),
2245 );
2246 check_type_and_value(
2247 &ConcreteDataType::duration_microsecond_datatype(),
2248 &Value::Duration(Duration::new_microsecond(1)),
2249 );
2250 check_type_and_value(
2251 &ConcreteDataType::duration_nanosecond_datatype(),
2252 &Value::Duration(Duration::new_nanosecond(1)),
2253 );
2254 check_type_and_value(
2255 &ConcreteDataType::decimal128_datatype(38, 10),
2256 &Value::Decimal128(Decimal128::new(1, 38, 10)),
2257 );
2258
2259 let item_type = Arc::new(ConcreteDataType::boolean_datatype());
2260 check_type_and_value(
2261 &ConcreteDataType::list_datatype(item_type.clone()),
2262 &Value::List(ListValue::new(
2263 vec![Value::Boolean(true)],
2264 item_type.clone(),
2265 )),
2266 );
2267
2268 check_type_and_value(
2269 &ConcreteDataType::struct_datatype(build_struct_type()),
2270 &Value::Struct(build_struct_value()),
2271 );
2272
2273 check_type_and_value(
2274 &ConcreteDataType::json2(JsonNativeType::Bool),
2275 &Value::Json(Box::new(true.into())),
2276 );
2277
2278 check_type_and_value(
2279 &ConcreteDataType::json2(JsonNativeType::Array(Box::new(JsonNativeType::Bool))),
2280 &Value::Json(Box::new([true].into())),
2281 );
2282
2283 check_type_and_value(
2284 &ConcreteDataType::json2(JsonNativeType::Object(JsonObjectType::from([
2285 ("address".to_string(), JsonNativeType::String),
2286 ("age".to_string(), JsonNativeType::u64()),
2287 (
2288 "awards".to_string(),
2289 JsonNativeType::Array(Box::new(JsonNativeType::Bool)),
2290 ),
2291 ("id".to_string(), JsonNativeType::i64()),
2292 ("name".to_string(), JsonNativeType::String),
2293 ]))),
2294 &Value::Json(Box::new(
2295 [
2296 ("id", JsonVariant::from(1i64)),
2297 ("name", "Alice".into()),
2298 ("age", 1u64.into()),
2299 ("address", "blah".into()),
2300 ("awards", [true, false].into()),
2301 ]
2302 .into(),
2303 )),
2304 );
2305 }
2306
2307 #[test]
2308 fn test_value_from_string() {
2309 let hello = "hello".to_string();
2310 assert_eq!(
2311 Value::String(StringBytes::from(hello.clone())),
2312 Value::from(hello)
2313 );
2314
2315 let world = "world";
2316 assert_eq!(Value::String(StringBytes::from(world)), Value::from(world));
2317 }
2318
2319 #[test]
2320 fn test_value_from_bytes() {
2321 let hello = b"hello".to_vec();
2322 assert_eq!(
2323 Value::Binary(Bytes::from(hello.clone())),
2324 Value::from(hello)
2325 );
2326
2327 let world: &[u8] = b"world";
2328 assert_eq!(Value::Binary(Bytes::from(world)), Value::from(world));
2329 }
2330
2331 fn to_json(value: Value) -> serde_json::Value {
2332 value.try_into().unwrap()
2333 }
2334
2335 #[test]
2336 fn test_to_json_value() {
2337 assert_eq!(serde_json::Value::Null, to_json(Value::Null));
2338 assert_eq!(serde_json::Value::Bool(true), to_json(Value::Boolean(true)));
2339 assert_eq!(
2340 serde_json::Value::Number(20u8.into()),
2341 to_json(Value::UInt8(20))
2342 );
2343 assert_eq!(
2344 serde_json::Value::Number(20i8.into()),
2345 to_json(Value::Int8(20))
2346 );
2347 assert_eq!(
2348 serde_json::Value::Number(2000u16.into()),
2349 to_json(Value::UInt16(2000))
2350 );
2351 assert_eq!(
2352 serde_json::Value::Number(2000i16.into()),
2353 to_json(Value::Int16(2000))
2354 );
2355 assert_eq!(
2356 serde_json::Value::Number(3000u32.into()),
2357 to_json(Value::UInt32(3000))
2358 );
2359 assert_eq!(
2360 serde_json::Value::Number(3000i32.into()),
2361 to_json(Value::Int32(3000))
2362 );
2363 assert_eq!(
2364 serde_json::Value::Number(4000u64.into()),
2365 to_json(Value::UInt64(4000))
2366 );
2367 assert_eq!(
2368 serde_json::Value::Number(4000i64.into()),
2369 to_json(Value::Int64(4000))
2370 );
2371 assert_eq!(
2372 serde_json::Value::from(125.0f32),
2373 to_json(Value::Float32(125.0.into()))
2374 );
2375 assert_eq!(
2376 serde_json::Value::from(125.0f64),
2377 to_json(Value::Float64(125.0.into()))
2378 );
2379 assert_eq!(
2380 serde_json::Value::String(String::from("hello")),
2381 to_json(Value::String(StringBytes::from("hello")))
2382 );
2383 assert_eq!(
2384 serde_json::Value::from(b"world".as_slice()),
2385 to_json(Value::Binary(Bytes::from(b"world".as_slice())))
2386 );
2387 assert_eq!(
2388 serde_json::Value::Number(5000i32.into()),
2389 to_json(Value::Date(Date::new(5000)))
2390 );
2391 assert_eq!(
2392 serde_json::Value::Number(1.into()),
2393 to_json(Value::Timestamp(Timestamp::new_millisecond(1)))
2394 );
2395 assert_eq!(
2396 serde_json::Value::Number(1.into()),
2397 to_json(Value::Time(Time::new_millisecond(1)))
2398 );
2399 assert_eq!(
2400 serde_json::Value::Number(1.into()),
2401 to_json(Value::Duration(Duration::new_millisecond(1)))
2402 );
2403
2404 let json_value: serde_json::Value = serde_json::from_str(r#"[123]"#).unwrap();
2405 assert_eq!(
2406 json_value,
2407 to_json(Value::List(ListValue {
2408 items: vec![Value::Int32(123)],
2409 datatype: Arc::new(ConcreteDataType::int32_datatype()),
2410 }))
2411 );
2412
2413 let struct_value = StructValue::try_new(
2414 vec![
2415 Value::Int64(42),
2416 Value::String("tomcat".into()),
2417 Value::Boolean(true),
2418 ],
2419 StructType::new(Arc::new(vec![
2420 StructField::new("num".to_string(), ConcreteDataType::int64_datatype(), true),
2421 StructField::new(
2422 "name".to_string(),
2423 ConcreteDataType::string_datatype(),
2424 true,
2425 ),
2426 StructField::new(
2427 "yes_or_no".to_string(),
2428 ConcreteDataType::boolean_datatype(),
2429 true,
2430 ),
2431 ])),
2432 )
2433 .unwrap();
2434 assert_eq!(
2435 serde_json::Value::try_from(Value::Struct(struct_value.clone())).unwrap(),
2436 serde_json::json!({
2437 "num": 42,
2438 "name": "tomcat",
2439 "yes_or_no": true
2440 })
2441 );
2442
2443 assert_eq!(
2445 serde_json::Value::try_from(Value::Json(Box::new("hello".into()))).unwrap(),
2446 serde_json::json!("hello")
2447 );
2448
2449 assert_eq!(
2451 serde_json::Value::try_from(Value::Json(Box::new([1i64, 2, 3,].into()))).unwrap(),
2452 serde_json::json!([1, 2, 3])
2453 );
2454
2455 assert_eq!(
2457 serde_json::Value::try_from(Value::Json(Box::new(
2458 [
2459 ("num".to_string(), JsonVariant::from(42i64)),
2460 ("name".to_string(), "tomcat".into()),
2461 ("yes_or_no".to_string(), true.into()),
2462 ]
2463 .into()
2464 )))
2465 .unwrap(),
2466 serde_json::json!({
2467 "num": 42,
2468 "name": "tomcat",
2469 "yes_or_no": true
2470 })
2471 );
2472 }
2473
2474 #[test]
2475 fn test_null_value() {
2476 assert!(Value::Null.is_null());
2477 assert!(Value::Json(Box::new(JsonValue::null())).is_null());
2478 assert!(!Value::Boolean(true).is_null());
2479 assert!(Value::Null < Value::Boolean(false));
2480 assert!(Value::Boolean(true) > Value::Null);
2481 assert!(Value::Null < Value::Int32(10));
2482 assert!(Value::Int32(10) > Value::Null);
2483 }
2484
2485 #[test]
2486 fn test_null_value_ref() {
2487 assert!(ValueRef::Null.is_null());
2488 assert!(!ValueRef::Boolean(true).is_null());
2489 assert!(ValueRef::Null < ValueRef::Boolean(false));
2490 assert!(ValueRef::Boolean(true) > ValueRef::Null);
2491 assert!(ValueRef::Null < ValueRef::Int32(10));
2492 assert!(ValueRef::Int32(10) > ValueRef::Null);
2493 }
2494
2495 #[test]
2496 fn test_as_value_ref() {
2497 macro_rules! check_as_value_ref {
2498 ($Variant: ident, $data: expr) => {
2499 let value = Value::$Variant($data);
2500 let value_ref = value.as_value_ref();
2501 let expect_ref = ValueRef::$Variant($data);
2502
2503 assert_eq!(expect_ref, value_ref);
2504 };
2505 }
2506
2507 assert_eq!(ValueRef::Null, Value::Null.as_value_ref());
2508 check_as_value_ref!(Boolean, true);
2509 check_as_value_ref!(UInt8, 123);
2510 check_as_value_ref!(UInt16, 123);
2511 check_as_value_ref!(UInt32, 123);
2512 check_as_value_ref!(UInt64, 123);
2513 check_as_value_ref!(Int8, -12);
2514 check_as_value_ref!(Int16, -12);
2515 check_as_value_ref!(Int32, -12);
2516 check_as_value_ref!(Int64, -12);
2517 check_as_value_ref!(Float32, OrderedF32::from(16.0));
2518 check_as_value_ref!(Float64, OrderedF64::from(16.0));
2519 check_as_value_ref!(Timestamp, Timestamp::new_millisecond(1));
2520 check_as_value_ref!(Time, Time::new_millisecond(1));
2521 check_as_value_ref!(IntervalYearMonth, IntervalYearMonth::new(1));
2522 check_as_value_ref!(IntervalDayTime, IntervalDayTime::new(1, 2));
2523 check_as_value_ref!(IntervalMonthDayNano, IntervalMonthDayNano::new(1, 2, 3));
2524 check_as_value_ref!(Duration, Duration::new_millisecond(1));
2525
2526 assert_eq!(
2527 ValueRef::String("hello"),
2528 Value::String("hello".into()).as_value_ref()
2529 );
2530 assert_eq!(
2531 ValueRef::Binary(b"hello"),
2532 Value::Binary("hello".as_bytes().into()).as_value_ref()
2533 );
2534
2535 check_as_value_ref!(Date, Date::new(103));
2536
2537 let list = build_list_value();
2538 assert_eq!(
2539 ValueRef::List(ListValueRef::Ref { val: &list }),
2540 Value::List(list.clone()).as_value_ref()
2541 );
2542
2543 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2544 .unwrap()
2545 .to_vec();
2546 assert_eq!(
2547 ValueRef::Binary(jsonb_value.clone().as_slice()),
2548 Value::Binary(jsonb_value.into()).as_value_ref()
2549 );
2550
2551 let struct_value = build_struct_value();
2552 assert_eq!(
2553 ValueRef::Struct(StructValueRef::Ref(&struct_value)),
2554 Value::Struct(struct_value.clone()).as_value_ref()
2555 );
2556 }
2557
2558 #[test]
2559 fn test_value_ref_as() {
2560 macro_rules! check_as_null {
2561 ($method: ident) => {
2562 assert_eq!(None, ValueRef::Null.$method().unwrap());
2563 };
2564 }
2565
2566 check_as_null!(try_into_binary);
2567 check_as_null!(try_into_string);
2568 check_as_null!(try_into_boolean);
2569 check_as_null!(try_into_list);
2570 check_as_null!(try_into_struct);
2571
2572 macro_rules! check_as_correct {
2573 ($data: expr, $Variant: ident, $method: ident) => {
2574 assert_eq!(Some($data), ValueRef::$Variant($data).$method().unwrap());
2575 };
2576 }
2577
2578 check_as_correct!("hello", String, try_into_string);
2579 check_as_correct!("hello".as_bytes(), Binary, try_into_binary);
2580 check_as_correct!(true, Boolean, try_into_boolean);
2581 check_as_correct!(Date::new(123), Date, try_into_date);
2582 check_as_correct!(Time::new_second(12), Time, try_into_time);
2583 check_as_correct!(Duration::new_second(12), Duration, try_into_duration);
2584
2585 let list = build_list_value();
2586 check_as_correct!(ListValueRef::Ref { val: &list }, List, try_into_list);
2587
2588 let struct_value = build_struct_value();
2589 check_as_correct!(StructValueRef::Ref(&struct_value), Struct, try_into_struct);
2590
2591 let wrong_value = ValueRef::Int32(12345);
2592 assert!(wrong_value.try_into_binary().is_err());
2593 assert!(wrong_value.try_into_string().is_err());
2594 assert!(wrong_value.try_into_boolean().is_err());
2595 assert!(wrong_value.try_into_list().is_err());
2596 assert!(wrong_value.try_into_struct().is_err());
2597 assert!(wrong_value.try_into_date().is_err());
2598 assert!(wrong_value.try_into_time().is_err());
2599 assert!(wrong_value.try_into_timestamp().is_err());
2600 assert!(wrong_value.try_into_duration().is_err());
2601 }
2602
2603 #[test]
2604 fn test_display() {
2605 set_default_timezone(Some("Asia/Shanghai")).unwrap();
2606 assert_eq!(Value::Null.to_string(), "Null");
2607 assert_eq!(Value::UInt8(8).to_string(), "8");
2608 assert_eq!(Value::UInt16(16).to_string(), "16");
2609 assert_eq!(Value::UInt32(32).to_string(), "32");
2610 assert_eq!(Value::UInt64(64).to_string(), "64");
2611 assert_eq!(Value::Int8(-8).to_string(), "-8");
2612 assert_eq!(Value::Int16(-16).to_string(), "-16");
2613 assert_eq!(Value::Int32(-32).to_string(), "-32");
2614 assert_eq!(Value::Int64(-64).to_string(), "-64");
2615 assert_eq!(Value::Float32((-32.123).into()).to_string(), "-32.123");
2616 assert_eq!(Value::Float64((-64.123).into()).to_string(), "-64.123");
2617 assert_eq!(Value::Float64(OrderedF64::infinity()).to_string(), "inf");
2618 assert_eq!(Value::Float64(OrderedF64::nan()).to_string(), "NaN");
2619 assert_eq!(Value::String(StringBytes::from("123")).to_string(), "123");
2620 assert_eq!(
2621 Value::Binary(Bytes::from(vec![1, 2, 3])).to_string(),
2622 "010203"
2623 );
2624 assert_eq!(Value::Date(Date::new(0)).to_string(), "1970-01-01");
2625 assert_eq!(
2626 Value::Timestamp(Timestamp::new(1000, TimeUnit::Millisecond)).to_string(),
2627 "1970-01-01 08:00:01+0800"
2628 );
2629 assert_eq!(
2630 Value::Time(Time::new(1000, TimeUnit::Millisecond)).to_string(),
2631 "08:00:01+0800"
2632 );
2633 assert_eq!(
2634 Value::Duration(Duration::new_millisecond(1000)).to_string(),
2635 "1000ms"
2636 );
2637 assert_eq!(
2638 Value::List(build_list_value()).to_string(),
2639 "Boolean[true, false]"
2640 );
2641 assert_eq!(
2642 Value::List(ListValue::new(
2643 vec![],
2644 Arc::new(ConcreteDataType::timestamp_second_datatype()),
2645 ))
2646 .to_string(),
2647 "TimestampSecond[]"
2648 );
2649 assert_eq!(
2650 Value::List(ListValue::new(
2651 vec![],
2652 Arc::new(ConcreteDataType::timestamp_millisecond_datatype()),
2653 ))
2654 .to_string(),
2655 "TimestampMillisecond[]"
2656 );
2657 assert_eq!(
2658 Value::List(ListValue::new(
2659 vec![],
2660 Arc::new(ConcreteDataType::timestamp_microsecond_datatype()),
2661 ))
2662 .to_string(),
2663 "TimestampMicrosecond[]"
2664 );
2665 assert_eq!(
2666 Value::List(ListValue::new(
2667 vec![],
2668 Arc::new(ConcreteDataType::timestamp_nanosecond_datatype()),
2669 ))
2670 .to_string(),
2671 "TimestampNanosecond[]"
2672 );
2673
2674 assert_eq!(
2675 Value::Struct(build_struct_value()).to_string(),
2676 "{ id: 1, name: tom, age: 25, address: 94038, awards: Boolean[true, false] }"
2677 );
2678
2679 assert_eq!(
2680 Value::Json(Box::new(
2681 [
2682 ("id", JsonVariant::from(1i64)),
2683 ("name", "tom".into()),
2684 ("age", 25u64.into()),
2685 ("address", "94038".into()),
2686 ("awards", [true, false].into()),
2687 ]
2688 .into()
2689 ))
2690 .to_string(),
2691 "Json({ address: 94038, age: 25, awards: [true, false], id: 1, name: tom })"
2692 )
2693 }
2694
2695 #[test]
2696 fn test_not_null_value_to_scalar_value() {
2697 assert_eq!(
2698 ScalarValue::Boolean(Some(true)),
2699 Value::Boolean(true)
2700 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2701 .unwrap()
2702 );
2703 assert_eq!(
2704 ScalarValue::Boolean(Some(false)),
2705 Value::Boolean(false)
2706 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2707 .unwrap()
2708 );
2709 assert_eq!(
2710 ScalarValue::UInt8(Some(1)),
2711 Value::UInt8(1)
2712 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2713 .unwrap()
2714 );
2715 assert_eq!(
2716 ScalarValue::UInt16(Some(2)),
2717 Value::UInt16(2)
2718 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2719 .unwrap()
2720 );
2721 assert_eq!(
2722 ScalarValue::UInt32(Some(3)),
2723 Value::UInt32(3)
2724 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2725 .unwrap()
2726 );
2727 assert_eq!(
2728 ScalarValue::UInt64(Some(4)),
2729 Value::UInt64(4)
2730 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2731 .unwrap()
2732 );
2733 assert_eq!(
2734 ScalarValue::Int8(Some(i8::MIN + 4)),
2735 Value::Int8(i8::MIN + 4)
2736 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2737 .unwrap()
2738 );
2739 assert_eq!(
2740 ScalarValue::Int16(Some(i16::MIN + 5)),
2741 Value::Int16(i16::MIN + 5)
2742 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2743 .unwrap()
2744 );
2745 assert_eq!(
2746 ScalarValue::Int32(Some(i32::MIN + 6)),
2747 Value::Int32(i32::MIN + 6)
2748 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2749 .unwrap()
2750 );
2751 assert_eq!(
2752 ScalarValue::Int64(Some(i64::MIN + 7)),
2753 Value::Int64(i64::MIN + 7)
2754 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2755 .unwrap()
2756 );
2757 assert_eq!(
2758 ScalarValue::Float32(Some(8.0f32)),
2759 Value::Float32(OrderedFloat(8.0f32))
2760 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2761 .unwrap()
2762 );
2763 assert_eq!(
2764 ScalarValue::Float64(Some(9.0f64)),
2765 Value::Float64(OrderedFloat(9.0f64))
2766 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2767 .unwrap()
2768 );
2769 assert_eq!(
2770 ScalarValue::Utf8(Some("hello".to_string())),
2771 Value::String(StringBytes::from("hello"))
2772 .try_to_scalar_value(&ConcreteDataType::string_datatype(),)
2773 .unwrap()
2774 );
2775 assert_eq!(
2776 ScalarValue::Binary(Some("world".as_bytes().to_vec())),
2777 Value::Binary(Bytes::from("world".as_bytes()))
2778 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2779 .unwrap()
2780 );
2781
2782 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2783 .unwrap()
2784 .to_vec();
2785 assert_eq!(
2786 ScalarValue::Binary(Some(jsonb_value.clone())),
2787 Value::Binary(jsonb_value.into())
2788 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2789 .unwrap()
2790 );
2791
2792 assert_eq!(
2793 build_scalar_struct_value(),
2794 Value::Struct(build_struct_value())
2795 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
2796 .unwrap()
2797 );
2798
2799 assert_eq!(
2800 build_scalar_list_value(),
2801 Value::List(build_list_value())
2802 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
2803 ConcreteDataType::boolean_datatype()
2804 )))
2805 .unwrap()
2806 );
2807 }
2808
2809 #[test]
2810 fn test_null_value_to_scalar_value() {
2811 assert_eq!(
2812 ScalarValue::Boolean(None),
2813 Value::Null
2814 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2815 .unwrap()
2816 );
2817 assert_eq!(
2818 ScalarValue::UInt8(None),
2819 Value::Null
2820 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2821 .unwrap()
2822 );
2823 assert_eq!(
2824 ScalarValue::UInt16(None),
2825 Value::Null
2826 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2827 .unwrap()
2828 );
2829 assert_eq!(
2830 ScalarValue::UInt32(None),
2831 Value::Null
2832 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2833 .unwrap()
2834 );
2835 assert_eq!(
2836 ScalarValue::UInt64(None),
2837 Value::Null
2838 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2839 .unwrap()
2840 );
2841 assert_eq!(
2842 ScalarValue::Int8(None),
2843 Value::Null
2844 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2845 .unwrap()
2846 );
2847 assert_eq!(
2848 ScalarValue::Int16(None),
2849 Value::Null
2850 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2851 .unwrap()
2852 );
2853 assert_eq!(
2854 ScalarValue::Int32(None),
2855 Value::Null
2856 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2857 .unwrap()
2858 );
2859 assert_eq!(
2860 ScalarValue::Int64(None),
2861 Value::Null
2862 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2863 .unwrap()
2864 );
2865 assert_eq!(
2866 ScalarValue::Float32(None),
2867 Value::Null
2868 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2869 .unwrap()
2870 );
2871 assert_eq!(
2872 ScalarValue::Float64(None),
2873 Value::Null
2874 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2875 .unwrap()
2876 );
2877 assert_eq!(
2878 ScalarValue::Utf8(None),
2879 Value::Null
2880 .try_to_scalar_value(&ConcreteDataType::string_datatype())
2881 .unwrap()
2882 );
2883 assert_eq!(
2884 ScalarValue::Binary(None),
2885 Value::Null
2886 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2887 .unwrap()
2888 );
2889
2890 assert_eq!(
2891 ScalarValue::Time32Second(None),
2892 Value::Null
2893 .try_to_scalar_value(&ConcreteDataType::time_second_datatype())
2894 .unwrap()
2895 );
2896 assert_eq!(
2897 ScalarValue::Time32Millisecond(None),
2898 Value::Null
2899 .try_to_scalar_value(&ConcreteDataType::time_millisecond_datatype())
2900 .unwrap()
2901 );
2902 assert_eq!(
2903 ScalarValue::Time64Microsecond(None),
2904 Value::Null
2905 .try_to_scalar_value(&ConcreteDataType::time_microsecond_datatype())
2906 .unwrap()
2907 );
2908 assert_eq!(
2909 ScalarValue::Time64Nanosecond(None),
2910 Value::Null
2911 .try_to_scalar_value(&ConcreteDataType::time_nanosecond_datatype())
2912 .unwrap()
2913 );
2914
2915 assert_eq!(
2916 ScalarValue::DurationSecond(None),
2917 Value::Null
2918 .try_to_scalar_value(&ConcreteDataType::duration_second_datatype())
2919 .unwrap()
2920 );
2921 assert_eq!(
2922 ScalarValue::DurationMillisecond(None),
2923 Value::Null
2924 .try_to_scalar_value(&ConcreteDataType::duration_millisecond_datatype())
2925 .unwrap()
2926 );
2927 assert_eq!(
2928 ScalarValue::DurationMicrosecond(None),
2929 Value::Null
2930 .try_to_scalar_value(&ConcreteDataType::duration_microsecond_datatype())
2931 .unwrap()
2932 );
2933 assert_eq!(
2934 ScalarValue::DurationNanosecond(None),
2935 Value::Null
2936 .try_to_scalar_value(&ConcreteDataType::duration_nanosecond_datatype())
2937 .unwrap()
2938 );
2939 assert_eq!(
2940 ScalarValue::Binary(None),
2941 Value::Null
2942 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2943 .unwrap()
2944 );
2945
2946 assert_eq!(
2947 ScalarValue::new_null_list(ArrowDataType::Boolean, true, 1),
2948 Value::Null
2949 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
2950 ConcreteDataType::boolean_datatype()
2951 )))
2952 .unwrap()
2953 );
2954
2955 assert_eq!(
2956 ScalarStructBuilder::new_null(build_struct_type().as_arrow_fields()),
2957 Value::Null
2958 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
2959 .unwrap()
2960 );
2961 }
2962
2963 #[test]
2964 fn test_list_value_to_scalar_value() {
2965 let items = vec![Value::Int32(-1), Value::Null];
2966 let item_type = Arc::new(ConcreteDataType::int32_datatype());
2967 let list = Value::List(ListValue::new(items, item_type.clone()));
2968 let df_list = list
2969 .try_to_scalar_value(&ConcreteDataType::list_datatype(item_type.clone()))
2970 .unwrap();
2971 assert!(matches!(df_list, ScalarValue::List(_)));
2972 match df_list {
2973 ScalarValue::List(vs) => {
2974 assert_eq!(
2975 ArrowDataType::List(Arc::new(Field::new_list_field(
2976 ArrowDataType::Int32,
2977 true
2978 ))),
2979 *vs.data_type()
2980 );
2981
2982 let vs = ScalarValue::convert_array_to_scalar_vec(vs.as_ref())
2983 .unwrap()
2984 .into_iter()
2985 .flatten()
2986 .flatten()
2987 .collect::<Vec<_>>();
2988 assert_eq!(
2989 vs,
2990 vec![ScalarValue::Int32(Some(-1)), ScalarValue::Int32(None)]
2991 );
2992 }
2993 _ => unreachable!(),
2994 }
2995 }
2996
2997 #[test]
2998 fn test_struct_value_to_scalar_value() {
2999 let struct_value = build_struct_value();
3000 let scalar_value = struct_value
3001 .try_to_scalar_value(&build_struct_type())
3002 .unwrap();
3003
3004 assert_eq!(scalar_value, build_scalar_struct_value());
3005
3006 assert!(matches!(scalar_value, ScalarValue::Struct(_)));
3007 match scalar_value {
3008 ScalarValue::Struct(values) => {
3009 assert_eq!(&build_struct_type().as_arrow_fields(), values.fields());
3010
3011 assert_eq!(
3012 ScalarValue::try_from_array(values.column(0), 0).unwrap(),
3013 ScalarValue::Int32(Some(1))
3014 );
3015 assert_eq!(
3016 ScalarValue::try_from_array(values.column(1), 0).unwrap(),
3017 ScalarValue::Utf8(Some("tom".into()))
3018 );
3019 assert_eq!(
3020 ScalarValue::try_from_array(values.column(2), 0).unwrap(),
3021 ScalarValue::UInt8(Some(25))
3022 );
3023 assert_eq!(
3024 ScalarValue::try_from_array(values.column(3), 0).unwrap(),
3025 ScalarValue::Utf8(Some("94038".into()))
3026 );
3027 }
3028 _ => panic!("Unexpected value type"),
3029 }
3030 }
3031
3032 #[test]
3033 fn test_timestamp_to_scalar_value() {
3034 assert_eq!(
3035 ScalarValue::TimestampSecond(Some(1), None),
3036 timestamp_to_scalar_value(TimeUnit::Second, Some(1))
3037 );
3038 assert_eq!(
3039 ScalarValue::TimestampMillisecond(Some(1), None),
3040 timestamp_to_scalar_value(TimeUnit::Millisecond, Some(1))
3041 );
3042 assert_eq!(
3043 ScalarValue::TimestampMicrosecond(Some(1), None),
3044 timestamp_to_scalar_value(TimeUnit::Microsecond, Some(1))
3045 );
3046 assert_eq!(
3047 ScalarValue::TimestampNanosecond(Some(1), None),
3048 timestamp_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3049 );
3050 }
3051
3052 #[test]
3053 fn test_time_to_scalar_value() {
3054 assert_eq!(
3055 ScalarValue::Time32Second(Some(1)),
3056 time_to_scalar_value(TimeUnit::Second, Some(1)).unwrap()
3057 );
3058 assert_eq!(
3059 ScalarValue::Time32Millisecond(Some(1)),
3060 time_to_scalar_value(TimeUnit::Millisecond, Some(1)).unwrap()
3061 );
3062 assert_eq!(
3063 ScalarValue::Time64Microsecond(Some(1)),
3064 time_to_scalar_value(TimeUnit::Microsecond, Some(1)).unwrap()
3065 );
3066 assert_eq!(
3067 ScalarValue::Time64Nanosecond(Some(1)),
3068 time_to_scalar_value(TimeUnit::Nanosecond, Some(1)).unwrap()
3069 );
3070 }
3071
3072 #[test]
3073 fn test_duration_to_scalar_value() {
3074 assert_eq!(
3075 ScalarValue::DurationSecond(Some(1)),
3076 duration_to_scalar_value(TimeUnit::Second, Some(1))
3077 );
3078 assert_eq!(
3079 ScalarValue::DurationMillisecond(Some(1)),
3080 duration_to_scalar_value(TimeUnit::Millisecond, Some(1))
3081 );
3082 assert_eq!(
3083 ScalarValue::DurationMicrosecond(Some(1)),
3084 duration_to_scalar_value(TimeUnit::Microsecond, Some(1))
3085 );
3086 assert_eq!(
3087 ScalarValue::DurationNanosecond(Some(1)),
3088 duration_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3089 );
3090 }
3091
3092 fn check_value_ref_size_eq(value_ref: &ValueRef, size: usize) {
3093 assert_eq!(value_ref.data_size(), size);
3094 }
3095
3096 #[test]
3097 fn test_value_ref_estimated_size() {
3098 check_value_ref_size_eq(&ValueRef::Null, 8);
3099 check_value_ref_size_eq(&ValueRef::Boolean(true), 1);
3100 check_value_ref_size_eq(&ValueRef::UInt8(1), 1);
3101 check_value_ref_size_eq(&ValueRef::UInt16(1), 2);
3102 check_value_ref_size_eq(&ValueRef::UInt32(1), 4);
3103 check_value_ref_size_eq(&ValueRef::UInt64(1), 8);
3104 check_value_ref_size_eq(&ValueRef::Int8(1), 1);
3105 check_value_ref_size_eq(&ValueRef::Int16(1), 2);
3106 check_value_ref_size_eq(&ValueRef::Int32(1), 4);
3107 check_value_ref_size_eq(&ValueRef::Int64(1), 8);
3108 check_value_ref_size_eq(&ValueRef::Float32(1.0.into()), 4);
3109 check_value_ref_size_eq(&ValueRef::Float64(1.0.into()), 8);
3110 check_value_ref_size_eq(&ValueRef::String("greptimedb"), 10);
3111 check_value_ref_size_eq(&ValueRef::Binary(b"greptimedb"), 10);
3112 check_value_ref_size_eq(&ValueRef::Date(Date::new(1)), 4);
3113 check_value_ref_size_eq(&ValueRef::Timestamp(Timestamp::new_millisecond(1)), 16);
3114 check_value_ref_size_eq(&ValueRef::Time(Time::new_millisecond(1)), 16);
3115 check_value_ref_size_eq(&ValueRef::IntervalYearMonth(IntervalYearMonth::new(1)), 4);
3116 check_value_ref_size_eq(&ValueRef::IntervalDayTime(IntervalDayTime::new(1, 2)), 8);
3117 check_value_ref_size_eq(
3118 &ValueRef::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
3119 16,
3120 );
3121 check_value_ref_size_eq(&ValueRef::Duration(Duration::new_millisecond(1)), 16);
3122 check_value_ref_size_eq(
3123 &ValueRef::List(ListValueRef::Ref {
3124 val: &ListValue {
3125 items: vec![
3126 Value::String("hello world".into()),
3127 Value::String("greptimedb".into()),
3128 ],
3129 datatype: Arc::new(ConcreteDataType::string_datatype()),
3130 },
3131 }),
3132 30,
3133 );
3134
3135 let data = vec![
3136 Some(vec![Some(1), Some(2), Some(3)]),
3137 None,
3138 Some(vec![Some(4), None, Some(6)]),
3139 ];
3140 let item_type = Arc::new(ConcreteDataType::int32_datatype());
3141 let mut builder = ListVectorBuilder::with_type_capacity(item_type.clone(), 8);
3142 for vec_opt in &data {
3143 if let Some(vec) = vec_opt {
3144 let values = vec.iter().map(|v| Value::from(*v)).collect();
3145 let list_value = ListValue::new(values, item_type.clone());
3146
3147 builder.push(Some(ListValueRef::Ref { val: &list_value }));
3148 } else {
3149 builder.push(None);
3150 }
3151 }
3152 let vector = builder.finish();
3153
3154 check_value_ref_size_eq(
3155 &ValueRef::List(ListValueRef::Indexed {
3156 vector: &vector,
3157 idx: 0,
3158 }),
3159 74,
3160 );
3161 check_value_ref_size_eq(
3162 &ValueRef::List(ListValueRef::Indexed {
3163 vector: &vector,
3164 idx: 1,
3165 }),
3166 74,
3167 );
3168 check_value_ref_size_eq(
3169 &ValueRef::List(ListValueRef::Indexed {
3170 vector: &vector,
3171 idx: 2,
3172 }),
3173 74,
3174 );
3175 check_value_ref_size_eq(&ValueRef::Decimal128(Decimal128::new(1234, 3, 1)), 32);
3176
3177 check_value_ref_size_eq(
3178 &ValueRef::Struct(StructValueRef::Ref(&build_struct_value())),
3179 31,
3180 );
3181
3182 check_value_ref_size_eq(
3183 &ValueRef::Json(Box::new(
3184 [
3185 ("id", JsonVariantRef::from(1i64)),
3186 ("name", "tom".into()),
3187 ("age", 25u64.into()),
3188 ("address", "94038".into()),
3189 ("awards", [true, false].into()),
3190 ]
3191 .into(),
3192 )),
3193 48,
3194 );
3195 }
3196
3197 #[test]
3198 fn test_incorrect_default_value_issue_3479() {
3199 let value = OrderedF64::from(0.047318541668048164);
3200 let serialized = serde_json::to_string(&value).unwrap();
3201 let deserialized: OrderedF64 = serde_json::from_str(&serialized).unwrap();
3202 assert_eq!(value, deserialized);
3203 }
3204}