Skip to content

Commit

Permalink
Clean up methods
Browse files Browse the repository at this point in the history
  • Loading branch information
Sov-trotter committed Aug 23, 2020
1 parent bcec31e commit d245b12
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 33 deletions.
47 changes: 15 additions & 32 deletions src/tables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,43 +19,24 @@ function Tables.schema(layer::AbstractFeatureLayer)
ngeom = ArchGDAL.ngeom(featuredefn)
geomdefns = (ArchGDAL.getgeomdefn(featuredefn, i) for i in 0:ngeom-1)
geom_names = (ArchGDAL.getname(geomdefn) for geomdefn in geomdefns)
geom_types = (ArchGDAL.gettype(geomdefn) for geomdefn in geomdefns)
geom_types = (IGeometry for i in 1:ngeom)

names = (names_fields..., geom_names...)
types = (types_fields..., geom_types...)
Tables.Schema(names, types)
Tables.Schema((names_fields..., geom_names...), (types_fields..., geom_types...))
end

Tables.istable(::Type{<:Table}) = true
Tables.rowaccess(::Type{<:Table}) = true
Tables.rows(t::Table) = t

function Base.iterate(t::Table, st = 0)
layer = getlayer(t)
st >= nfeature(layer) && return nothing
if iszero(st)
resetreading!(layer)
end

featuredefn = layerdefn(layer)
field_names = Tuple(Symbol(getname(getfielddefn(featuredefn, i-1))) for i in 1:nfield(layer))
fielddefns = (getfielddefn(featuredefn, i) for i in 0:nfield(layer)-1)
types_fields = (_FIELDTYPE[gettype(fielddefn)] for fielddefn in fielddefns)
geom_names = Tuple(Symbol(getname(getgeomdefn(featuredefn, i-1))) for i in 1:ngeom(layer))

st >= nfeature(layer) && return nothing
v = Union{types_fields..., IGeometry}[]
nextfeature(layer) do feature
for name in field_names
push!(v, getfield(feature, name))
end
for idx in 1:length(geom_names)
push!(v, getgeom(feature, idx-1))
end
end
row = NamedTuple{(field_names..., geom_names...)}(v)
return row, st + 1
return get_row(layer), st + 1
end

Tables.istable(::Type{<:Table}) = true
Tables.rowaccess(::Type{<:Table}) = true
Tables.rows(t::Table) = t

Base.IteratorSize(::Type{<:Table}) = Base.HasLength()
Base.size(t::Table) = nfeature(getlayer(t))
Base.length(t::Table) = size(t)
Expand All @@ -66,13 +47,16 @@ Base.getproperty(t::Table, s::Symbol) = [getproperty(iterate(t, i)[1], s) for i
function Base.getindex(t::Table, idx::Int)
layer = getlayer(t)
setnextbyindex!(layer, idx)
return get_row(layer)
end

function get_row(layer::IFeatureLayer)
featuredefn = layerdefn(layer)
field_names = Tuple(Symbol(getname(getfielddefn(featuredefn, i-1))) for i in 1:nfield(layer))
fielddefns = (getfielddefn(featuredefn, i) for i in 0:nfield(layer)-1)
types_fields = (_FIELDTYPE[gettype(fielddefn)] for fielddefn in fielddefns)
geom_names = Tuple(Symbol(getname(getgeomdefn(featuredefn, i-1))) for i in 1:ngeom(layer))
v = Union{types_fields..., IGeometry}[]
field_names = Tuple(Symbol(getname(fielddefn)) for fielddefn in fielddefns)
geom_names = (Symbol(getname(getgeomdefn(featuredefn, i-1))) for i in 1:ngeom(layer))

v = Union{Tables.schema(layer).types...}[]
nextfeature(layer) do feature
for name in field_names
push!(v, getfield(feature, name))
Expand All @@ -83,7 +67,6 @@ function Base.getindex(t::Table, idx::Int)
end
row = NamedTuple{(field_names..., geom_names...)}(v)
end


function Base.show(io::IO, t::Table)
println(io, "Table with $(nfeature(getlayer(t))) features")
Expand Down
1 change: 0 additions & 1 deletion test/test_tables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import ArchGDAL; const AG = ArchGDAL
using Tables

@testset "Tables Support" begin

dataset = AG.read(joinpath(@__DIR__, "data/point.geojson"))
dataset1 = AG.read(joinpath(@__DIR__, "data/multi_geom.csv"), options = ["GEOM_POSSIBLE_NAMES=point,linestring", "KEEP_GEOM_COLUMNS=NO"])
@test dataset isa ArchGDAL.IDataset
Expand Down

0 comments on commit d245b12

Please sign in to comment.