Repository: drill Updated Branches: refs/heads/master b6577feda -> 8f3dc0d10
DRILL-3292: At the stage of converting Prel to Pop (planning phase), ensure constants in Window are converted to LogicalExpression Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/8f3dc0d1 Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/8f3dc0d1 Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/8f3dc0d1 Branch: refs/heads/master Commit: 8f3dc0d10fd87c5c7df57b59a390dc2a150b35d0 Parents: b6577fe Author: Hsuan-Yi Chu <[email protected]> Authored: Mon Jul 6 10:58:45 2015 -0700 Committer: Aman Sinha <[email protected]> Committed: Wed Jul 8 14:54:34 2015 -0700 ---------------------------------------------------------------------- .../drill/exec/planner/physical/WindowPrel.java | 17 +++++++++++---- .../apache/drill/exec/TestWindowFunctions.java | 22 +++++++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/8f3dc0d1/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrel.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrel.java index 170438e..c27b547 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrel.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/WindowPrel.java @@ -20,8 +20,6 @@ package org.apache.drill.exec.planner.physical; import com.google.common.collect.Lists; -import org.apache.calcite.rel.type.RelDataTypeField; -import org.apache.calcite.rel.type.RelRecordType; import org.apache.drill.common.expression.ExpressionPosition; import org.apache.drill.common.expression.FieldReference; import org.apache.drill.common.expression.FunctionCall; @@ -32,14 +30,18 @@ import org.apache.drill.common.logical.data.Order; import org.apache.drill.exec.physical.base.PhysicalOperator; import org.apache.drill.exec.physical.config.WindowPOP; import org.apache.drill.exec.planner.common.DrillWindowRelBase; +import org.apache.drill.exec.planner.logical.DrillOptiq; +import org.apache.drill.exec.planner.logical.DrillParseContext; import org.apache.drill.exec.planner.physical.visitor.PrelVisitor; import org.apache.drill.exec.record.BatchSchema; + +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelTraitSet; -import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.util.BitSets; @@ -48,7 +50,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Map; import static com.google.common.base.Preconditions.checkState; @@ -112,10 +113,17 @@ public class WindowPrel extends DrillWindowRelBase implements Prel { } protected LogicalExpression toDrill(AggregateCall call, List<String> fn) { + DrillParseContext context = new DrillParseContext(PrelUtil.getSettings(getCluster())); + List<LogicalExpression> args = Lists.newArrayList(); for (Integer i : call.getArgList()) { + final int indexInConstants = i - fn.size(); if (i < fn.size()) { args.add(new FieldReference(fn.get(i))); + } else { + final RexLiteral constant = constants.get(indexInConstants); + LogicalExpression expr = DrillOptiq.toDrill(context, getInput(), constant); + args.add(expr); } } @@ -123,6 +131,7 @@ public class WindowPrel extends DrillWindowRelBase implements Prel { if (args.isEmpty()) { args.add(new ValueExpressions.LongExpression(1l)); } + return new FunctionCall(call.getAggregation().getName().toLowerCase(), args, ExpressionPosition.UNKNOWN); } http://git-wip-us.apache.org/repos/asf/drill/blob/8f3dc0d1/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java index 8676c28..7071bea 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java @@ -403,4 +403,24 @@ public class TestWindowFunctions extends BaseTestQuery { .build().run(); } -} + @Test // DRILL-3292 + public void testWindowConstants() throws Exception { + String query = "select rank() over w fn, sum(2) over w sumINTEGER, sum(employee_id) over w sumEmpId, sum(0.5) over w sumFLOAT \n" + + "from cp.`employee.json` \n" + + "where position_id = 2 \n" + + "window w as(partition by position_id order by employee_id)"; + + testBuilder() + .sqlQuery(query) + .ordered() + .baselineColumns("fn", "sumINTEGER", "sumEmpId", "sumFLOAT") + .baselineValues(1l, 2l, 2l, 0.5) + .baselineValues(2l, 4l, 6l, 1.0) + .baselineValues(3l, 6l, 11l, 1.5) + .baselineValues(4l, 8l, 31l, 2.0) + .baselineValues(5l, 10l, 52l, 2.5) + .baselineValues(6l, 12l, 74l, 3.0) + .build() + .run(); + } +} \ No newline at end of file
