diff --git a/src/vector.jl b/src/vector.jl index b0a4f99..b33920a 100644 --- a/src/vector.jl +++ b/src/vector.jl @@ -19,3 +19,7 @@ Base.setindex!(G::GeometryVector, v, i::Int) = setindex!(parent(G), v, i) # https://docs.julialang.org/en/v1/manual/interfaces/#man-interface-array Base.similar(G::GeometryVector, ::Type{T}, dims::Dims) where {T} = GeometryVector(similar(parent(G), T, dims)) + +# Mutable array interface +# TODO Invalidate spatial index on mutations +Base.deleteat!(G::GeometryVector, i) = (deleteat!(parent(G), i); G) diff --git a/test/runtests.jl b/test/runtests.jl index 299973e..f6f027a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -444,6 +444,28 @@ end @test GI.geometrycolumns(t) == (:geom,) end +@testitem "GeometryVector mutability" setup = [Setup] begin + using DataFrames + + # Test deleteat! directly on GeometryVector + gv = GDF.GeometryVector(AG.createpoint.(coords)) + @test length(gv) == 10 + deleteat!(gv, 5) + @test length(gv) == 9 + + # Test with DataFrame filtering (the original issue scenario) + df = DataFrame(geometry=GDF.GeometryVector(AG.createpoint.(coords)), name="test") + @test nrow(df) == 10 + filter!(row -> row.name == "test", df) + @test nrow(df) == 10 + + # Test with subset removal + df2 = DataFrame(geometry=GDF.GeometryVector(AG.createpoint.(coords)), value=1:10) + filter!(row -> row.value > 5, df2) + @test nrow(df2) == 5 + @test length(df2.geometry) == 5 +end + filter(ti) = !(:nowindows in ti.tags && Sys.iswindows()) @run_package_tests filter = filter