1use crate::data::ArrayData;
10use arrow_buffer::{IntervalMonthDayNano, i256};
11use arrow_schema::{DataType, IntervalUnit};
12use half::f16;
13
14mod boolean;
15mod byte_view;
16mod dictionary;
17mod fixed_binary;
18mod fixed_list;
19mod list;
20mod list_view;
21mod null;
22mod primitive;
23mod run;
24mod structure;
25mod union;
26mod utils;
27mod variable_size;
28
29use self::run::run_equal;
33use crate::equal::list_view::list_view_equal;
34use boolean::boolean_equal;
35use byte_view::byte_view_equal;
36use dictionary::dictionary_equal;
37use fixed_binary::fixed_binary_equal;
38use fixed_list::fixed_list_equal;
39use list::list_equal;
40use null::null_equal;
41use primitive::primitive_equal;
42use structure::struct_equal;
43use union::union_equal;
44use variable_size::variable_sized_equal;
45
46#[inline]
52fn equal_values(
53 lhs: &ArrayData,
54 rhs: &ArrayData,
55 lhs_start: usize,
56 rhs_start: usize,
57 len: usize,
58) -> bool {
59 match lhs.data_type() {
60 DataType::Null => null_equal(lhs, rhs, lhs_start, rhs_start, len),
61 DataType::Boolean => boolean_equal(lhs, rhs, lhs_start, rhs_start, len),
62 DataType::UInt8 => primitive_equal::<u8>(lhs, rhs, lhs_start, rhs_start, len),
63 DataType::UInt16 => primitive_equal::<u16>(lhs, rhs, lhs_start, rhs_start, len),
64 DataType::UInt32 => primitive_equal::<u32>(lhs, rhs, lhs_start, rhs_start, len),
65 DataType::UInt64 => primitive_equal::<u64>(lhs, rhs, lhs_start, rhs_start, len),
66 DataType::Int8 => primitive_equal::<i8>(lhs, rhs, lhs_start, rhs_start, len),
67 DataType::Int16 => primitive_equal::<i16>(lhs, rhs, lhs_start, rhs_start, len),
68 DataType::Int32 => primitive_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
69 DataType::Int64 => primitive_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
70 DataType::Float32 => primitive_equal::<f32>(lhs, rhs, lhs_start, rhs_start, len),
71 DataType::Float64 => primitive_equal::<f64>(lhs, rhs, lhs_start, rhs_start, len),
72 DataType::Decimal32(_, _) => primitive_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
73 DataType::Decimal64(_, _) => primitive_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
74 DataType::Decimal128(_, _) => primitive_equal::<i128>(lhs, rhs, lhs_start, rhs_start, len),
75 DataType::Decimal256(_, _) => primitive_equal::<i256>(lhs, rhs, lhs_start, rhs_start, len),
76 DataType::Date32 | DataType::Time32(_) | DataType::Interval(IntervalUnit::YearMonth) => {
77 primitive_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len)
78 }
79 DataType::Date64
80 | DataType::Interval(IntervalUnit::DayTime)
81 | DataType::Time64(_)
82 | DataType::Timestamp(_, _)
83 | DataType::Duration(_) => primitive_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
84 DataType::Interval(IntervalUnit::MonthDayNano) => {
85 primitive_equal::<IntervalMonthDayNano>(lhs, rhs, lhs_start, rhs_start, len)
86 }
87 DataType::Utf8 | DataType::Binary => {
88 variable_sized_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len)
89 }
90 DataType::LargeUtf8 | DataType::LargeBinary => {
91 variable_sized_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len)
92 }
93 DataType::FixedSizeBinary(_) => fixed_binary_equal(lhs, rhs, lhs_start, rhs_start, len),
94 DataType::BinaryView | DataType::Utf8View => {
95 byte_view_equal(lhs, rhs, lhs_start, rhs_start, len)
96 }
97 DataType::List(_) => list_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
98 DataType::LargeList(_) => list_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
99 DataType::ListView(_) => list_view_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
100 DataType::LargeListView(_) => list_view_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
101 DataType::FixedSizeList(_, _) => fixed_list_equal(lhs, rhs, lhs_start, rhs_start, len),
102 DataType::Struct(_) => struct_equal(lhs, rhs, lhs_start, rhs_start, len),
103 DataType::Union(_, _) => union_equal(lhs, rhs, lhs_start, rhs_start, len),
104 DataType::Dictionary(data_type, _) => match data_type.as_ref() {
105 DataType::Int8 => dictionary_equal::<i8>(lhs, rhs, lhs_start, rhs_start, len),
106 DataType::Int16 => dictionary_equal::<i16>(lhs, rhs, lhs_start, rhs_start, len),
107 DataType::Int32 => dictionary_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
108 DataType::Int64 => dictionary_equal::<i64>(lhs, rhs, lhs_start, rhs_start, len),
109 DataType::UInt8 => dictionary_equal::<u8>(lhs, rhs, lhs_start, rhs_start, len),
110 DataType::UInt16 => dictionary_equal::<u16>(lhs, rhs, lhs_start, rhs_start, len),
111 DataType::UInt32 => dictionary_equal::<u32>(lhs, rhs, lhs_start, rhs_start, len),
112 DataType::UInt64 => dictionary_equal::<u64>(lhs, rhs, lhs_start, rhs_start, len),
113 _ => unreachable!(),
114 },
115 DataType::Float16 => primitive_equal::<f16>(lhs, rhs, lhs_start, rhs_start, len),
116 DataType::Map(_, _) => list_equal::<i32>(lhs, rhs, lhs_start, rhs_start, len),
117 DataType::RunEndEncoded(_, _) => run_equal(lhs, rhs, lhs_start, rhs_start, len),
118 }
119}
120
121fn equal_range(
122 lhs: &ArrayData,
123 rhs: &ArrayData,
124 lhs_start: usize,
125 rhs_start: usize,
126 len: usize,
127) -> bool {
128 utils::equal_nulls(lhs, rhs, lhs_start, rhs_start, len)
129 && equal_values(lhs, rhs, lhs_start, rhs_start, len)
130}
131
132pub fn equal(lhs: &ArrayData, rhs: &ArrayData) -> bool {
152 utils::base_equal(lhs, rhs)
153 && lhs.null_count() == rhs.null_count()
154 && utils::equal_nulls(lhs, rhs, 0, 0, lhs.len())
155 && equal_values(lhs, rhs, 0, 0, lhs.len())
156}
157
158