>From <[email protected]>:

[email protected] has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19006 )


Change subject: [WIP] Push projections into assign,aggregate operators
......................................................................

[WIP] Push projections into assign,aggregate operators

Change-Id: I2767a176bb1d7bd7722121b9b8d57a8e9cf9de2a
---
M 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractAssignOperator.java
M 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
A 
hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/TestRule.java
M 
hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/AbstractAssignPOperator.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
5 files changed, 112 insertions(+), 4 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/06/19006/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
index 5209b3e..933d31a 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
@@ -157,6 +157,7 @@
 import org.apache.hyracks.algebricks.rewriter.rules.SetExecutionModeRule;
 import org.apache.hyracks.algebricks.rewriter.rules.SimpleUnnestToProductRule;
 import org.apache.hyracks.algebricks.rewriter.rules.SwitchInnerJoinBranchRule;
+import org.apache.hyracks.algebricks.rewriter.rules.TestRule;
 import 
org.apache.hyracks.algebricks.rewriter.rules.subplan.EliminateIsomorphicSubplanRule;
 import 
org.apache.hyracks.algebricks.rewriter.rules.subplan.EliminateSubplanRule;
 import 
org.apache.hyracks.algebricks.rewriter.rules.subplan.EliminateSubplanWithInputCardinalityOneRule;
@@ -466,6 +467,7 @@
         prepareForJobGenRewrites.add(new PopulateResultMetadataRule());
         prepareForJobGenRewrites.add(new 
AnnotateOperatorCostCardinalityRule());
         prepareForJobGenRewrites.add(new EnsureColumnarSupportedTypesRule());
+        prepareForJobGenRewrites.add(new TestRule());
         return prepareForJobGenRewrites;
     }
 }
diff --git 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/AbstractAssignPOperator.java
 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/AbstractAssignPOperator.java
index 4466a25..9d70b23 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/AbstractAssignPOperator.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/AbstractAssignPOperator.java
@@ -71,7 +71,13 @@
         }

         // TODO push projections into the operator
-        int[] projectionList = JobGenHelper.projectAllVariables(opSchema);
+        int[] projectionList;
+
+        if (assign.isProjectionPushed()) {
+            projectionList = JobGenHelper.projectVariables(opSchema, 
assign.getPushedProjectionVariables());
+        } else {
+            projectionList = JobGenHelper.projectAllVariables(opSchema);
+        }

         IPushRuntimeFactory runtime =
                 createRuntimeFactory(context, assign, opSchema, inputSchemas, 
outColumns, projectionList);
diff --git 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractAssignOperator.java
 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractAssignOperator.java
index 586b1a8..34aab91 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractAssignOperator.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractAssignOperator.java
@@ -34,6 +34,8 @@
 public abstract class AbstractAssignOperator extends AbstractLogicalOperator {
     protected final List<LogicalVariable> variables;
     protected final List<Mutable<ILogicalExpression>> expressions;
+    protected List<LogicalVariable> pushedProjectionVariables;
+    protected boolean isProjectionPushed;

     public AbstractAssignOperator() {
         this.variables = new ArrayList<LogicalVariable>();
@@ -45,6 +47,19 @@
         this.expressions = expressions;
     }

+    public void pushProjectionVariables(List<LogicalVariable> 
pushedProjectionVariables) {
+        isProjectionPushed = true;
+        this.pushedProjectionVariables = pushedProjectionVariables;
+    }
+
+    public List<LogicalVariable> getPushedProjectionVariables() {
+        return pushedProjectionVariables;
+    }
+
+    public boolean isProjectionPushed() {
+        return isProjectionPushed;
+    }
+
     public List<LogicalVariable> getVariables() {
         return variables;
     }
@@ -56,8 +71,14 @@
     @Override
     public void recomputeSchema() {
         schema = new ArrayList<LogicalVariable>();
-        schema.addAll(inputs.get(0).getValue().getSchema());
-        schema.addAll(variables);
+
+        if (isProjectionPushed()) {
+            schema.addAll(variables);
+        } else {
+            schema.addAll(inputs.get(0).getValue().getSchema());
+            schema.addAll(variables);
+        }
+
     }

     @Override
@@ -75,6 +96,13 @@
         return new VariablePropagationPolicy() {
             @Override
             public void propagateVariables(IOperatorSchema target, 
IOperatorSchema... sources) {
+
+                if (isProjectionPushed) {
+                    for (LogicalVariable p : pushedProjectionVariables)
+                        target.addVariable(p);
+                    return;
+                }
+
                 if (propagateInputVars) {
                     target.addAllVariables(sources[0]);
                 }
diff --git 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
index 4a0c85f..2222515 100644
--- 
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
+++ 
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
@@ -86,7 +86,13 @@
         }

         // TODO push projections into the operator
-        int[] projectionList = JobGenHelper.projectAllVariables(opSchema);
+        int[] projectionList;
+
+        if (ragg.isProjectionPushed()) {
+            projectionList = JobGenHelper.projectVariables(opSchema, 
ragg.getPushedProjectionVariables());
+        } else {
+            projectionList = JobGenHelper.projectAllVariables(opSchema);
+        }

         RunningAggregateRuntimeFactory runtime =
                 new RunningAggregateRuntimeFactory(projectionList, outColumns, 
runningAggFuns);
diff --git 
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/TestRule.java
 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/TestRule.java
new file mode 100644
index 0000000..9bafe33
--- /dev/null
+++ 
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/TestRule.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.algebricks.rewriter.rules;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractAssignOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import 
org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator;
+import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
+
+public class TestRule implements IAlgebraicRewriteRule {
+
+    @Override
+    public boolean rewritePost(Mutable<ILogicalOperator> opRef, 
IOptimizationContext context) {
+
+        AbstractLogicalOperator op = (AbstractLogicalOperator) 
opRef.getValue();
+
+        if (op.getOperatorTag() != LogicalOperatorTag.PROJECT) {
+            return false;
+        }
+
+        Mutable<ILogicalOperator> opRef2 = op.getInputs().get(0);
+        AbstractLogicalOperator op2 = (AbstractLogicalOperator) 
opRef2.getValue();
+
+        if (op2.getOperatorTag() != LogicalOperatorTag.ASSIGN
+                && op2.getOperatorTag() != 
LogicalOperatorTag.RUNNINGAGGREGATE) {
+            return false;
+        }
+
+        AbstractAssignOperator assignOperator = (AbstractAssignOperator) op2;
+        ProjectOperator projectOperator = (ProjectOperator) op;
+
+        assignOperator.pushProjectionVariables(projectOperator.getVariables());
+        opRef.setValue(op2);
+        return true;
+    }
+
+}

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19006
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I2767a176bb1d7bd7722121b9b8d57a8e9cf9de2a
Gerrit-Change-Number: 19006
Gerrit-PatchSet: 1
Gerrit-Owner: [email protected]
Gerrit-MessageType: newchange

Reply via email to