@@ -368,20 +368,24 @@ function subset(varinfo::TypedVarInfo, vns::AbstractVector{<:VarName})
368
368
)
369
369
end
370
370
371
- function subset (metadata:: Metadata , vns_given:: AbstractVector{<:VarName} )
371
+ function subset (metadata:: Metadata , vns_given:: AbstractVector{VN} ) where VN <: VarName
372
372
# TODO : Should we error if `vns` contains a variable that is not in `metadata`?
373
373
# For each `vn` in `vns`, get the variables subsumed by `vn`.
374
- vns = mapreduce (vcat, vns_given) do vn
374
+ vns = mapreduce (vcat, vns_given; init = VN[] ) do vn
375
375
filter (Base. Fix1 (subsumes, vn), metadata. vns)
376
376
end
377
377
indices_for_vns = map (Base. Fix1 (getindex, metadata. idcs), vns)
378
- indices = Dict (vn => i for (i, vn) in enumerate (vns))
378
+ indices = if isempty (vns)
379
+ Dict {VarName,Int} ()
380
+ else
381
+ Dict (vn => i for (i, vn) in enumerate (vns))
382
+ end
379
383
# Construct new `vals` and `ranges`.
380
384
vals_original = metadata. vals
381
385
ranges_original = metadata. ranges
382
386
# Allocate the new `vals`. and `ranges`.
383
- vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]))
384
- ranges = similar (ranges_original)
387
+ vals = similar (metadata. vals, sum (length, ranges_original[indices_for_vns]; init = 0 ))
388
+ ranges = similar (ranges_original, length (vns) )
385
389
# The new range `r` for `vns[i]` is offset by `offset` and
386
390
# has the same length as the original range `r_original`.
387
391
# The new `indices` (from above) ensures ordering according to `vns`.
@@ -415,7 +419,7 @@ function subset(metadata::Metadata, vns_given::AbstractVector{<:VarName})
415
419
ranges,
416
420
vals,
417
421
metadata. dists[indices_for_vns],
418
- metadata. gids,
422
+ metadata. gids[indices_for_vns] ,
419
423
metadata. orders[indices_for_vns],
420
424
flags,
421
425
)
0 commit comments