This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 07a721f67f Add Duration to ScalarValue (#6838)
07a721f67f is described below

commit 07a721f67fd9501159f33ec20f5ac670584c8e9f
Author: Raphael Taylor-Davies <[email protected]>
AuthorDate: Tue Jul 4 13:11:44 2023 +0100

    Add Duration to ScalarValue (#6838)
---
 datafusion/common/src/scalar.rs                 | 102 +++++++++++++++++++++++-
 datafusion/proto/proto/datafusion.proto         |   6 ++
 datafusion/proto/src/generated/pbjson.rs        |  52 ++++++++++++
 datafusion/proto/src/generated/prost.rs         |  10 ++-
 datafusion/proto/src/logical_plan/from_proto.rs |   4 +
 datafusion/proto/src/logical_plan/to_proto.rs   | 100 ++++++++++++++---------
 6 files changed, 236 insertions(+), 38 deletions(-)

diff --git a/datafusion/common/src/scalar.rs b/datafusion/common/src/scalar.rs
index 044d40534e..4fef60020f 100644
--- a/datafusion/common/src/scalar.rs
+++ b/datafusion/common/src/scalar.rs
@@ -132,6 +132,14 @@ pub enum ScalarValue {
     /// Months and days are encoded as 32-bit signed integers.
     /// Nanoseconds is encoded as a 64-bit signed integer (no leap seconds).
     IntervalMonthDayNano(Option<i128>),
+    /// Duration in seconds
+    DurationSecond(Option<i64>),
+    /// Duration in milliseconds
+    DurationMillisecond(Option<i64>),
+    /// Duration in microseconds
+    DurationMicrosecond(Option<i64>),
+    /// Duration in nanoseconds
+    DurationNanosecond(Option<i64>),
     /// struct of nested ScalarValue
     Struct(Option<Vec<ScalarValue>>, Fields),
     /// Dictionary type: index type and value
@@ -210,6 +218,14 @@ impl PartialEq for ScalarValue {
             (TimestampMicrosecond(_, _), _) => false,
             (TimestampNanosecond(v1, _), TimestampNanosecond(v2, _)) => 
v1.eq(v2),
             (TimestampNanosecond(_, _), _) => false,
+            (DurationSecond(v1), DurationSecond(v2)) => v1.eq(v2),
+            (DurationSecond(_), _) => false,
+            (DurationMillisecond(v1), DurationMillisecond(v2)) => v1.eq(v2),
+            (DurationMillisecond(_), _) => false,
+            (DurationMicrosecond(v1), DurationMicrosecond(v2)) => v1.eq(v2),
+            (DurationMicrosecond(_), _) => false,
+            (DurationNanosecond(v1), DurationNanosecond(v2)) => v1.eq(v2),
+            (DurationNanosecond(_), _) => false,
             (IntervalYearMonth(v1), IntervalYearMonth(v2)) => v1.eq(v2),
             (IntervalYearMonth(v1), IntervalDayTime(v2)) => {
                 ym_to_milli(v1).eq(&dt_to_milli(v2))
@@ -357,6 +373,14 @@ impl PartialOrd for ScalarValue {
                 mdn_to_nano(v1).partial_cmp(&dt_to_nano(v2))
             }
             (IntervalMonthDayNano(_), _) => None,
+            (DurationSecond(v1), DurationSecond(v2)) => v1.partial_cmp(v2),
+            (DurationSecond(_), _) => None,
+            (DurationMillisecond(v1), DurationMillisecond(v2)) => 
v1.partial_cmp(v2),
+            (DurationMillisecond(_), _) => None,
+            (DurationMicrosecond(v1), DurationMicrosecond(v2)) => 
v1.partial_cmp(v2),
+            (DurationMicrosecond(_), _) => None,
+            (DurationNanosecond(v1), DurationNanosecond(v2)) => 
v1.partial_cmp(v2),
+            (DurationNanosecond(_), _) => None,
             (Struct(v1, t1), Struct(v2, t2)) => {
                 if t1.eq(t2) {
                     v1.partial_cmp(v2)
@@ -1508,6 +1532,10 @@ impl std::hash::Hash for ScalarValue {
             TimestampMillisecond(v, _) => v.hash(state),
             TimestampMicrosecond(v, _) => v.hash(state),
             TimestampNanosecond(v, _) => v.hash(state),
+            DurationSecond(v) => v.hash(state),
+            DurationMillisecond(v) => v.hash(state),
+            DurationMicrosecond(v) => v.hash(state),
+            DurationNanosecond(v) => v.hash(state),
             IntervalYearMonth(v) => v.hash(state),
             IntervalDayTime(v) => v.hash(state),
             IntervalMonthDayNano(v) => v.hash(state),
@@ -1984,6 +2012,16 @@ impl ScalarValue {
             ScalarValue::IntervalMonthDayNano(_) => {
                 DataType::Interval(IntervalUnit::MonthDayNano)
             }
+            ScalarValue::DurationSecond(_) => 
DataType::Duration(TimeUnit::Second),
+            ScalarValue::DurationMillisecond(_) => {
+                DataType::Duration(TimeUnit::Millisecond)
+            }
+            ScalarValue::DurationMicrosecond(_) => {
+                DataType::Duration(TimeUnit::Microsecond)
+            }
+            ScalarValue::DurationNanosecond(_) => {
+                DataType::Duration(TimeUnit::Nanosecond)
+            }
             ScalarValue::Struct(_, fields) => DataType::Struct(fields.clone()),
             ScalarValue::Dictionary(k, v) => {
                 DataType::Dictionary(k.clone(), Box::new(v.get_datatype()))
@@ -2118,6 +2156,10 @@ impl ScalarValue {
             ScalarValue::IntervalYearMonth(v) => v.is_none(),
             ScalarValue::IntervalDayTime(v) => v.is_none(),
             ScalarValue::IntervalMonthDayNano(v) => v.is_none(),
+            ScalarValue::DurationSecond(v) => v.is_none(),
+            ScalarValue::DurationMillisecond(v) => v.is_none(),
+            ScalarValue::DurationMicrosecond(v) => v.is_none(),
+            ScalarValue::DurationNanosecond(v) => v.is_none(),
             ScalarValue::Struct(v, _) => v.is_none(),
             ScalarValue::Dictionary(_, v) => v.is_null(),
         }
@@ -2897,6 +2939,34 @@ impl ScalarValue {
                 e,
                 size
             ),
+            ScalarValue::DurationSecond(e) => build_array_from_option!(
+                Duration,
+                TimeUnit::Second,
+                DurationSecondArray,
+                e,
+                size
+            ),
+            ScalarValue::DurationMillisecond(e) => build_array_from_option!(
+                Duration,
+                TimeUnit::Millisecond,
+                DurationMillisecondArray,
+                e,
+                size
+            ),
+            ScalarValue::DurationMicrosecond(e) => build_array_from_option!(
+                Duration,
+                TimeUnit::Microsecond,
+                DurationMicrosecondArray,
+                e,
+                size
+            ),
+            ScalarValue::DurationNanosecond(e) => build_array_from_option!(
+                Duration,
+                TimeUnit::Nanosecond,
+                DurationNanosecondArray,
+                e,
+                size
+            ),
             ScalarValue::Struct(values, fields) => match values {
                 Some(values) => {
                     let field_values: Vec<_> = fields
@@ -3264,6 +3334,18 @@ impl ScalarValue {
             ScalarValue::IntervalMonthDayNano(val) => {
                 eq_array_primitive!(array, index, IntervalMonthDayNanoArray, 
val)
             }
+            ScalarValue::DurationSecond(val) => {
+                eq_array_primitive!(array, index, DurationSecondArray, val)
+            }
+            ScalarValue::DurationMillisecond(val) => {
+                eq_array_primitive!(array, index, DurationMillisecondArray, 
val)
+            }
+            ScalarValue::DurationMicrosecond(val) => {
+                eq_array_primitive!(array, index, DurationMicrosecondArray, 
val)
+            }
+            ScalarValue::DurationNanosecond(val) => {
+                eq_array_primitive!(array, index, DurationNanosecondArray, val)
+            }
             ScalarValue::Struct(_, _) => unimplemented!(),
             ScalarValue::Dictionary(key_type, v) => {
                 let (values_array, values_index) = match key_type.as_ref() {
@@ -3313,7 +3395,11 @@ impl ScalarValue {
                 | ScalarValue::Time64Nanosecond(_)
                 | ScalarValue::IntervalYearMonth(_)
                 | ScalarValue::IntervalDayTime(_)
-                | ScalarValue::IntervalMonthDayNano(_) => 0,
+                | ScalarValue::IntervalMonthDayNano(_)
+                | ScalarValue::DurationSecond(_)
+                | ScalarValue::DurationMillisecond(_)
+                | ScalarValue::DurationMicrosecond(_)
+                | ScalarValue::DurationNanosecond(_) => 0,
                 ScalarValue::Utf8(s) | ScalarValue::LargeUtf8(s) => {
                     s.as_ref().map(|s| s.capacity()).unwrap_or_default()
                 }
@@ -3699,6 +3785,10 @@ impl fmt::Display for ScalarValue {
             ScalarValue::IntervalDayTime(e) => format_option!(f, e)?,
             ScalarValue::IntervalYearMonth(e) => format_option!(f, e)?,
             ScalarValue::IntervalMonthDayNano(e) => format_option!(f, e)?,
+            ScalarValue::DurationSecond(e) => format_option!(f, e)?,
+            ScalarValue::DurationMillisecond(e) => format_option!(f, e)?,
+            ScalarValue::DurationMicrosecond(e) => format_option!(f, e)?,
+            ScalarValue::DurationNanosecond(e) => format_option!(f, e)?,
             ScalarValue::Struct(e, fields) => match e {
                 Some(l) => write!(
                     f,
@@ -3781,6 +3871,16 @@ impl fmt::Debug for ScalarValue {
             ScalarValue::IntervalMonthDayNano(_) => {
                 write!(f, "IntervalMonthDayNano(\"{self}\")")
             }
+            ScalarValue::DurationSecond(_) => write!(f, 
"DurationSecond(\"{self}\")"),
+            ScalarValue::DurationMillisecond(_) => {
+                write!(f, "DurationMillisecond(\"{self}\")")
+            }
+            ScalarValue::DurationMicrosecond(_) => {
+                write!(f, "DurationMicrosecond(\"{self}\")")
+            }
+            ScalarValue::DurationNanosecond(_) => {
+                write!(f, "DurationNanosecond(\"{self}\")")
+            }
             ScalarValue::Struct(e, fields) => {
                 // Use Debug representation of field values
                 match e {
diff --git a/datafusion/proto/proto/datafusion.proto 
b/datafusion/proto/proto/datafusion.proto
index 0d61cd2b35..81a8bc6b23 100644
--- a/datafusion/proto/proto/datafusion.proto
+++ b/datafusion/proto/proto/datafusion.proto
@@ -904,6 +904,12 @@ message ScalarValue{
     int64 date_64_value = 21;
     int32 interval_yearmonth_value = 24;
     int64 interval_daytime_value = 25;
+
+    int64 duration_second_value = 35;
+    int64 duration_millisecond_value = 36;
+    int64 duration_microsecond_value = 37;
+    int64 duration_nanosecond_value = 38;
+
     ScalarTimestampValue timestamp_value = 26;
     ScalarDictionaryValue dictionary_value = 27;
     bytes binary_value = 28;
diff --git a/datafusion/proto/src/generated/pbjson.rs 
b/datafusion/proto/src/generated/pbjson.rs
index 831dd49618..3c7763a154 100644
--- a/datafusion/proto/src/generated/pbjson.rs
+++ b/datafusion/proto/src/generated/pbjson.rs
@@ -18938,6 +18938,18 @@ impl serde::Serialize for ScalarValue {
                 scalar_value::Value::IntervalDaytimeValue(v) => {
                     struct_ser.serialize_field("intervalDaytimeValue", 
ToString::to_string(&v).as_str())?;
                 }
+                scalar_value::Value::DurationSecondValue(v) => {
+                    struct_ser.serialize_field("durationSecondValue", 
ToString::to_string(&v).as_str())?;
+                }
+                scalar_value::Value::DurationMillisecondValue(v) => {
+                    struct_ser.serialize_field("durationMillisecondValue", 
ToString::to_string(&v).as_str())?;
+                }
+                scalar_value::Value::DurationMicrosecondValue(v) => {
+                    struct_ser.serialize_field("durationMicrosecondValue", 
ToString::to_string(&v).as_str())?;
+                }
+                scalar_value::Value::DurationNanosecondValue(v) => {
+                    struct_ser.serialize_field("durationNanosecondValue", 
ToString::to_string(&v).as_str())?;
+                }
                 scalar_value::Value::TimestampValue(v) => {
                     struct_ser.serialize_field("timestampValue", v)?;
                 }
@@ -19016,6 +19028,14 @@ impl<'de> serde::Deserialize<'de> for ScalarValue {
             "intervalYearmonthValue",
             "interval_daytime_value",
             "intervalDaytimeValue",
+            "duration_second_value",
+            "durationSecondValue",
+            "duration_millisecond_value",
+            "durationMillisecondValue",
+            "duration_microsecond_value",
+            "durationMicrosecondValue",
+            "duration_nanosecond_value",
+            "durationNanosecondValue",
             "timestamp_value",
             "timestampValue",
             "dictionary_value",
@@ -19057,6 +19077,10 @@ impl<'de> serde::Deserialize<'de> for ScalarValue {
             Date64Value,
             IntervalYearmonthValue,
             IntervalDaytimeValue,
+            DurationSecondValue,
+            DurationMillisecondValue,
+            DurationMicrosecondValue,
+            DurationNanosecondValue,
             TimestampValue,
             DictionaryValue,
             BinaryValue,
@@ -19107,6 +19131,10 @@ impl<'de> serde::Deserialize<'de> for ScalarValue {
                             "date64Value" | "date_64_value" => 
Ok(GeneratedField::Date64Value),
                             "intervalYearmonthValue" | 
"interval_yearmonth_value" => Ok(GeneratedField::IntervalYearmonthValue),
                             "intervalDaytimeValue" | "interval_daytime_value" 
=> Ok(GeneratedField::IntervalDaytimeValue),
+                            "durationSecondValue" | "duration_second_value" => 
Ok(GeneratedField::DurationSecondValue),
+                            "durationMillisecondValue" | 
"duration_millisecond_value" => Ok(GeneratedField::DurationMillisecondValue),
+                            "durationMicrosecondValue" | 
"duration_microsecond_value" => Ok(GeneratedField::DurationMicrosecondValue),
+                            "durationNanosecondValue" | 
"duration_nanosecond_value" => Ok(GeneratedField::DurationNanosecondValue),
                             "timestampValue" | "timestamp_value" => 
Ok(GeneratedField::TimestampValue),
                             "dictionaryValue" | "dictionary_value" => 
Ok(GeneratedField::DictionaryValue),
                             "binaryValue" | "binary_value" => 
Ok(GeneratedField::BinaryValue),
@@ -19267,6 +19295,30 @@ impl<'de> serde::Deserialize<'de> for ScalarValue {
                             }
                             value__ = 
map.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x|
 scalar_value::Value::IntervalDaytimeValue(x.0));
                         }
+                        GeneratedField::DurationSecondValue => {
+                            if value__.is_some() {
+                                return 
Err(serde::de::Error::duplicate_field("durationSecondValue"));
+                            }
+                            value__ = 
map.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x|
 scalar_value::Value::DurationSecondValue(x.0));
+                        }
+                        GeneratedField::DurationMillisecondValue => {
+                            if value__.is_some() {
+                                return 
Err(serde::de::Error::duplicate_field("durationMillisecondValue"));
+                            }
+                            value__ = 
map.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x|
 scalar_value::Value::DurationMillisecondValue(x.0));
+                        }
+                        GeneratedField::DurationMicrosecondValue => {
+                            if value__.is_some() {
+                                return 
Err(serde::de::Error::duplicate_field("durationMicrosecondValue"));
+                            }
+                            value__ = 
map.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x|
 scalar_value::Value::DurationMicrosecondValue(x.0));
+                        }
+                        GeneratedField::DurationNanosecondValue => {
+                            if value__.is_some() {
+                                return 
Err(serde::de::Error::duplicate_field("durationNanosecondValue"));
+                            }
+                            value__ = 
map.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x|
 scalar_value::Value::DurationNanosecondValue(x.0));
+                        }
                         GeneratedField::TimestampValue => {
                             if value__.is_some() {
                                 return 
Err(serde::de::Error::duplicate_field("timestampValue"));
diff --git a/datafusion/proto/src/generated/prost.rs 
b/datafusion/proto/src/generated/prost.rs
index e6c076e7d4..aca90c5f57 100644
--- a/datafusion/proto/src/generated/prost.rs
+++ b/datafusion/proto/src/generated/prost.rs
@@ -1087,7 +1087,7 @@ pub struct ScalarFixedSizeBinary {
 pub struct ScalarValue {
     #[prost(
         oneof = "scalar_value::Value",
-        tags = "33, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 
21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34"
+        tags = "33, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 
21, 24, 25, 35, 36, 37, 38, 26, 27, 28, 29, 30, 31, 32, 34"
     )]
     pub value: ::core::option::Option<scalar_value::Value>,
 }
@@ -1142,6 +1142,14 @@ pub mod scalar_value {
         IntervalYearmonthValue(i32),
         #[prost(int64, tag = "25")]
         IntervalDaytimeValue(i64),
+        #[prost(int64, tag = "35")]
+        DurationSecondValue(i64),
+        #[prost(int64, tag = "36")]
+        DurationMillisecondValue(i64),
+        #[prost(int64, tag = "37")]
+        DurationMicrosecondValue(i64),
+        #[prost(int64, tag = "38")]
+        DurationNanosecondValue(i64),
         #[prost(message, tag = "26")]
         TimestampValue(super::ScalarTimestampValue),
         #[prost(message, tag = "27")]
diff --git a/datafusion/proto/src/logical_plan/from_proto.rs 
b/datafusion/proto/src/logical_plan/from_proto.rs
index b4a49713c2..c4dc8eb9b2 100644
--- a/datafusion/proto/src/logical_plan/from_proto.rs
+++ b/datafusion/proto/src/logical_plan/from_proto.rs
@@ -680,6 +680,10 @@ impl TryFrom<&protobuf::ScalarValue> for ScalarValue {
             }
             Value::IntervalYearmonthValue(v) => 
Self::IntervalYearMonth(Some(*v)),
             Value::IntervalDaytimeValue(v) => Self::IntervalDayTime(Some(*v)),
+            Value::DurationSecondValue(v) => Self::DurationSecond(Some(*v)),
+            Value::DurationMillisecondValue(v) => 
Self::DurationMillisecond(Some(*v)),
+            Value::DurationMicrosecondValue(v) => 
Self::DurationMicrosecond(Some(*v)),
+            Value::DurationNanosecondValue(v) => 
Self::DurationNanosecond(Some(*v)),
             Value::TimestampValue(v) => {
                 let timezone = if v.timezone.is_empty() {
                     None
diff --git a/datafusion/proto/src/logical_plan/to_proto.rs 
b/datafusion/proto/src/logical_plan/to_proto.rs
index 5b09aee910..d81e92c3f3 100644
--- a/datafusion/proto/src/logical_plan/to_proto.rs
+++ b/datafusion/proto/src/logical_plan/to_proto.rs
@@ -1013,63 +1013,62 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
     type Error = Error;
 
     fn try_from(val: &ScalarValue) -> Result<Self, Self::Error> {
-        use datafusion_common::scalar;
         use protobuf::scalar_value::Value;
 
         let data_type = val.get_datatype();
         match val {
-            scalar::ScalarValue::Boolean(val) => {
+            ScalarValue::Boolean(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::BoolValue(*s))
             }
-            scalar::ScalarValue::Float32(val) => {
+            ScalarValue::Float32(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Float32Value(*s))
             }
-            scalar::ScalarValue::Float64(val) => {
+            ScalarValue::Float64(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Float64Value(*s))
             }
-            scalar::ScalarValue::Int8(val) => {
+            ScalarValue::Int8(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::Int8Value(*s as i32)
                 })
             }
-            scalar::ScalarValue::Int16(val) => {
+            ScalarValue::Int16(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::Int16Value(*s as i32)
                 })
             }
-            scalar::ScalarValue::Int32(val) => {
+            ScalarValue::Int32(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Int32Value(*s))
             }
-            scalar::ScalarValue::Int64(val) => {
+            ScalarValue::Int64(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Int64Value(*s))
             }
-            scalar::ScalarValue::UInt8(val) => {
+            ScalarValue::UInt8(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::Uint8Value(*s as u32)
                 })
             }
-            scalar::ScalarValue::UInt16(val) => {
+            ScalarValue::UInt16(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::Uint16Value(*s as u32)
                 })
             }
-            scalar::ScalarValue::UInt32(val) => {
+            ScalarValue::UInt32(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Uint32Value(*s))
             }
-            scalar::ScalarValue::UInt64(val) => {
+            ScalarValue::UInt64(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Uint64Value(*s))
             }
-            scalar::ScalarValue::Utf8(val) => {
+            ScalarValue::Utf8(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::Utf8Value(s.to_owned())
                 })
             }
-            scalar::ScalarValue::LargeUtf8(val) => {
+            ScalarValue::LargeUtf8(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::LargeUtf8Value(s.to_owned())
                 })
             }
-            scalar::ScalarValue::List(values, boxed_field) => {
+            ScalarValue::List(values, boxed_field) => {
                 let is_null = values.is_none();
 
                 let values = if let Some(values) = values.as_ref() {
@@ -1093,10 +1092,10 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     )),
                 })
             }
-            datafusion::scalar::ScalarValue::Date32(val) => {
+            ScalarValue::Date32(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Date32Value(*s))
             }
-            datafusion::scalar::ScalarValue::TimestampMicrosecond(val, tz) => {
+            ScalarValue::TimestampMicrosecond(val, tz) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::TimestampValue(protobuf::ScalarTimestampValue {
                         timezone: tz.as_deref().unwrap_or("").to_string(),
@@ -1108,7 +1107,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     })
                 })
             }
-            datafusion::scalar::ScalarValue::TimestampNanosecond(val, tz) => {
+            ScalarValue::TimestampNanosecond(val, tz) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::TimestampValue(protobuf::ScalarTimestampValue {
                         timezone: tz.as_deref().unwrap_or("").to_string(),
@@ -1120,7 +1119,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     })
                 })
             }
-            datafusion::scalar::ScalarValue::Decimal128(val, p, s) => match 
*val {
+            ScalarValue::Decimal128(val, p, s) => match *val {
                 Some(v) => {
                     let array = v.to_be_bytes();
                     let vec_val: Vec<u8> = array.to_vec();
@@ -1138,10 +1137,10 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     )),
                 }),
             },
-            datafusion::scalar::ScalarValue::Date64(val) => {
+            ScalarValue::Date64(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| 
Value::Date64Value(*s))
             }
-            datafusion::scalar::ScalarValue::TimestampSecond(val, tz) => {
+            ScalarValue::TimestampSecond(val, tz) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::TimestampValue(protobuf::ScalarTimestampValue {
                         timezone: tz.as_deref().unwrap_or("").to_string(),
@@ -1151,7 +1150,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     })
                 })
             }
-            datafusion::scalar::ScalarValue::TimestampMillisecond(val, tz) => {
+            ScalarValue::TimestampMillisecond(val, tz) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::TimestampValue(protobuf::ScalarTimestampValue {
                         timezone: tz.as_deref().unwrap_or("").to_string(),
@@ -1163,31 +1162,31 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                     })
                 })
             }
-            datafusion::scalar::ScalarValue::IntervalYearMonth(val) => {
+            ScalarValue::IntervalYearMonth(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::IntervalYearmonthValue(*s)
                 })
             }
-            datafusion::scalar::ScalarValue::IntervalDayTime(val) => {
+            ScalarValue::IntervalDayTime(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::IntervalDaytimeValue(*s)
                 })
             }
-            datafusion::scalar::ScalarValue::Null => Ok(protobuf::ScalarValue {
+            ScalarValue::Null => Ok(protobuf::ScalarValue {
                 value: Some(Value::NullValue((&data_type).try_into()?)),
             }),
 
-            scalar::ScalarValue::Binary(val) => {
+            ScalarValue::Binary(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::BinaryValue(s.to_owned())
                 })
             }
-            scalar::ScalarValue::LargeBinary(val) => {
+            ScalarValue::LargeBinary(val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     Value::LargeBinaryValue(s.to_owned())
                 })
             }
-            scalar::ScalarValue::FixedSizeBinary(length, val) => {
+            ScalarValue::FixedSizeBinary(length, val) => {
                 create_proto_scalar(val.as_ref(), &data_type, |s| {
                     
Value::FixedSizeBinaryValue(protobuf::ScalarFixedSizeBinary {
                         values: s.to_owned(),
@@ -1196,7 +1195,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::Time32Second(v) => {
+            ScalarValue::Time32Second(v) => {
                 create_proto_scalar(v.as_ref(), &data_type, |v| {
                     Value::Time32Value(protobuf::ScalarTime32Value {
                         value: Some(
@@ -1206,7 +1205,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::Time32Millisecond(v) => {
+            ScalarValue::Time32Millisecond(v) => {
                 create_proto_scalar(v.as_ref(), &data_type, |v| {
                     Value::Time32Value(protobuf::ScalarTime32Value {
                         value: Some(
@@ -1218,7 +1217,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::Time64Microsecond(v) => {
+            ScalarValue::Time64Microsecond(v) => {
                 create_proto_scalar(v.as_ref(), &data_type, |v| {
                     Value::Time64Value(protobuf::ScalarTime64Value {
                         value: Some(
@@ -1230,7 +1229,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::Time64Nanosecond(v) => {
+            ScalarValue::Time64Nanosecond(v) => {
                 create_proto_scalar(v.as_ref(), &data_type, |v| {
                     Value::Time64Value(protobuf::ScalarTime64Value {
                         value: Some(
@@ -1242,7 +1241,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::IntervalMonthDayNano(v) => {
+            ScalarValue::IntervalMonthDayNano(v) => {
                 let value = if let Some(v) = v {
                     let (months, days, nanos) = 
IntervalMonthDayNanoType::to_parts(*v);
                     
Value::IntervalMonthDayNano(protobuf::IntervalMonthDayNanoValue {
@@ -1251,13 +1250,42 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                         nanos,
                     })
                 } else {
-                    
protobuf::scalar_value::Value::NullValue((&data_type).try_into()?)
+                    Value::NullValue((&data_type).try_into()?)
                 };
 
                 Ok(protobuf::ScalarValue { value: Some(value) })
             }
 
-            datafusion::scalar::ScalarValue::Struct(values, fields) => {
+            ScalarValue::DurationSecond(v) => {
+                let value = match v {
+                    Some(v) => Value::DurationSecondValue(*v),
+                    None => Value::NullValue((&data_type).try_into()?),
+                };
+                Ok(protobuf::ScalarValue { value: Some(value) })
+            }
+            ScalarValue::DurationMillisecond(v) => {
+                let value = match v {
+                    Some(v) => Value::DurationMillisecondValue(*v),
+                    None => Value::NullValue((&data_type).try_into()?),
+                };
+                Ok(protobuf::ScalarValue { value: Some(value) })
+            }
+            ScalarValue::DurationMicrosecond(v) => {
+                let value = match v {
+                    Some(v) => Value::DurationMicrosecondValue(*v),
+                    None => Value::NullValue((&data_type).try_into()?),
+                };
+                Ok(protobuf::ScalarValue { value: Some(value) })
+            }
+            ScalarValue::DurationNanosecond(v) => {
+                let value = match v {
+                    Some(v) => Value::DurationNanosecondValue(*v),
+                    None => Value::NullValue((&data_type).try_into()?),
+                };
+                Ok(protobuf::ScalarValue { value: Some(value) })
+            }
+
+            ScalarValue::Struct(values, fields) => {
                 // encode null as empty field values list
                 let field_values = if let Some(values) = values {
                     if values.is_empty() {
@@ -1284,7 +1312,7 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue {
                 })
             }
 
-            datafusion::scalar::ScalarValue::Dictionary(index_type, val) => {
+            ScalarValue::Dictionary(index_type, val) => {
                 let value: protobuf::ScalarValue = val.as_ref().try_into()?;
                 Ok(protobuf::ScalarValue {
                     value: Some(Value::DictionaryValue(Box::new(

Reply via email to