From eec7918dd810f6b2c7d5343dbc27ce96318a4404 Mon Sep 17 00:00:00 2001 From: Sebastian Ratz Date: Mon, 7 Mar 2022 12:04:46 +0000 Subject: [PATCH] P2ResolverFactoryImpl: Improve calculateDependencyFragments performance Change-Id: I4416aec8dd12faeacb2bf1f84cf3608bbd8c308a --- .../p2/resolver/P2ResolverFactoryImpl.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java index e97aba2c56..9b452d1651 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java @@ -19,8 +19,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -134,25 +132,26 @@ public Set calculateDependencyFragments(ResolutionData data, if (fragmentsList.isEmpty()) { return Collections.emptySet(); } - Set dependencyFragments = new HashSet<>(); - for (Iterator iterator = resolvedUnits.iterator(); iterator.hasNext() - && !fragmentsList.isEmpty();) { - IInstallableUnit resolvedUnit = iterator.next(); - addMatchingFragments(fragmentsList, dependencyFragments, resolvedUnit); - } - return dependencyFragments; - } - private static void addMatchingFragments(List> fragmentsList, - Set dependencyFragments, IInstallableUnit unitToMatch) { - Iterator> iterator = fragmentsList.iterator(); - while (iterator.hasNext()) { - Entry fragment = iterator.next(); - if (fragment.getValue().isMatch(unitToMatch)) { - dependencyFragments.add(fragment.getKey()); - iterator.remove(); - } - } + Map> availableIUsById = availableIUs.stream()// + .collect(Collectors.groupingBy(iu -> iu.getId())); + + return fragmentsList.stream()// + .filter(entry -> { + IRequiredCapability hostRequirement = entry.getValue(); + List potentialHosts = availableIUsById.get(entry.getValue().getName()); + if (potentialHosts == null) { // quick lookup by ID + return false; + } + for (IInstallableUnit potentialHost : potentialHosts) { + if (hostRequirement.isMatch(potentialHost)) { // precise match + return true; + } + } + return false; + })// + .map(entry -> entry.getKey())// + .collect(Collectors.toSet()); } private static Optional> findFragmentHostRequirement(