From 9ca91a2d8933374c708937a3be602b22af76ddc1 Mon Sep 17 00:00:00 2001 From: Janak Ramakrishnan Date: Thu, 5 May 2016 21:54:38 +0000 Subject: Stream output of rbuildfiles operator to a callback. This function was missed when we transformed to callbacks. -- MOS_MIGRATED_REVID=121619124 --- .../build/lib/query2/RBuildFilesFunction.java | 8 ++-- .../build/lib/query2/SkyQueryEnvironment.java | 47 +++++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java index 624573c132..b3a64c6169 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java +++ b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java @@ -17,6 +17,7 @@ import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.query2.engine.Callback; import com.google.devtools.build.lib.query2.engine.QueryEnvironment; import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Argument; @@ -27,7 +28,6 @@ import com.google.devtools.build.lib.query2.engine.QueryExpression; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.List; -import java.util.Set; /** * An "rbuildfiles" query expression, which computes the set of packages (as represented by their @@ -76,8 +76,8 @@ public class RBuildFilesFunction implements QueryFunction { for (Argument arg : args) { fileNames.add(arg.getWord()); } - callback.process((Set) - ((SkyQueryEnvironment) env) - .getRBuildFiles(Collections2.transform(args, ARGUMENT_TO_PATH_FRAGMENT))); + ((SkyQueryEnvironment) env) + .getRBuildFiles( + Collections2.transform(args, ARGUMENT_TO_PATH_FRAGMENT), (Callback) callback); } } 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 349661d8dd..c127f42570 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 @@ -864,12 +864,42 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment { return result; } + private static final Function EXTRACT_PACKAGE = + new Function() { + @Override + public Package apply(SkyValue skyValue) { + return ((PackageValue) skyValue).getPackage(); + } + }; + + private static final Predicate ERROR_FREE_PACKAGE = + new Predicate() { + @Override + public boolean apply(Package pkg) { + return !pkg.containsErrors(); + } + }; + + private static final Function GET_BUILD_FILE = + new Function() { + @Override + public Target apply(Package pkg) { + return pkg.getBuildFile(); + } + }; + + private static Iterable getBuildFilesForPackageValues(Iterable packageValues) { + return Iterables.transform( + Iterables.filter(Iterables.transform(packageValues, EXTRACT_PACKAGE), ERROR_FREE_PACKAGE), + GET_BUILD_FILE); + } + /** * Calculates the set of {@link Package} objects, represented as source file targets, that depend * on the given list of BUILD files and subincludes (other files are filtered out). */ - @Nullable - Set getRBuildFiles(Collection fileIdentifiers) { + void getRBuildFiles(Collection fileIdentifiers, Callback callback) + throws QueryException, InterruptedException { Collection files = getSkyKeysForFileFragments(fileIdentifiers); Collection current = graph.getSuccessfulValues(files).keySet(); Set resultKeys = CompactHashSet.create(); @@ -889,16 +919,13 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment { current.add(rdep); } } - } - Map packageValues = graph.getSuccessfulValues(resultKeys); - ImmutableSet.Builder result = ImmutableSet.builder(); - for (SkyValue value : packageValues.values()) { - Package pkg = ((PackageValue) value).getPackage(); - if (!pkg.containsErrors()) { - result.add(pkg.getBuildFile()); + if (resultKeys.size() >= BATCH_CALLBACK_SIZE) { + callback.process( + getBuildFilesForPackageValues(graph.getSuccessfulValues(resultKeys).values())); + resultKeys.clear(); } } - return result.build(); + callback.process(getBuildFilesForPackageValues(graph.getSuccessfulValues(resultKeys).values())); } @Override -- cgit v1.2.3