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