/** * Unnest more complex structures. * * @return List of algebraic rewrite rules. */ public final static List<IAlgebraicRewriteRule> buildUnnestingRuleCollection() { List<IAlgebraicRewriteRule> xquery = new LinkedList<IAlgebraicRewriteRule>(); xquery.add(new PushSelectDownRule()); xquery.add(new SimpleUnnestToProductRule()); xquery.add(new ComplexUnnestToProductRule()); xquery.add(new ComplexJoinInferenceRule()); xquery.add(new PushSelectIntoJoinRule()); xquery.add(new IntroJoinInsideSubplanRule()); xquery.add(new PushMapOperatorDownThroughProductRule()); xquery.add(new PushSubplanWithAggregateDownThroughProductRule()); xquery.add(new IntroduceGroupByForSubplanRule()); xquery.add(new SubplanOutOfGroupRule()); xquery.add(new InsertOuterJoinRule()); xquery.add(new ExtractFunctionsFromJoinConditionRule()); xquery.add(new RemoveRedundantVariablesRule()); xquery.add(new RemoveUnusedAssignAndAggregateRule()); xquery.add(new FactorRedundantGroupAndDecorVarsRule()); xquery.add(new EliminateSubplanRule()); xquery.add(new EliminateGroupByEmptyKeyRule()); xquery.add(new PushSubplanIntoGroupByRule()); xquery.add(new NestedSubplanToJoinRule()); xquery.add(new EliminateSubplanWithInputCardinalityOneRule()); return xquery; }
/** * check whether the operator is inside a sub-plan * * @param nestedRootRef * @return true-if it is; false otherwise. */ private boolean insideSubplan(Mutable<ILogicalOperator> nestedRootRef) { AbstractLogicalOperator nestedRoot = (AbstractLogicalOperator) nestedRootRef.getValue(); if (nestedRoot.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE) { return true; } List<Mutable<ILogicalOperator>> inputs = nestedRoot.getInputs(); for (Mutable<ILogicalOperator> input : inputs) { if (insideSubplan(input)) { return true; } } return false; } }
if (insideSubplan(opRef)) { return false; if (!findPlanPartition(op2, innerUsedVars, outerUsedVars, innerOps, outerOps, topSelects, false)) { if (!findPlanPartition(unnestChild, innerUsedVars, outerUsedVars, innerOps, outerOps, topSelects, true)) { innerRoot = buildOperatorChain(innerOps, ets, context); context.computeAndSetTypeEnvironmentForOperator(innerRoot); outerRoot = buildOperatorChain(outerOps, null, context); context.computeAndSetTypeEnvironmentForOperator(outerRoot); topOp = buildOperatorChain(topSelects, product, context);
return findPlanPartition((AbstractLogicalOperator) op.getInputs().get(0).getValue(), innerUsedVars, outerUsedVars, innerOps, outerOps, topSelects, belowSecondUnnest);
condPushDownAndJoinInference.add(new CancelUnnestWithNestedListifyRule()); condPushDownAndJoinInference.add(new SimpleUnnestToProductRule()); condPushDownAndJoinInference.add(new ComplexUnnestToProductRule()); condPushDownAndJoinInference.add(new DisjunctivePredicateToJoinRule()); condPushDownAndJoinInference.add(new PushSelectIntoJoinRule());