public static boolean isOperatorIsomorphicPlanSegment(ILogicalOperator op, ILogicalOperator arg) throws AlgebricksException { List<Mutable<ILogicalOperator>> inputs1 = op.getInputs(); List<Mutable<ILogicalOperator>> inputs2 = arg.getInputs(); if (inputs1.size() != inputs2.size()) { return false; } for (int i = 0; i < inputs1.size(); i++) { ILogicalOperator input1 = inputs1.get(i).getValue(); ILogicalOperator input2 = inputs2.get(i).getValue(); boolean isomorphic = isOperatorIsomorphicPlanSegment(input1, input2); if (!isomorphic) { return false; } } return IsomorphismUtilities.isOperatorIsomorphic(op, arg); }
public static boolean isOperatorIsomorphicPlan(ILogicalPlan plan, ILogicalPlan arg) throws AlgebricksException { if (plan.getRoots().size() != arg.getRoots().size()) { return false; } for (int i = 0; i < plan.getRoots().size(); i++) { ILogicalOperator topOp1 = plan.getRoots().get(i).getValue(); ILogicalOperator topOp2 = arg.getRoots().get(i).getValue(); if (!IsomorphismUtilities.isOperatorIsomorphicPlanSegment(topOp1, topOp2)) { return false; } } return true; }
@Override public Boolean visitSubplanOperator(SubplanOperator op, ILogicalOperator arg) throws AlgebricksException { AbstractLogicalOperator aop = (AbstractLogicalOperator) arg; if (aop.getOperatorTag() != LogicalOperatorTag.SUBPLAN) { return Boolean.FALSE; } SubplanOperator subplanOpArg = (SubplanOperator) copyAndSubstituteVar(op, arg); List<ILogicalPlan> plans = op.getNestedPlans(); List<ILogicalPlan> plansArg = subplanOpArg.getNestedPlans(); for (int i = 0; i < plans.size(); i++) { List<Mutable<ILogicalOperator>> roots = plans.get(i).getRoots(); List<Mutable<ILogicalOperator>> rootsArg = plansArg.get(i).getRoots(); if (roots.size() == rootsArg.size()) { return Boolean.FALSE; } for (int j = 0; j < roots.size(); j++) { ILogicalOperator topOp1 = roots.get(j).getValue(); ILogicalOperator topOp2 = rootsArg.get(j).getValue(); boolean isomorphic = IsomorphismUtilities.isOperatorIsomorphicPlanSegment(topOp1, topOp2); if (!isomorphic) { return Boolean.FALSE; } } } return Boolean.TRUE; }
ILogicalOperator topOp1 = roots.get(j).getValue(); ILogicalOperator topOp2 = rootsArg.get(j).getValue(); isomorphic = IsomorphismUtilities.isOperatorIsomorphicPlanSegment(topOp1, topOp2); if (!isomorphic) { return Boolean.FALSE;
private boolean consolidateNestedPlans(WindowOperator winOpTo, WindowOperator winOpFrom, IOptimizationContext context) throws AlgebricksException { if (winOpTo.hasNestedPlans()) { AggregateOperator aggTo = getAggregateRoot(winOpTo.getNestedPlans()); if (aggTo == null) { return false; } AggregateOperator aggFrom = getAggregateRoot(winOpFrom.getNestedPlans()); if (aggFrom == null) { return false; } if (!IsomorphismUtilities.isOperatorIsomorphicPlanSegment(aggTo.getInputs().get(0).getValue(), aggFrom.getInputs().get(0).getValue())) { return false; } aggTo.getVariables().addAll(aggFrom.getVariables()); aggTo.getExpressions().addAll(aggFrom.getExpressions()); context.computeAndSetTypeEnvironmentForOperator(aggTo); } else { setAll(winOpTo.getNestedPlans(), winOpFrom.getNestedPlans()); setAll(winOpTo.getFrameValueExpressions(), winOpFrom.getFrameValueExpressions()); setAll(winOpTo.getFrameStartExpressions(), winOpFrom.getFrameStartExpressions()); setAll(winOpTo.getFrameEndExpressions(), winOpFrom.getFrameEndExpressions()); setAll(winOpTo.getFrameExcludeExpressions(), winOpFrom.getFrameExcludeExpressions()); winOpTo.setFrameExcludeNegationStartIdx(winOpFrom.getFrameExcludeNegationStartIdx()); winOpTo.getFrameOffset().setValue(winOpFrom.getFrameOffset().getValue()); winOpTo.setFrameMaxObjects(winOpFrom.getFrameMaxObjects()); } return true; }