luoyuxia commented on code in PR #81:
URL: https://github.com/apache/fluss-rust/pull/81#discussion_r2610752709


##########
crates/fluss/src/record/arrow.rs:
##########
@@ -589,16 +589,81 @@ pub fn to_arrow_type(fluss_type: &DataType) -> 
ArrowDataType {
         DataType::Double(_) => ArrowDataType::Float64,
         DataType::Char(_) => ArrowDataType::Utf8,
         DataType::String(_) => ArrowDataType::Utf8,
-        DataType::Decimal(_) => todo!(),
+        DataType::Decimal(decimal_type) => ArrowDataType::Decimal128(
+            decimal_type
+                .precision()
+                .try_into()
+                .expect("precision exceeds u8::MAX"),
+            decimal_type
+                .scale()
+                .try_into()
+                .expect("scale exceeds i8::MAX"),
+        ),
         DataType::Date(_) => ArrowDataType::Date32,
-        DataType::Time(_) => todo!(),
-        DataType::Timestamp(_) => todo!(),
-        DataType::TimestampLTz(_) => todo!(),
-        DataType::Bytes(_) => todo!(),
-        DataType::Binary(_) => todo!(),
-        DataType::Array(_data_type) => todo!(),
-        DataType::Map(_data_type) => todo!(),
-        DataType::Row(_data_fields) => todo!(),
+        DataType::Time(time_type) => match time_type.precision() {
+            0 => ArrowDataType::Time32(arrow_schema::TimeUnit::Second),
+            1..=3 => 
ArrowDataType::Time32(arrow_schema::TimeUnit::Millisecond),
+            4..=6 => 
ArrowDataType::Time64(arrow_schema::TimeUnit::Microsecond),
+            7..=9 => ArrowDataType::Time64(arrow_schema::TimeUnit::Nanosecond),
+            // This arm should never be reached due to validation in TimeType.
+            invalid => panic!("Invalid precision value for TimeType: {}", 
invalid),
+        },
+        DataType::Timestamp(timestamp_type) => match 
timestamp_type.precision() {
+            0 => ArrowDataType::Timestamp(arrow_schema::TimeUnit::Second, 
None),
+            1..=3 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Millisecond, None),
+            4..=6 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Microsecond, None),
+            7..=9 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Nanosecond, None),
+            // This arm should never be reached due to validation in Timestamp.
+            invalid => panic!("Invalid precision value for TimestampType: {}", 
invalid),
+        },
+        DataType::TimestampLTz(timestamp_ltz_type) => match 
timestamp_ltz_type.precision() {
+            0 => ArrowDataType::Timestamp(arrow_schema::TimeUnit::Second, 
None),
+            1..=3 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Millisecond, None),
+            4..=6 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Microsecond, None),
+            7..=9 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Nanosecond, None),
+            // This arm should never be reached due to validation in 
TimestampLTz.
+            invalid => panic!("Invalid precision value for TimestampLTzType: 
{}", invalid),
+        },
+        DataType::Bytes(_) => ArrowDataType::Binary,
+        DataType::Binary(binary_type) => ArrowDataType::FixedSizeBinary(
+            binary_type
+                .length()
+                .try_into()
+                .expect("length exceeds i32::MAX"),
+        ),
+        DataType::Array(arrow_type) => ArrowDataType::List(
+            
arrow_schema::Field::new_list_field(to_arrow_type(arrow_type.get_element_type()),
 true)

Review Comment:
   nit:
   consider nullable of arrow_type



##########
crates/fluss/src/record/arrow.rs:
##########
@@ -589,16 +589,81 @@ pub fn to_arrow_type(fluss_type: &DataType) -> 
ArrowDataType {
         DataType::Double(_) => ArrowDataType::Float64,
         DataType::Char(_) => ArrowDataType::Utf8,
         DataType::String(_) => ArrowDataType::Utf8,
-        DataType::Decimal(_) => todo!(),
+        DataType::Decimal(decimal_type) => ArrowDataType::Decimal128(
+            decimal_type
+                .precision()
+                .try_into()
+                .expect("precision exceeds u8::MAX"),
+            decimal_type
+                .scale()
+                .try_into()
+                .expect("scale exceeds i8::MAX"),
+        ),
         DataType::Date(_) => ArrowDataType::Date32,
-        DataType::Time(_) => todo!(),
-        DataType::Timestamp(_) => todo!(),
-        DataType::TimestampLTz(_) => todo!(),
-        DataType::Bytes(_) => todo!(),
-        DataType::Binary(_) => todo!(),
-        DataType::Array(_data_type) => todo!(),
-        DataType::Map(_data_type) => todo!(),
-        DataType::Row(_data_fields) => todo!(),
+        DataType::Time(time_type) => match time_type.precision() {
+            0 => ArrowDataType::Time32(arrow_schema::TimeUnit::Second),
+            1..=3 => 
ArrowDataType::Time32(arrow_schema::TimeUnit::Millisecond),
+            4..=6 => 
ArrowDataType::Time64(arrow_schema::TimeUnit::Microsecond),
+            7..=9 => ArrowDataType::Time64(arrow_schema::TimeUnit::Nanosecond),
+            // This arm should never be reached due to validation in TimeType.
+            invalid => panic!("Invalid precision value for TimeType: {}", 
invalid),
+        },
+        DataType::Timestamp(timestamp_type) => match 
timestamp_type.precision() {
+            0 => ArrowDataType::Timestamp(arrow_schema::TimeUnit::Second, 
None),
+            1..=3 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Millisecond, None),
+            4..=6 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Microsecond, None),
+            7..=9 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Nanosecond, None),
+            // This arm should never be reached due to validation in Timestamp.
+            invalid => panic!("Invalid precision value for TimestampType: {}", 
invalid),
+        },
+        DataType::TimestampLTz(timestamp_ltz_type) => match 
timestamp_ltz_type.precision() {
+            0 => ArrowDataType::Timestamp(arrow_schema::TimeUnit::Second, 
None),
+            1..=3 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Millisecond, None),
+            4..=6 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Microsecond, None),
+            7..=9 => 
ArrowDataType::Timestamp(arrow_schema::TimeUnit::Nanosecond, None),
+            // This arm should never be reached due to validation in 
TimestampLTz.
+            invalid => panic!("Invalid precision value for TimestampLTzType: 
{}", invalid),
+        },
+        DataType::Bytes(_) => ArrowDataType::Binary,
+        DataType::Binary(binary_type) => ArrowDataType::FixedSizeBinary(
+            binary_type
+                .length()
+                .try_into()
+                .expect("length exceeds i32::MAX"),
+        ),
+        DataType::Array(arrow_type) => ArrowDataType::List(
+            
arrow_schema::Field::new_list_field(to_arrow_type(arrow_type.get_element_type()),
 true)
+                .into(),
+        ),
+        DataType::Map(map_type) => {
+            let key_type = to_arrow_type(map_type.key_type());
+            let value_type = to_arrow_type(map_type.value_type());
+            let entry_fields = vec![
+                arrow_schema::Field::new("key", key_type, false),

Review Comment:
   dito



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to