64
64
Base. sort! (c:: StructArray{<:Union{Tuple, NamedTuple}} ) = permute! (c, sortperm (c))
65
65
Base. sort (c:: StructArray{<:Union{Tuple, NamedTuple}} ) = c[sortperm (c)]
66
66
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
+
67
72
# Methods from IndexedTables to refine sorting:
68
73
# # 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)
70
75
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′)
72
78
nc = length (cols)
73
79
for (_, idxs) in TiedIndices (x, p, lo: hi)
74
80
i, i1 = extrema (idxs)
@@ -88,7 +94,7 @@ Base.@noinline function sort_sub_by!(v, i0, i1, by, order, temp)
88
94
sort! (v, i0, i1, MergeSort, order, temp)
89
95
end
90
96
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
92
98
min = max = by[v[i0]]
93
99
@inbounds for i = i0+ 1 : i1
94
100
val = by[v[i]]
0 commit comments