Skip to content

Commit 6fb2a3f

Browse files
committed
avoid type piracy in reduce with vcat
1 parent 5cd4616 commit 6fb2a3f

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/abstractdataframe/iteration.jl

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,12 @@ function mapcols!(f::Union{Function,Type}, df::DataFrame; cols=All())
598598
return df
599599
end
600600

601+
##############################################################################
602+
##
603+
## Reduction
604+
##
605+
##############################################################################
606+
601607
"""
602608
reduce(::typeof(vcat),
603609
dfs::Union{AbstractVector{<:AbstractDataFrame},
@@ -686,7 +692,10 @@ julia> reduce(vcat, [df1, df2, df3], cols=:union, source=:source)
686692
```
687693
"""
688694
function Base.reduce(::typeof(vcat),
689-
dfs::Union{AbstractVector{<:AbstractDataFrame},
695+
dfs::Union{AbstractVector{AbstractDataFrame},
696+
AbstractVector{DataFrame},
697+
AbstractVector{SubDataFrame},
698+
AbstractVector{Union{DataFrame,SubDataFrame}},
690699
Tuple{AbstractDataFrame,Vararg{AbstractDataFrame}}};
691700
cols::Union{Symbol,AbstractVector{Symbol},
692701
AbstractVector{<:AbstractString}}=:setequal,
@@ -741,8 +750,10 @@ end
741750

742751
# definition needed to avoid dispatch ambiguity
743752
Base.reduce(::typeof(vcat),
744-
dfs::SentinelArrays.ChainedVector{T,A} where {T<:AbstractDataFrame,
745-
A<:AbstractVector{T}};
753+
dfs::Union{SentinelArrays.ChainedVector{AbstractDataFrame,<:AbstractVector{AbstractDataFrame}},
754+
SentinelArrays.ChainedVector{DataFrame,<:AbstractVector{DataFrame}},
755+
SentinelArrays.ChainedVector{SubDataFrame,<:AbstractVector{SubDataFrame}},
756+
SentinelArrays.ChainedVector{Union{DataFrame,SubDataFrame},<:AbstractVector{Union{DataFrame,SubDataFrame}}}};
746757
cols::Union{Symbol,AbstractVector{Symbol},
747758
AbstractVector{<:AbstractString}}=:setequal,
748759
source::Union{Nothing,SymbolOrString,

test/cat.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,4 +477,19 @@ end
477477
@test reduce(vcat, (df1, df2)) == DataFrame(a=[1, 1], b=[2, 2])
478478
end
479479

480+
@testset "vcat type piracy" begin
481+
x = Int[]
482+
@test reduce(vcat, Union{}[], init=x) === x
483+
484+
@test reduce(vcat, AbstractDataFrame[DataFrame(a=1), DataFrame(a=2)]) ==
485+
DataFrame(a=[1, 2])
486+
@test reduce(vcat, Union{DataFrame, SubDataFrame}[DataFrame(a=1), DataFrame(a=2)]) ==
487+
DataFrame(a=[1, 2])
488+
@test reduce(vcat, AbstractDataFrame[DataFrame(a=1), DataFrame(a=2)]; source=:source) ==
489+
DataFrame(a=[1, 2], source=[1, 2])
490+
@test reduce(vcat, Union{DataFrame,SubDataFrame}[DataFrame(a=1), DataFrame(a=2)]; source=:source) ==
491+
DataFrame(a=[1, 2], source=[1, 2])
492+
end
493+
494+
480495
end # module

0 commit comments

Comments
 (0)