Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.facebook.presto.sql.planner;
 
 
 import java.util.List;
 import java.util.Map;
 
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 public class ProjectionPushDown
         extends PlanOptimizer
 {
     @Override
     public PlanNode optimize(PlanNode planSession sessionMap<SymbolTypetypesSymbolAllocator symbolAllocatorPlanNodeIdAllocator idAllocator)
     {
         requireNonNull(plan"plan is null");
         requireNonNull(session"session is null");
         requireNonNull(types"types is null");
         requireNonNull(symbolAllocator"symbolAllocator is null");
         requireNonNull(idAllocator"idAllocator is null");
 
         return PlanRewriter.rewriteWith(new Rewriter(idAllocatorsymbolAllocator), plan);
     }
 
     private static class Rewriter
             extends PlanRewriter<Void>
     {
         private final PlanNodeIdAllocator idAllocator;
         private final SymbolAllocator symbolAllocator;
 
         public Rewriter(PlanNodeIdAllocator idAllocatorSymbolAllocator symbolAllocator)
         {
             this. = requireNonNull(idAllocator"idAllocator is null");
             this. = requireNonNull(symbolAllocator"symbolAllocator is null");
         }

        
Convert a plan of the shape ... -> Project -> Union -> ... to ... -> Union -> Project -> ...
 
         @Override
         public PlanNode visitProject(ProjectNode nodeRewriteContext<Voidcontext)
         {
             // If we have a Project on a Union, push the Project through the Union
             PlanNode source = context.rewrite(node.getSource());
 
             if (!(source instanceof UnionNode)) {
                 return context.replaceChildren(node, ImmutableList.of(source));
             }
 
             UnionNode unionNode = (UnionNodesource;
 
             // OutputLayout of the resultant Union, will be same as the layout of the Project
             List<SymboloutputLayout = node.getOutputSymbols();
 
             // Mapping from the output symbol to ordered list of symbols from each of the sources
             ImmutableListMultimap.Builder<SymbolSymbolmappings = ImmutableListMultimap.builder();
 
             // sources for the resultant UnionNode
             ImmutableList.Builder<PlanNodeoutputSources = ImmutableList.builder();
 
             for (int i = 0; i < unionNode.getSources().size(); i++) {
                 Map<SymbolQualifiedNameReferenceoutputToInput = unionNode.sourceSymbolMap(i);   // Map: output of union -> input of this source to the union
                 ImmutableMap.Builder<SymbolExpressionassignments = ImmutableMap.builder();      // assignments for the new ProjectNode
 
                 // mapping from current ProjectNode to new ProjectNode, used to identify the output layout
                 Map<SymbolSymbolprojectSymbolMapping = new HashMap<>();
 
                 // Translate the assignments in the ProjectNode using symbols of the source of the UnionNode
                 for (Map.Entry<SymbolExpressionentry : node.getAssignments().entrySet()) {
                     Expression translatedExpression = translateExpression(entry.getValue(), outputToInput);
                     Type type = .getTypes().get(entry.getKey());
                    Symbol symbol = .newSymbol(translatedExpressiontype);
                    assignments.put(symboltranslatedExpression);
                    projectSymbolMapping.put(entry.getKey(), symbol);
                }
                outputSources.add(new ProjectNode(.getNextId(), unionNode.getSources().get(i), assignments.build()));
                outputLayout.forEach(symbol -> mappings.put(symbolprojectSymbolMapping.get(symbol)));
            }
            return new UnionNode(node.getId(), outputSources.build(), mappings.build());
        }
    }
    private static Expression translateExpression(Expression inputExpressionMap<SymbolQualifiedNameReferencesymbolMapping)
    {
        return ExpressionTreeRewriter.rewriteWith(new ExpressionRewriter<Void>()
        {
            @Override
            public Expression rewriteQualifiedNameReference(QualifiedNameReference nodeVoid contextExpressionTreeRewriter<VoidtreeRewriter)
            {
                QualifiedNameReference qualifiedNameReference = symbolMapping.get(Symbol.fromQualifiedName(node.getName()));
                checkState(qualifiedNameReference != null"Cannot resolve symbol %s"node.getName());
                return qualifiedNameReference;
            }
        }, inputExpression);
    }
New to GrepCode? Check out our FAQ X