diff --git a/arrow-data/src/equal/decimal.rs b/arrow-data/src/equal/decimal.rs deleted file mode 100644 index 15703389cb8a..000000000000 --- a/arrow-data/src/equal/decimal.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -use crate::data::{contains_nulls, ArrayData}; -use arrow_buffer::bit_util::get_bit; -use arrow_schema::DataType; - -use super::utils::equal_len; - -pub(super) fn decimal_equal( - lhs: &ArrayData, - rhs: &ArrayData, - lhs_start: usize, - rhs_start: usize, - len: usize, -) -> bool { - let size = match lhs.data_type() { - DataType::Decimal128(_, _) => 16, - DataType::Decimal256(_, _) => 32, - _ => unreachable!(), - }; - - let lhs_values = &lhs.buffers()[0].as_slice()[lhs.offset() * size..]; - let rhs_values = &rhs.buffers()[0].as_slice()[rhs.offset() * size..]; - - // Only checking one null mask here because by the time the control flow reaches - // this point, the equality of the two masks would have already been verified. - if !contains_nulls(lhs.null_buffer(), lhs_start + lhs.offset(), len) { - equal_len( - lhs_values, - rhs_values, - size * lhs_start, - size * rhs_start, - size * len, - ) - } else { - // get a ref of the null buffer bytes, to use in testing for nullness - let lhs_null_bytes = lhs.null_buffer().as_ref().unwrap().as_slice(); - let rhs_null_bytes = rhs.null_buffer().as_ref().unwrap().as_slice(); - // with nulls, we need to compare item by item whenever it is not null - (0..len).all(|i| { - let lhs_pos = lhs_start + i; - let rhs_pos = rhs_start + i; - - let lhs_is_null = !get_bit(lhs_null_bytes, lhs_pos + lhs.offset()); - let rhs_is_null = !get_bit(rhs_null_bytes, rhs_pos + rhs.offset()); - - lhs_is_null - || (lhs_is_null == rhs_is_null) - && equal_len( - lhs_values, - rhs_values, - lhs_pos * size, - rhs_pos * size, - size, // 1 * size since we are comparing a single entry - ) - }) - } -} diff --git a/arrow-data/src/equal/mod.rs b/arrow-data/src/equal/mod.rs index 063ef64d4d84..85c595cfed1c 100644 --- a/arrow-data/src/equal/mod.rs +++ b/arrow-data/src/equal/mod.rs @@ -20,11 +20,11 @@ //! depend on dynamic casting of `Array`. use crate::data::ArrayData; +use arrow_buffer::i256; use arrow_schema::{DataType, IntervalUnit}; use half::f16; mod boolean; -mod decimal; mod dictionary; mod fixed_binary; mod fixed_list; @@ -40,7 +40,6 @@ mod variable_size; // For this reason, they are not exposed and are instead used // to build the generic functions below (`equal_range` and `equal`). use boolean::boolean_equal; -use decimal::decimal_equal; use dictionary::dictionary_equal; use fixed_binary::fixed_binary_equal; use fixed_list::fixed_list_equal; @@ -74,6 +73,12 @@ fn equal_values( DataType::Int64 => primitive_equal::(lhs, rhs, lhs_start, rhs_start, len), DataType::Float32 => primitive_equal::(lhs, rhs, lhs_start, rhs_start, len), DataType::Float64 => primitive_equal::(lhs, rhs, lhs_start, rhs_start, len), + DataType::Decimal128(_, _) => { + primitive_equal::(lhs, rhs, lhs_start, rhs_start, len) + } + DataType::Decimal256(_, _) => { + primitive_equal::(lhs, rhs, lhs_start, rhs_start, len) + } DataType::Date32 | DataType::Time32(_) | DataType::Interval(IntervalUnit::YearMonth) => { @@ -98,9 +103,6 @@ fn equal_values( DataType::FixedSizeBinary(_) => { fixed_binary_equal(lhs, rhs, lhs_start, rhs_start, len) } - DataType::Decimal128(_, _) | DataType::Decimal256(_, _) => { - decimal_equal(lhs, rhs, lhs_start, rhs_start, len) - } DataType::List(_) => list_equal::(lhs, rhs, lhs_start, rhs_start, len), DataType::LargeList(_) => list_equal::(lhs, rhs, lhs_start, rhs_start, len), DataType::FixedSizeList(_, _) => {