Skip to content

Commit f8dc712

Browse files
author
Pietro Vertechi
authored
use Perm (#49)
1 parent ef7751d commit f8dc712

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

src/sort.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,17 @@ end
6464
Base.sort!(c::StructArray{<:Union{Tuple, NamedTuple}}) = permute!(c, sortperm(c))
6565
Base.sort(c::StructArray{<:Union{Tuple, NamedTuple}}) = c[sortperm(c)]
6666

67+
# Given an ordering `p`, return a vector `v` such that `Perm(Forward, v)` is
68+
# equivalent to `p`. Return `nothing` if such vector is not found.
69+
forward_vec(p::Perm{ForwardOrdering}) = p.data
70+
forward_vec(::Ordering) = nothing
71+
6772
# Methods from IndexedTables to refine sorting:
6873
# # assuming x[p] is sorted, sort by remaining columns where x[p] is constant
69-
function refine_perm!(p, cols, c, x, y, lo, hi)
74+
function refine_perm!(p, cols, c, x, y, lo, hi)
7075
temp = similar(p, 0)
71-
order = Base.Order.By(j->(@inbounds k=y[j]; k))
76+
order = Perm(Forward, y′)
77+
y = something(forward_vec(order), y′)
7278
nc = length(cols)
7379
for (_, idxs) in TiedIndices(x, p, lo:hi)
7480
i, i1 = extrema(idxs)
@@ -88,7 +94,7 @@ Base.@noinline function sort_sub_by!(v, i0, i1, by, order, temp)
8894
sort!(v, i0, i1, MergeSort, order, temp)
8995
end
9096

91-
Base.@noinline function sort_sub_by!(v, i0, i1, by::Vector{T}, order, temp) where T<:Integer
97+
Base.@noinline function sort_sub_by!(v, i0, i1, by::AbstractVector{T}, order, temp) where T<:Integer
9298
min = max = by[v[i0]]
9399
@inbounds for i = i0+1:i1
94100
val = by[v[i]]

0 commit comments

Comments
 (0)