Allow output formatters to work in stream mode.
--
MOS_MIGRATED_REVID=109908202
diff --git a/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java
index 11eef89..b3e4341 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/AbstractBlazeQueryEnvironment.java
@@ -17,6 +17,7 @@
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.TargetParsingException;
@@ -31,11 +32,11 @@
import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator;
import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader;
import com.google.devtools.build.lib.profiler.AutoProfiler;
+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.QueryEvalResult;
import com.google.devtools.build.lib.query2.engine.QueryException;
import com.google.devtools.build.lib.query2.engine.QueryExpression;
-import com.google.devtools.build.lib.query2.engine.QueryUtil;
import com.google.devtools.build.lib.util.BinaryPredicate;
import com.google.devtools.build.skyframe.WalkableGraph.WalkableGraphFactory;
@@ -45,6 +46,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
import javax.annotation.Nullable;
@@ -136,10 +138,11 @@
* @throws QueryException if the evaluation failed and {@code --nokeep_going} was in
* effect
*/
- public QueryEvalResult<T> evaluateQuery(QueryExpression expr)
+ public QueryEvalResult evaluateQuery(QueryExpression expr, final Callback<T> callback)
throws QueryException, InterruptedException {
- Set<T> resultNodes;
- try (AutoProfiler p = AutoProfiler.logged("evaluating query", LOG)) {
+
+ final AtomicBoolean empty = new AtomicBoolean(true);
+ try (final AutoProfiler p = AutoProfiler.logged("evaluating query", LOG)) {
resolvedTargetPatterns.clear();
// In the --nokeep_going case, errors are reported in the order in which the patterns are
@@ -152,9 +155,15 @@
// Unfortunately, by evaluating the patterns in parallel, we lose some location information.
throw new QueryException(expr, e.getMessage());
}
-
try {
- resultNodes = QueryUtil.evalAll(this, expr);
+ this.eval(expr, new Callback<T>() {
+ @Override
+ public void process(Iterable<T> partialResult)
+ throws QueryException, InterruptedException {
+ empty.compareAndSet(true, Iterables.isEmpty(partialResult));
+ callback.process(partialResult);
+ }
+ });
} catch (QueryException e) {
throw new QueryException(e, expr);
}
@@ -172,12 +181,12 @@
}
}
- return new QueryEvalResult<>(!eventHandler.hasErrors(), resultNodes);
+ return new QueryEvalResult(!eventHandler.hasErrors(), empty.get());
}
- public QueryEvalResult<T> evaluateQuery(String query)
+ public QueryEvalResult evaluateQuery(String query, Callback<T> callback)
throws QueryException, InterruptedException {
- return evaluateQuery(QueryExpression.parse(query, this));
+ return evaluateQuery(QueryExpression.parse(query, this), callback);
}
@Override