@Override
public PlanNode optimize(PlanNode plan, Session session, Map<Symbol, Type> types, SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator)
{
boolean distributedJoinEnabled = SystemSessionProperties.isDistributedJoinEnabled(session);
boolean distributedIndexJoinEnabled = SystemSessionProperties.isDistributedIndexJoinEnabled(session);
boolean redistributeWrites = SystemSessionProperties.isRedistributeWrites(session);
boolean preferStreamingOperators = SystemSessionProperties.preferStreamingOperators(session);
PlanWithProperties result = plan.accept(new Rewriter(symbolAllocator, idAllocator, symbolAllocator, session, distributedIndexJoinEnabled, distributedJoinEnabled, preferStreamingOperators, redistributeWrites), new Context(PreferredProperties.any(), false));
return result.getNode();
}