aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java
diff options
context:
space:
mode:
authorGravatar Miguel Alcon Pinto <malcon@google.com>2015-11-06 19:05:13 +0000
committerGravatar Florian Weikert <fwe@google.com>2015-11-06 22:53:28 +0000
commit42984f371c18033f3f162965b8f288ececbdbfd8 (patch)
tree3057903ff47fe12daf65f87bda0ec7321076adad /src/main/java/com/google/devtools/build/lib/query2/engine/BinaryOperatorExpression.java
parent297f1202500e199fec28acdc070336507a8e2876 (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.java24
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