Skip to content

Commit 7b374b9

Browse files
authored
arrow-array: Implement PartialEq for RunArray (#7727)
# Which issue does this PR close? Closes #7691 # Are there any user-facing changes? No, just implementing for ease of use and consistency in tests and elsewhere across the wider repository. @alamb
1 parent 469c7ee commit 7b374b9

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

arrow-array/src/array/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,12 @@ impl<T: ByteViewType + ?Sized> PartialEq for GenericByteViewArray<T> {
733733
}
734734
}
735735

736+
impl<R: RunEndIndexType> PartialEq for RunArray<R> {
737+
fn eq(&self, other: &Self) -> bool {
738+
self.to_data().eq(&other.to_data())
739+
}
740+
}
741+
736742
/// Constructs an array using the input `data`.
737743
/// Returns a reference-counted `Array` instance.
738744
pub fn make_array(data: ArrayData) -> ArrayRef {

arrow-array/src/array/run_array.rs

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ mod tests {
670670
use crate::builder::PrimitiveRunBuilder;
671671
use crate::cast::AsArray;
672672
use crate::types::{Int8Type, UInt32Type};
673-
use crate::{Int32Array, StringArray};
673+
use crate::{Int16Array, Int32Array, StringArray};
674674

675675
fn build_input_array(size: usize) -> Vec<Option<i32>> {
676676
// The input array is created by shuffling and repeating
@@ -1104,4 +1104,69 @@ mod tests {
11041104
assert_eq!(&n, &expected[offset..offset + length], "{offset} {length}");
11051105
}
11061106
}
1107+
1108+
#[test]
1109+
fn test_run_array_eq_identical() {
1110+
let run_ends1 = Int32Array::from(vec![2, 4, 6]);
1111+
let values1 = StringArray::from(vec!["a", "b", "c"]);
1112+
let array1 = RunArray::<Int32Type>::try_new(&run_ends1, &values1).unwrap();
1113+
1114+
let run_ends2 = Int32Array::from(vec![2, 4, 6]);
1115+
let values2 = StringArray::from(vec!["a", "b", "c"]);
1116+
let array2 = RunArray::<Int32Type>::try_new(&run_ends2, &values2).unwrap();
1117+
1118+
assert_eq!(array1, array2);
1119+
}
1120+
1121+
#[test]
1122+
fn test_run_array_ne_different_run_ends() {
1123+
let run_ends1 = Int32Array::from(vec![2, 4, 6]);
1124+
let values1 = StringArray::from(vec!["a", "b", "c"]);
1125+
let array1 = RunArray::<Int32Type>::try_new(&run_ends1, &values1).unwrap();
1126+
1127+
let run_ends2 = Int32Array::from(vec![1, 4, 6]);
1128+
let values2 = StringArray::from(vec!["a", "b", "c"]);
1129+
let array2 = RunArray::<Int32Type>::try_new(&run_ends2, &values2).unwrap();
1130+
1131+
assert_ne!(array1, array2);
1132+
}
1133+
1134+
#[test]
1135+
fn test_run_array_ne_different_values() {
1136+
let run_ends1 = Int32Array::from(vec![2, 4, 6]);
1137+
let values1 = StringArray::from(vec!["a", "b", "c"]);
1138+
let array1 = RunArray::<Int32Type>::try_new(&run_ends1, &values1).unwrap();
1139+
1140+
let run_ends2 = Int32Array::from(vec![2, 4, 6]);
1141+
let values2 = StringArray::from(vec!["a", "b", "d"]);
1142+
let array2 = RunArray::<Int32Type>::try_new(&run_ends2, &values2).unwrap();
1143+
1144+
assert_ne!(array1, array2);
1145+
}
1146+
1147+
#[test]
1148+
fn test_run_array_eq_with_nulls() {
1149+
let run_ends1 = Int32Array::from(vec![2, 4, 6]);
1150+
let values1 = StringArray::from(vec![Some("a"), None, Some("c")]);
1151+
let array1 = RunArray::<Int32Type>::try_new(&run_ends1, &values1).unwrap();
1152+
1153+
let run_ends2 = Int32Array::from(vec![2, 4, 6]);
1154+
let values2 = StringArray::from(vec![Some("a"), None, Some("c")]);
1155+
let array2 = RunArray::<Int32Type>::try_new(&run_ends2, &values2).unwrap();
1156+
1157+
assert_eq!(array1, array2);
1158+
}
1159+
1160+
#[test]
1161+
fn test_run_array_eq_different_run_end_types() {
1162+
let run_ends_i16_1 = Int16Array::from(vec![2_i16, 4, 6]);
1163+
let values_i16_1 = StringArray::from(vec!["a", "b", "c"]);
1164+
let array_i16_1 = RunArray::<Int16Type>::try_new(&run_ends_i16_1, &values_i16_1).unwrap();
1165+
1166+
let run_ends_i16_2 = Int16Array::from(vec![2_i16, 4, 6]);
1167+
let values_i16_2 = StringArray::from(vec!["a", "b", "c"]);
1168+
let array_i16_2 = RunArray::<Int16Type>::try_new(&run_ends_i16_2, &values_i16_2).unwrap();
1169+
1170+
assert_eq!(array_i16_1, array_i16_2);
1171+
}
11071172
}

0 commit comments

Comments
 (0)