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/03/23 00:39:46 UTC

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

Author: prestonc
Date: Fri Mar 22 23:39:45 2013
New Revision: 1460055

URL: http://svn.apache.org/r1460055
Log:
Corrected the eliminate unnest aggregate subplan to be replaced by a single assign operator.

Modified:
    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/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=1460055&r1=1460054&r2=1460055&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 Fri Mar 22 23:39:45 2013
@@ -17,12 +17,18 @@
 package org.apache.vxquery.compiler.rewriter.rules;
 
 import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.vxquery.functions.BuiltinOperators;
 
 import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 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;
@@ -31,6 +37,7 @@ public class EliminateUnnestAggregateSub
     /**
      * 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 {
@@ -40,7 +47,6 @@ public class EliminateUnnestAggregateSub
         }
         UnnestOperator unnest = (UnnestOperator) op;
 
-        // Check if assign is for fn:Collection.
         AbstractLogicalOperator op2 = (AbstractLogicalOperator) unnest.getInputs().get(0).getValue();
         if (op2.getOperatorTag() != LogicalOperatorTag.SUBPLAN) {
             return false;
@@ -52,13 +58,27 @@ public class EliminateUnnestAggregateSub
         if (subplanOp.getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
             return false;
         }
+        AggregateOperator aggregate = (AggregateOperator) subplanOp;
 
-        AbstractLogicalOperator subplanEnd = findLastSubplanOperator(subplanOp);
+        // Check to see if the expression is a function and op:sequence.
+        ILogicalExpression logicalExpression = (ILogicalExpression) aggregate.getExpressions().get(0).getValue();
+        if (logicalExpression.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
+            return false;
+        }
+        AbstractFunctionCallExpression functionCall = (AbstractFunctionCallExpression) logicalExpression;
+        if (!functionCall.getFunctionIdentifier().equals(BuiltinOperators.SEQUENCE.getFunctionIdentifier())) {
+            return false;
+        }
 
-        // Remove the subplan.
-        unnest.getInputs().get(0).setValue(subplanOp);
+        // Replace search string with assign.
+        AssignOperator aOp = new AssignOperator(unnest.getVariable(), functionCall.getArguments().get(0));
+        for (Mutable<ILogicalOperator> input : subplanOp.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());
 
         return true;