>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