Skip to content

Commit ac5e719

Browse files
authored
add colmetadata support (#311)
1 parent 07e7462 commit ac5e719

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/StructArrays.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ function refvalue(s::StructArray{T}, v::Tup) where {T}
2525
createinstance(T, map(refvalue, components(s), v)...)
2626
end
2727

28+
# implement colmetadata for StructArray based on metadata of individual columns
29+
import DataAPI: metadata, metadatasupport, colmetadata, colmetadatasupport
30+
31+
colmetadatasupport(::Type{T}) where {T<:StructArray} = (
32+
read=any(col -> metadatasupport(col).read, array_types(T).parameters),
33+
write=false, # not implemented
34+
)
35+
colmetadata(sa::StructArray, col::Symbol) = metadata(getproperty(sa, col))
36+
colmetadata(sa::StructArray) =
37+
map(Tables.columns(sa)) do col
38+
metadatasupport(typeof(col)).read ? metadata(col) : nothing
39+
end
40+
2841
@static if !isdefined(Base, :get_extension)
2942
include("../ext/StructArraysAdaptExt.jl")
3043
include("../ext/StructArraysGPUArraysCoreExt.jl")

test/runtests.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,24 @@ end
11901190
end
11911191
end
11921192

1193+
@testset "metadata" begin
1194+
using DataAPI: colmetadatasupport, colmetadata, metadata, DataAPI
1195+
1196+
struct MyArray <: AbstractVector{Int} end
1197+
Base.size(::MyArray) = (2,)
1198+
DataAPI.metadatasupport(::Type{<:MyArray}) = (read=true, write=false)
1199+
DataAPI.metadata(::MyArray) = (x=1, y="2")
1200+
1201+
sa = StructArray(a=[1,2], b=[1,2])
1202+
@test colmetadatasupport(typeof(sa)) == (read=false, write=false)
1203+
1204+
sa = StructArray(a=MyArray(), b=[1,2])
1205+
@test metadata(sa.a) == (x=1, y="2")
1206+
@test colmetadatasupport(typeof(sa)) == (read=true, write=false)
1207+
@test colmetadata(sa, :a) == (x=1, y="2")
1208+
@test colmetadata(sa) == (a=(x=1, y="2"), b=nothing)
1209+
end
1210+
11931211
struct ArrayConverter end
11941212

11951213
Adapt.adapt_storage(::ArrayConverter, xs::AbstractArray) = convert(Array, xs)

0 commit comments

Comments
 (0)