StructArrays.jl icon indicating copy to clipboard operation
StructArrays.jl copied to clipboard

Relax `LazyRow` for other packages

Open Moelf opened this issue 1 year ago • 3 comments

There's no reason why LazyRow can only work with StructArray, for example we had this for a while now: https://github.com/JuliaHEP/UnROOT.jl/blob/5f9ae4f21f04bf61f56f0ccabe7942754e07f7d9/src/iteration.jl#L196-L199

but essentially for any table-like structure, we simply have:

@inline function Base.getproperty(evt::LazyEvent, s::Symbol)
    @inbounds getproperty(Core.getfield(evt, :tree), s)[Core.getfield(evt, :idx)]
end

and basically this is just saying LazyRow wraps a object that support parent.col[idx]

Moelf avatar Apr 07 '23 16:04 Moelf

Bump, any appetite for this?

Moelf avatar Nov 05 '23 15:11 Moelf

Would be useful indeed! Also a bit more general, like

struct LazyIndexed{P,I}
    parent::P
    index::I
end

parent(li::LazyIndexed) = getfield(li, :parent)
index(li::LazyIndexed) = getfield(li, :index)
getproperty(li::LazyIndexed, p) = getproperty(parent(li), p)[index(li)]
# StructArrays-specific:
getindex(li::LazyIndexed{<:StructArray}, ix::Union{Integer,Symbol}) = getindex(components(parent(li)), ix)[index(li)]
getindex(li::LazyIndexed{<:StructArray{<:NamedTuple}}, ixs::Tuple{Vararg{Symbol}}) = getindex.(getindex(components(parent(li)), ixs), Ref(index(li)))

This can be a separate small package used in StructArrays, ROOT, etc. Does that sound reasonable?

On naming, Julia often uses "view" to mean lazy in this context, so I wonder if we can make it more consistent here. view(parent, index) won't work unfortunately, because it already means 0-dim array view and not a scalar.

(disclaimer: not a StructArrays member)

aplavin avatar Nov 05 '23 17:11 aplavin

This can be a separate small package used in StructArrays, ROOT, etc.

yeah that makes a lot of sense to me.

Moelf avatar Nov 05 '23 17:11 Moelf