aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java70
1 files changed, 48 insertions, 22 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index f6181f29ea..7df803396a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.query2;
import com.google.common.base.Function;
-import com.google.common.base.Functions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
@@ -185,10 +184,10 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
private Map<Target, Collection<Target>> makeTargetsMap(Map<SkyKey, Iterable<SkyKey>> input) {
ImmutableMap.Builder<Target, Collection<Target>> result = ImmutableMap.builder();
- Map<SkyKey, Target> allTargets = makeTargetsWithAssociations(
- Sets.newHashSet(Iterables.concat(input.values())));
+ Map<SkyKey, Target> allTargets =
+ makeTargetsFromSkyKeys(Sets.newHashSet(Iterables.concat(input.values())));
- for (Map.Entry<SkyKey, Target> entry : makeTargetsWithAssociations(input.keySet()).entrySet()) {
+ for (Map.Entry<SkyKey, Target> entry : makeTargetsFromSkyKeys(input.keySet()).entrySet()) {
Iterable<SkyKey> skyKeys = input.get(entry.getKey());
Set<Target> targets = CompactHashSet.createWithExpectedSize(Iterables.size(skyKeys));
for (SkyKey key : skyKeys) {
@@ -316,8 +315,7 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
aggregator.processLastPending();
}
- @Override
- public Uniquifier<Target> createUniquifier() {
+ private static Uniquifier<Target> uniquifier() {
return new AbstractUniquifier<Target, Label>() {
@Override
protected Label extractKey(Target target) {
@@ -326,6 +324,11 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
};
}
+ @Override
+ public Uniquifier<Target> createUniquifier() {
+ return uniquifier();
+ }
+
/**
* Wraps a {@link Callback<Target>} with three additional filtering mechanisms. First, it
* validates the scope of the targets it's given before it passes them to the delegate Callback.
@@ -366,7 +369,7 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
Set<Label> labels = precomputedPatterns.get(pattern);
if (labels != null) {
try {
- callback.process(ImmutableSet.copyOf(makeTargetsFromLabels(labels)));
+ makeTargetsFromLabels(labels, callback);
} catch (InterruptedException e) {
throw new QueryException(owner, e.getMessage());
}
@@ -626,19 +629,39 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
}
};
- private Map<SkyKey, Target> makeTargetsWithAssociations(Iterable<SkyKey> keys) {
- return makeTargetsWithAssociations(keys, SKYKEY_TO_LABEL);
- }
-
- private Collection<Target> makeTargetsFromLabels(Iterable<Label> labels) {
- return makeTargetsWithAssociations(labels, Functions.<Label>identity()).values();
+ private void makeTargetsFromLabels(Iterable<Label> labels, Callback<Target> callback)
+ throws QueryException, InterruptedException {
+ Multimap<SkyKey, Label> packageKeyToLabelMap = ArrayListMultimap.create();
+ for (Label label : labels) {
+ try {
+ packageKeyToLabelMap.put(getPackageKeyAndValidateLabel(label), label);
+ } catch (QueryException e) {
+ // Skip disallowed labels.
+ }
+ }
+ Uniquifier<Target> uniquifier = createUniquifier();
+ for (List<SkyKey> packageKeys :
+ Iterables.partition(packageKeyToLabelMap.keySet(), BATCH_CALLBACK_SIZE)) {
+ Map<SkyKey, SkyValue> packageMap = graph.getSuccessfulValues(packageKeys);
+ // Conservatively say all our targets are in different packages.
+ List<Target> targets = new ArrayList<>(packageMap.size());
+ for (Map.Entry<SkyKey, SkyValue> entry : packageMap.entrySet()) {
+ for (Label label : packageKeyToLabelMap.get(entry.getKey())) {
+ try {
+ targets.add(((PackageValue) entry.getValue()).getPackage().getTarget(label.getName()));
+ } catch (NoSuchTargetException e) {
+ // Skip missing target.
+ }
+ }
+ }
+ callback.process(uniquifier.unique(targets));
+ }
}
- private <E> Map<E, Target> makeTargetsWithAssociations(Iterable<E> keys,
- Function<E, Label> toLabel) {
- Multimap<SkyKey, E> packageKeyToTargetKeyMap = ArrayListMultimap.create();
- for (E key : keys) {
- Label label = toLabel.apply(key);
+ private Map<SkyKey, Target> makeTargetsFromSkyKeys(Iterable<SkyKey> keys) {
+ Multimap<SkyKey, SkyKey> packageKeyToTargetKeyMap = ArrayListMultimap.create();
+ for (SkyKey key : keys) {
+ Label label = SKYKEY_TO_LABEL.apply(key);
if (label == null) {
continue;
}
@@ -648,13 +671,16 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> {
// Skip disallowed labels.
}
}
- ImmutableMap.Builder<E, Target> result = ImmutableMap.builder();
+ ImmutableMap.Builder<SkyKey, Target> result = ImmutableMap.builder();
Map<SkyKey, SkyValue> packageMap = graph.getSuccessfulValues(packageKeyToTargetKeyMap.keySet());
for (Map.Entry<SkyKey, SkyValue> entry : packageMap.entrySet()) {
- for (E targetKey : packageKeyToTargetKeyMap.get(entry.getKey())) {
+ for (SkyKey targetKey : packageKeyToTargetKeyMap.get(entry.getKey())) {
try {
- result.put(targetKey, ((PackageValue) entry.getValue()).getPackage()
- .getTarget((toLabel.apply(targetKey)).getName()));
+ result.put(
+ targetKey,
+ ((PackageValue) entry.getValue())
+ .getPackage()
+ .getTarget((SKYKEY_TO_LABEL.apply(targetKey)).getName()));
} catch (NoSuchTargetException e) {
// Skip missing target.
}