From 54a16f096141710c7cad256d9f715be9fceb71a9 Mon Sep 17 00:00:00 2001 From: Nathan Harmata Date: Tue, 13 Dec 2016 17:49:27 +0000 Subject: Rephrase query transformation in terms of composition of QueryExpressionMappers. -- PiperOrigin-RevId: 141904124 MOS_MIGRATED_REVID=141904124 --- .../build/lib/query2/SkyQueryEnvironment.java | 10 +-- .../lib/query2/engine/QueryExpressionMapper.java | 80 +++++++++++++++++++++- 2 files changed, 84 insertions(+), 6 deletions(-) (limited to 'src/main/java/com/google/devtools') 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 78a850b8e7..9a52eba825 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 @@ -308,7 +308,8 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment @Override public final QueryExpression transformParsedQuery(QueryExpression queryExpression) { - QueryExpression transformedQueryExpression = getTransformedQueryExpression(queryExpression); + QueryExpressionMapper mapper = getQueryExpressionMapper(); + QueryExpression transformedQueryExpression = queryExpression.getMapped(mapper); LOG.info(String.format( "transformed query [%s] to [%s]", Ascii.truncate( @@ -318,14 +319,13 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment return transformedQueryExpression; } - protected QueryExpression getTransformedQueryExpression(QueryExpression queryExpression) { + protected QueryExpressionMapper getQueryExpressionMapper() { if (universeScope.size() != 1) { - return queryExpression; + return QueryExpressionMapper.identity(); } TargetPattern.Parser targetPatternParser = new TargetPattern.Parser(parserPrefix); String universeScopePattern = Iterables.getOnlyElement(universeScope); - return queryExpression.getMapped( - new RdepsToAllRdepsQueryExpressionMapper(targetPatternParser, universeScopePattern)); + return new RdepsToAllRdepsQueryExpressionMapper(targetPatternParser, universeScopePattern); } @Override 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; + } + } } -- cgit v1.2.3