You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@asterixdb.apache.org by AsterixDB Code Review <do...@asterix-gerrit.ics.uci.edu> on 2024/10/24 12:13:57 UTC

Change in asterixdb[master]: [WIP] Push projections into assign,aggregate operators

From <pr...@gmail.com>:

preethampoluparthi@gmail.com 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: preethampoluparthi@gmail.com
Gerrit-MessageType: newchange