aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/query2/engine
diff options
context:
space:
mode:
authorGravatar Nathan Harmata <nharmata@google.com>2016-12-13 17:49:27 +0000
committerGravatar John Cater <jcater@google.com>2016-12-13 21:04:55 +0000
commit54a16f096141710c7cad256d9f715be9fceb71a9 (patch)
tree810df81bd020d92fac1170648f6e47cf8e96f17f /src/main/java/com/google/devtools/build/lib/query2/engine
parentb79e2f689a58d2943ed84c9bcebfb7c538ad6b07 (diff)
Rephrase query transformation in terms of composition of QueryExpressionMappers.
-- PiperOrigin-RevId: 141904124 MOS_MIGRATED_REVID=141904124
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2/engine')
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpressionMapper.java80
1 files changed, 79 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpressionMapper.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpressionMapper.java
index f04ed1ec4b..0a0336c8af 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpressionMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpressionMapper.java
@@ -25,7 +25,7 @@ import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Argument;
* maintain reference-equality, as an optimization). Subclasses of {@link QueryExpressionMapper} can
* override these methods in order to implement an arbitrary transformation.
*/
-public class QueryExpressionMapper {
+public abstract class QueryExpressionMapper {
public QueryExpression map(TargetLiteral targetLiteral) {
return targetLiteral;
}
@@ -88,5 +88,83 @@ public class QueryExpressionMapper {
public QueryExpression map(SetExpression setExpression) {
return setExpression;
}
+
+ public static QueryExpressionMapper identity() {
+ return IdentityMapper.INSTANCE;
+ }
+
+ public static QueryExpressionMapper compose(
+ QueryExpressionMapper outerMapper, QueryExpressionMapper innerMapper) {
+ return new ComposedQueryExpressionMapper(outerMapper, innerMapper);
+ }
+
+ private static class ComposedQueryExpressionMapper extends QueryExpressionMapper {
+ private QueryExpressionMapper outerMapper;
+ private QueryExpressionMapper innerMapper;
+
+ private ComposedQueryExpressionMapper(
+ QueryExpressionMapper outerMapper,
+ QueryExpressionMapper innerMapper) {
+ this.outerMapper = outerMapper;
+ this.innerMapper = innerMapper;
+ }
+
+ @Override
+ public QueryExpression map(TargetLiteral targetLiteral) {
+ return innerMapper.map(targetLiteral).getMapped(outerMapper);
+ }
+
+ @Override
+ public QueryExpression map(BinaryOperatorExpression binaryOperatorExpression) {
+ return innerMapper.map(binaryOperatorExpression).getMapped(outerMapper);
+ }
+
+ @Override
+ public QueryExpression map(FunctionExpression functionExpression) {
+ return innerMapper.map(functionExpression).getMapped(outerMapper);
+ }
+
+ @Override
+ public QueryExpression map(LetExpression letExpression) {
+ return innerMapper.map(letExpression).getMapped(outerMapper);
+ }
+
+ @Override
+ public QueryExpression map(SetExpression setExpression) {
+ return innerMapper.map(setExpression).getMapped(outerMapper);
+ }
+ }
+
+ private static class IdentityMapper extends QueryExpressionMapper {
+ private static final IdentityMapper INSTANCE = new IdentityMapper();
+
+ private IdentityMapper() {
+ }
+
+ @Override
+ public QueryExpression map(TargetLiteral targetLiteral) {
+ return targetLiteral;
+ }
+
+ @Override
+ public QueryExpression map(BinaryOperatorExpression binaryOperatorExpression) {
+ return binaryOperatorExpression;
+ }
+
+ @Override
+ public QueryExpression map(FunctionExpression functionExpression) {
+ return functionExpression;
+ }
+
+ @Override
+ public QueryExpression map(LetExpression letExpression) {
+ return letExpression;
+ }
+
+ @Override
+ public QueryExpression map(SetExpression setExpression) {
+ return setExpression;
+ }
+ }
}