This is an automated email from the ASF dual-hosted git repository. jhyde pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 90530a0a0571513d5358a0dd16197390f492633d Author: Mahesh Kumar Behera <[email protected]> AuthorDate: Sat Apr 10 11:03:00 2021 +0530 [CALCITE-4572] Piglet fails if Pig Latin script contains RANK or FILTER operators (Mahesh Kumar Behera) Close apache/calcite#2394 --- .../org/apache/calcite/piglet/PigRelOpVisitor.java | 4 +-- .../java/org/apache/calcite/test/PigRelOpTest.java | 34 ++++++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java index ecbb81a..7d0dc71 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigRelOpVisitor.java @@ -84,8 +84,6 @@ import java.util.Set; * algebra plans. */ class PigRelOpVisitor extends PigRelOpWalker.PlanPreVisitor { - private static final String RANK_PREFIX = "rank_"; - // The relational algebra builder customized for Pig protected final PigRelBuilder builder; private Operator currentRoot; @@ -648,7 +646,7 @@ class PigRelOpVisitor extends PigRelOpWalker.PlanPreVisitor { List<String> fieldNames = new ArrayList<>(); projectedFields.add(rankField); - fieldNames.add(RANK_PREFIX + loRank.getAlias()); // alias of the rank field + fieldNames.add(loRank.getSchema().getField(0).alias); // alias of the rank field for (int i = 0; i < inputRowType.getFieldCount(); i++) { projectedFields.add(builder.field(i)); fieldNames.add(inputRowType.getFieldNames().get(i)); diff --git a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java index de14526..959949d 100644 --- a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java +++ b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java @@ -1142,7 +1142,7 @@ class PigRelOpTest extends PigRelTestBase { + " LogicalProject(EMPNO=[$0], JOB=[$2], DEPTNO=[$7])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; final String optimizedPlan = "" - + "LogicalProject(rank_C=[$3], EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + + "LogicalProject(rank_B=[$3], EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + " LogicalWindow(window#0=[window(order by [2, 1 DESC] " + "aggs [RANK()])])\n" + " LogicalProject(EMPNO=[$0], JOB=[$2], DEPTNO=[$7])\n" @@ -1150,7 +1150,7 @@ class PigRelOpTest extends PigRelTestBase { final String script = base + "C = RANK B BY DEPTNO ASC, JOB DESC;\n"; final String plan = "" - + "LogicalProject(rank_C=[RANK() OVER (ORDER BY $2, $1 DESC)], " + + "LogicalProject(rank_B=[RANK() OVER (ORDER BY $2, $1 DESC)], " + "EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + basePlan; final String result = "" @@ -1170,7 +1170,7 @@ class PigRelOpTest extends PigRelTestBase { + "(14,7900,CLERK,30)\n"; final String sql = "" + "SELECT RANK() OVER (ORDER BY DEPTNO, JOB DESC RANGE BETWEEN " - + "UNBOUNDED PRECEDING AND CURRENT ROW) AS rank_C, EMPNO, JOB, DEPTNO\n" + + "UNBOUNDED PRECEDING AND CURRENT ROW) AS rank_B, EMPNO, JOB, DEPTNO\n" + "FROM scott.EMP"; pig(script).assertRel(hasTree(plan)) .assertOptimizedRel(hasTree(optimizedPlan)) @@ -1179,14 +1179,14 @@ class PigRelOpTest extends PigRelTestBase { final String script2 = base + "C = RANK B BY DEPTNO ASC, JOB DESC DENSE;\n"; final String optimizedPlan2 = "" - + "LogicalProject(rank_C=[$3], EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + + "LogicalProject(rank_B=[$3], EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + " LogicalWindow(window#0=[window(order by [2, 1 DESC] " + "aggs [DENSE_RANK()])" + "])\n" + " LogicalProject(EMPNO=[$0], JOB=[$2], DEPTNO=[$7])\n" + " LogicalTableScan(table=[[scott, EMP]])\n"; final String plan2 = "" - + "LogicalProject(rank_C=[DENSE_RANK() OVER (ORDER BY $2, $1 DESC)], " + + "LogicalProject(rank_B=[DENSE_RANK() OVER (ORDER BY $2, $1 DESC)], " + "EMPNO=[$0], JOB=[$1], DEPTNO=[$2])\n" + basePlan; final String result2 = "" @@ -1206,7 +1206,7 @@ class PigRelOpTest extends PigRelTestBase { + "(9,7900,CLERK,30)\n"; final String sql2 = "" + "SELECT DENSE_RANK() OVER (ORDER BY DEPTNO, JOB DESC RANGE BETWEEN " - + "UNBOUNDED PRECEDING AND CURRENT ROW) AS rank_C, EMPNO, JOB, DEPTNO\n" + + "UNBOUNDED PRECEDING AND CURRENT ROW) AS rank_B, EMPNO, JOB, DEPTNO\n" + "FROM scott.EMP"; pig(script2).assertRel(hasTree(plan2)) .assertOptimizedRel(hasTree(optimizedPlan2)) @@ -1621,4 +1621,26 @@ class PigRelOpTest extends PigRelTestBase { pig(script).assertRel(hasTree(plan)) .assertSql(is(sql)); } + + @Test void testRankAndFilter() { + final String script = "" + + "A = LOAD 'emp1' USING PigStorage(',') as (" + + " id:int, name:chararray, age:int, city:chararray);\n" + + "B = rank A;\n" + + "C = FILTER B by ($0 > 1);"; + + final String plan = "" + + "LogicalFilter(condition=[>($0, 1)])\n" + + " LogicalProject(rank_A=[RANK() OVER ()], id=[$0]," + + " name=[$1], age=[$2], city=[$3])\n" + + " LogicalTableScan(table=[[emp1]])\n"; + + final String sql = "SELECT w0$o0 AS rank_A, id, name, age, city\n" + + "FROM (SELECT id, name, age, city, RANK() OVER (RANGE BETWEEN " + + "UNBOUNDED PRECEDING AND CURRENT ROW)\n" + + " FROM emp1) AS t\n" + + "WHERE w0$o0 > 1"; + pig(script).assertRel(hasTree(plan)) + .assertSql(is(sql)); + } }
