use arrow::datatypes::{DataType, Field, Fields, Schema};
pub(crate) fn schema_satisfied_by(original: &Schema, candidate: &Schema) -> bool {
original.metadata() == candidate.metadata()
&& fields_satisfied_by(original.fields(), candidate.fields())
}
fn fields_satisfied_by(original: &Fields, candidate: &Fields) -> bool {
original.len() == candidate.len()
&& original
.iter()
.zip(candidate)
.all(|(original, candidate)| field_satisfied_by(original, candidate))
}
fn field_satisfied_by(original: &Field, candidate: &Field) -> bool {
original.name() == candidate.name()
&& (original.is_nullable() || !candidate.is_nullable())
&& original.metadata() == candidate.metadata()
&& data_type_satisfied_by(original.data_type(), candidate.data_type())
}
fn data_type_satisfied_by(original: &DataType, candidate: &DataType) -> bool {
match (original, candidate) {
(DataType::List(original_field), DataType::List(candidate_field)) => {
field_satisfied_by(original_field, candidate_field)
}
(DataType::ListView(original_field), DataType::ListView(candidate_field)) => {
field_satisfied_by(original_field, candidate_field)
}
(
DataType::FixedSizeList(original_field, original_size),
DataType::FixedSizeList(candidate_field, candidate_size),
) => {
original_size == candidate_size
&& field_satisfied_by(original_field, candidate_field)
}
(DataType::LargeList(original_field), DataType::LargeList(candidate_field)) => {
field_satisfied_by(original_field, candidate_field)
}
(
DataType::LargeListView(original_field),
DataType::LargeListView(candidate_field),
) => field_satisfied_by(original_field, candidate_field),
(DataType::Struct(original_fields), DataType::Struct(candidate_fields)) => {
fields_satisfied_by(original_fields, candidate_fields)
}
_ => original == candidate,
}
}