datafusion/
schema_equivalence.rs1use arrow::datatypes::{DataType, Field, Fields, Schema};
19
20pub(crate) fn schema_satisfied_by(original: &Schema, candidate: &Schema) -> bool {
25 original.metadata() == candidate.metadata()
26 && fields_satisfied_by(original.fields(), candidate.fields())
27}
28
29fn fields_satisfied_by(original: &Fields, candidate: &Fields) -> bool {
31 original.len() == candidate.len()
32 && original
33 .iter()
34 .zip(candidate)
35 .all(|(original, candidate)| field_satisfied_by(original, candidate))
36}
37
38fn field_satisfied_by(original: &Field, candidate: &Field) -> bool {
40 original.name() == candidate.name()
41 && (original.is_nullable() || !candidate.is_nullable())
42 && original.metadata() == candidate.metadata()
43 && data_type_satisfied_by(original.data_type(), candidate.data_type())
44}
45
46fn data_type_satisfied_by(original: &DataType, candidate: &DataType) -> bool {
48 match (original, candidate) {
49 (DataType::List(original_field), DataType::List(candidate_field)) => {
50 field_satisfied_by(original_field, candidate_field)
51 }
52
53 (DataType::ListView(original_field), DataType::ListView(candidate_field)) => {
54 field_satisfied_by(original_field, candidate_field)
55 }
56
57 (
58 DataType::FixedSizeList(original_field, original_size),
59 DataType::FixedSizeList(candidate_field, candidate_size),
60 ) => {
61 original_size == candidate_size
62 && field_satisfied_by(original_field, candidate_field)
63 }
64
65 (DataType::LargeList(original_field), DataType::LargeList(candidate_field)) => {
66 field_satisfied_by(original_field, candidate_field)
67 }
68
69 (
70 DataType::LargeListView(original_field),
71 DataType::LargeListView(candidate_field),
72 ) => field_satisfied_by(original_field, candidate_field),
73
74 (DataType::Struct(original_fields), DataType::Struct(candidate_fields)) => {
75 fields_satisfied_by(original_fields, candidate_fields)
76 }
77
78 _ => original == candidate,
83 }
84}