This is an automated email from the ASF dual-hosted git repository.
chunwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new 74536b7 [CALCITE-3838] Support Calc in
RelMdSize,RelMdSelectivity,RelMdMaxRowCount,RelMdMinRowCount,RelMdTableReferences
74536b7 is described below
commit 74536b7045c67004057ca1a01e6bcce33b59f9c3
Author: Chunwei Lei <[email protected]>
AuthorDate: Mon Mar 2 19:27:58 2020 +0800
[CALCITE-3838] Support Calc in
RelMdSize,RelMdSelectivity,RelMdMaxRowCount,RelMdMinRowCount,RelMdTableReferences
---
.../apache/calcite/rel/metadata/RelMdMaxRowCount.java | 5 +++++
.../apache/calcite/rel/metadata/RelMdMinRowCount.java | 10 ++++++++++
.../apache/calcite/rel/metadata/RelMdSelectivity.java | 17 +++++++++++++++++
.../java/org/apache/calcite/rel/metadata/RelMdSize.java | 11 +++++++++++
.../calcite/rel/metadata/RelMdTableReferences.java | 8 ++++++++
5 files changed, 51 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 ab66bf2..e6255a3 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.Calc;
import org.apache.calcite.rel.core.Exchange;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Intersect;
@@ -90,6 +91,10 @@ public class RelMdMaxRowCount
return mq.getMaxRowCount(rel.getInput());
}
+ public Double getMaxRowCount(Calc rel, RelMetadataQuery mq) {
+ return mq.getMaxRowCount(rel.getInput());
+ }
+
public Double getMaxRowCount(Project rel, RelMetadataQuery mq) {
return mq.getMaxRowCount(rel.getInput());
}
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 1a9b25a..6b00071 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.Calc;
import org.apache.calcite.rel.core.Exchange;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Intersect;
@@ -75,6 +76,15 @@ public class RelMdMinRowCount
return 0d; // no lower bound
}
+ public Double getMinRowCount(Calc rel, RelMetadataQuery mq) {
+ if (rel.getProgram().getCondition() != null) {
+ // no lower bound
+ return 0d;
+ } else {
+ return mq.getMinRowCount(rel.getInput());
+ }
+ }
+
public Double getMinRowCount(Project rel, RelMetadataQuery mq) {
return mq.getMinRowCount(rel.getInput());
}
diff --git
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
index d98b2cd..ec181f9 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSelectivity.java
@@ -19,6 +19,7 @@ package org.apache.calcite.rel.metadata;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Aggregate;
+import org.apache.calcite.rel.core.Calc;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Join;
import org.apache.calcite.rel.core.Project;
@@ -26,7 +27,9 @@ import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.core.TableModify;
import org.apache.calcite.rel.core.Union;
import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexLocalRef;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexProgram;
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.util.BuiltInMethod;
@@ -119,6 +122,20 @@ public class RelMdSelectivity
}
}
+ public Double getSelectivity(Calc rel, RelMetadataQuery mq, RexNode
predicate) {
+ final RexProgram rexProgram = rel.getProgram();
+ final RexLocalRef programCondition = rexProgram.getCondition();
+ if (programCondition == null) {
+ return getSelectivity(rel.getInput(), mq, predicate);
+ } else {
+ return mq.getSelectivity(rel.getInput(),
+ RelMdUtil.minusPreds(
+ rel.getCluster().getRexBuilder(),
+ predicate,
+ rexProgram.expandLocalRef(programCondition)));
+ }
+ }
+
public Double getSelectivity(Join rel, RelMetadataQuery mq, RexNode
predicate) {
if (!rel.isSemiJoin()) {
return getSelectivity((RelNode) rel, mq, predicate);
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
index fe2e663..458df6b 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdSize.java
@@ -20,6 +20,7 @@ import org.apache.calcite.avatica.util.ByteString;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.AggregateCall;
+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;
@@ -138,6 +139,16 @@ public class RelMdSize implements
MetadataHandler<BuiltInMetadata.Size> {
return sizes.build();
}
+ public List<Double> averageColumnSizes(Calc rel, RelMetadataQuery mq) {
+ final List<Double> inputColumnSizes =
+ mq.getAverageColumnSizesNotNull(rel.getInput());
+ final ImmutableNullableList.Builder<Double> sizes =
+ ImmutableNullableList.builder();
+ rel.getProgram().split().left.forEach(
+ exp -> sizes.add(averageRexSize(exp, inputColumnSizes)));
+ return sizes.build();
+ }
+
public List<Double> averageColumnSizes(Values rel, RelMetadataQuery mq) {
final List<RelDataTypeField> fields = rel.getRowType().getFieldList();
final ImmutableList.Builder<Double> list = ImmutableList.builder();
diff --git
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
index 36bd889..e554728 100644
---
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
+++
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.hep.HepRelVertex;
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.Calc;
import org.apache.calcite.rel.core.Exchange;
import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.Join;
@@ -201,6 +202,13 @@ public class RelMdTableReferences
}
/**
+ * Table references from Calc.
+ */
+ public Set<RelTableRef> getTableReferences(Calc rel, RelMetadataQuery mq) {
+ return mq.getTableReferences(rel.getInput());
+ }
+
+ /**
* Table references from Sort.
*/
public Set<RelTableRef> getTableReferences(Sort rel, RelMetadataQuery mq) {