diff --git a/src/join.jl b/src/join.jl index 37ee57c..c809fde 100644 --- a/src/join.jl +++ b/src/join.jl @@ -33,11 +33,15 @@ function join( error("Not all DataFrames have all columns given by `cols`") end + # Work with local copies to avoid mutating caller-provided arrays + cols = copy(cols) + invariant_cols = copy(invariant_cols) + if :id in cols deleteat!(cols, findall(cols .== :id)) end if :id in invariant_cols - deleteat!(cols, findall(cols .== :id)) + deleteat!(invariant_cols, findall(invariant_cols .== :id)) end invariant_cols = [:id; invariant_cols] cols = setdiff(cols, invariant_cols) @@ -48,6 +52,10 @@ function join( s = first(stats)[1] df = stats[s][:, invariant_cols] + # Apply hdr_override to invariant columns, but keep :id stable. + inv_col_names = [c == :id ? "id" : (haskey(hdr_override, c) ? hdr_override[c] : String(c)) for c in invariant_cols] + rename!(df, Dict(c => Symbol(n) for (c, n) in zip(invariant_cols, inv_col_names))) + invariant_cols = [Symbol(n) for n in inv_col_names] rename_f(c, s) = begin symbol_c = Symbol(c) diff --git a/test/test-tables.jl b/test/test-tables.jl index c0dd974..bafb00d 100644 --- a/test/test-tables.jl +++ b/test/test-tables.jl @@ -42,12 +42,33 @@ cols = [:status, :name, :f, :t, :iter] stats, [:status, :f, :t], invariant_cols = [:name], - hdr_override = Dict(:status => "flag"), + hdr_override = Dict(:status => "flag", :name => "Name"), ) + @test :Name in propertynames(df_joined) + @test :name ∉ propertynames(df_joined) println(df_joined) end + @testset "join ignores id header override" begin + df_joined = join( + stats, + [:status, :f, :t], + invariant_cols = [:name], + hdr_override = Dict(:id => "identifier", :status => "flag"), + ) + df_expected = join( + stats, + [:status, :f, :t], + invariant_cols = [:name], + hdr_override = Dict(:status => "flag"), + ) + + @test :id in propertynames(df_joined) + @test :identifier ∉ propertynames(df_joined) + @test df_joined == df_expected + end + @testset "joined results in latex format" begin df_joined = join( stats,