diff --git a/cpp/src/arrow/sparse_tensor.cc b/cpp/src/arrow/sparse_tensor.cc index b84070b3d28..477fa2f7650 100644 --- a/cpp/src/arrow/sparse_tensor.cc +++ b/cpp/src/arrow/sparse_tensor.cc @@ -405,13 +405,10 @@ SparseCSFIndex::SparseCSFIndex(const std::vector>& indpt std::string SparseCSFIndex::ToString() const { return std::string("SparseCSFIndex"); } bool SparseCSFIndex::Equals(const SparseCSFIndex& other) const { - for (int64_t i = 0; i < static_cast(indices().size()); ++i) { - if (!indices()[i]->Equals(*other.indices()[i])) return false; - } - for (int64_t i = 0; i < static_cast(indptr().size()); ++i) { - if (!indptr()[i]->Equals(*other.indptr()[i])) return false; - } - return axis_order() == other.axis_order(); + auto eq = [](const auto& a, const auto& b) { return a->Equals(*b); }; + return axis_order() == other.axis_order() && + std::ranges::equal(indices(), other.indices(), eq) && + std::ranges::equal(indptr(), other.indptr(), eq); } // ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/sparse_tensor_test.cc b/cpp/src/arrow/sparse_tensor_test.cc index c9c28a11b1b..434f4a1723c 100644 --- a/cpp/src/arrow/sparse_tensor_test.cc +++ b/cpp/src/arrow/sparse_tensor_test.cc @@ -1641,10 +1641,32 @@ TYPED_TEST_P(TestSparseCSFTensorForIndexValueType, TestNonAscendingShape) { ASSERT_TRUE(st->Equals(*sparse_tensor)); } +TYPED_TEST_P(TestSparseCSFTensorForIndexValueType, TestEqualityMismatchedDimensions) { + using IndexValueType = TypeParam; + using c_index_value_type = typename IndexValueType::c_type; + + // 2D vs 3D - comparing indices with different dimensionality + // 2D CSF: ndim=2, so indptr.size()=1, indices.size()=2 + std::vector axis_order_2D = {0, 1}; + std::vector> indptr_2D = {{0, 1}}; + std::vector> indices_2D = {{0}, {0}}; + auto si_2D = this->MakeSparseCSFIndex(axis_order_2D, indptr_2D, indices_2D); + + // 3D CSF: ndim=3, so indptr.size()=2, indices.size()=3 + std::vector axis_order_3D = {0, 1, 2}; + std::vector> indptr_3D = {{0, 1}, {0, 1}}; + std::vector> indices_3D = {{0}, {0}, {0}}; + auto si_3D = this->MakeSparseCSFIndex(axis_order_3D, indptr_3D, indices_3D); + + ASSERT_FALSE(si_2D->Equals(*si_3D)); + ASSERT_FALSE(si_3D->Equals(*si_2D)); + ASSERT_TRUE(si_2D->Equals(*si_2D)); +} + REGISTER_TYPED_TEST_SUITE_P(TestSparseCSFTensorForIndexValueType, TestCreateSparseTensor, TestTensorToSparseTensor, TestSparseTensorToTensor, TestAlternativeAxisOrder, TestNonAscendingShape, - TestRoundTrip); + TestRoundTrip, TestEqualityMismatchedDimensions); INSTANTIATE_TYPED_TEST_SUITE_P(TestInt8, TestSparseCSFTensorForIndexValueType, Int8Type); INSTANTIATE_TYPED_TEST_SUITE_P(TestUInt8, TestSparseCSFTensorForIndexValueType,