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) => x.checked_neg().map(Value::Int8),
547 Value::Int16(x) => x.checked_neg().map(Value::Int16),
548 Value::Int32(x) => x.checked_neg().map(Value::Int32),
549 Value::Int64(x) => x.checked_neg().map(Value::Int64),
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) => x.checked_negative().map(Value::Date),
554 Value::Timestamp(x) => x.checked_negative().map(Value::Timestamp),
555 Value::Time(x) => x.checked_negative().map(Value::Time),
556 Value::Duration(x) => x.checked_negative().map(Value::Duration),
557 Value::IntervalYearMonth(x) => x.checked_negative().map(Value::IntervalYearMonth),
558 Value::IntervalDayTime(x) => x.checked_negative().map(Value::IntervalDayTime),
559 Value::IntervalMonthDayNano(x) => x.checked_negative().map(Value::IntervalMonthDayNano),
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::Dictionary(_, value) => (*value).try_into()?,
1222 ScalarValue::Decimal32(_, _, _)
1223 | ScalarValue::Decimal64(_, _, _)
1224 | ScalarValue::Decimal256(_, _, _)
1225 | ScalarValue::FixedSizeList(_)
1226 | ScalarValue::LargeList(_)
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 #[test]
1748 fn test_try_negative_overflow() {
1749 assert_eq!(Value::Int8(i8::MIN).try_negative(), None);
1752 assert_eq!(Value::Int16(i16::MIN).try_negative(), None);
1753 assert_eq!(Value::Int32(i32::MIN).try_negative(), None);
1754 assert_eq!(Value::Int64(i64::MIN).try_negative(), None);
1755 assert_eq!(
1756 Value::Timestamp(Timestamp::new_nanosecond(i64::MIN)).try_negative(),
1757 None
1758 );
1759 assert_eq!(Value::Date(Date::new(i32::MIN)).try_negative(), None);
1760 assert_eq!(
1761 Value::Time(Time::new_nanosecond(i64::MIN)).try_negative(),
1762 None
1763 );
1764 assert_eq!(
1765 Value::Duration(Duration::new_nanosecond(i64::MIN)).try_negative(),
1766 None
1767 );
1768 assert_eq!(
1769 Value::IntervalYearMonth(IntervalYearMonth::new(i32::MIN)).try_negative(),
1770 None
1771 );
1772 assert_eq!(
1773 Value::IntervalDayTime(IntervalDayTime::new(i32::MIN, i32::MIN)).try_negative(),
1774 None
1775 );
1776 assert_eq!(
1777 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(i32::MIN, i32::MIN, i64::MIN))
1778 .try_negative(),
1779 None
1780 );
1781
1782 assert_eq!(Value::Int64(5).try_negative(), Some(Value::Int64(-5)));
1784 assert_eq!(
1785 Value::Timestamp(Timestamp::new_nanosecond(5)).try_negative(),
1786 Some(Value::Timestamp(Timestamp::new_nanosecond(-5)))
1787 );
1788 }
1789
1790 pub(crate) fn build_struct_type() -> StructType {
1791 StructType::new(Arc::new(vec![
1792 StructField::new("id".to_string(), ConcreteDataType::int32_datatype(), false),
1793 StructField::new(
1794 "name".to_string(),
1795 ConcreteDataType::string_datatype(),
1796 true,
1797 ),
1798 StructField::new("age".to_string(), ConcreteDataType::uint8_datatype(), true),
1799 StructField::new(
1800 "address".to_string(),
1801 ConcreteDataType::string_datatype(),
1802 true,
1803 ),
1804 StructField::new(
1805 "awards".to_string(),
1806 ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::boolean_datatype())),
1807 true,
1808 ),
1809 ]))
1810 }
1811
1812 pub(crate) fn build_struct_value() -> StructValue {
1813 let struct_type = build_struct_type();
1814
1815 let struct_items = vec![
1816 Value::Int32(1),
1817 Value::String("tom".into()),
1818 Value::UInt8(25),
1819 Value::String("94038".into()),
1820 Value::List(build_list_value()),
1821 ];
1822 StructValue::try_new(struct_items, struct_type).unwrap()
1823 }
1824
1825 pub(crate) fn build_scalar_struct_value() -> ScalarValue {
1826 let struct_type = build_struct_type();
1827 let arrays = vec![
1828 ScalarValue::Int32(Some(1)).to_array().unwrap(),
1829 ScalarValue::Utf8(Some("tom".into())).to_array().unwrap(),
1830 ScalarValue::UInt8(Some(25)).to_array().unwrap(),
1831 ScalarValue::Utf8(Some("94038".into())).to_array().unwrap(),
1832 build_scalar_list_value().to_array().unwrap(),
1833 ];
1834 let struct_arrow_array = StructArray::new(struct_type.as_arrow_fields(), arrays, None);
1835 ScalarValue::Struct(Arc::new(struct_arrow_array))
1836 }
1837
1838 pub(crate) fn build_list_value() -> ListValue {
1839 let items = vec![Value::Boolean(true), Value::Boolean(false)];
1840 ListValue::new(items, Arc::new(ConcreteDataType::boolean_datatype()))
1841 }
1842
1843 pub(crate) fn build_scalar_list_value() -> ScalarValue {
1844 let items = vec![
1845 ScalarValue::Boolean(Some(true)),
1846 ScalarValue::Boolean(Some(false)),
1847 ];
1848 ScalarValue::List(ScalarValue::new_list(&items, &ArrowDataType::Boolean, true))
1849 }
1850
1851 #[test]
1852 fn test_try_from_scalar_value() {
1853 assert_eq!(
1854 Value::Boolean(true),
1855 ScalarValue::Boolean(Some(true)).try_into().unwrap()
1856 );
1857 assert_eq!(
1858 Value::Boolean(false),
1859 ScalarValue::Boolean(Some(false)).try_into().unwrap()
1860 );
1861 assert_eq!(Value::Null, ScalarValue::Boolean(None).try_into().unwrap());
1862
1863 assert_eq!(
1864 Value::Float32(1.0f32.into()),
1865 ScalarValue::Float32(Some(1.0f32)).try_into().unwrap()
1866 );
1867 assert_eq!(Value::Null, ScalarValue::Float32(None).try_into().unwrap());
1868
1869 assert_eq!(
1870 Value::Float64(2.0f64.into()),
1871 ScalarValue::Float64(Some(2.0f64)).try_into().unwrap()
1872 );
1873 assert_eq!(Value::Null, ScalarValue::Float64(None).try_into().unwrap());
1874
1875 assert_eq!(
1876 Value::Int8(i8::MAX),
1877 ScalarValue::Int8(Some(i8::MAX)).try_into().unwrap()
1878 );
1879 assert_eq!(Value::Null, ScalarValue::Int8(None).try_into().unwrap());
1880
1881 assert_eq!(
1882 Value::Int16(i16::MAX),
1883 ScalarValue::Int16(Some(i16::MAX)).try_into().unwrap()
1884 );
1885 assert_eq!(Value::Null, ScalarValue::Int16(None).try_into().unwrap());
1886
1887 assert_eq!(
1888 Value::Int32(i32::MAX),
1889 ScalarValue::Int32(Some(i32::MAX)).try_into().unwrap()
1890 );
1891 assert_eq!(Value::Null, ScalarValue::Int32(None).try_into().unwrap());
1892
1893 assert_eq!(
1894 Value::Int64(i64::MAX),
1895 ScalarValue::Int64(Some(i64::MAX)).try_into().unwrap()
1896 );
1897 assert_eq!(Value::Null, ScalarValue::Int64(None).try_into().unwrap());
1898
1899 assert_eq!(
1900 Value::UInt8(u8::MAX),
1901 ScalarValue::UInt8(Some(u8::MAX)).try_into().unwrap()
1902 );
1903 assert_eq!(Value::Null, ScalarValue::UInt8(None).try_into().unwrap());
1904
1905 assert_eq!(
1906 Value::UInt16(u16::MAX),
1907 ScalarValue::UInt16(Some(u16::MAX)).try_into().unwrap()
1908 );
1909 assert_eq!(Value::Null, ScalarValue::UInt16(None).try_into().unwrap());
1910
1911 assert_eq!(
1912 Value::UInt32(u32::MAX),
1913 ScalarValue::UInt32(Some(u32::MAX)).try_into().unwrap()
1914 );
1915 assert_eq!(Value::Null, ScalarValue::UInt32(None).try_into().unwrap());
1916
1917 assert_eq!(
1918 Value::UInt64(u64::MAX),
1919 ScalarValue::UInt64(Some(u64::MAX)).try_into().unwrap()
1920 );
1921 assert_eq!(Value::Null, ScalarValue::UInt64(None).try_into().unwrap());
1922
1923 assert_eq!(
1924 Value::from("hello"),
1925 ScalarValue::Utf8(Some("hello".to_string()))
1926 .try_into()
1927 .unwrap()
1928 );
1929 assert_eq!(Value::Null, ScalarValue::Utf8(None).try_into().unwrap());
1930
1931 assert_eq!(
1932 Value::from("dictionary"),
1933 ScalarValue::Dictionary(
1934 Box::new(ArrowDataType::UInt32),
1935 Box::new(ScalarValue::Utf8(Some("dictionary".to_string()))),
1936 )
1937 .try_into()
1938 .unwrap()
1939 );
1940
1941 assert_eq!(
1942 Value::from("large_hello"),
1943 ScalarValue::LargeUtf8(Some("large_hello".to_string()))
1944 .try_into()
1945 .unwrap()
1946 );
1947 assert_eq!(
1948 Value::Null,
1949 ScalarValue::LargeUtf8(None).try_into().unwrap()
1950 );
1951
1952 assert_eq!(
1953 Value::from("world".as_bytes()),
1954 ScalarValue::Binary(Some("world".as_bytes().to_vec()))
1955 .try_into()
1956 .unwrap()
1957 );
1958 assert_eq!(Value::Null, ScalarValue::Binary(None).try_into().unwrap());
1959
1960 assert_eq!(
1961 Value::from("large_world".as_bytes()),
1962 ScalarValue::LargeBinary(Some("large_world".as_bytes().to_vec()))
1963 .try_into()
1964 .unwrap()
1965 );
1966 assert_eq!(
1967 Value::Null,
1968 ScalarValue::LargeBinary(None).try_into().unwrap()
1969 );
1970
1971 assert_eq!(
1972 Value::List(build_list_value()),
1973 build_scalar_list_value().try_into().unwrap()
1974 );
1975 assert_eq!(
1976 Value::List(ListValue::new(
1977 vec![],
1978 Arc::new(ConcreteDataType::uint32_datatype())
1979 )),
1980 ScalarValue::List(ScalarValue::new_list(&[], &ArrowDataType::UInt32, true))
1981 .try_into()
1982 .unwrap()
1983 );
1984
1985 assert_eq!(
1986 Value::Date(Date::new(123)),
1987 ScalarValue::Date32(Some(123)).try_into().unwrap()
1988 );
1989 assert_eq!(Value::Null, ScalarValue::Date32(None).try_into().unwrap());
1990
1991 assert_eq!(
1992 Value::Timestamp(Timestamp::new(1, TimeUnit::Second)),
1993 ScalarValue::TimestampSecond(Some(1), None)
1994 .try_into()
1995 .unwrap()
1996 );
1997 assert_eq!(
1998 Value::Null,
1999 ScalarValue::TimestampSecond(None, None).try_into().unwrap()
2000 );
2001
2002 assert_eq!(
2003 Value::Timestamp(Timestamp::new(1, TimeUnit::Millisecond)),
2004 ScalarValue::TimestampMillisecond(Some(1), None)
2005 .try_into()
2006 .unwrap()
2007 );
2008 assert_eq!(
2009 Value::Null,
2010 ScalarValue::TimestampMillisecond(None, None)
2011 .try_into()
2012 .unwrap()
2013 );
2014
2015 assert_eq!(
2016 Value::Timestamp(Timestamp::new(1, TimeUnit::Microsecond)),
2017 ScalarValue::TimestampMicrosecond(Some(1), None)
2018 .try_into()
2019 .unwrap()
2020 );
2021 assert_eq!(
2022 Value::Null,
2023 ScalarValue::TimestampMicrosecond(None, None)
2024 .try_into()
2025 .unwrap()
2026 );
2027
2028 assert_eq!(
2029 Value::Timestamp(Timestamp::new(1, TimeUnit::Nanosecond)),
2030 ScalarValue::TimestampNanosecond(Some(1), None)
2031 .try_into()
2032 .unwrap()
2033 );
2034 assert_eq!(
2035 Value::Null,
2036 ScalarValue::TimestampNanosecond(None, None)
2037 .try_into()
2038 .unwrap()
2039 );
2040 assert_eq!(
2041 Value::Null,
2042 ScalarValue::IntervalMonthDayNano(None).try_into().unwrap()
2043 );
2044 assert_eq!(
2045 Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 1, 1)),
2046 ScalarValue::IntervalMonthDayNano(Some(IntervalMonthDayNano::new(1, 1, 1).into()))
2047 .try_into()
2048 .unwrap()
2049 );
2050
2051 assert_eq!(
2052 Value::Time(Time::new(1, TimeUnit::Second)),
2053 ScalarValue::Time32Second(Some(1)).try_into().unwrap()
2054 );
2055 assert_eq!(
2056 Value::Null,
2057 ScalarValue::Time32Second(None).try_into().unwrap()
2058 );
2059
2060 assert_eq!(
2061 Value::Time(Time::new(1, TimeUnit::Millisecond)),
2062 ScalarValue::Time32Millisecond(Some(1)).try_into().unwrap()
2063 );
2064 assert_eq!(
2065 Value::Null,
2066 ScalarValue::Time32Millisecond(None).try_into().unwrap()
2067 );
2068
2069 assert_eq!(
2070 Value::Time(Time::new(1, TimeUnit::Microsecond)),
2071 ScalarValue::Time64Microsecond(Some(1)).try_into().unwrap()
2072 );
2073 assert_eq!(
2074 Value::Null,
2075 ScalarValue::Time64Microsecond(None).try_into().unwrap()
2076 );
2077
2078 assert_eq!(
2079 Value::Time(Time::new(1, TimeUnit::Nanosecond)),
2080 ScalarValue::Time64Nanosecond(Some(1)).try_into().unwrap()
2081 );
2082 assert_eq!(
2083 Value::Null,
2084 ScalarValue::Time64Nanosecond(None).try_into().unwrap()
2085 );
2086
2087 assert_eq!(
2088 Value::Duration(Duration::new_second(1)),
2089 ScalarValue::DurationSecond(Some(1)).try_into().unwrap()
2090 );
2091 assert_eq!(
2092 Value::Null,
2093 ScalarValue::DurationSecond(None).try_into().unwrap()
2094 );
2095
2096 assert_eq!(
2097 Value::Duration(Duration::new_millisecond(1)),
2098 ScalarValue::DurationMillisecond(Some(1))
2099 .try_into()
2100 .unwrap()
2101 );
2102 assert_eq!(
2103 Value::Null,
2104 ScalarValue::DurationMillisecond(None).try_into().unwrap()
2105 );
2106
2107 assert_eq!(
2108 Value::Duration(Duration::new_microsecond(1)),
2109 ScalarValue::DurationMicrosecond(Some(1))
2110 .try_into()
2111 .unwrap()
2112 );
2113 assert_eq!(
2114 Value::Null,
2115 ScalarValue::DurationMicrosecond(None).try_into().unwrap()
2116 );
2117
2118 assert_eq!(
2119 Value::Duration(Duration::new_nanosecond(1)),
2120 ScalarValue::DurationNanosecond(Some(1)).try_into().unwrap()
2121 );
2122 assert_eq!(
2123 Value::Null,
2124 ScalarValue::DurationNanosecond(None).try_into().unwrap()
2125 );
2126
2127 assert_eq!(
2128 Value::Decimal128(Decimal128::new(1, 38, 10)),
2129 ScalarValue::Decimal128(Some(1), 38, 10).try_into().unwrap()
2130 );
2131 assert_eq!(
2132 Value::Null,
2133 ScalarValue::Decimal128(None, 0, 0).try_into().unwrap()
2134 );
2135
2136 let struct_value = build_struct_value();
2137 let scalar_struct_value = build_scalar_struct_value();
2138 assert_eq!(
2139 Value::Struct(struct_value),
2140 scalar_struct_value.try_into().unwrap()
2141 );
2142 }
2143
2144 #[test]
2145 fn test_value_from_inner() {
2146 assert_eq!(Value::Boolean(true), Value::from(true));
2147 assert_eq!(Value::Boolean(false), Value::from(false));
2148
2149 assert_eq!(Value::UInt8(u8::MIN), Value::from(u8::MIN));
2150 assert_eq!(Value::UInt8(u8::MAX), Value::from(u8::MAX));
2151
2152 assert_eq!(Value::UInt16(u16::MIN), Value::from(u16::MIN));
2153 assert_eq!(Value::UInt16(u16::MAX), Value::from(u16::MAX));
2154
2155 assert_eq!(Value::UInt32(u32::MIN), Value::from(u32::MIN));
2156 assert_eq!(Value::UInt32(u32::MAX), Value::from(u32::MAX));
2157
2158 assert_eq!(Value::UInt64(u64::MIN), Value::from(u64::MIN));
2159 assert_eq!(Value::UInt64(u64::MAX), Value::from(u64::MAX));
2160
2161 assert_eq!(Value::Int8(i8::MIN), Value::from(i8::MIN));
2162 assert_eq!(Value::Int8(i8::MAX), Value::from(i8::MAX));
2163
2164 assert_eq!(Value::Int16(i16::MIN), Value::from(i16::MIN));
2165 assert_eq!(Value::Int16(i16::MAX), Value::from(i16::MAX));
2166
2167 assert_eq!(Value::Int32(i32::MIN), Value::from(i32::MIN));
2168 assert_eq!(Value::Int32(i32::MAX), Value::from(i32::MAX));
2169
2170 assert_eq!(Value::Int64(i64::MIN), Value::from(i64::MIN));
2171 assert_eq!(Value::Int64(i64::MAX), Value::from(i64::MAX));
2172
2173 assert_eq!(
2174 Value::Float32(OrderedFloat(f32::MIN)),
2175 Value::from(f32::MIN)
2176 );
2177 assert_eq!(
2178 Value::Float32(OrderedFloat(f32::MAX)),
2179 Value::from(f32::MAX)
2180 );
2181
2182 assert_eq!(
2183 Value::Float64(OrderedFloat(f64::MIN)),
2184 Value::from(f64::MIN)
2185 );
2186 assert_eq!(
2187 Value::Float64(OrderedFloat(f64::MAX)),
2188 Value::from(f64::MAX)
2189 );
2190
2191 let string_bytes = StringBytes::from("hello");
2192 assert_eq!(
2193 Value::String(string_bytes.clone()),
2194 Value::from(string_bytes)
2195 );
2196
2197 let bytes = Bytes::from(b"world".as_slice());
2198 assert_eq!(Value::Binary(bytes.clone()), Value::from(bytes));
2199 }
2200
2201 fn check_type_and_value(data_type: &ConcreteDataType, value: &Value) {
2202 assert_eq!(*data_type, value.data_type());
2203 assert_eq!(data_type.logical_type_id(), value.logical_type_id());
2204 }
2205
2206 #[test]
2207 fn test_value_datatype() {
2208 check_type_and_value(&ConcreteDataType::boolean_datatype(), &Value::Boolean(true));
2209 check_type_and_value(&ConcreteDataType::uint8_datatype(), &Value::UInt8(u8::MIN));
2210 check_type_and_value(
2211 &ConcreteDataType::uint16_datatype(),
2212 &Value::UInt16(u16::MIN),
2213 );
2214 check_type_and_value(
2215 &ConcreteDataType::uint16_datatype(),
2216 &Value::UInt16(u16::MAX),
2217 );
2218 check_type_and_value(
2219 &ConcreteDataType::uint32_datatype(),
2220 &Value::UInt32(u32::MIN),
2221 );
2222 check_type_and_value(
2223 &ConcreteDataType::uint64_datatype(),
2224 &Value::UInt64(u64::MIN),
2225 );
2226 check_type_and_value(&ConcreteDataType::int8_datatype(), &Value::Int8(i8::MIN));
2227 check_type_and_value(&ConcreteDataType::int16_datatype(), &Value::Int16(i16::MIN));
2228 check_type_and_value(&ConcreteDataType::int32_datatype(), &Value::Int32(i32::MIN));
2229 check_type_and_value(&ConcreteDataType::int64_datatype(), &Value::Int64(i64::MIN));
2230 check_type_and_value(
2231 &ConcreteDataType::float32_datatype(),
2232 &Value::Float32(OrderedFloat(f32::MIN)),
2233 );
2234 check_type_and_value(
2235 &ConcreteDataType::float64_datatype(),
2236 &Value::Float64(OrderedFloat(f64::MIN)),
2237 );
2238 check_type_and_value(
2239 &ConcreteDataType::string_datatype(),
2240 &Value::String(StringBytes::from("hello")),
2241 );
2242 check_type_and_value(
2243 &ConcreteDataType::binary_datatype(),
2244 &Value::Binary(Bytes::from(b"world".as_slice())),
2245 );
2246 let item_type = Arc::new(ConcreteDataType::int32_datatype());
2247 check_type_and_value(
2248 &ConcreteDataType::list_datatype(item_type.clone()),
2249 &Value::List(ListValue::new(vec![Value::Int32(10)], item_type.clone())),
2250 );
2251 check_type_and_value(
2252 &ConcreteDataType::list_datatype(Arc::new(ConcreteDataType::null_datatype())),
2253 &Value::List(ListValue::default()),
2254 );
2255 check_type_and_value(
2256 &ConcreteDataType::date_datatype(),
2257 &Value::Date(Date::new(1)),
2258 );
2259 check_type_and_value(
2260 &ConcreteDataType::timestamp_millisecond_datatype(),
2261 &Value::Timestamp(Timestamp::new_millisecond(1)),
2262 );
2263 check_type_and_value(
2264 &ConcreteDataType::time_second_datatype(),
2265 &Value::Time(Time::new_second(1)),
2266 );
2267 check_type_and_value(
2268 &ConcreteDataType::time_millisecond_datatype(),
2269 &Value::Time(Time::new_millisecond(1)),
2270 );
2271 check_type_and_value(
2272 &ConcreteDataType::time_microsecond_datatype(),
2273 &Value::Time(Time::new_microsecond(1)),
2274 );
2275 check_type_and_value(
2276 &ConcreteDataType::time_nanosecond_datatype(),
2277 &Value::Time(Time::new_nanosecond(1)),
2278 );
2279 check_type_and_value(
2280 &ConcreteDataType::interval_year_month_datatype(),
2281 &Value::IntervalYearMonth(IntervalYearMonth::new(1)),
2282 );
2283 check_type_and_value(
2284 &ConcreteDataType::interval_day_time_datatype(),
2285 &Value::IntervalDayTime(IntervalDayTime::new(1, 2)),
2286 );
2287 check_type_and_value(
2288 &ConcreteDataType::interval_month_day_nano_datatype(),
2289 &Value::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
2290 );
2291 check_type_and_value(
2292 &ConcreteDataType::duration_second_datatype(),
2293 &Value::Duration(Duration::new_second(1)),
2294 );
2295 check_type_and_value(
2296 &ConcreteDataType::duration_millisecond_datatype(),
2297 &Value::Duration(Duration::new_millisecond(1)),
2298 );
2299 check_type_and_value(
2300 &ConcreteDataType::duration_microsecond_datatype(),
2301 &Value::Duration(Duration::new_microsecond(1)),
2302 );
2303 check_type_and_value(
2304 &ConcreteDataType::duration_nanosecond_datatype(),
2305 &Value::Duration(Duration::new_nanosecond(1)),
2306 );
2307 check_type_and_value(
2308 &ConcreteDataType::decimal128_datatype(38, 10),
2309 &Value::Decimal128(Decimal128::new(1, 38, 10)),
2310 );
2311
2312 let item_type = Arc::new(ConcreteDataType::boolean_datatype());
2313 check_type_and_value(
2314 &ConcreteDataType::list_datatype(item_type.clone()),
2315 &Value::List(ListValue::new(
2316 vec![Value::Boolean(true)],
2317 item_type.clone(),
2318 )),
2319 );
2320
2321 check_type_and_value(
2322 &ConcreteDataType::struct_datatype(build_struct_type()),
2323 &Value::Struct(build_struct_value()),
2324 );
2325
2326 check_type_and_value(
2327 &ConcreteDataType::json2(JsonNativeType::Bool),
2328 &Value::Json(Box::new(true.into())),
2329 );
2330
2331 check_type_and_value(
2332 &ConcreteDataType::json2(JsonNativeType::Array(Box::new(JsonNativeType::Bool))),
2333 &Value::Json(Box::new([true].into())),
2334 );
2335
2336 check_type_and_value(
2337 &ConcreteDataType::json2(JsonNativeType::Object(JsonObjectType::from([
2338 ("address".to_string(), JsonNativeType::String),
2339 ("age".to_string(), JsonNativeType::u64()),
2340 (
2341 "awards".to_string(),
2342 JsonNativeType::Array(Box::new(JsonNativeType::Bool)),
2343 ),
2344 ("id".to_string(), JsonNativeType::i64()),
2345 ("name".to_string(), JsonNativeType::String),
2346 ]))),
2347 &Value::Json(Box::new(
2348 [
2349 ("id", JsonVariant::from(1i64)),
2350 ("name", "Alice".into()),
2351 ("age", 1u64.into()),
2352 ("address", "blah".into()),
2353 ("awards", [true, false].into()),
2354 ]
2355 .into(),
2356 )),
2357 );
2358 }
2359
2360 #[test]
2361 fn test_value_from_string() {
2362 let hello = "hello".to_string();
2363 assert_eq!(
2364 Value::String(StringBytes::from(hello.clone())),
2365 Value::from(hello)
2366 );
2367
2368 let world = "world";
2369 assert_eq!(Value::String(StringBytes::from(world)), Value::from(world));
2370 }
2371
2372 #[test]
2373 fn test_value_from_bytes() {
2374 let hello = b"hello".to_vec();
2375 assert_eq!(
2376 Value::Binary(Bytes::from(hello.clone())),
2377 Value::from(hello)
2378 );
2379
2380 let world: &[u8] = b"world";
2381 assert_eq!(Value::Binary(Bytes::from(world)), Value::from(world));
2382 }
2383
2384 fn to_json(value: Value) -> serde_json::Value {
2385 value.try_into().unwrap()
2386 }
2387
2388 #[test]
2389 fn test_to_json_value() {
2390 assert_eq!(serde_json::Value::Null, to_json(Value::Null));
2391 assert_eq!(serde_json::Value::Bool(true), to_json(Value::Boolean(true)));
2392 assert_eq!(
2393 serde_json::Value::Number(20u8.into()),
2394 to_json(Value::UInt8(20))
2395 );
2396 assert_eq!(
2397 serde_json::Value::Number(20i8.into()),
2398 to_json(Value::Int8(20))
2399 );
2400 assert_eq!(
2401 serde_json::Value::Number(2000u16.into()),
2402 to_json(Value::UInt16(2000))
2403 );
2404 assert_eq!(
2405 serde_json::Value::Number(2000i16.into()),
2406 to_json(Value::Int16(2000))
2407 );
2408 assert_eq!(
2409 serde_json::Value::Number(3000u32.into()),
2410 to_json(Value::UInt32(3000))
2411 );
2412 assert_eq!(
2413 serde_json::Value::Number(3000i32.into()),
2414 to_json(Value::Int32(3000))
2415 );
2416 assert_eq!(
2417 serde_json::Value::Number(4000u64.into()),
2418 to_json(Value::UInt64(4000))
2419 );
2420 assert_eq!(
2421 serde_json::Value::Number(4000i64.into()),
2422 to_json(Value::Int64(4000))
2423 );
2424 assert_eq!(
2425 serde_json::Value::from(125.0f32),
2426 to_json(Value::Float32(125.0.into()))
2427 );
2428 assert_eq!(
2429 serde_json::Value::from(125.0f64),
2430 to_json(Value::Float64(125.0.into()))
2431 );
2432 assert_eq!(
2433 serde_json::Value::String(String::from("hello")),
2434 to_json(Value::String(StringBytes::from("hello")))
2435 );
2436 assert_eq!(
2437 serde_json::Value::from(b"world".as_slice()),
2438 to_json(Value::Binary(Bytes::from(b"world".as_slice())))
2439 );
2440 assert_eq!(
2441 serde_json::Value::Number(5000i32.into()),
2442 to_json(Value::Date(Date::new(5000)))
2443 );
2444 assert_eq!(
2445 serde_json::Value::Number(1.into()),
2446 to_json(Value::Timestamp(Timestamp::new_millisecond(1)))
2447 );
2448 assert_eq!(
2449 serde_json::Value::Number(1.into()),
2450 to_json(Value::Time(Time::new_millisecond(1)))
2451 );
2452 assert_eq!(
2453 serde_json::Value::Number(1.into()),
2454 to_json(Value::Duration(Duration::new_millisecond(1)))
2455 );
2456
2457 let json_value: serde_json::Value = serde_json::from_str(r#"[123]"#).unwrap();
2458 assert_eq!(
2459 json_value,
2460 to_json(Value::List(ListValue {
2461 items: vec![Value::Int32(123)],
2462 datatype: Arc::new(ConcreteDataType::int32_datatype()),
2463 }))
2464 );
2465
2466 let struct_value = StructValue::try_new(
2467 vec![
2468 Value::Int64(42),
2469 Value::String("tomcat".into()),
2470 Value::Boolean(true),
2471 ],
2472 StructType::new(Arc::new(vec![
2473 StructField::new("num".to_string(), ConcreteDataType::int64_datatype(), true),
2474 StructField::new(
2475 "name".to_string(),
2476 ConcreteDataType::string_datatype(),
2477 true,
2478 ),
2479 StructField::new(
2480 "yes_or_no".to_string(),
2481 ConcreteDataType::boolean_datatype(),
2482 true,
2483 ),
2484 ])),
2485 )
2486 .unwrap();
2487 assert_eq!(
2488 serde_json::Value::try_from(Value::Struct(struct_value.clone())).unwrap(),
2489 serde_json::json!({
2490 "num": 42,
2491 "name": "tomcat",
2492 "yes_or_no": true
2493 })
2494 );
2495
2496 assert_eq!(
2498 serde_json::Value::try_from(Value::Json(Box::new("hello".into()))).unwrap(),
2499 serde_json::json!("hello")
2500 );
2501
2502 assert_eq!(
2504 serde_json::Value::try_from(Value::Json(Box::new([1i64, 2, 3,].into()))).unwrap(),
2505 serde_json::json!([1, 2, 3])
2506 );
2507
2508 assert_eq!(
2510 serde_json::Value::try_from(Value::Json(Box::new(
2511 [
2512 ("num".to_string(), JsonVariant::from(42i64)),
2513 ("name".to_string(), "tomcat".into()),
2514 ("yes_or_no".to_string(), true.into()),
2515 ]
2516 .into()
2517 )))
2518 .unwrap(),
2519 serde_json::json!({
2520 "num": 42,
2521 "name": "tomcat",
2522 "yes_or_no": true
2523 })
2524 );
2525 }
2526
2527 #[test]
2528 fn test_null_value() {
2529 assert!(Value::Null.is_null());
2530 assert!(Value::Json(Box::new(JsonValue::null())).is_null());
2531 assert!(!Value::Boolean(true).is_null());
2532 assert!(Value::Null < Value::Boolean(false));
2533 assert!(Value::Boolean(true) > Value::Null);
2534 assert!(Value::Null < Value::Int32(10));
2535 assert!(Value::Int32(10) > Value::Null);
2536 }
2537
2538 #[test]
2539 fn test_null_value_ref() {
2540 assert!(ValueRef::Null.is_null());
2541 assert!(!ValueRef::Boolean(true).is_null());
2542 assert!(ValueRef::Null < ValueRef::Boolean(false));
2543 assert!(ValueRef::Boolean(true) > ValueRef::Null);
2544 assert!(ValueRef::Null < ValueRef::Int32(10));
2545 assert!(ValueRef::Int32(10) > ValueRef::Null);
2546 }
2547
2548 #[test]
2549 fn test_as_value_ref() {
2550 macro_rules! check_as_value_ref {
2551 ($Variant: ident, $data: expr) => {
2552 let value = Value::$Variant($data);
2553 let value_ref = value.as_value_ref();
2554 let expect_ref = ValueRef::$Variant($data);
2555
2556 assert_eq!(expect_ref, value_ref);
2557 };
2558 }
2559
2560 assert_eq!(ValueRef::Null, Value::Null.as_value_ref());
2561 check_as_value_ref!(Boolean, true);
2562 check_as_value_ref!(UInt8, 123);
2563 check_as_value_ref!(UInt16, 123);
2564 check_as_value_ref!(UInt32, 123);
2565 check_as_value_ref!(UInt64, 123);
2566 check_as_value_ref!(Int8, -12);
2567 check_as_value_ref!(Int16, -12);
2568 check_as_value_ref!(Int32, -12);
2569 check_as_value_ref!(Int64, -12);
2570 check_as_value_ref!(Float32, OrderedF32::from(16.0));
2571 check_as_value_ref!(Float64, OrderedF64::from(16.0));
2572 check_as_value_ref!(Timestamp, Timestamp::new_millisecond(1));
2573 check_as_value_ref!(Time, Time::new_millisecond(1));
2574 check_as_value_ref!(IntervalYearMonth, IntervalYearMonth::new(1));
2575 check_as_value_ref!(IntervalDayTime, IntervalDayTime::new(1, 2));
2576 check_as_value_ref!(IntervalMonthDayNano, IntervalMonthDayNano::new(1, 2, 3));
2577 check_as_value_ref!(Duration, Duration::new_millisecond(1));
2578
2579 assert_eq!(
2580 ValueRef::String("hello"),
2581 Value::String("hello".into()).as_value_ref()
2582 );
2583 assert_eq!(
2584 ValueRef::Binary(b"hello"),
2585 Value::Binary("hello".as_bytes().into()).as_value_ref()
2586 );
2587
2588 check_as_value_ref!(Date, Date::new(103));
2589
2590 let list = build_list_value();
2591 assert_eq!(
2592 ValueRef::List(ListValueRef::Ref { val: &list }),
2593 Value::List(list.clone()).as_value_ref()
2594 );
2595
2596 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2597 .unwrap()
2598 .to_vec();
2599 assert_eq!(
2600 ValueRef::Binary(jsonb_value.clone().as_slice()),
2601 Value::Binary(jsonb_value.into()).as_value_ref()
2602 );
2603
2604 let struct_value = build_struct_value();
2605 assert_eq!(
2606 ValueRef::Struct(StructValueRef::Ref(&struct_value)),
2607 Value::Struct(struct_value.clone()).as_value_ref()
2608 );
2609 }
2610
2611 #[test]
2612 fn test_value_ref_as() {
2613 macro_rules! check_as_null {
2614 ($method: ident) => {
2615 assert_eq!(None, ValueRef::Null.$method().unwrap());
2616 };
2617 }
2618
2619 check_as_null!(try_into_binary);
2620 check_as_null!(try_into_string);
2621 check_as_null!(try_into_boolean);
2622 check_as_null!(try_into_list);
2623 check_as_null!(try_into_struct);
2624
2625 macro_rules! check_as_correct {
2626 ($data: expr, $Variant: ident, $method: ident) => {
2627 assert_eq!(Some($data), ValueRef::$Variant($data).$method().unwrap());
2628 };
2629 }
2630
2631 check_as_correct!("hello", String, try_into_string);
2632 check_as_correct!("hello".as_bytes(), Binary, try_into_binary);
2633 check_as_correct!(true, Boolean, try_into_boolean);
2634 check_as_correct!(Date::new(123), Date, try_into_date);
2635 check_as_correct!(Time::new_second(12), Time, try_into_time);
2636 check_as_correct!(Duration::new_second(12), Duration, try_into_duration);
2637
2638 let list = build_list_value();
2639 check_as_correct!(ListValueRef::Ref { val: &list }, List, try_into_list);
2640
2641 let struct_value = build_struct_value();
2642 check_as_correct!(StructValueRef::Ref(&struct_value), Struct, try_into_struct);
2643
2644 let wrong_value = ValueRef::Int32(12345);
2645 assert!(wrong_value.try_into_binary().is_err());
2646 assert!(wrong_value.try_into_string().is_err());
2647 assert!(wrong_value.try_into_boolean().is_err());
2648 assert!(wrong_value.try_into_list().is_err());
2649 assert!(wrong_value.try_into_struct().is_err());
2650 assert!(wrong_value.try_into_date().is_err());
2651 assert!(wrong_value.try_into_time().is_err());
2652 assert!(wrong_value.try_into_timestamp().is_err());
2653 assert!(wrong_value.try_into_duration().is_err());
2654 }
2655
2656 #[test]
2657 fn test_display() {
2658 set_default_timezone(Some("Asia/Shanghai")).unwrap();
2659 assert_eq!(Value::Null.to_string(), "Null");
2660 assert_eq!(Value::UInt8(8).to_string(), "8");
2661 assert_eq!(Value::UInt16(16).to_string(), "16");
2662 assert_eq!(Value::UInt32(32).to_string(), "32");
2663 assert_eq!(Value::UInt64(64).to_string(), "64");
2664 assert_eq!(Value::Int8(-8).to_string(), "-8");
2665 assert_eq!(Value::Int16(-16).to_string(), "-16");
2666 assert_eq!(Value::Int32(-32).to_string(), "-32");
2667 assert_eq!(Value::Int64(-64).to_string(), "-64");
2668 assert_eq!(Value::Float32((-32.123).into()).to_string(), "-32.123");
2669 assert_eq!(Value::Float64((-64.123).into()).to_string(), "-64.123");
2670 assert_eq!(Value::Float64(OrderedF64::infinity()).to_string(), "inf");
2671 assert_eq!(Value::Float64(OrderedF64::nan()).to_string(), "NaN");
2672 assert_eq!(Value::String(StringBytes::from("123")).to_string(), "123");
2673 assert_eq!(
2674 Value::Binary(Bytes::from(vec![1, 2, 3])).to_string(),
2675 "010203"
2676 );
2677 assert_eq!(Value::Date(Date::new(0)).to_string(), "1970-01-01");
2678 assert_eq!(
2679 Value::Timestamp(Timestamp::new(1000, TimeUnit::Millisecond)).to_string(),
2680 "1970-01-01 08:00:01+0800"
2681 );
2682 assert_eq!(
2683 Value::Time(Time::new(1000, TimeUnit::Millisecond)).to_string(),
2684 "08:00:01+0800"
2685 );
2686 assert_eq!(
2687 Value::Duration(Duration::new_millisecond(1000)).to_string(),
2688 "1000ms"
2689 );
2690 assert_eq!(
2691 Value::List(build_list_value()).to_string(),
2692 "Boolean[true, false]"
2693 );
2694 assert_eq!(
2695 Value::List(ListValue::new(
2696 vec![],
2697 Arc::new(ConcreteDataType::timestamp_second_datatype()),
2698 ))
2699 .to_string(),
2700 "TimestampSecond[]"
2701 );
2702 assert_eq!(
2703 Value::List(ListValue::new(
2704 vec![],
2705 Arc::new(ConcreteDataType::timestamp_millisecond_datatype()),
2706 ))
2707 .to_string(),
2708 "TimestampMillisecond[]"
2709 );
2710 assert_eq!(
2711 Value::List(ListValue::new(
2712 vec![],
2713 Arc::new(ConcreteDataType::timestamp_microsecond_datatype()),
2714 ))
2715 .to_string(),
2716 "TimestampMicrosecond[]"
2717 );
2718 assert_eq!(
2719 Value::List(ListValue::new(
2720 vec![],
2721 Arc::new(ConcreteDataType::timestamp_nanosecond_datatype()),
2722 ))
2723 .to_string(),
2724 "TimestampNanosecond[]"
2725 );
2726
2727 assert_eq!(
2728 Value::Struct(build_struct_value()).to_string(),
2729 "{ id: 1, name: tom, age: 25, address: 94038, awards: Boolean[true, false] }"
2730 );
2731
2732 assert_eq!(
2733 Value::Json(Box::new(
2734 [
2735 ("id", JsonVariant::from(1i64)),
2736 ("name", "tom".into()),
2737 ("age", 25u64.into()),
2738 ("address", "94038".into()),
2739 ("awards", [true, false].into()),
2740 ]
2741 .into()
2742 ))
2743 .to_string(),
2744 "Json({ address: 94038, age: 25, awards: [true, false], id: 1, name: tom })"
2745 )
2746 }
2747
2748 #[test]
2749 fn test_not_null_value_to_scalar_value() {
2750 assert_eq!(
2751 ScalarValue::Boolean(Some(true)),
2752 Value::Boolean(true)
2753 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2754 .unwrap()
2755 );
2756 assert_eq!(
2757 ScalarValue::Boolean(Some(false)),
2758 Value::Boolean(false)
2759 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2760 .unwrap()
2761 );
2762 assert_eq!(
2763 ScalarValue::UInt8(Some(1)),
2764 Value::UInt8(1)
2765 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2766 .unwrap()
2767 );
2768 assert_eq!(
2769 ScalarValue::UInt16(Some(2)),
2770 Value::UInt16(2)
2771 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2772 .unwrap()
2773 );
2774 assert_eq!(
2775 ScalarValue::UInt32(Some(3)),
2776 Value::UInt32(3)
2777 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2778 .unwrap()
2779 );
2780 assert_eq!(
2781 ScalarValue::UInt64(Some(4)),
2782 Value::UInt64(4)
2783 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2784 .unwrap()
2785 );
2786 assert_eq!(
2787 ScalarValue::Int8(Some(i8::MIN + 4)),
2788 Value::Int8(i8::MIN + 4)
2789 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2790 .unwrap()
2791 );
2792 assert_eq!(
2793 ScalarValue::Int16(Some(i16::MIN + 5)),
2794 Value::Int16(i16::MIN + 5)
2795 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2796 .unwrap()
2797 );
2798 assert_eq!(
2799 ScalarValue::Int32(Some(i32::MIN + 6)),
2800 Value::Int32(i32::MIN + 6)
2801 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2802 .unwrap()
2803 );
2804 assert_eq!(
2805 ScalarValue::Int64(Some(i64::MIN + 7)),
2806 Value::Int64(i64::MIN + 7)
2807 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2808 .unwrap()
2809 );
2810 assert_eq!(
2811 ScalarValue::Float32(Some(8.0f32)),
2812 Value::Float32(OrderedFloat(8.0f32))
2813 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2814 .unwrap()
2815 );
2816 assert_eq!(
2817 ScalarValue::Float64(Some(9.0f64)),
2818 Value::Float64(OrderedFloat(9.0f64))
2819 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2820 .unwrap()
2821 );
2822 assert_eq!(
2823 ScalarValue::Utf8(Some("hello".to_string())),
2824 Value::String(StringBytes::from("hello"))
2825 .try_to_scalar_value(&ConcreteDataType::string_datatype(),)
2826 .unwrap()
2827 );
2828 assert_eq!(
2829 ScalarValue::Binary(Some("world".as_bytes().to_vec())),
2830 Value::Binary(Bytes::from("world".as_bytes()))
2831 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2832 .unwrap()
2833 );
2834
2835 let jsonb_value = jsonb::parse_value(r#"{"key": "value"}"#.as_bytes())
2836 .unwrap()
2837 .to_vec();
2838 assert_eq!(
2839 ScalarValue::Binary(Some(jsonb_value.clone())),
2840 Value::Binary(jsonb_value.into())
2841 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2842 .unwrap()
2843 );
2844
2845 assert_eq!(
2846 build_scalar_struct_value(),
2847 Value::Struct(build_struct_value())
2848 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
2849 .unwrap()
2850 );
2851
2852 assert_eq!(
2853 build_scalar_list_value(),
2854 Value::List(build_list_value())
2855 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
2856 ConcreteDataType::boolean_datatype()
2857 )))
2858 .unwrap()
2859 );
2860 }
2861
2862 #[test]
2863 fn test_null_value_to_scalar_value() {
2864 assert_eq!(
2865 ScalarValue::Boolean(None),
2866 Value::Null
2867 .try_to_scalar_value(&ConcreteDataType::boolean_datatype())
2868 .unwrap()
2869 );
2870 assert_eq!(
2871 ScalarValue::UInt8(None),
2872 Value::Null
2873 .try_to_scalar_value(&ConcreteDataType::uint8_datatype())
2874 .unwrap()
2875 );
2876 assert_eq!(
2877 ScalarValue::UInt16(None),
2878 Value::Null
2879 .try_to_scalar_value(&ConcreteDataType::uint16_datatype())
2880 .unwrap()
2881 );
2882 assert_eq!(
2883 ScalarValue::UInt32(None),
2884 Value::Null
2885 .try_to_scalar_value(&ConcreteDataType::uint32_datatype())
2886 .unwrap()
2887 );
2888 assert_eq!(
2889 ScalarValue::UInt64(None),
2890 Value::Null
2891 .try_to_scalar_value(&ConcreteDataType::uint64_datatype())
2892 .unwrap()
2893 );
2894 assert_eq!(
2895 ScalarValue::Int8(None),
2896 Value::Null
2897 .try_to_scalar_value(&ConcreteDataType::int8_datatype())
2898 .unwrap()
2899 );
2900 assert_eq!(
2901 ScalarValue::Int16(None),
2902 Value::Null
2903 .try_to_scalar_value(&ConcreteDataType::int16_datatype())
2904 .unwrap()
2905 );
2906 assert_eq!(
2907 ScalarValue::Int32(None),
2908 Value::Null
2909 .try_to_scalar_value(&ConcreteDataType::int32_datatype())
2910 .unwrap()
2911 );
2912 assert_eq!(
2913 ScalarValue::Int64(None),
2914 Value::Null
2915 .try_to_scalar_value(&ConcreteDataType::int64_datatype())
2916 .unwrap()
2917 );
2918 assert_eq!(
2919 ScalarValue::Float32(None),
2920 Value::Null
2921 .try_to_scalar_value(&ConcreteDataType::float32_datatype())
2922 .unwrap()
2923 );
2924 assert_eq!(
2925 ScalarValue::Float64(None),
2926 Value::Null
2927 .try_to_scalar_value(&ConcreteDataType::float64_datatype())
2928 .unwrap()
2929 );
2930 assert_eq!(
2931 ScalarValue::Utf8(None),
2932 Value::Null
2933 .try_to_scalar_value(&ConcreteDataType::string_datatype())
2934 .unwrap()
2935 );
2936 assert_eq!(
2937 ScalarValue::Binary(None),
2938 Value::Null
2939 .try_to_scalar_value(&ConcreteDataType::binary_datatype())
2940 .unwrap()
2941 );
2942
2943 assert_eq!(
2944 ScalarValue::Time32Second(None),
2945 Value::Null
2946 .try_to_scalar_value(&ConcreteDataType::time_second_datatype())
2947 .unwrap()
2948 );
2949 assert_eq!(
2950 ScalarValue::Time32Millisecond(None),
2951 Value::Null
2952 .try_to_scalar_value(&ConcreteDataType::time_millisecond_datatype())
2953 .unwrap()
2954 );
2955 assert_eq!(
2956 ScalarValue::Time64Microsecond(None),
2957 Value::Null
2958 .try_to_scalar_value(&ConcreteDataType::time_microsecond_datatype())
2959 .unwrap()
2960 );
2961 assert_eq!(
2962 ScalarValue::Time64Nanosecond(None),
2963 Value::Null
2964 .try_to_scalar_value(&ConcreteDataType::time_nanosecond_datatype())
2965 .unwrap()
2966 );
2967
2968 assert_eq!(
2969 ScalarValue::DurationSecond(None),
2970 Value::Null
2971 .try_to_scalar_value(&ConcreteDataType::duration_second_datatype())
2972 .unwrap()
2973 );
2974 assert_eq!(
2975 ScalarValue::DurationMillisecond(None),
2976 Value::Null
2977 .try_to_scalar_value(&ConcreteDataType::duration_millisecond_datatype())
2978 .unwrap()
2979 );
2980 assert_eq!(
2981 ScalarValue::DurationMicrosecond(None),
2982 Value::Null
2983 .try_to_scalar_value(&ConcreteDataType::duration_microsecond_datatype())
2984 .unwrap()
2985 );
2986 assert_eq!(
2987 ScalarValue::DurationNanosecond(None),
2988 Value::Null
2989 .try_to_scalar_value(&ConcreteDataType::duration_nanosecond_datatype())
2990 .unwrap()
2991 );
2992 assert_eq!(
2993 ScalarValue::Binary(None),
2994 Value::Null
2995 .try_to_scalar_value(&ConcreteDataType::json_datatype())
2996 .unwrap()
2997 );
2998
2999 assert_eq!(
3000 ScalarValue::new_null_list(ArrowDataType::Boolean, true, 1),
3001 Value::Null
3002 .try_to_scalar_value(&ConcreteDataType::list_datatype(Arc::new(
3003 ConcreteDataType::boolean_datatype()
3004 )))
3005 .unwrap()
3006 );
3007
3008 assert_eq!(
3009 ScalarStructBuilder::new_null(build_struct_type().as_arrow_fields()),
3010 Value::Null
3011 .try_to_scalar_value(&ConcreteDataType::struct_datatype(build_struct_type()))
3012 .unwrap()
3013 );
3014 }
3015
3016 #[test]
3017 fn test_list_value_to_scalar_value() {
3018 let items = vec![Value::Int32(-1), Value::Null];
3019 let item_type = Arc::new(ConcreteDataType::int32_datatype());
3020 let list = Value::List(ListValue::new(items, item_type.clone()));
3021 let df_list = list
3022 .try_to_scalar_value(&ConcreteDataType::list_datatype(item_type.clone()))
3023 .unwrap();
3024 assert!(matches!(df_list, ScalarValue::List(_)));
3025 match df_list {
3026 ScalarValue::List(vs) => {
3027 assert_eq!(
3028 ArrowDataType::List(Arc::new(Field::new_list_field(
3029 ArrowDataType::Int32,
3030 true
3031 ))),
3032 *vs.data_type()
3033 );
3034
3035 let vs = ScalarValue::convert_array_to_scalar_vec(vs.as_ref())
3036 .unwrap()
3037 .into_iter()
3038 .flatten()
3039 .flatten()
3040 .collect::<Vec<_>>();
3041 assert_eq!(
3042 vs,
3043 vec![ScalarValue::Int32(Some(-1)), ScalarValue::Int32(None)]
3044 );
3045 }
3046 _ => unreachable!(),
3047 }
3048 }
3049
3050 #[test]
3051 fn test_struct_value_to_scalar_value() {
3052 let struct_value = build_struct_value();
3053 let scalar_value = struct_value
3054 .try_to_scalar_value(&build_struct_type())
3055 .unwrap();
3056
3057 assert_eq!(scalar_value, build_scalar_struct_value());
3058
3059 assert!(matches!(scalar_value, ScalarValue::Struct(_)));
3060 match scalar_value {
3061 ScalarValue::Struct(values) => {
3062 assert_eq!(&build_struct_type().as_arrow_fields(), values.fields());
3063
3064 assert_eq!(
3065 ScalarValue::try_from_array(values.column(0), 0).unwrap(),
3066 ScalarValue::Int32(Some(1))
3067 );
3068 assert_eq!(
3069 ScalarValue::try_from_array(values.column(1), 0).unwrap(),
3070 ScalarValue::Utf8(Some("tom".into()))
3071 );
3072 assert_eq!(
3073 ScalarValue::try_from_array(values.column(2), 0).unwrap(),
3074 ScalarValue::UInt8(Some(25))
3075 );
3076 assert_eq!(
3077 ScalarValue::try_from_array(values.column(3), 0).unwrap(),
3078 ScalarValue::Utf8(Some("94038".into()))
3079 );
3080 }
3081 _ => panic!("Unexpected value type"),
3082 }
3083 }
3084
3085 #[test]
3086 fn test_timestamp_to_scalar_value() {
3087 assert_eq!(
3088 ScalarValue::TimestampSecond(Some(1), None),
3089 timestamp_to_scalar_value(TimeUnit::Second, Some(1))
3090 );
3091 assert_eq!(
3092 ScalarValue::TimestampMillisecond(Some(1), None),
3093 timestamp_to_scalar_value(TimeUnit::Millisecond, Some(1))
3094 );
3095 assert_eq!(
3096 ScalarValue::TimestampMicrosecond(Some(1), None),
3097 timestamp_to_scalar_value(TimeUnit::Microsecond, Some(1))
3098 );
3099 assert_eq!(
3100 ScalarValue::TimestampNanosecond(Some(1), None),
3101 timestamp_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3102 );
3103 }
3104
3105 #[test]
3106 fn test_time_to_scalar_value() {
3107 assert_eq!(
3108 ScalarValue::Time32Second(Some(1)),
3109 time_to_scalar_value(TimeUnit::Second, Some(1)).unwrap()
3110 );
3111 assert_eq!(
3112 ScalarValue::Time32Millisecond(Some(1)),
3113 time_to_scalar_value(TimeUnit::Millisecond, Some(1)).unwrap()
3114 );
3115 assert_eq!(
3116 ScalarValue::Time64Microsecond(Some(1)),
3117 time_to_scalar_value(TimeUnit::Microsecond, Some(1)).unwrap()
3118 );
3119 assert_eq!(
3120 ScalarValue::Time64Nanosecond(Some(1)),
3121 time_to_scalar_value(TimeUnit::Nanosecond, Some(1)).unwrap()
3122 );
3123 }
3124
3125 #[test]
3126 fn test_duration_to_scalar_value() {
3127 assert_eq!(
3128 ScalarValue::DurationSecond(Some(1)),
3129 duration_to_scalar_value(TimeUnit::Second, Some(1))
3130 );
3131 assert_eq!(
3132 ScalarValue::DurationMillisecond(Some(1)),
3133 duration_to_scalar_value(TimeUnit::Millisecond, Some(1))
3134 );
3135 assert_eq!(
3136 ScalarValue::DurationMicrosecond(Some(1)),
3137 duration_to_scalar_value(TimeUnit::Microsecond, Some(1))
3138 );
3139 assert_eq!(
3140 ScalarValue::DurationNanosecond(Some(1)),
3141 duration_to_scalar_value(TimeUnit::Nanosecond, Some(1))
3142 );
3143 }
3144
3145 fn check_value_ref_size_eq(value_ref: &ValueRef, size: usize) {
3146 assert_eq!(value_ref.data_size(), size);
3147 }
3148
3149 #[test]
3150 fn test_value_ref_estimated_size() {
3151 check_value_ref_size_eq(&ValueRef::Null, 8);
3152 check_value_ref_size_eq(&ValueRef::Boolean(true), 1);
3153 check_value_ref_size_eq(&ValueRef::UInt8(1), 1);
3154 check_value_ref_size_eq(&ValueRef::UInt16(1), 2);
3155 check_value_ref_size_eq(&ValueRef::UInt32(1), 4);
3156 check_value_ref_size_eq(&ValueRef::UInt64(1), 8);
3157 check_value_ref_size_eq(&ValueRef::Int8(1), 1);
3158 check_value_ref_size_eq(&ValueRef::Int16(1), 2);
3159 check_value_ref_size_eq(&ValueRef::Int32(1), 4);
3160 check_value_ref_size_eq(&ValueRef::Int64(1), 8);
3161 check_value_ref_size_eq(&ValueRef::Float32(1.0.into()), 4);
3162 check_value_ref_size_eq(&ValueRef::Float64(1.0.into()), 8);
3163 check_value_ref_size_eq(&ValueRef::String("greptimedb"), 10);
3164 check_value_ref_size_eq(&ValueRef::Binary(b"greptimedb"), 10);
3165 check_value_ref_size_eq(&ValueRef::Date(Date::new(1)), 4);
3166 check_value_ref_size_eq(&ValueRef::Timestamp(Timestamp::new_millisecond(1)), 16);
3167 check_value_ref_size_eq(&ValueRef::Time(Time::new_millisecond(1)), 16);
3168 check_value_ref_size_eq(&ValueRef::IntervalYearMonth(IntervalYearMonth::new(1)), 4);
3169 check_value_ref_size_eq(&ValueRef::IntervalDayTime(IntervalDayTime::new(1, 2)), 8);
3170 check_value_ref_size_eq(
3171 &ValueRef::IntervalMonthDayNano(IntervalMonthDayNano::new(1, 2, 3)),
3172 16,
3173 );
3174 check_value_ref_size_eq(&ValueRef::Duration(Duration::new_millisecond(1)), 16);
3175 check_value_ref_size_eq(
3176 &ValueRef::List(ListValueRef::Ref {
3177 val: &ListValue {
3178 items: vec![
3179 Value::String("hello world".into()),
3180 Value::String("greptimedb".into()),
3181 ],
3182 datatype: Arc::new(ConcreteDataType::string_datatype()),
3183 },
3184 }),
3185 30,
3186 );
3187
3188 let data = vec![
3189 Some(vec![Some(1), Some(2), Some(3)]),
3190 None,
3191 Some(vec![Some(4), None, Some(6)]),
3192 ];
3193 let item_type = Arc::new(ConcreteDataType::int32_datatype());
3194 let mut builder = ListVectorBuilder::with_type_capacity(item_type.clone(), 8);
3195 for vec_opt in &data {
3196 if let Some(vec) = vec_opt {
3197 let values = vec.iter().map(|v| Value::from(*v)).collect();
3198 let list_value = ListValue::new(values, item_type.clone());
3199
3200 builder.push(Some(ListValueRef::Ref { val: &list_value }));
3201 } else {
3202 builder.push(None);
3203 }
3204 }
3205 let vector = builder.finish();
3206
3207 check_value_ref_size_eq(
3208 &ValueRef::List(ListValueRef::Indexed {
3209 vector: &vector,
3210 idx: 0,
3211 }),
3212 74,
3213 );
3214 check_value_ref_size_eq(
3215 &ValueRef::List(ListValueRef::Indexed {
3216 vector: &vector,
3217 idx: 1,
3218 }),
3219 74,
3220 );
3221 check_value_ref_size_eq(
3222 &ValueRef::List(ListValueRef::Indexed {
3223 vector: &vector,
3224 idx: 2,
3225 }),
3226 74,
3227 );
3228 check_value_ref_size_eq(&ValueRef::Decimal128(Decimal128::new(1234, 3, 1)), 32);
3229
3230 check_value_ref_size_eq(
3231 &ValueRef::Struct(StructValueRef::Ref(&build_struct_value())),
3232 31,
3233 );
3234
3235 check_value_ref_size_eq(
3236 &ValueRef::Json(Box::new(
3237 [
3238 ("id", JsonVariantRef::from(1i64)),
3239 ("name", "tom".into()),
3240 ("age", 25u64.into()),
3241 ("address", "94038".into()),
3242 ("awards", [true, false].into()),
3243 ]
3244 .into(),
3245 )),
3246 48,
3247 );
3248 }
3249
3250 #[test]
3251 fn test_incorrect_default_value_issue_3479() {
3252 let value = OrderedF64::from(0.047318541668048164);
3253 let serialized = serde_json::to_string(&value).unwrap();
3254 let deserialized: OrderedF64 = serde_json::from_str(&serialized).unwrap();
3255 assert_eq!(value, deserialized);
3256 }
3257}