@Override
    public SubPlanBuilder visitTableCommit(TableCommitNode node, Void context) {
      SubPlanBuilder current = node.getSource().accept(this, context);
      checkState(
          current.getRoot() instanceof TableWriterNode,
          "table commit node must be preceeded by table writer node");
      OutputTableHandle target = ((TableWriterNode) current.getRoot()).getTarget();
      checkNotNull(
          target,
          "target table handle should have been constructed when we visited the table writer node");

      if (current.getDistribution() != PlanDistribution.COORDINATOR_ONLY && !createSingleNodePlan) {
        current.setRoot(
            new SinkNode(
                idAllocator.getNextId(), current.getRoot(), current.getRoot().getOutputSymbols()));

        // create a new non-partitioned fragment to run on the coordinator
        current =
            createCoordinatorOnlyPlan(
                    new ExchangeNode(
                        idAllocator.getNextId(),
                        current.getId(),
                        current.getRoot().getOutputSymbols()))
                .addChild(current.build());
      }

      current.setRoot(
          new TableCommitNode(node.getId(), current.getRoot(), target, node.getOutputSymbols()));

      return current;
    }
 @Override
 public Void visitTableCommit(TableCommitNode node, Void context) {
   printNode(
       node,
       format("TableCommit[%s]", Joiner.on(", ").join(node.getOutputSymbols())),
       NODE_COLORS.get(NodeType.TABLE_COMMIT));
   return node.getSource().accept(this, context);
 }
 @Override
 public PlanNode visitTableCommit(TableCommitNode node, RewriteContext<Void> context) {
   Optional<DeleteNode> delete = findNode(node.getSource(), DeleteNode.class);
   if (!delete.isPresent()) {
     return context.defaultRewrite(node);
   }
   Optional<TableScanNode> tableScan = findNode(delete.get().getSource(), TableScanNode.class);
   if (!tableScan.isPresent()) {
     return context.defaultRewrite(node);
   }
   TableScanNode tableScanNode = tableScan.get();
   if (!metadata.supportsMetadataDelete(
       session, tableScanNode.getTable(), tableScanNode.getLayout().get())) {
     return context.defaultRewrite(node);
   }
   return new MetadataDeleteNode(
       idAllocator.getNextId(),
       delete.get().getTarget(),
       Iterables.getOnlyElement(node.getOutputSymbols()),
       tableScanNode.getLayout().get());
 }