diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e2e1f99a..8715a9cbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ Changelog.generate( - `Begin`/`End` bugfixed for use as types - lookup methods like `order`, `span` etc work from all objects consistently ([#1071]) +- `==` for AbstractDimArray with missing values return missing and do not error +- `isequal` of AbstractDimArrays takes the dimensions into account ### Changed diff --git a/src/array/array.jl b/src/array/array.jl index a6915c5f9..05d8d6bae 100644 --- a/src/array/array.jl +++ b/src/array/array.jl @@ -129,8 +129,9 @@ Base.parentindices(A::AbstractDimArray) = parentindices(parent(A)) Base.vec(A::AbstractDimArray) = vec(parent(A)) # Only compare data and dim - metadata and refdims can be different Base.:(==)(A1::AbstractDimArray, A2::AbstractDimArray) = - parent(A1) == parent(A2) && dims(A1) == dims(A2) - + dims(A1) == dims(A2) && parent(A1) == parent(A2) +Base.isequal(A1::AbstractDimArray, A2::AbstractDimArray) = + isequal(dims(A1), dims(A2)) && isequal(parent(A1), parent(A2)) # undef constructor for Array, using dims function Base.Array{T}(x::UndefInitializer, d1::Dimension, dims::Dimension...) where T Base.Array{T}(x, (d1, dims...)) diff --git a/src/stack/stack.jl b/src/stack/stack.jl index fab86b81b..afc4febe4 100644 --- a/src/stack/stack.jl +++ b/src/stack/stack.jl @@ -146,7 +146,9 @@ end Base.parent(s::AbstractDimStack) = data(s) # Only compare data and dim - metadata and refdims can be different Base.:(==)(s1::AbstractDimStack, s2::AbstractDimStack) = - data(s1) == data(s2) && dims(s1) == dims(s2) && layerdims(s1) == layerdims(s2) + dims(s1) == dims(s2) && layerdims(s1) == layerdims(s2) && data(s1) == data(s2) +Base.isequal(s1::AbstractDimStack, s2::AbstractDimStack) = + isequal(dims(s1), dims(s2)) && isequal(layerdims(s1), layerdims(s2)) && isequal(data(s1), data(s2)) Base.read(s::AbstractDimStack) = maplayers(read, s) # Array-like diff --git a/test/array.jl b/test/array.jl index 010344210..c2a8916f3 100644 --- a/test/array.jl +++ b/test/array.jl @@ -618,3 +618,20 @@ end @test Base.dataids(a) == Base.dataids(parent(a)) @test Base.mightalias(a, parent(a)) end + +@testset "isequal and == with missing" begin + a = [missing 0; 0 0] + ba = [missing 0 0; 0 0 0] + + da = DimArray(a, (X(1:2), Y(1:2))) + dba = DimArray(ba, (X(1:2), Y(1:3))) + + @test ismissing(dba[:,1:2] == da) + @test (dba == da) == false + @test isequal(dba, da) == false + @test isequal(dba[:,1:2], da) + @test isequal(da, dba[:,2:3]) == false + dshift = DimArray(a, (X(10:11), Y(2:3))) + @test isequal(da, dshift) == false + @test (da == dshift) == false +end diff --git a/test/stack.jl b/test/stack.jl index 100216fb9..3d031313b 100644 --- a/test/stack.jl +++ b/test/stack.jl @@ -395,6 +395,17 @@ end end +@testset "isequal and == with missing" begin + a = [missing 1; 1 1] + da1 = DimArray(a, (X(1:2), Y(1:2))) + da2 = DimArray(copy(a), (X(2:3), Y(2:3))) + ds1 = DimStack(da1) + ds2 = DimStack(da2) + @test (ds1 == ds2) == false + @test ismissing(ds1 == ds1) + @test isequal(ds1, ds1) +end + @testset "skipmissing" begin skips = skipmissing(s) skips2 = skipmissing(mixed)