Skip to content

Commit 60fe5fa

Browse files
authored
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
1 parent 30b58d5 commit 60fe5fa

File tree

1 file changed

+75
-4
lines changed

1 file changed

+75
-4
lines changed

arrow-schema/src/datatype_display.rs

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,18 @@ impl fmt::Display for DataType {
7171
Self::Utf8 => write!(f, "Utf8"),
7272
Self::LargeUtf8 => write!(f, "LargeUtf8"),
7373
Self::Utf8View => write!(f, "Utf8View"),
74-
Self::ListView(field) => write!(f, "ListView({field})"), // TODO: make more readable
75-
Self::LargeListView(field) => write!(f, "LargeListView({field})"), // TODO: make more readable
76-
Self::List(field) | Self::LargeList(field) => {
74+
Self::List(field)
75+
| Self::LargeList(field)
76+
| Self::ListView(field)
77+
| Self::LargeListView(field) => {
7778
let type_name = if matches!(self, Self::List(_)) {
7879
"List"
79-
} else {
80+
} else if matches!(self, Self::ListView(_)) {
81+
"ListView"
82+
} else if matches!(self, Self::LargeList(_)) {
8083
"LargeList"
84+
} else {
85+
"LargeListView"
8186
};
8287

8388
let name = field.name();
@@ -196,6 +201,15 @@ mod tests {
196201
assert_eq!(list_data_type_string, expected_string);
197202
}
198203

204+
#[test]
205+
fn test_display_list_view() {
206+
let list_view_data_type =
207+
DataType::ListView(Arc::new(Field::new("item", DataType::Int32, true)));
208+
let list_view_data_type_string = list_view_data_type.to_string();
209+
let expected_string = "ListView(nullable Int32)";
210+
assert_eq!(list_view_data_type_string, expected_string);
211+
}
212+
199213
#[test]
200214
fn test_display_list_with_named_field() {
201215
let list_data_type = DataType::List(Arc::new(Field::new("foo", DataType::UInt64, false)));
@@ -204,6 +218,15 @@ mod tests {
204218
assert_eq!(list_data_type_string, expected_string);
205219
}
206220

221+
#[test]
222+
fn test_display_list_view_with_named_field() {
223+
let list_view_data_type =
224+
DataType::ListView(Arc::new(Field::new("bar", DataType::UInt64, false)));
225+
let list_view_data_type_string = list_view_data_type.to_string();
226+
let expected_string = "ListView(UInt64, field: 'bar')";
227+
assert_eq!(list_view_data_type_string, expected_string);
228+
}
229+
207230
#[test]
208231
fn test_display_nested_list() {
209232
let nested_data_type = DataType::List(Arc::new(Field::new_list_field(
@@ -215,6 +238,17 @@ mod tests {
215238
assert_eq!(nested_data_type_string, nested_expected_string);
216239
}
217240

241+
#[test]
242+
fn test_display_nested_list_view() {
243+
let nested_view_data_type = DataType::ListView(Arc::new(Field::new_list_field(
244+
DataType::ListView(Arc::new(Field::new_list_field(DataType::UInt64, false))),
245+
false,
246+
)));
247+
let nested_view_data_type_string = nested_view_data_type.to_string();
248+
let nested_view_expected_string = "ListView(ListView(UInt64))";
249+
assert_eq!(nested_view_data_type_string, nested_view_expected_string);
250+
}
251+
218252
#[test]
219253
fn test_display_list_with_metadata() {
220254
let mut field = Field::new_list_field(DataType::Int32, true);
@@ -227,6 +261,17 @@ mod tests {
227261
assert_eq!(list_data_type_string, expected_string);
228262
}
229263

264+
#[test]
265+
fn test_display_list_view_with_metadata() {
266+
let mut field = Field::new_list_field(DataType::Int32, true);
267+
let metadata = HashMap::from([("foo2".to_string(), "value2".to_string())]);
268+
field.set_metadata(metadata);
269+
let list_view_data_type = DataType::ListView(Arc::new(field));
270+
let list_view_data_type_string = list_view_data_type.to_string();
271+
let expected_string = "ListView(nullable Int32, metadata: {\"foo2\": \"value2\"})";
272+
assert_eq!(list_view_data_type_string, expected_string);
273+
}
274+
230275
#[test]
231276
fn test_display_large_list() {
232277
let large_list_data_type =
@@ -253,6 +298,32 @@ mod tests {
253298
assert_eq!(large_list_metadata_string, expected_metadata_string);
254299
}
255300

301+
#[test]
302+
fn test_display_large_list_view() {
303+
let large_list_view_data_type =
304+
DataType::LargeListView(Arc::new(Field::new("item", DataType::Int32, true)));
305+
let large_list_view_data_type_string = large_list_view_data_type.to_string();
306+
let expected_string = "LargeListView(nullable Int32)";
307+
assert_eq!(large_list_view_data_type_string, expected_string);
308+
309+
// Test with named field
310+
let large_list_view_named =
311+
DataType::LargeListView(Arc::new(Field::new("bar", DataType::UInt64, false)));
312+
let large_list_view_named_string = large_list_view_named.to_string();
313+
let expected_named_string = "LargeListView(UInt64, field: 'bar')";
314+
assert_eq!(large_list_view_named_string, expected_named_string);
315+
316+
// Test with metadata
317+
let mut field = Field::new_list_field(DataType::Int32, true);
318+
let metadata = HashMap::from([("key1".to_string(), "value1".to_string())]);
319+
field.set_metadata(metadata);
320+
let large_list_view_metadata = DataType::LargeListView(Arc::new(field));
321+
let large_list_view_metadata_string = large_list_view_metadata.to_string();
322+
let expected_metadata_string =
323+
"LargeListView(nullable Int32, metadata: {\"key1\": \"value1\"})";
324+
assert_eq!(large_list_view_metadata_string, expected_metadata_string);
325+
}
326+
256327
#[test]
257328
fn test_display_fixed_size_list() {
258329
let fixed_size_list =

0 commit comments

Comments
 (0)