@Override public ILogicalOperator visitUnionOperator(UnionAllOperator op, ILogicalOperator arg) throws AlgebricksException { List<Mutable<ILogicalOperator>> copiedInputs = new ArrayList<>(); for (Mutable<ILogicalOperator> childRef : op.getInputs()) { copiedInputs.add(deepCopyOperatorReference(childRef, null)); } List<List<LogicalVariable>> liveVarsInInputs = new ArrayList<>(); for (Mutable<ILogicalOperator> inputOpRef : copiedInputs) { List<LogicalVariable> liveVars = new ArrayList<>(); VariableUtilities.getLiveVariables(inputOpRef.getValue(), liveVars); liveVarsInInputs.add(liveVars); } List<LogicalVariable> liveVarsInLeftInput = liveVarsInInputs.get(0); List<LogicalVariable> liveVarsInRightInput = liveVarsInInputs.get(1); List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> copiedTriples = new ArrayList<>(); int index = 0; for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> triple : op.getVariableMappings()) { LogicalVariable producedVar = deepCopyVariable(triple.third); Triple<LogicalVariable, LogicalVariable, LogicalVariable> copiedTriple = new Triple<>(liveVarsInLeftInput.get(index), liveVarsInRightInput.get(index), producedVar); copiedTriples.add(copiedTriple); ++index; } UnionAllOperator opCopy = new UnionAllOperator(copiedTriples); deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy); return opCopy; }
private AssignOperator createAssignBelowUnionAllBranch(UnionAllOperator unionOp, int inputIndex, AssignOperator originalAssignOp, Set<LogicalVariable> assignUsedVars, IOptimizationContext context) throws AlgebricksException { AssignOperator newAssignOp = cloneAssignOperator(originalAssignOp, context); newAssignOp.getInputs() .add(new MutableObject<ILogicalOperator>(unionOp.getInputs().get(inputIndex).getValue())); unionOp.getInputs().get(inputIndex).setValue(newAssignOp); int numVarMappings = unionOp.getVariableMappings().size(); for (int i = 0; i < numVarMappings; i++) { Triple<LogicalVariable, LogicalVariable, LogicalVariable> varMapping = unionOp.getVariableMappings().get(i); if (assignUsedVars.contains(varMapping.third)) { LogicalVariable replacementVar; if (inputIndex == 0) { replacementVar = varMapping.first; } else { replacementVar = varMapping.second; } VariableUtilities.substituteVariables(newAssignOp, varMapping.third, replacementVar, context); } } context.computeAndSetTypeEnvironmentForOperator(newAssignOp); return newAssignOp; }
private void insertProjectOperator(UnionAllOperator opUnion, int branch, ArrayList<LogicalVariable> usedVariables, IOptimizationContext context) throws AlgebricksException { ProjectOperator projectOp = new ProjectOperator(usedVariables); ILogicalOperator inputOp = opUnion.getInputs().get(branch).getValue(); projectOp.getInputs().add(new MutableObject<ILogicalOperator>(inputOp)); opUnion.getInputs().get(branch).setValue(projectOp); projectOp.setPhysicalOperator(new StreamProjectPOperator()); projectOp.setExecutionMode(inputOp.getExecutionMode()); context.computeAndSetTypeEnvironmentForOperator(projectOp); context.computeAndSetTypeEnvironmentForOperator(inputOp); }
@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; }
for (int j = 0; j < unionOp.getInputs().size(); j++) { newAssignOps[j] = createAssignBelowUnionAllBranch(unionOp, j, assignOp, assignUsedVars, context);
Mutable<ILogicalOperator> branchOpRef = op.getInputs().get(childIndex); ILogicalOperator branchOp = branchOpRef.getValue(); IVariableTypeEnvironment childEnv = context.getOutputTypeEnvironment(branchOp);