This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 60fe5fa3c5 feat: Enhance DataType display formatting for `ListView`
and `LargeListView` variants (#8569)
60fe5fa3c5 is described below
commit 60fe5fa3c5afa157db56a5697de72ba2c7aa232c
Author: Alex Huang <[email protected]>
AuthorDate: Sat Oct 11 15:50:18 2025 +0300
feat: Enhance DataType display formatting for `ListView` and
`LargeListView` variants (#8569)
# Which issue does this PR close?
- Part of #8351
# Rationale for this change
# What changes are included in this PR?
# Are these changes tested?
Yes
# Are there any user-facing changes?
No
---
arrow-schema/src/datatype_display.rs | 79 ++++++++++++++++++++++++++++++++++--
1 file changed, 75 insertions(+), 4 deletions(-)
diff --git a/arrow-schema/src/datatype_display.rs
b/arrow-schema/src/datatype_display.rs
index ea50e3634c..80f214606c 100644
--- a/arrow-schema/src/datatype_display.rs
+++ b/arrow-schema/src/datatype_display.rs
@@ -71,13 +71,18 @@ impl fmt::Display for DataType {
Self::Utf8 => write!(f, "Utf8"),
Self::LargeUtf8 => write!(f, "LargeUtf8"),
Self::Utf8View => write!(f, "Utf8View"),
- Self::ListView(field) => write!(f, "ListView({field})"), // TODO:
make more readable
- Self::LargeListView(field) => write!(f, "LargeListView({field})"),
// TODO: make more readable
- Self::List(field) | Self::LargeList(field) => {
+ Self::List(field)
+ | Self::LargeList(field)
+ | Self::ListView(field)
+ | Self::LargeListView(field) => {
let type_name = if matches!(self, Self::List(_)) {
"List"
- } else {
+ } else if matches!(self, Self::ListView(_)) {
+ "ListView"
+ } else if matches!(self, Self::LargeList(_)) {
"LargeList"
+ } else {
+ "LargeListView"
};
let name = field.name();
@@ -196,6 +201,15 @@ mod tests {
assert_eq!(list_data_type_string, expected_string);
}
+ #[test]
+ fn test_display_list_view() {
+ let list_view_data_type =
+ DataType::ListView(Arc::new(Field::new("item", DataType::Int32,
true)));
+ let list_view_data_type_string = list_view_data_type.to_string();
+ let expected_string = "ListView(nullable Int32)";
+ assert_eq!(list_view_data_type_string, expected_string);
+ }
+
#[test]
fn test_display_list_with_named_field() {
let list_data_type = DataType::List(Arc::new(Field::new("foo",
DataType::UInt64, false)));
@@ -204,6 +218,15 @@ mod tests {
assert_eq!(list_data_type_string, expected_string);
}
+ #[test]
+ fn test_display_list_view_with_named_field() {
+ let list_view_data_type =
+ DataType::ListView(Arc::new(Field::new("bar", DataType::UInt64,
false)));
+ let list_view_data_type_string = list_view_data_type.to_string();
+ let expected_string = "ListView(UInt64, field: 'bar')";
+ assert_eq!(list_view_data_type_string, expected_string);
+ }
+
#[test]
fn test_display_nested_list() {
let nested_data_type = DataType::List(Arc::new(Field::new_list_field(
@@ -215,6 +238,17 @@ mod tests {
assert_eq!(nested_data_type_string, nested_expected_string);
}
+ #[test]
+ fn test_display_nested_list_view() {
+ let nested_view_data_type =
DataType::ListView(Arc::new(Field::new_list_field(
+
DataType::ListView(Arc::new(Field::new_list_field(DataType::UInt64, false))),
+ false,
+ )));
+ let nested_view_data_type_string = nested_view_data_type.to_string();
+ let nested_view_expected_string = "ListView(ListView(UInt64))";
+ assert_eq!(nested_view_data_type_string, nested_view_expected_string);
+ }
+
#[test]
fn test_display_list_with_metadata() {
let mut field = Field::new_list_field(DataType::Int32, true);
@@ -227,6 +261,17 @@ mod tests {
assert_eq!(list_data_type_string, expected_string);
}
+ #[test]
+ fn test_display_list_view_with_metadata() {
+ let mut field = Field::new_list_field(DataType::Int32, true);
+ let metadata = HashMap::from([("foo2".to_string(),
"value2".to_string())]);
+ field.set_metadata(metadata);
+ let list_view_data_type = DataType::ListView(Arc::new(field));
+ let list_view_data_type_string = list_view_data_type.to_string();
+ let expected_string = "ListView(nullable Int32, metadata: {\"foo2\":
\"value2\"})";
+ assert_eq!(list_view_data_type_string, expected_string);
+ }
+
#[test]
fn test_display_large_list() {
let large_list_data_type =
@@ -253,6 +298,32 @@ mod tests {
assert_eq!(large_list_metadata_string, expected_metadata_string);
}
+ #[test]
+ fn test_display_large_list_view() {
+ let large_list_view_data_type =
+ DataType::LargeListView(Arc::new(Field::new("item",
DataType::Int32, true)));
+ let large_list_view_data_type_string =
large_list_view_data_type.to_string();
+ let expected_string = "LargeListView(nullable Int32)";
+ assert_eq!(large_list_view_data_type_string, expected_string);
+
+ // Test with named field
+ let large_list_view_named =
+ DataType::LargeListView(Arc::new(Field::new("bar",
DataType::UInt64, false)));
+ let large_list_view_named_string = large_list_view_named.to_string();
+ let expected_named_string = "LargeListView(UInt64, field: 'bar')";
+ assert_eq!(large_list_view_named_string, expected_named_string);
+
+ // Test with metadata
+ let mut field = Field::new_list_field(DataType::Int32, true);
+ let metadata = HashMap::from([("key1".to_string(),
"value1".to_string())]);
+ field.set_metadata(metadata);
+ let large_list_view_metadata =
DataType::LargeListView(Arc::new(field));
+ let large_list_view_metadata_string =
large_list_view_metadata.to_string();
+ let expected_metadata_string =
+ "LargeListView(nullable Int32, metadata: {\"key1\": \"value1\"})";
+ assert_eq!(large_list_view_metadata_string, expected_metadata_string);
+ }
+
#[test]
fn test_display_fixed_size_list() {
let fixed_size_list =