You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2021/04/15 04:11:15 UTC
[calcite] 07/08: [CALCITE-4572] Piglet fails if Pig Latin script
contains RANK or FILTER operators (Mahesh Kumar Behera)
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 <ma...@apache.org>
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));
+ }
}