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);