diff options
author | 2015-11-06 19:05:13 +0000 | |
---|---|---|
committer | 2015-11-06 22:53:28 +0000 | |
commit | 42984f371c18033f3f162965b8f288ececbdbfd8 (patch) | |
tree | 3057903ff47fe12daf65f87bda0ec7321076adad /src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java | |
parent | 297f1202500e199fec28acdc070336507a8e2876 (diff) |
Transform Blaze query to be able to work in streamed mode.
--
MOS_MIGRATED_REVID=107249788
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java index 28bb6e7eca..b62565e3f7 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java +++ b/src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java @@ -15,9 +15,9 @@ package com.google.devtools.build.lib.query2.engine; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.query2.engine.Lexer.TokenKind; import java.util.Collection; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -46,29 +46,35 @@ class BinaryOperatorExpression extends QueryExpression { } @Override - public <T> Set<T> eval(QueryEnvironment<T> env) throws QueryException, InterruptedException { - Set<T> lhsValue = new LinkedHashSet<>(operands.get(0).eval(env)); + public <T> void eval(QueryEnvironment<T> env, Callback<T> callback) + throws QueryException, InterruptedException { + if (operator == TokenKind.PLUS || operator == TokenKind.UNION) { + for (QueryExpression operand : operands) { + env.eval(operand, callback); + } + return; + } + // We cannot do differences with partial results. So we fully evaluate the operands + Set<T> lhsValue = QueryUtil.evalAll(env, operands.get(0)); for (int i = 1; i < operands.size(); i++) { - Set<T> rhsValue = operands.get(i).eval(env); + Set<T> rhsValue = QueryUtil.evalAll(env, operands.get(i)); switch (operator) { case INTERSECT: case CARET: lhsValue.retainAll(rhsValue); break; - case UNION: - case PLUS: - lhsValue.addAll(rhsValue); - break; case EXCEPT: case MINUS: lhsValue.removeAll(rhsValue); break; + case UNION: + case PLUS: default: throw new IllegalStateException("operator=" + operator); } } - return lhsValue; + callback.process(lhsValue); } @Override |