@Override
 public PlanNode visitProject(ProjectNode node, RewriteContext<Void> context) {
   PlanNode source = context.rewrite(node.getSource());
   Map<Symbol, Expression> assignments =
       ImmutableMap.copyOf(
           Maps.transformValues(node.getAssignments(), this::simplifyExpression));
   return new ProjectNode(node.getId(), source, assignments);
 }
    @Override
    public PlanNode visitProject(ProjectNode node, RewriteContext<Set<Symbol>> context) {
      ImmutableSet.Builder<Symbol> expectedInputs = ImmutableSet.builder();

      ImmutableMap.Builder<Symbol, Expression> builder = ImmutableMap.builder();
      for (int i = 0; i < node.getOutputSymbols().size(); i++) {
        Symbol output = node.getOutputSymbols().get(i);
        Expression expression = node.getAssignments().get(output);

        if (context.get().contains(output)) {
          expectedInputs.addAll(DependencyExtractor.extractUnique(expression));
          builder.put(output, expression);
        }
      }

      PlanNode source = context.rewrite(node.getSource(), expectedInputs.build());

      return new ProjectNode(node.getId(), source, builder.build());
    }
 @Override
 public SubPlanBuilder visitProject(ProjectNode node, Void context) {
   SubPlanBuilder current = node.getSource().accept(this, context);
   current.setRoot(new ProjectNode(node.getId(), current.getRoot(), node.getOutputMap()));
   return current;
 }