From 334203a27e3ea015333ab541fd5ea7116727b422 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:56:46 +0200 Subject: [PATCH] fix: mark (Large)ListView as nested and support in equal data type --- arrow-schema/src/datatype.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/arrow-schema/src/datatype.rs b/arrow-schema/src/datatype.rs index 7cd53b13c73e..23bd2e2cfa42 100644 --- a/arrow-schema/src/datatype.rs +++ b/arrow-schema/src/datatype.rs @@ -552,16 +552,21 @@ impl DataType { matches!(self, Int16 | Int32 | Int64) } - /// Returns true if this type is nested (List, FixedSizeList, LargeList, Struct, Union, + /// Returns true if this type is nested (List, FixedSizeList, LargeList, ListView. LargeListView, Struct, Union, /// or Map), or a dictionary of a nested type #[inline] pub fn is_nested(&self) -> bool { use DataType::*; match self { Dictionary(_, v) => DataType::is_nested(v.as_ref()), - List(_) | FixedSizeList(_, _) | LargeList(_) | Struct(_) | Union(_, _) | Map(_, _) => { - true - } + List(_) + | FixedSizeList(_, _) + | LargeList(_) + | ListView(_) + | LargeListView(_) + | Struct(_) + | Union(_, _) + | Map(_, _) => true, _ => false, } } @@ -578,7 +583,9 @@ impl DataType { pub fn equals_datatype(&self, other: &DataType) -> bool { match (&self, other) { (DataType::List(a), DataType::List(b)) - | (DataType::LargeList(a), DataType::LargeList(b)) => { + | (DataType::LargeList(a), DataType::LargeList(b)) + | (DataType::ListView(a), DataType::ListView(b)) + | (DataType::LargeListView(a), DataType::LargeListView(b)) => { a.is_nullable() == b.is_nullable() && a.data_type().equals_datatype(b.data_type()) } (DataType::FixedSizeList(a, a_size), DataType::FixedSizeList(b, b_size)) => { @@ -725,7 +732,9 @@ impl DataType { pub fn contains(&self, other: &DataType) -> bool { match (self, other) { (DataType::List(f1), DataType::List(f2)) - | (DataType::LargeList(f1), DataType::LargeList(f2)) => f1.contains(f2), + | (DataType::LargeList(f1), DataType::LargeList(f2)) + | (DataType::ListView(f1), DataType::ListView(f2)) + | (DataType::LargeListView(f1), DataType::LargeListView(f2)) => f1.contains(f2), (DataType::FixedSizeList(f1, s1), DataType::FixedSizeList(f2, s2)) => { s1 == s2 && f1.contains(f2) } @@ -1006,11 +1015,16 @@ mod tests { #[test] fn test_nested() { let list = DataType::List(Arc::new(Field::new("foo", DataType::Utf8, true))); + let list_view = DataType::ListView(Arc::new(Field::new("foo", DataType::Utf8, true))); + let large_list_view = + DataType::LargeListView(Arc::new(Field::new("foo", DataType::Utf8, true))); assert!(!DataType::is_nested(&DataType::Boolean)); assert!(!DataType::is_nested(&DataType::Int32)); assert!(!DataType::is_nested(&DataType::Utf8)); assert!(DataType::is_nested(&list)); + assert!(DataType::is_nested(&list_view)); + assert!(DataType::is_nested(&large_list_view)); assert!(!DataType::is_nested(&DataType::Dictionary( Box::new(DataType::Int32),