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 2016/05/31 19:37:01 UTC

calcite git commit: [CALCITE-1266] RelBuilder.field gets offsets wrong

Repository: calcite
Updated Branches:
  refs/heads/master d757201f1 -> 48e434263


[CALCITE-1266] RelBuilder.field gets offsets wrong


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/48e43426
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/48e43426
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/48e43426

Branch: refs/heads/master
Commit: 48e434263e526dcfa0c367e523cdc83b5989ab16
Parents: d757201
Author: Julian Hyde <jh...@apache.org>
Authored: Tue May 31 11:37:31 2016 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 31 11:37:31 2016 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/tools/RelBuilder.java    | 20 +++++++++++++++++++-
 .../apache/calcite/test/PigRelBuilderTest.java  |  2 +-
 .../org/apache/calcite/test/RelBuilderTest.java |  6 +++---
 .../org/apache/calcite/test/RelOptRulesTest.xml |  2 +-
 4 files changed, 24 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/48e43426/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index acc9363..d912ba2 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -250,6 +250,20 @@ public class RelBuilder {
     return peek(inputCount - 1 - inputOrdinal);
   }
 
+  /** Returns the number of fields in all inputs before (to the left of)
+   * the given input.
+   *
+   * @param inputCount Number of inputs
+   * @param inputOrdinal Input ordinal
+   */
+  private int inputOffset(int inputCount, int inputOrdinal) {
+    int offset = 0;
+    for (int i = 0; i < inputOrdinal; i++) {
+      offset += peek(inputCount, i).getRowType().getFieldCount();
+    }
+    return offset;
+  }
+
   // Methods that return scalar expressions
 
   /** Creates a literal (constant expression). */
@@ -327,7 +341,11 @@ public class RelBuilder {
       throw new IllegalArgumentException("field ordinal [" + fieldOrdinal
           + "] out of range; input fields are: " + rowType.getFieldNames());
     }
-    return cluster.getRexBuilder().makeInputRef(input, fieldOrdinal);
+    final RelDataType fieldType =
+        rowType.getFieldList().get(fieldOrdinal).getType();
+    final int offset = inputOffset(inputCount, inputOrdinal);
+    return cluster.getRexBuilder()
+        .makeInputRef(fieldType, offset + fieldOrdinal);
   }
 
   /** Creates a reference to a field of the current record which originated

http://git-wip-us.apache.org/repos/asf/calcite/blob/48e43426/core/src/test/java/org/apache/calcite/test/PigRelBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/PigRelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/PigRelBuilderTest.java
index d1b9f33..d877097 100644
--- a/core/src/test/java/org/apache/calcite/test/PigRelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/PigRelBuilderTest.java
@@ -117,7 +117,7 @@ public class PigRelBuilderTest {
             builder.groupKey("DEPTNO").alias("e"),
             builder.groupKey("DEPTNO").alias("d"))
         .build();
-    final String plan = "LogicalJoin(condition=[=($0, $0)], joinType=[inner])\n"
+    final String plan = "LogicalJoin(condition=[=($0, $2)], joinType=[inner])\n"
         + "  LogicalAggregate(group=[{0}], EMP=[COLLECT($8)])\n"
         + "    LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], $f8=[ROW($0, $1, $2, $3, $4, $5, $6, $7)])\n      LogicalTableScan(table=[[scott, EMP]])\n  LogicalAggregate(group=[{0}], DEPT=[COLLECT($3)])\n"
         + "    LogicalProject(DEPTNO=[$0], DNAME=[$1], LOC=[$2], $f3=[ROW($0, $1, $2)])\n"

http://git-wip-us.apache.org/repos/asf/calcite/blob/48e43426/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index e6ea995..bb9f7b4 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -815,7 +815,7 @@ public class RelBuilderTest {
                     builder.field(2, 1, "DEPTNO")))
             .build();
     final String expected = ""
-        + "LogicalJoin(condition=[=($7, $0)], joinType=[inner])\n"
+        + "LogicalJoin(condition=[=($7, $8)], joinType=[inner])\n"
         + "  LogicalFilter(condition=[IS NULL($6)])\n"
         + "    LogicalTableScan(table=[[scott, EMP]])\n"
         + "  LogicalTableScan(table=[[scott, DEPT]])\n";
@@ -834,7 +834,7 @@ public class RelBuilderTest {
             .join(JoinRelType.INNER, "DEPTNO")
             .build();
     final String expected = ""
-        + "LogicalJoin(condition=[=($7, $0)], joinType=[inner])\n"
+        + "LogicalJoin(condition=[=($7, $8)], joinType=[inner])\n"
         + "  LogicalFilter(condition=[IS NULL($6)])\n"
         + "    LogicalTableScan(table=[[scott, EMP]])\n"
         + "  LogicalTableScan(table=[[scott, DEPT]])\n";
@@ -864,7 +864,7 @@ public class RelBuilderTest {
             .build();
     // Note that "dept.deptno IS NOT NULL" has been simplified away.
     final String expected = ""
-        + "LogicalJoin(condition=[AND(=($7, $0), =($0, 123))], joinType=[left])\n"
+        + "LogicalJoin(condition=[AND(=($7, $8), =($0, 123))], joinType=[left])\n"
         + "  LogicalTableScan(table=[[scott, EMP]])\n"
         + "  LogicalTableScan(table=[[scott, DEPT]])\n";
     assertThat(str(root), is(expected));

http://git-wip-us.apache.org/repos/asf/calcite/blob/48e43426/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 20c5c0f..506f2dd 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -4666,7 +4666,7 @@ LogicalProject(DEPTNO=[$7])
 LogicalProject(EMPNO=[$0])
   LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10])
     LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10], $f0=[$11])
-      LogicalJoin(condition=[<($2, $3)], joinType=[left])
+      LogicalJoin(condition=[<($11, $12)], joinType=[left])
         LogicalTableScan(table=[[CATALOG, SALES, EMP]])
         LogicalJoin(condition=[true], joinType=[left])
           LogicalJoin(condition=[true], joinType=[left])