You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by hy...@apache.org on 2019/10/30 06:33:02 UTC

[calcite] 01/01: [CALCITE-3454] Support Exchange in RelMdMaxRowCount, RelMdMinRowCount, RelMdRowCount (xy2953396112)

This is an automated email from the ASF dual-hosted git repository.

hyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit d51f76c19b4dca8e55d04409ed4af103ac7eca25
Author: dz <95...@qq.com>
AuthorDate: Mon Oct 28 20:21:17 2019 +0800

    [CALCITE-3454] Support Exchange in RelMdMaxRowCount,RelMdMinRowCount,RelMdRowCount (xy2953396112)
    
    Close #1542
---
 .../calcite/rel/metadata/RelMdMaxRowCount.java     |  5 +++++
 .../calcite/rel/metadata/RelMdMinRowCount.java     |  5 +++++
 .../apache/calcite/rel/metadata/RelMdRowCount.java |  5 +++++
 .../org/apache/calcite/test/RelMetadataTest.java   | 22 ++++++++++++++++++++++
 4 files changed, 37 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
index 7058a6c..a2b7645 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMaxRowCount.java
@@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptPredicateList;
 import org.apache.calcite.plan.volcano.RelSubset;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
+import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
@@ -92,6 +93,10 @@ public class RelMdMaxRowCount
     return mq.getMaxRowCount(rel.getInput());
   }
 
+  public Double getMaxRowCount(Exchange rel, RelMetadataQuery mq) {
+    return mq.getMaxRowCount(rel.getInput());
+  }
+
   public Double getMaxRowCount(Sort rel, RelMetadataQuery mq) {
     Double rowCount = mq.getMaxRowCount(rel.getInput());
     if (rowCount == null) {
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
index e34bedc..11067ad 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdMinRowCount.java
@@ -20,6 +20,7 @@ import org.apache.calcite.adapter.enumerable.EnumerableLimit;
 import org.apache.calcite.plan.volcano.RelSubset;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
+import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
@@ -77,6 +78,10 @@ public class RelMdMinRowCount
     return mq.getMinRowCount(rel.getInput());
   }
 
+  public Double getMinRowCount(Exchange rel, RelMetadataQuery mq) {
+    return mq.getMinRowCount(rel.getInput());
+  }
+
   public Double getMinRowCount(Sort rel, RelMetadataQuery mq) {
     Double rowCount = mq.getMinRowCount(rel.getInput());
     if (rowCount == null) {
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
index 53784f7..4c2d311 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdRowCount.java
@@ -22,6 +22,7 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.SingleRel;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.Calc;
+import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
@@ -212,6 +213,10 @@ public class RelMdRowCount
   public Double getRowCount(Values rel, RelMetadataQuery mq) {
     return rel.estimateRowCount(mq);
   }
+
+  public Double getRowCount(Exchange rel, RelMetadataQuery mq) {
+    return mq.getRowCount(rel.getInput());
+  }
 }
 
 // End RelMdRowCount.java
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index 96d2de0..8197543 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -498,6 +498,20 @@ public class RelMetadataTest extends SqlToRelTestBase {
     assertThat(min, is(expectedMin));
   }
 
+  private void checkExchangeRowCount(RelNode rel, double expected, double expectedMin,
+      double expectedMax) {
+    final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
+    final Double result = mq.getRowCount(rel);
+    assertThat(result, notNullValue());
+    assertEquals(expected, result, 0d);
+    final Double max = mq.getMaxRowCount(rel);
+    assertThat(max, notNullValue());
+    assertEquals(expectedMax, max, 0d);
+    final Double min = mq.getMinRowCount(rel);
+    assertThat(max, notNullValue());
+    assertEquals(expectedMin, min, 0d);
+  }
+
   @Test public void testRowCountEmp() {
     final String sql = "select * from emp";
     checkRowCount(sql, EMP_SIZE, 0D, Double.POSITIVE_INFINITY);
@@ -623,6 +637,14 @@ public class RelMetadataTest extends SqlToRelTestBase {
     checkRowCount(sql, EMP_SIZE, 0D, Double.POSITIVE_INFINITY);
   }
 
+  @Test public void testRowCountExchange() {
+    final String sql = "select * from emp order by ename limit 123456";
+    RelNode rel = convertSql(sql);
+    final RelDistribution dist = RelDistributions.hash(ImmutableList.<Integer>of());
+    final LogicalExchange exchange = LogicalExchange.create(rel, dist);
+    checkExchangeRowCount(exchange, EMP_SIZE, 0D, 123456D);
+  }
+
   @Test public void testRowCountSortHighLimit() {
     final String sql = "select * from emp order by ename limit 123456";
     checkRowCount(sql, EMP_SIZE, 0D, 123456D);