Skip to content

Commit 3e2ee9d

Browse files
authored
allow comparison optimizations in TiedIndices (#56)
1 parent 28f1525 commit 3e2ee9d

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
julia 0.7
2+
PooledArrays 0.5
23
Requires

src/StructArrays.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module StructArrays
22

33
import Requires
4+
using PooledArrays: PooledArray
5+
46
export StructArray, StructVector, LazyRow, LazyRows
57
export collect_structarray, fieldarrays
68

@@ -13,9 +15,6 @@ include("lazy.jl")
1315

1416
function __init__()
1517
Requires.@require Tables="bd369af6-aec1-5ad0-b16a-f7cc5008161c" include("tables.jl")
16-
Requires.@require PooledArrays="2dfb63ee-cc39-5dd5-95bd-886bf059d720" begin
17-
fastpermute!(v::PooledArrays.PooledArray, p::AbstractVector) = permute!(v, p)
18-
end
1918
Requires.@require WeakRefStrings="ea10d353-3f73-51f8-a26c-33c1cb351aa5" begin
2019
fastpermute!(v::WeakRefStrings.StringArray, p::AbstractVector) = permute!(v, p)
2120
end

src/sort.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@ using Base.Sort, Base.Order
22

33
fastpermute!(v::AbstractArray, p::AbstractVector) = copyto!(v, v[p])
44
fastpermute!(v::StructArray, p::AbstractVector) = permute!(v, p)
5+
fastpermute!(v::PooledArray, p::AbstractVector) = permute!(v, p)
6+
7+
optimize_isequal(v::AbstractArray) = v
8+
optimize_isequal(v::PooledArray) = v.refs
9+
optimize_isequal(v::StructArray{<:Union{Tuple, NamedTuple}}) = StructArray(map(optimize_isequal, fieldarrays(v)))
10+
11+
pool(v::AbstractArray, condition = !isbitstypeeltype) = condition(v) ? convert(PooledArray, v) : v
12+
pool(v::StructArray, condition = !isbitstypeeltype) = replace_storage(t -> pool(t, condition), v)
513

614
function Base.permute!(c::StructArray, p::AbstractVector)
715
foreachfield(v -> fastpermute!(v, p), c)
@@ -76,7 +84,7 @@ function refine_perm!(p, cols, c, x, y′, lo, hi)
7684
order = Perm(Forward, y′)
7785
y = something(forward_vec(order), y′)
7886
nc = length(cols)
79-
for (_, idxs) in TiedIndices(x, p, lo:hi)
87+
for (_, idxs) in TiedIndices(optimize_isequal(x), p, lo:hi)
8088
i, i1 = extrema(idxs)
8189
if i1 > i
8290
sort_sub_by!(p, i, i1, y, order, temp)

test/REQUIRE

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
Tables
2-
PooledArrays
32
WeakRefStrings

test/runtests.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ end
2727
@test all(v.b .== v_pooled.b)
2828
@test !isa(v_pooled.a, PooledArrays.PooledArray)
2929
@test isa(v_pooled.b, PooledArrays.PooledArray)
30+
@test v_pooled == StructArrays.pool(v)
31+
end
32+
33+
@testset "optimize_isequal" begin
34+
a = ["a", "b", "a", "a"]
35+
b = PooledArrays.PooledArray(["x", "y", "z", "x"])
36+
s = StructArray((a, b))
37+
t = StructArrays.optimize_isequal(s)
38+
@test t[1] != t[2]
39+
@test t[1] != t[3]
40+
@test t[1] == t[4]
41+
@test t[1][2] isa Integer
3042
end
3143

3244
@testset "namedtuple" begin

0 commit comments

Comments
 (0)