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