in arrow-schema/src/schema.rs [865:1022]
fn normalize_list() {
// Only the Struct type field should be unwrapped
let a = Arc::new(Field::new("a", DataType::Utf8, true));
let b = Arc::new(Field::new("b", DataType::Int64, false));
let c = Arc::new(Field::new("c", DataType::Int64, true));
let d = Arc::new(Field::new("d", DataType::Utf8, true));
let e = Arc::new(Field::new("e", DataType::Int64, false));
let f = Arc::new(Field::new("f", DataType::Int64, true));
let one = Arc::new(Field::new(
"1",
DataType::Struct(Fields::from(vec![a.clone(), b.clone(), c.clone()])),
true,
));
let two = Arc::new(Field::new(
"2",
DataType::List(Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
))),
false,
));
let exclamation = Arc::new(Field::new(
"!",
DataType::Struct(Fields::from(vec![one.clone(), two.clone()])),
false,
));
let normalize_all = Schema::new(vec![exclamation.clone()])
.normalize(".", None)
.expect("valid normalization");
// List shouldn't be affected
let expected = Schema::new(vec![
Field::new("!.1.a", DataType::Utf8, true),
Field::new("!.1.b", DataType::Int64, false),
Field::new("!.1.c", DataType::Int64, true),
Field::new(
"!.2",
DataType::List(Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
))),
false,
),
]);
assert_eq!(normalize_all, expected);
assert_eq!(normalize_all.fields().len(), 4);
// FixedSizeList
let two = Arc::new(Field::new(
"2",
DataType::FixedSizeList(
Arc::new(Field::new_fixed_size_list(
"3",
Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
)),
1,
true,
)),
1,
),
false,
));
let exclamation = Arc::new(Field::new(
"!",
DataType::Struct(Fields::from(vec![one.clone(), two])),
false,
));
let normalize_all = Schema::new(vec![exclamation.clone()])
.normalize(".", None)
.expect("valid normalization");
// FixedSizeList shouldn't be affected
let expected = Schema::new(vec![
Field::new("!.1.a", DataType::Utf8, true),
Field::new("!.1.b", DataType::Int64, false),
Field::new("!.1.c", DataType::Int64, true),
Field::new(
"!.2",
DataType::FixedSizeList(
Arc::new(Field::new_fixed_size_list(
"3",
Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
)),
1,
true,
)),
1,
),
false,
),
]);
assert_eq!(normalize_all, expected);
assert_eq!(normalize_all.fields().len(), 4);
// LargeList
let two = Arc::new(Field::new(
"2",
DataType::FixedSizeList(
Arc::new(Field::new_large_list(
"3",
Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
)),
true,
)),
1,
),
false,
));
let exclamation = Arc::new(Field::new(
"!",
DataType::Struct(Fields::from(vec![one.clone(), two])),
false,
));
let normalize_all = Schema::new(vec![exclamation.clone()])
.normalize(".", None)
.expect("valid normalization");
// LargeList shouldn't be affected
let expected = Schema::new(vec![
Field::new("!.1.a", DataType::Utf8, true),
Field::new("!.1.b", DataType::Int64, false),
Field::new("!.1.c", DataType::Int64, true),
Field::new(
"!.2",
DataType::FixedSizeList(
Arc::new(Field::new_large_list(
"3",
Arc::new(Field::new_list_field(
DataType::Struct(Fields::from(vec![d.clone(), e.clone(), f.clone()])),
true,
)),
true,
)),
1,
),
false,
),
]);
assert_eq!(normalize_all, expected);
assert_eq!(normalize_all.fields().len(), 4);
}