@Override
 public Void visitOp(PhysicalOperator op, Wrapper wrapper) {
   if (op instanceof HasAffinity) {
     wrapper.addEndpointAffinity(((HasAffinity) op).getOperatorAffinity());
   }
   Stats stats = wrapper.getStats();
   stats.addCost(op.getCost());
   for (PhysicalOperator child : op) {
     child.accept(this, wrapper);
   }
   return null;
 }
 @Override
 public T visitOp(PhysicalOperator op, X value) throws E {
   throw new UnsupportedOperationException(
       String.format(
           "The PhysicalVisitor of type %s does not currently support visiting the PhysicalOperator type %s.",
           this.getClass().getCanonicalName(), op.getClass().getCanonicalName()));
 }
 public T visitChildren(PhysicalOperator op, X value) throws E {
   for (PhysicalOperator child : op) {
     child.accept(this, value);
   }
   return null;
 }