< Summary

Information
Class: src/tables.jl
Assembly: Default
File(s): src/tables.jl
Tag: 61_25545638018
Line coverage
88%
Covered lines: 40
Uncovered lines: 5
Coverable lines: 45
Total lines: 95
Line coverage: 88.8%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

File(s)

src/tables.jl

#LineLine coverage
 1# Tables.jl interface for `JSONWorksheet`.
 2#
 3# Reference: https://tables.juliadata.org/stable/implementing-the-interface/
 4#
 5# `JSONWorksheet` is naturally row-oriented (`jws.data` is a Vector of
 6# `PointerDict`s), so row access is the primary path. We additionally synthesise
 7# column access for column-oriented sinks (DataFrames, CSV.jl, ...).
 8#
 9# Column names are exposed as `Symbol`s built from the JSON Pointer path
 10# (`/a/b` -> `Symbol("/a/b")`). Schema element types come from the `Pointer{T}`
 11# parameter when available.
 12
 13# --- Table-level declarations -------------------------------------------------
 14
 115Tables.istable(::Type{<:JSONWorksheet}) = true
 116Tables.rowaccess(::Type{<:JSONWorksheet}) = true
 117Tables.columnaccess(::Type{<:JSONWorksheet}) = true
 18
 119Tables.rows(jws::JSONWorksheet) = [JSONWorksheetRow(jws, i) for i in 1:length(jws.data)]
 120Tables.columns(jws::JSONWorksheet) = JSONWorksheetColumns(jws)
 21
 422Tables.columnnames(jws::JSONWorksheet) =
 1623    ntuple(i -> _column_symbol(jws.pointer[i]), length(jws.pointer))
 24
 125function Tables.schema(jws::JSONWorksheet)
 626    types = ntuple(i -> _pointer_eltype(jws.pointer[i]), length(jws.pointer))
 127    Tables.Schema(Tables.columnnames(jws), types)
 28end
 29
 630Tables.getcolumn(jws::JSONWorksheet, i::Int) = jws[:, i]
 131Tables.getcolumn(jws::JSONWorksheet, p::Pointer) = jws[:, p]
 232function Tables.getcolumn(jws::JSONWorksheet, nm::Symbol)
 233    for p in jws.pointer
 734        _column_symbol(p) === nm && return jws[:, p]
 535    end
 036    return jws[:, JSONPointer.Pointer(string(nm))]
 37end
 38
 439function Tables.matrix(jws::JSONWorksheet; transpose::Bool=false)
 240    m = jws[:, :]
 241    transpose && return permutedims(m)
 142    m isa AbstractVector && return reshape(m, :, 1)
 143    return m
 44end
 45
 2446_column_symbol(p::Pointer) = Symbol("/" * join(p.tokens, "/"))
 447_pointer_eltype(::Pointer{T}) where {T} = T
 48
 49# --- AbstractRow wrapper ------------------------------------------------------
 50#
 51# Subtyping `Tables.AbstractRow` provides automatic `getindex`, `propertynames`,
 52# `getproperty`, iteration, and `show`. Note: `getproperty` on an `AbstractRow`
 53# is overridden to dispatch through `getcolumn`, so internal field access must
 54# go through `getfield`.
 55
 56struct JSONWorksheetRow <: Tables.AbstractRow
 357    parent::JSONWorksheet
 58    index::Int
 59end
 60
 261function Tables.getcolumn(row::JSONWorksheetRow, i::Int)
 262    par = getfield(row, :parent)
 263    par[getfield(row, :index), i]
 64end
 165function Tables.getcolumn(row::JSONWorksheetRow, p::Pointer)
 166    par = getfield(row, :parent)
 167    par[getfield(row, :index), p]
 68end
 169function Tables.getcolumn(row::JSONWorksheetRow, nm::Symbol)
 170    par = getfield(row, :parent)
 171    idx = getfield(row, :index)
 172    for p in par.pointer
 173        _column_symbol(p) === nm && return par[idx, p]
 074    end
 075    return par[idx, JSONPointer.Pointer(string(nm))]
 76end
 177Tables.columnnames(row::JSONWorksheetRow) =
 78    Tables.columnnames(getfield(row, :parent))
 79
 80# --- AbstractColumns wrapper --------------------------------------------------
 81
 82struct JSONWorksheetColumns <: Tables.AbstractColumns
 183    parent::JSONWorksheet
 84end
 85
 286Tables.getcolumn(c::JSONWorksheetColumns, i::Int) =
 87    Tables.getcolumn(getfield(c, :parent), i)
 088Tables.getcolumn(c::JSONWorksheetColumns, p::Pointer) =
 89    Tables.getcolumn(getfield(c, :parent), p)
 190Tables.getcolumn(c::JSONWorksheetColumns, nm::Symbol) =
 91    Tables.getcolumn(getfield(c, :parent), nm)
 192Tables.columnnames(c::JSONWorksheetColumns) =
 93    Tables.columnnames(getfield(c, :parent))
 094Tables.schema(c::JSONWorksheetColumns) =
 95    Tables.schema(getfield(c, :parent))

Methods/Properties