From ffa7baf7208d3f130929ce0921953de58b67ff8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Vezy?= Date: Sun, 23 Apr 2023 17:51:00 +0200 Subject: [PATCH 1/3] Use `DataAPI.rownumber` --- Project.toml | 2 +- src/Tables.jl | 3 ++- src/dicts.jl | 5 +++-- src/fallbacks.jl | 1 + src/matrix.jl | 2 ++ src/tofromdatavalues.jl | 1 + 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index e51787c..fb105f7 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Tables" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" authors = ["quinnj "] -version = "1.10.1" +version = "1.11.0" [deps] DataAPI = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" diff --git a/src/Tables.jl b/src/Tables.jl index ddec790..3e0a979 100644 --- a/src/Tables.jl +++ b/src/Tables.jl @@ -1,7 +1,7 @@ module Tables using LinearAlgebra, DataValueInterfaces, DataAPI, TableTraits, IteratorInterfaceExtensions, OrderedCollections - +import DataAPI: rownumber export rowtable, columntable if !hasmethod(getproperty, Tuple{Tuple, Int}) @@ -250,6 +250,7 @@ struct Row{T} <: AbstractRow end Row(x::Row) = x +rownumber(x::Row) = rownumber(x.x) """ Tables.Columns(tbl) diff --git a/src/dicts.jl b/src/dicts.jl index d5d1bf9..0081378 100644 --- a/src/dicts.jl +++ b/src/dicts.jl @@ -110,9 +110,10 @@ struct DictRow <: AbstractRow row::Dict{Symbol, Any} end +rownumber(x::DictRow) = getfield(x, :row) columnnames(x::DictRow) = getfield(x, :names) -getcolumn(x::DictRow, i::Int) = get(getfield(x, :row), columnnames(x)[i], missing) -getcolumn(x::DictRow, nm::Symbol) = get(getfield(x, :row), nm, missing) +getcolumn(x::DictRow, i::Int) = get(rownumber(x), columnnames(x)[i], missing) +getcolumn(x::DictRow, nm::Symbol) = get(rownumber(x), nm, missing) Base.IteratorSize(::Type{DictRowTable}) = Base.HasLength() Base.length(x::DictRowTable) = length(getfield(x, :values)) diff --git a/src/fallbacks.jl b/src/fallbacks.jl index f0621c0..8392766 100644 --- a/src/fallbacks.jl +++ b/src/fallbacks.jl @@ -19,6 +19,7 @@ end getcolumns(c::ColumnsRow) = getfield(c, :columns) getrow(c::ColumnsRow) = getfield(c, :row) +rownumber(c::ColumnsRow) = getrow(c) # AbstractRow interface Base.@propagate_inbounds getcolumn(c::ColumnsRow, ::Type{T}, col::Int, nm::Symbol) where {T} = getcolumn(getcolumns(c), T, col, nm)[getrow(c)] diff --git a/src/matrix.jl b/src/matrix.jl index b8d0fdb..40d982d 100644 --- a/src/matrix.jl +++ b/src/matrix.jl @@ -31,6 +31,8 @@ struct MatrixRow{T} <: AbstractRow source::MatrixRowTable{T} end +rownumber(x::MatrixRow) = getfield(x, :row) + getcolumn(m::MatrixRow, ::Type, col::Int, nm::Symbol) = getfield(getfield(m, :source), :matrix)[getfield(m, :row), col] getcolumn(m::MatrixRow, i::Int) = diff --git a/src/tofromdatavalues.jl b/src/tofromdatavalues.jl index b3dbb98..18fd90b 100644 --- a/src/tofromdatavalues.jl +++ b/src/tofromdatavalues.jl @@ -60,6 +60,7 @@ struct IteratorRow{T} <: AbstractRow end getrow(r::IteratorRow) = getfield(r, :row) +rownumber(r::IteratorRow) = getrow(r) wrappedtype(::Type{I}) where {T, I<:IteratorRow{T}} = T wrappedtype(::Type{T}) where {T} = T From aefedf63f805ce6d8485229d678893dbc4b1132c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Vezy?= Date: Sun, 23 Apr 2023 22:09:34 +0200 Subject: [PATCH 2/3] Up DataAPI compat --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index fb105f7..552e61a 100644 --- a/Project.toml +++ b/Project.toml @@ -13,7 +13,7 @@ TableTraits = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] -DataAPI = "1" +DataAPI = "1.15" DataValueInterfaces = "1" IteratorInterfaceExtensions = "0.1.1, 1" OrderedCollections = "1" From 5f091b0bfa38e2fba033bb245044dba27c009729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Vezy?= Date: Sun, 23 Apr 2023 22:42:54 +0200 Subject: [PATCH 3/3] Update DictRow: add row index as a field for `rownumber` --- src/dicts.jl | 11 ++++++----- test/runtests.jl | 7 ++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/dicts.jl b/src/dicts.jl index 0081378..1e61af4 100644 --- a/src/dicts.jl +++ b/src/dicts.jl @@ -108,12 +108,13 @@ schema(x::DictRowTable) = Schema(getfield(x, :names), [getfield(x, :types)[nm] f struct DictRow <: AbstractRow names::Vector{Symbol} row::Dict{Symbol, Any} + rownumber::Int end -rownumber(x::DictRow) = getfield(x, :row) +rownumber(x::DictRow) = getfield(x, :rownumber) columnnames(x::DictRow) = getfield(x, :names) -getcolumn(x::DictRow, i::Int) = get(rownumber(x), columnnames(x)[i], missing) -getcolumn(x::DictRow, nm::Symbol) = get(rownumber(x), nm, missing) +getcolumn(x::DictRow, i::Int) = get(getfield(x, :row), columnnames(x)[i], missing) +getcolumn(x::DictRow, nm::Symbol) = get(getfield(x, :row), nm, missing) Base.IteratorSize(::Type{DictRowTable}) = Base.HasLength() Base.length(x::DictRowTable) = length(getfield(x, :values)) @@ -122,7 +123,7 @@ Base.eltype(::Type{DictRowTable}) = DictRow function Base.iterate(x::DictRowTable, st=1) st > length(x) && return nothing - return DictRow(x.names, x.values[st]), st + 1 + return DictRow(x.names, x.values[st], st), st + 1 end function subset(x::DictRowTable, inds; viewhint::Union{Bool,Nothing}=nothing, view::Union{Bool,Nothing}=nothing) @@ -132,7 +133,7 @@ function subset(x::DictRowTable, inds; viewhint::Union{Bool,Nothing}=nothing, vi end values = viewhint === true ? Base.view(getfield(x, :values), inds) : getfield(x, :values)[inds] if inds isa Integer - return DictRow(getfield(x, :names), values) + return DictRow(getfield(x, :names), values, inds) else values isa AbstractVector || throw(ArgumentError("`Tables.subset`: invalid `inds` argument, expected `RowTable` output, got $(typeof(ret))")) return DictRowTable(getfield(x, :names), getfield(x, :types), values) diff --git a/test/runtests.jl b/test/runtests.jl index 25d03c8..6b53203 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -83,7 +83,8 @@ using Test, Tables, OrderedCollections, TableTraits, DataValues, QueryOperators, @test Tables.columnaccess(rows) @test Tables.columns(rows) === nt @test Tables.materializer(rows) === Tables.materializer(nt) - + @test Tables.rownumber(Tables.IteratorRow(row)) == 1 + @test Tables.rowmerge(row; b=200, hey="hello") == (a=1, b=200, hey="hello") @test Tables.rowmerge(row, (hey="hello", a=200)) == (a=200, b=4, hey="hello") @test Tables.rowmerge(row, (hey="hello", a=200), row, (x=:x, y=:y, hey="bye")) == (a=1, b=4, hey="bye", x=:x, y=:y) @@ -826,6 +827,10 @@ end @test isequal(ct.c, [3, missing, missing, 10, 10]) @test isequal(ct.d, [missing, 5, 7, missing, 11]) + for (i,row) in enumerate(drt) + @test Tables.rownumber(row) == i + end + dct = Tables.dictcolumntable(rt) @test isequal(dct.a, [1, missing, 6, 8, 8]) @test isequal(ct.b, Union{Int, Float64, Missing}[2, 4.0, missing, 9, 9])