@Override public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException { AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue(); if (op.getOperatorTag() != LogicalOperatorTag.UNIONALL) { return false; } UnionAllOperator opUnion = (UnionAllOperator) op; List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> varMap = opUnion.getVariableMappings(); ArrayList<LogicalVariable> usedVariablesFromOne = new ArrayList<>(); ArrayList<LogicalVariable> usedVariablesFromTwo = new ArrayList<>(); for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> triple : varMap) { usedVariablesFromOne.add(triple.first); usedVariablesFromTwo.add(triple.second); } ArrayList<LogicalVariable> inputSchemaOne = new ArrayList<>(); VariableUtilities.getLiveVariables(opUnion.getInputs().get(0).getValue(), inputSchemaOne); ArrayList<LogicalVariable> inputSchemaTwo = new ArrayList<>(); VariableUtilities.getLiveVariables(opUnion.getInputs().get(1).getValue(), inputSchemaTwo); boolean rewritten = false; if (!isIdentical(usedVariablesFromOne, inputSchemaOne)) { insertProjectOperator(opUnion, 0, usedVariablesFromOne, context); rewritten = true; } if (!isIdentical(usedVariablesFromTwo, inputSchemaTwo)) { insertProjectOperator(opUnion, 1, usedVariablesFromTwo, context); rewritten = true; } return rewritten; }