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

Reply via email to