@@ -171,24 +171,40 @@ end
171
171
172
172
# normal union doesn't have the behavior we want
173
173
# (e.g. union(["1"], "2") === ["1", '2'])
174
- vcatunion (args... ) = unique (vcat (args... ))
174
+ keyunion (args... ) = unique (vcat (args... ))
175
+
176
+ function tagunion (args... )
177
+ unflattened = keyunion (args... )
178
+ result = Any[]
179
+ for i in unflattened
180
+ if isa (i, Tuple)
181
+ for j in i
182
+ push! (result, j)
183
+ end
184
+ else
185
+ push! (result, i)
186
+ end
187
+ end
188
+ return result
189
+ end
175
190
176
191
function loadtagged! (f:: TagFilter , dest:: BenchmarkGroup , src:: BenchmarkGroup ,
177
192
group:: BenchmarkGroup , keys:: Vector , tags:: Vector )
178
- ismatch = f. predicate (tags)
179
- if ismatch
193
+ if f. predicate (tags)
180
194
child_dest = createchild! (dest, src, keys)
181
195
for (k, v) in group
182
196
if isa (v, BenchmarkGroup)
183
- loadtagged! (f, dest, src, v, vcatunion (keys, k), vcatunion (tags, k, v. tags))
184
- else
197
+ loadtagged! (f, dest, src, v, keyunion (keys, k), tagunion (tags, k, v. tags))
198
+ elseif isa (child_dest, BenchmarkGroup)
185
199
child_dest[k] = v
186
200
end
187
201
end
188
202
else
189
203
for (k, v) in group
190
204
if isa (v, BenchmarkGroup)
191
- loadtagged! (f, dest, src, v, vcatunion (keys, k), vcatunion (tags, k, v. tags))
205
+ loadtagged! (f, dest, src, v, keyunion (keys, k), tagunion (tags, k, v. tags))
206
+ elseif f. predicate (tagunion (tags, k))
207
+ createchild! (dest, src, keyunion (keys, k))
192
208
end
193
209
end
194
210
end
@@ -202,8 +218,10 @@ function createchild!(dest, src, keys)
202
218
k = first (keys)
203
219
src_child = src[k]
204
220
if ! (haskey (dest, k))
205
- dest_child = similar (src_child)
221
+ isgroup = isa (src_child, BenchmarkGroup)
222
+ dest_child = isgroup ? similar (src_child) : src_child
206
223
dest[k] = dest_child
224
+ ! (isgroup) && return
207
225
else
208
226
dest_child = dest[k]
209
227
end
0 commit comments