@Override public Void visitGroupByOperator(GroupByOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForGroupBy(op, arg); mapVariablesInNestedPlans(op, arg); return null; }
@Override public Void visitAggregateOperator(AggregateOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForAbstractAssign(op, arg); return null; }
@Override public Void visitIntersectOperator(IntersectOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForIntersect(op, arg); return null; }
@Override public Void visitWindowOperator(WindowOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForWindow(op, arg); mapVariablesInNestedPlans(op, arg); return null; }
@Override public Void visitUnionOperator(UnionAllOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForUnion(op, arg); return null; }
@Override public Void visitSubplanOperator(SubplanOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesInNestedPlans(op, arg); return null; }
private void mapVariablesStandard(ILogicalOperator op, ILogicalOperator arg) throws AlgebricksException { if (op.getOperatorTag() != arg.getOperatorTag()) { return; } mapChildren(op, arg); mapVariables(op, arg); }
private void mapVariablesForIntersect(IntersectOperator op, ILogicalOperator arg) { if (op.getOperatorTag() != arg.getOperatorTag()) { return; } IntersectOperator opArg = (IntersectOperator) arg; if (op.getNumInput() != opArg.getNumInput()) { return; } for (int i = 0; i < op.getNumInput(); i++) { for (int j = 0; j < op.getInputVariables(i).size(); j++) { if (!varEquivalent(op.getInputVariables(i).get(j), opArg.getInputVariables(i).get(j))) { return; } } } mapVariables(op.getOutputVars(), opArg.getOutputVars()); }
private void mapVariablesForAbstractAssign(ILogicalOperator left, ILogicalOperator right) throws AlgebricksException { if (left.getOperatorTag() != right.getOperatorTag()) { return; } AbstractAssignOperator leftOp = (AbstractAssignOperator) left; AbstractAssignOperator rightOp = (AbstractAssignOperator) right; List<LogicalVariable> producedVarLeft = new ArrayList<LogicalVariable>(); List<LogicalVariable> producedVarRight = new ArrayList<LogicalVariable>(); VariableUtilities.getProducedVariables(left, producedVarLeft); VariableUtilities.getProducedVariables(right, producedVarRight); mapVariablesForAbstractAssign(producedVarLeft, leftOp.getExpressions(), producedVarRight, rightOp.getExpressions()); }
private void mapVarExprPairList(List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> leftPairs, List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> rightPairs) { if (leftPairs.size() != rightPairs.size()) { return; } for (int i = 0; i < leftPairs.size(); i++) { ILogicalExpression exprLeft = leftPairs.get(i).second.getValue(); LogicalVariable leftVar = leftPairs.get(i).first; for (int j = 0; j < leftPairs.size(); j++) { ILogicalExpression exprRight = copyExpressionAndSubtituteVars(rightPairs.get(j).second).getValue(); if (exprLeft.equals(exprRight)) { LogicalVariable rightVar = rightPairs.get(j).first; if (rightVar != null && leftVar != null) { variableMapping.put(rightVar, leftVar); } break; } } } }
public static void mapVariablesTopDown(ILogicalOperator op, ILogicalOperator arg, Map<LogicalVariable, LogicalVariable> variableMapping) throws AlgebricksException { IsomorphismVariableMappingVisitor visitor = new IsomorphismVariableMappingVisitor(variableMapping); op.accept(visitor, arg); }
private void mapVariables(ILogicalOperator left, ILogicalOperator right) throws AlgebricksException { if (left.getOperatorTag() != right.getOperatorTag()) { return; } List<LogicalVariable> producedVarLeft = new ArrayList<>(); List<LogicalVariable> producedVarRight = new ArrayList<>(); VariableUtilities.getProducedVariables(left, producedVarLeft); VariableUtilities.getProducedVariables(right, producedVarRight); mapVariables(producedVarLeft, producedVarRight); }
private void mapVariablesForGroupBy(ILogicalOperator left, ILogicalOperator right) { if (left.getOperatorTag() != right.getOperatorTag()) { return; } GroupByOperator leftOp = (GroupByOperator) left; GroupByOperator rightOp = (GroupByOperator) right; List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> leftPairs = leftOp.getGroupByList(); List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> rightPairs = rightOp.getGroupByList(); mapVarExprPairList(leftPairs, rightPairs); leftPairs = leftOp.getDecorList(); rightPairs = rightOp.getDecorList(); mapVarExprPairList(leftPairs, rightPairs); }
private void mapVariablesForUnion(ILogicalOperator op, ILogicalOperator arg) { if (op.getOperatorTag() != arg.getOperatorTag()) { return; } UnionAllOperator union = (UnionAllOperator) op; UnionAllOperator unionArg = (UnionAllOperator) arg; mapVarTripleList(union.getVariableMappings(), unionArg.getVariableMappings()); }
private void mapVariablesForWindow(ILogicalOperator left, ILogicalOperator right) { if (left.getOperatorTag() != right.getOperatorTag()) { return; } WindowOperator leftOp = (WindowOperator) left; WindowOperator rightOp = (WindowOperator) right; mapVariablesForAbstractAssign(leftOp.getVariables(), leftOp.getExpressions(), rightOp.getVariables(), rightOp.getExpressions()); }
private void mapVariablesForAbstractAssign(List<LogicalVariable> variablesLeft, List<Mutable<ILogicalExpression>> exprsLeft, List<LogicalVariable> variablesRight, List<Mutable<ILogicalExpression>> exprsRight) { if (variablesLeft.size() != variablesRight.size()) { return; } int size = variablesLeft.size(); // Keeps track of already matched right side variables. Set<LogicalVariable> matchedRightVars = new HashSet<>(); for (int i = 0; i < size; i++) { ILogicalExpression exprLeft = exprsLeft.get(i).getValue(); LogicalVariable left = variablesLeft.get(i); for (int j = 0; j < size; j++) { ILogicalExpression exprRight = copyExpressionAndSubtituteVars(exprsRight.get(j)).getValue(); LogicalVariable right = variablesRight.get(j); if (exprLeft.equals(exprRight) && !matchedRightVars.contains(right)) { variableMapping.put(right, left); matchedRightVars.add(right); // The added variable will not be considered in next rounds. break; } } } }
@Override public Void visitRunningAggregateOperator(RunningAggregateOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForAbstractAssign(op, arg); return null; }
@Override public Void visitAssignOperator(AssignOperator op, ILogicalOperator arg) throws AlgebricksException { mapChildren(op, arg); mapVariablesForAbstractAssign(op, arg); return null; }