|
3 | 3 |
|
4 | 4 | import com.google.common.collect.ImmutableList; |
5 | 5 | import com.google.common.collect.ImmutableSet; |
| 6 | +import com.google.common.collect.Sets; |
6 | 7 | import graphql.Internal; |
7 | 8 |
|
8 | 9 | import java.lang.reflect.Array; |
9 | 10 | import java.util.ArrayList; |
10 | 11 | import java.util.Collection; |
11 | 12 | import java.util.Iterator; |
12 | 13 | import java.util.LinkedHashMap; |
13 | | -import java.util.LinkedHashSet; |
14 | 14 | import java.util.List; |
15 | 15 | import java.util.Map; |
16 | 16 | import java.util.NoSuchElementException; |
@@ -330,4 +330,27 @@ public static <T> Supplier<T> interThreadMemoize(Supplier<T> delegate) { |
330 | 330 | return new InterThreadMemoizedSupplier<>(delegate); |
331 | 331 | } |
332 | 332 |
|
| 333 | + /** |
| 334 | + * Faster set intersection. |
| 335 | + * |
| 336 | + * @param set1 first set |
| 337 | + * @param set2 second set |
| 338 | + * @return intersection set |
| 339 | + */ |
| 340 | + public static <T> Set<T> intersection(Set<T> set1, Set<T> set2) { |
| 341 | + // Set intersection calculation is expensive when either set is large. Often, either set has only one member. |
| 342 | + // When either set contains only one member, it is equivalent and much cheaper to calculate intersection via contains. |
| 343 | + if (set1.size() == 1 && set2.contains(set1.iterator().next())) { |
| 344 | + return set1; |
| 345 | + } else if (set2.size() == 1 && set1.contains(set2.iterator().next())) { |
| 346 | + return set2; |
| 347 | + } |
| 348 | + |
| 349 | + // Guava's Sets.intersection is faster when the smaller set is passed as the first argument. |
| 350 | + if (set1.size() < set2.size()) { |
| 351 | + return Sets.intersection(set1, set2); |
| 352 | + } |
| 353 | + return Sets.intersection(set2, set1); |
| 354 | + } |
| 355 | + |
333 | 356 | } |
0 commit comments