You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by pr...@apache.org on 2013/08/28 06:29:34 UTC

svn commit: r1518070 - in /incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules: EliminateUnnestAggregateSequencesRule.java EliminateUnnestAggregateSubplanRule.java

Author: prestonc
Date: Wed Aug 28 04:29:34 2013
New Revision: 1518070

URL: http://svn.apache.org/r1518070
Log:
Changed the rules to leave the unnest operator. The plans still convert aggregate to an assign.

Modified:
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSequencesRule.java
    incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSubplanRule.java

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSequencesRule.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSequencesRule.java?rev=1518070&r1=1518069&r2=1518070&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSequencesRule.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSequencesRule.java Wed Aug 28 04:29:34 2013
@@ -29,16 +29,34 @@ import edu.uci.ics.hyracks.algebricks.co
 import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator;
 import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
-import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator;
 import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
 import edu.uci.ics.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
+/**
+ * The rule searches for unnest followed by an aggregate operator with a
+ * sequence function and converts the aggregate operator to an assign.
+ * 
+ * <pre>
+ * Before
+ * 
+ *   plan__parent
+ *   UNNEST( $v2 : iterate( $v1 ) )
+ *   AGGREGATE( $v1 : sequence( $v0 ) )
+ *   plan__child
+ *   
+ *   where plan__parent does not use $v1 and $v0 is defined in plan__child.
+ *   
+ * After
+ * 
+ *   plan__parent
+ *   UNNEST( $v2 : iterate( $v1 ) )
+ *   ASSIGN( $v1 : $v0 )
+ *   plan__child
+ * </pre>
+ * 
+ * @author prestonc
+ */
 public class EliminateUnnestAggregateSequencesRule implements IAlgebraicRewriteRule {
-    /**
-     * Find where an unnest is followed by a aggregate.
-     * Search pattern: unnest -> (aggregate ... )
-     * Replacement pattern: assign -> ...
-     */
     @Override
     public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
@@ -73,38 +91,17 @@ public class EliminateUnnestAggregateSeq
             return false;
         }
 
-        // Use the left over functions from iterator and sequence.
-        Mutable<ILogicalExpression> assignExpression = functionCall2.getArguments().get(0);
-        ILogicalExpression lastUnnestExpression = findLastFunctionExpression(logicalExpression);
-        if (lastUnnestExpression != null) {
-            // Additional functions are included in the iterate function that need to be included.
-            AbstractFunctionCallExpression lastUnnestFunction = (AbstractFunctionCallExpression) lastUnnestExpression;
-            lastUnnestFunction.getArguments().set(0, functionCall2.getArguments().get(0));
-            assignExpression = functionCall.getArguments().get(0);
-        }
-
         // Replace search string with assign.
+        Mutable<ILogicalExpression> assignExpression = functionCall2.getArguments().get(0);
         AssignOperator aOp = new AssignOperator(unnest.getVariable(), assignExpression);
         for (Mutable<ILogicalOperator> input : aggregate.getInputs()) {
             aOp.getInputs().add(input);
         }
-        opRef.setValue(aOp);
+        unnest.getInputs().get(0).setValue(aOp);
 
         return true;
     }
 
-    private ILogicalExpression findLastFunctionExpression(ILogicalExpression expression) {
-        if (expression.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
-            AbstractFunctionCallExpression functionCall = (AbstractFunctionCallExpression) expression;
-            ILogicalExpression nextExpression = functionCall.getArguments().get(0).getValue();
-            if (nextExpression.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-                return expression;
-            }
-            return findLastFunctionExpression(nextExpression);
-        }
-        return null;
-    }
-
     @Override
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context) {
         return false;

Modified: incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSubplanRule.java
URL: http://svn.apache.org/viewvc/incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSubplanRule.java?rev=1518070&r1=1518069&r2=1518070&view=diff
==============================================================================
--- incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSubplanRule.java (original)
+++ incubator/vxquery/trunk/vxquery/vxquery-core/src/main/java/org/apache/vxquery/compiler/rewriter/rules/EliminateUnnestAggregateSubplanRule.java Wed Aug 28 04:29:34 2013
@@ -33,12 +33,34 @@ import edu.uci.ics.hyracks.algebricks.co
 import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
 import edu.uci.ics.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
+/**
+ * The rule searches for unnest followed by subplan with the root operator an
+ * aggregate and removes the aggregate subplan.
+ * 
+ * <pre>
+ * Before
+ * 
+ *   plan__parent
+ *   UNNEST( $v2 : iterate( $v1 ) )
+ *   SUBPLAN{
+ *     AGGREGATE( $v1 : sequence( $v0 ) )
+ *     plan__nested
+ *     NESTEDTUPLESOURCE
+ *   }
+ *   plan__child
+ *   
+ *   where plan__parent does not use $v1 and $v0 is defined plan__child.
+ *    
+ * After 
+ * 
+ *   plan__parent
+ *   UNNEST( $v2 : iterate( $v1 ) )
+ *   ASSIGN( $v1 : $v0 )
+ *   plan__nested
+ *   plan__child
+ * </pre>
+ */
 public class EliminateUnnestAggregateSubplanRule implements IAlgebraicRewriteRule {
-    /**
-     * Find where an unnest is followed by a subplan with the root operator of aggregate.
-     * Search pattern: unnest -> subplan -> (aggregate ... )
-     * Replacement pattern: assign -> ...
-     */
     @Override
     public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
@@ -80,26 +102,20 @@ public class EliminateUnnestAggregateSub
             return false;
         }
 
-        // Use the left over functions from iterator and sequence.
-        Mutable<ILogicalExpression> assignExpression = functionCall2.getArguments().get(0);
-        ILogicalExpression lastUnnestExpression = findLastFunctionExpression(logicalExpression);
-        if (lastUnnestExpression != null) {
-            // Additional functions are included in the iterate function that need to be included.
-            AbstractFunctionCallExpression lastUnnestFunction = (AbstractFunctionCallExpression) lastUnnestExpression;
-            lastUnnestFunction.getArguments().set(0, functionCall2.getArguments().get(0));
-            assignExpression = functionCall.getArguments().get(0);
+        // Make inline the arguments for the subplan.
+        AbstractLogicalOperator subplanEnd = findLastSubplanOperator(subplanOp);
+        int count = 0;
+        for (Mutable<ILogicalOperator> input : subplan.getInputs()) {
+            subplanEnd.getInputs().get(count++).setValue(input.getValue());
         }
 
         // Replace search string with assign.
-        AssignOperator aOp = new AssignOperator(unnest.getVariable(), assignExpression);
-        for (Mutable<ILogicalOperator> input : subplanOp.getInputs()) {
+        Mutable<ILogicalExpression> assignExpression = functionCall2.getArguments().get(0);
+        AssignOperator aOp = new AssignOperator(aggregate.getVariables().get(0), assignExpression);
+        for (Mutable<ILogicalOperator> input : aggregate.getInputs()) {
             aOp.getInputs().add(input);
         }
-        opRef.setValue(aOp);
-
-        // Make inline the arguments for the subplan.
-        AbstractLogicalOperator subplanEnd = findLastSubplanOperator(subplanOp);
-        subplanEnd.getInputs().get(0).setValue(subplan.getInputs().get(0).getValue());
+        unnest.getInputs().get(0).setValue(aOp);
 
         return true;
     }