This is an automated email from the ASF dual-hosted git repository.
alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 3c7e1f234d [ASTERIXDB-3531][COMP] Push projections into
RunningAggregator operator
3c7e1f234d is described below
commit 3c7e1f234dd90ca06887c2e8eda6bd611e396644
Author: preetham0202 <[email protected]>
AuthorDate: Wed Dec 4 16:51:53 2024 +0530
[ASTERIXDB-3531][COMP] Push projections into RunningAggregator operator
- user model changes: no
- storage format changes: no
- interface changes: no
details:
- At the end of the query optimisation if project is parent of
RunningAggregator in the plan tree, project variables are pushed onto
RunningAggregator operator.
Ext-ref: MB-57625
Change-Id: Idd194ce11d0117a37fa8930c85195c21534a7392
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19174
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../physical/RunningAggregatePOperator.java | 30 +++++++++++++++++-----
.../LogicalOperatorPrettyPrintVisitor.java | 3 +++
.../LogicalOperatorPrettyPrintVisitorJson.java | 3 +++
.../core/utils/LogicalOperatorDotVisitor.java | 3 +++
.../rewriter/rules/EmbedProjectRule.java | 3 ++-
5 files changed, 35 insertions(+), 7 deletions(-)
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 4a0c85fabe..506457e8ec 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
@@ -73,10 +73,6 @@ public class RunningAggregatePOperator extends
AbstractPhysicalOperator {
RunningAggregateOperator ragg = (RunningAggregateOperator) op;
List<LogicalVariable> variables = ragg.getVariables();
List<Mutable<ILogicalExpression>> expressions = ragg.getExpressions();
- int[] outColumns = new int[variables.size()];
- for (int i = 0; i < outColumns.length; i++) {
- outColumns[i] = opSchema.findVariable(variables.get(i));
- }
IRunningAggregateEvaluatorFactory[] runningAggFuns = new
IRunningAggregateEvaluatorFactory[expressions.size()];
IExpressionRuntimeProvider expressionRuntimeProvider =
context.getExpressionRuntimeProvider();
for (int i = 0; i < runningAggFuns.length; i++) {
@@ -85,8 +81,30 @@ public class RunningAggregatePOperator extends
AbstractPhysicalOperator {
context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas,
context);
}
- // TODO push projections into the operator
- int[] projectionList = JobGenHelper.projectAllVariables(opSchema);
+ int[] outColumns = new int[variables.size()];
+ int[] projectionList;
+
+ if (ragg.isProjectPushed()) {
+ for (int i = 0; i < outColumns.length; i++) {
+ outColumns[i] = inputSchemas[0].getSize() + i;
+ }
+ List<LogicalVariable> projectVars = ragg.getProjectVariables();
+
+ projectionList = new int[projectVars.size()];
+ int c = 0;
+ for (LogicalVariable projectVar : projectVars) {
+ if (variables.contains(projectVar)) {
+ projectionList[c++] = inputSchemas[0].getSize() +
variables.indexOf(projectVar);
+ } else {
+ projectionList[c++] =
inputSchemas[0].findVariable(projectVar);
+ }
+ }
+ } else {
+ for (int i = 0; i < outColumns.length; i++) {
+ outColumns[i] = opSchema.findVariable(variables.get(i));
+ }
+ projectionList = JobGenHelper.projectAllVariables(opSchema);
+ }
RunningAggregateRuntimeFactory runtime =
new RunningAggregateRuntimeFactory(projectionList, outColumns,
runningAggFuns);
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
index 946a6be6ee..34bf4223ee 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
@@ -187,6 +187,9 @@ public class LogicalOperatorPrettyPrintVisitor extends
AbstractLogicalOperatorPr
public Void visitRunningAggregateOperator(RunningAggregateOperator op,
Integer indent) throws AlgebricksException {
addIndent(indent).append("running-aggregate
").append(str(op.getVariables())).append(" <- ");
pprintExprList(op.getExpressions(), indent);
+ if (op.isProjectPushed()) {
+ buffer.append(" project: ").append(str(op.getProjectVariables()));
+ }
return null;
}
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index b7bfc632b7..af3069a086 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -525,6 +525,9 @@ public class LogicalOperatorPrettyPrintVisitorJson extends
AbstractLogicalOperat
try {
jsonGenerator.writeStringField(OPERATOR_FIELD,
"running-aggregate");
writeVariablesAndExpressions(op.getVariables(),
op.getExpressions(), indent);
+ if (op.isProjectPushed()) {
+ writeArrayFieldOfVariables(PROJECT_VARIABLES_FIELD,
op.getProjectVariables());
+ }
return null;
} catch (IOException e) {
throw AlgebricksException.create(ErrorCode.ERROR_PRINTING_PLAN, e,
String.valueOf(e));
diff --git
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
index 8000483b33..98e416a38a 100644
---
a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
+++
b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
@@ -112,6 +112,9 @@ public class LogicalOperatorDotVisitor implements
ILogicalOperatorVisitor<String
stringBuilder.setLength(0);
stringBuilder.append("running-aggregate
").append(str(op.getVariables())).append(" <- ");
printExprList(op.getExpressions());
+ if (op.isProjectPushed()) {
+ stringBuilder.append(" project:
").append(str(op.getProjectVariables()));
+ }
appendSchema(op, showDetails);
appendAnnotations(op, showDetails);
appendPhysicalOperatorInfo(op, showDetails);
diff --git
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EmbedProjectRule.java
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EmbedProjectRule.java
index 23df409de8..08fa3ea9a7 100644
---
a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EmbedProjectRule.java
+++
b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EmbedProjectRule.java
@@ -47,7 +47,8 @@ public class EmbedProjectRule implements
IAlgebraicRewriteRule {
AbstractLogicalOperator op2 = (AbstractLogicalOperator)
opRef2.getValue();
if (op2.getOperatorTag() != LogicalOperatorTag.ASSIGN &&
op2.getOperatorTag() != LogicalOperatorTag.UNNEST
- && op2.getOperatorTag() !=
LogicalOperatorTag.LEFT_OUTER_UNNEST) {
+ && op2.getOperatorTag() != LogicalOperatorTag.LEFT_OUTER_UNNEST
+ && op2.getOperatorTag() !=
LogicalOperatorTag.RUNNINGAGGREGATE) {
return false;
}