Modify SkyQueryEnvironment#evalTargetPatternKey to take into account the filtering policy specified in the TargetPatternKey.
Add a TargetExcludingFilteringPolicy that can filter multiple single targets
Allow for TargetPatternValue.combineTargetsBelowDirectoryWithNegativePatterns the option of excluding single targets.
Improve toString of some filtering policies.
PiperOrigin-RevId: 230566477
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 30fc480..08c44e9 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
@@ -15,6 +15,7 @@
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static com.google.devtools.build.lib.pkgcache.FilteringPolicies.NO_FILTER;
import com.google.common.base.Ascii;
import com.google.common.base.Function;
@@ -725,13 +726,24 @@
reportBuildFileError(owner, exn.getMessage());
return Futures.immediateFuture(null);
};
- ListenableFuture<Void> evalFuture = patternToEval.evalAsync(
- resolver,
- blacklistedSubdirectoriesToExclude,
- additionalSubdirectoriesToExclude,
- callback,
- QueryException.class,
- executor);
+ Callback<Target> filteredCallback = callback;
+ if (!targetPatternKey.getPolicy().equals(NO_FILTER)) {
+ filteredCallback =
+ targets ->
+ callback.process(
+ Iterables.filter(
+ targets,
+ target ->
+ targetPatternKey.getPolicy().shouldRetain(target, /*explicit=*/ false)));
+ }
+ ListenableFuture<Void> evalFuture =
+ patternToEval.evalAsync(
+ resolver,
+ blacklistedSubdirectoriesToExclude,
+ additionalSubdirectoriesToExclude,
+ filteredCallback,
+ QueryException.class,
+ executor);
return QueryTaskFutureImpl.ofDelegate(
Futures.catchingAsync(
evalFuture,