You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2019/05/31 05:25:05 UTC

[calcite] branch master updated: [CALCITE-3102] Remove deprecation warnings following CALCITE-2969

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

danny0405 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 682dd8f  [CALCITE-3102] Remove deprecation warnings following CALCITE-2969
682dd8f is described below

commit 682dd8f6c25e421355e83e113e98d4b27bee89bc
Author: yuzhao.cyz <yu...@alibaba-inc.com>
AuthorDate: Fri May 31 10:38:09 2019 +0800

    [CALCITE-3102] Remove deprecation warnings following CALCITE-2969
---
 .../enumerable/EnumerableMergeJoinRule.java        |  2 -
 .../adapter/enumerable/EnumerableSemiJoin.java     | 86 +++-------------------
 .../adapter/enumerable/EnumerableSemiJoinRule.java | 13 +++-
 .../org/apache/calcite/rel/core/Correlate.java     | 11 ---
 .../calcite/rel/logical/LogicalCorrelate.java      | 16 ----
 .../calcite/rel/metadata/RelMdCollation.java       |  7 --
 .../rel/metadata/RelMdColumnUniqueness.java        |  8 --
 .../rel/metadata/RelMdDistinctRowCount.java        |  7 --
 .../calcite/rel/metadata/RelMdNodeTypes.java       |  6 --
 .../calcite/rel/metadata/RelMdPopulationSize.java  |  6 --
 .../apache/calcite/rel/metadata/RelMdRowCount.java | 13 ----
 .../org/apache/calcite/rel/metadata/RelMdSize.java |  5 --
 .../calcite/rel/metadata/RelMdUniqueKeys.java      |  8 --
 .../org/apache/calcite/rel/metadata/RelMdUtil.java | 18 +----
 .../apache/calcite/rel/mutable/MutableRels.java    | 10 ---
 .../calcite/rel/rules/JoinToCorrelateRule.java     |  5 +-
 .../java/org/apache/calcite/tools/Programs.java    |  1 -
 site/_docs/history.md                              |  1 -
 18 files changed, 22 insertions(+), 201 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
index 3b37535..2b04efd 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
@@ -95,8 +95,6 @@ class EnumerableMergeJoinRule extends ConverterRule {
           left,
           right,
           info.getEquiCondition(left, right, cluster.getRexBuilder()),
-          info.leftKeys,
-          info.rightKeys,
           join.getVariablesSet(),
           join.getJoinType());
     } catch (InvalidRelException e) {
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
index f053dfe..691e79a 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
@@ -16,25 +16,18 @@
  */
 package org.apache.calcite.adapter.enumerable;
 
-import org.apache.calcite.linq4j.tree.BlockBuilder;
-import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.Expressions;
 import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelOptCost;
-import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.InvalidRelException;
 import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.JoinInfo;
 import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.metadata.RelMdCollation;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableIntList;
-import org.apache.calcite.util.Util;
+
+import com.google.common.collect.ImmutableSet;
 
 /** Implementation of {@link org.apache.calcite.rel.core.SemiJoin} in
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}.
@@ -43,7 +36,7 @@ import org.apache.calcite.util.Util;
  * see {@link EnumerableJoinRule} for details.
  */
 @Deprecated // to be removed before 2.0
-public class EnumerableSemiJoin extends SemiJoin implements EnumerableRel {
+public class EnumerableSemiJoin extends EnumerableHashJoin implements EnumerableRel {
   /** Creates an EnumerableSemiJoin.
    *
    * <p>Use {@link #create} unless you know what you're doing. */
@@ -56,11 +49,12 @@ public class EnumerableSemiJoin extends SemiJoin implements EnumerableRel {
       ImmutableIntList leftKeys,
       ImmutableIntList rightKeys)
       throws InvalidRelException {
-    super(cluster, traits, left, right, condition, leftKeys, rightKeys);
+    super(cluster, traits, left, right, condition,
+        ImmutableSet.of(), JoinRelType.SEMI);
   }
 
   /** Creates an EnumerableSemiJoin. */
-  public static EnumerableSemiJoin create(RelNode left, RelNode right, RexNode condition,
+  public static EnumerableHashJoin create(RelNode left, RelNode right, RexNode condition,
       ImmutableIntList leftKeys, ImmutableIntList rightKeys) {
     final RelOptCluster cluster = left.getCluster();
     final RelMetadataQuery mq = cluster.getMetadataQuery();
@@ -69,82 +63,20 @@ public class EnumerableSemiJoin extends SemiJoin implements EnumerableRel {
             .replaceIfs(RelCollationTraitDef.INSTANCE,
                 () -> RelMdCollation.enumerableSemiJoin(mq, left, right));
     try {
-      return new EnumerableSemiJoin(
+      return new EnumerableHashJoin(
           cluster,
           traitSet,
           left,
           right,
           condition,
-          leftKeys,
-          rightKeys);
-    } catch (InvalidRelException e) {
-      // Semantic error not possible. Must be a bug. Convert to
-      // internal error.
-      throw new AssertionError(e);
-    }
-  }
-
-  @Override public SemiJoin copy(RelTraitSet traitSet, RexNode condition,
-      RelNode left, RelNode right, JoinRelType joinType,
-      boolean semiJoinDone) {
-    assert joinType == JoinRelType.INNER;
-    final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
-    assert joinInfo.isEqui();
-    try {
-      return new EnumerableSemiJoin(getCluster(), traitSet, left, right,
-          condition, joinInfo.leftKeys, joinInfo.rightKeys);
+          ImmutableSet.of(),
+          JoinRelType.SEMI);
     } catch (InvalidRelException e) {
       // Semantic error not possible. Must be a bug. Convert to
       // internal error.
       throw new AssertionError(e);
     }
   }
-
-  @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
-      RelMetadataQuery mq) {
-    double rowCount = mq.getRowCount(this);
-
-    // Right-hand input is the "build", and hopefully small, input.
-    final double rightRowCount = right.estimateRowCount(mq);
-    final double leftRowCount = left.estimateRowCount(mq);
-    if (Double.isInfinite(leftRowCount)) {
-      rowCount = leftRowCount;
-    } else {
-      rowCount += Util.nLogN(leftRowCount);
-    }
-    if (Double.isInfinite(rightRowCount)) {
-      rowCount = rightRowCount;
-    } else {
-      rowCount += rightRowCount;
-    }
-    return planner.getCostFactory().makeCost(rowCount, 0, 0).multiplyBy(.01d);
-  }
-
-  public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
-    BlockBuilder builder = new BlockBuilder();
-    final Result leftResult =
-        implementor.visitChild(this, 0, (EnumerableRel) left, pref);
-    Expression leftExpression =
-        builder.append(
-            "left", leftResult.block);
-    final Result rightResult =
-        implementor.visitChild(this, 1, (EnumerableRel) right, pref);
-    Expression rightExpression =
-        builder.append(
-            "right", rightResult.block);
-    final PhysType physType = leftResult.physType;
-    return implementor.result(
-        physType,
-        builder.append(
-            Expressions.call(
-                BuiltInMethod.SEMI_JOIN.method,
-                Expressions.list(
-                    leftExpression,
-                    rightExpression,
-                    leftResult.physType.generateAccessor(leftKeys),
-                    rightResult.physType.generateAccessor(rightKeys))))
-            .toBlock());
-  }
 }
 
 // End EnumerableSemiJoin.java
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
index 40a0ee9..631ea1e 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
@@ -17,10 +17,14 @@
 package org.apache.calcite.adapter.enumerable;
 
 import org.apache.calcite.plan.Convention;
+import org.apache.calcite.rel.InvalidRelException;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.SemiJoin;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -48,8 +52,13 @@ class EnumerableSemiJoinRule extends ConverterRule {
       }
       newInputs.add(input);
     }
-    return EnumerableSemiJoin.create(newInputs.get(0), newInputs.get(1),
-        semiJoin.getCondition(), semiJoin.leftKeys, semiJoin.rightKeys);
+    try {
+      return EnumerableHashJoin.create(newInputs.get(0), newInputs.get(1),
+          semiJoin.getCondition(), ImmutableSet.of(), JoinRelType.SEMI);
+    } catch (InvalidRelException e) {
+      // Convert to internal error.
+      throw new AssertionError(e);
+    }
   }
 }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
index ccd9523..44a8534 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java
@@ -27,7 +27,6 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelWriter;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.sql.SemiJoinType;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Litmus;
@@ -99,16 +98,6 @@ public abstract class Correlate extends BiRel {
     this.requiredColumns = requiredColumns;
   }
 
-  @Deprecated // To be removed before 2.0
-  protected Correlate(RelOptCluster cluster, RelTraitSet traits, RelNode left,
-      RelNode right, CorrelationId correlationId, ImmutableBitSet
-      requiredColumns, SemiJoinType joinType) {
-    super(cluster, traits, left, right);
-    this.joinType = joinType.toJoinType();
-    this.correlationId = correlationId;
-    this.requiredColumns = requiredColumns;
-  }
-
   /**
    * Creates a Correlate by parsing serialized output.
    *
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java
index 6c1ebb5..137ca78 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCorrelate.java
@@ -26,7 +26,6 @@ import org.apache.calcite.rel.RelShuttle;
 import org.apache.calcite.rel.core.Correlate;
 import org.apache.calcite.rel.core.CorrelationId;
 import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.sql.SemiJoinType;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Litmus;
 
@@ -75,14 +74,6 @@ public final class LogicalCorrelate extends Correlate {
     assert !CalciteSystemProperty.DEBUG.value() || isValid(Litmus.THROW, null);
   }
 
-  @Deprecated // To be removed before 2.0
-  public LogicalCorrelate(RelOptCluster cluster, RelTraitSet traitSet, RelNode left,
-      RelNode right, CorrelationId correlationId, ImmutableBitSet requiredColumns,
-      SemiJoinType joinType) {
-    this(cluster, traitSet, left, right, correlationId, requiredColumns,
-        joinType.toJoinType());
-  }
-
   /**
    * Creates a LogicalCorrelate by parsing serialized output.
    */
@@ -104,13 +95,6 @@ public final class LogicalCorrelate extends Correlate {
         requiredColumns, joinType);
   }
 
-  @Deprecated // To be removed before 2.0
-  public static LogicalCorrelate create(RelNode left, RelNode right,
-      CorrelationId correlationId, ImmutableBitSet requiredColumns,
-      SemiJoinType joinType) {
-    return create(left, right, correlationId, requiredColumns, joinType.toJoinType());
-  }
-
   //~ Methods ----------------------------------------------------------------
 
   @Override public LogicalCorrelate copy(RelTraitSet traitSet,
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
index 1541099..e1edf51 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
@@ -20,7 +20,6 @@ import org.apache.calcite.adapter.enumerable.EnumerableCorrelate;
 import org.apache.calcite.adapter.enumerable.EnumerableHashJoin;
 import org.apache.calcite.adapter.enumerable.EnumerableMergeJoin;
 import org.apache.calcite.adapter.enumerable.EnumerableNestedLoopJoin;
-import org.apache.calcite.adapter.enumerable.EnumerableSemiJoin;
 import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.plan.hep.HepRelVertex;
@@ -156,12 +155,6 @@ public class RelMdCollation
             join.getJoinType()));
   }
 
-  public ImmutableList<RelCollation> collations(EnumerableSemiJoin join,
-      RelMetadataQuery mq) {
-    return ImmutableList.copyOf(
-        RelMdCollation.enumerableSemiJoin(mq, join.getLeft(), join.getRight()));
-  }
-
   public ImmutableList<RelCollation> collations(Sort sort,
       RelMetadataQuery mq) {
     return ImmutableList.copyOf(
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
index cc5e77e..dce0564 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnUniqueness.java
@@ -30,7 +30,6 @@ import org.apache.calcite.rel.core.JoinInfo;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.SetOp;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableScan;
@@ -313,13 +312,6 @@ public class RelMdColumnUniqueness
     throw new AssertionError();
   }
 
-  public Boolean areColumnsUnique(SemiJoin rel, RelMetadataQuery mq,
-      ImmutableBitSet columns, boolean ignoreNulls) {
-    // only return the unique keys from the LHS since a semijoin only
-    // returns the LHS
-    return mq.areColumnsUnique(rel.getLeft(), columns, ignoreNulls);
-  }
-
   public Boolean areColumnsUnique(Aggregate rel, RelMetadataQuery mq,
       ImmutableBitSet columns, boolean ignoreNulls) {
     // group by keys form a unique key
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
index e207135..0cca9a4 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistinctRowCount.java
@@ -24,7 +24,6 @@ import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rel.core.Values;
@@ -143,12 +142,6 @@ public class RelMdDistinctRowCount
         groupKey, predicate, false);
   }
 
-  @Deprecated // to be removed before 2.0
-  public Double getDistinctRowCount(SemiJoin rel, RelMetadataQuery mq,
-      ImmutableBitSet groupKey, RexNode predicate) {
-    return RelMdUtil.getSemiJoinDistinctRowCount(rel, mq, groupKey, predicate);
-  }
-
   public Double getDistinctRowCount(Aggregate rel, RelMetadataQuery mq,
       ImmutableBitSet groupKey, RexNode predicate) {
     if (predicate == null || predicate.isAlwaysTrue()) {
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
index 31e223d..22737b6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdNodeTypes.java
@@ -26,7 +26,6 @@ import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Union;
@@ -114,11 +113,6 @@ public class RelMdNodeTypes
     return getNodeTypes(rel, Join.class, mq);
   }
 
-  public Multimap<Class<? extends RelNode>, RelNode> getNodeTypes(SemiJoin rel,
-      RelMetadataQuery mq) {
-    return getNodeTypes(rel, SemiJoin.class, mq);
-  }
-
   public Multimap<Class<? extends RelNode>, RelNode> getNodeTypes(Aggregate rel,
       RelMetadataQuery mq) {
     return getNodeTypes(rel, Aggregate.class, mq);
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
index a0d17bb..8e21963 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPopulationSize.java
@@ -22,7 +22,6 @@ import org.apache.calcite.rel.core.Exchange;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rel.core.Values;
@@ -85,11 +84,6 @@ public class RelMdPopulationSize
     return RelMdUtil.getJoinPopulationSize(mq, rel, groupKey);
   }
 
-  public Double getPopulationSize(SemiJoin rel, RelMetadataQuery mq,
-      ImmutableBitSet groupKey) {
-    return mq.getPopulationSize(rel.getLeft(), groupKey);
-  }
-
   public Double getPopulationSize(Aggregate rel, RelMetadataQuery mq,
       ImmutableBitSet groupKey) {
     ImmutableBitSet.Builder childKey = ImmutableBitSet.builder();
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 b5f035b..27db782 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
@@ -27,14 +27,12 @@ import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rex.RexDynamicParam;
 import org.apache.calcite.rex.RexLiteral;
-import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Bug;
 import org.apache.calcite.util.BuiltInMethod;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -188,17 +186,6 @@ public class RelMdRowCount
     return RelMdUtil.getJoinRowCount(mq, rel, rel.getCondition());
   }
 
-  public Double getRowCount(SemiJoin rel, RelMetadataQuery mq) {
-    // create a RexNode representing the selectivity of the
-    // semijoin filter and pass it to getSelectivity
-    RexNode semiJoinSelectivity =
-        RelMdUtil.makeSemiJoinSelectivityRexNode(mq, rel);
-
-    return NumberUtil.multiply(
-        mq.getSelectivity(rel.getLeft(), semiJoinSelectivity),
-        mq.getRowCount(rel.getLeft()));
-  }
-
   public Double getRowCount(Aggregate rel, RelMetadataQuery mq) {
     ImmutableBitSet groupKey = rel.getGroupSet(); // .range(rel.getGroupCount());
 
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 1f386c0..c12c462 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
@@ -26,7 +26,6 @@ import org.apache.calcite.rel.core.Intersect;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Union;
@@ -177,10 +176,6 @@ public class RelMdSize implements MetadataHandler<BuiltInMetadata.Size> {
     return list.build();
   }
 
-  public List<Double> averageColumnSizes(SemiJoin rel, RelMetadataQuery mq) {
-    return averageJoinColumnSizes(rel, mq);
-  }
-
   public List<Double> averageColumnSizes(Join rel, RelMetadataQuery mq) {
     return averageJoinColumnSizes(rel, mq);
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
index 4bf414e..d33873e 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUniqueKeys.java
@@ -23,7 +23,6 @@ import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinInfo;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.SetOp;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rex.RexInputRef;
@@ -206,13 +205,6 @@ public class RelMdUniqueKeys
     return retSet;
   }
 
-  public Set<ImmutableBitSet> getUniqueKeys(SemiJoin rel, RelMetadataQuery mq,
-      boolean ignoreNulls) {
-    // only return the unique keys from the LHS since a semijoin only
-    // returns the LHS
-    return mq.getUniqueKeys(rel.getLeft(), ignoreNulls);
-  }
-
   public Set<ImmutableBitSet> getUniqueKeys(Aggregate rel, RelMetadataQuery mq,
       boolean ignoreNulls) {
     // group by keys form a unique key
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
index cb603b0..e9123c6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
@@ -25,7 +25,6 @@ import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
@@ -111,21 +110,6 @@ public class RelMdUtil {
    * table/columns and the number of distinct values in the fact table
    * columns.
    *
-   * @param rel semijoin rel
-   * @return calculated selectivity
-   */
-  public static double computeSemiJoinSelectivity(RelMetadataQuery mq,
-      SemiJoin rel) {
-    return computeSemiJoinSelectivity(mq, rel.getLeft(), rel.getRight(),
-        rel.getLeftKeys(), rel.getRightKeys());
-  }
-
-  /**
-   * Computes the selectivity of a semijoin filter if it is applied on a fact
-   * table. The computation is based on the selectivity of the dimension
-   * table/columns and the number of distinct values in the fact table
-   * columns.
-   *
    * @param factRel fact table participating in the semijoin
    * @param dimRel  dimension table participating in the semijoin
    * @param rel     semijoin rel
@@ -740,7 +724,7 @@ public class RelMdUtil {
   }
 
   /** Returns an estimate of the number of rows returned by a
-   * {@link SemiJoin}. */
+   * join with type {@link JoinRelType#SEMI}. */
   public static Double getSemiJoinRowCount(RelMetadataQuery mq, RelNode left,
       RelNode right, JoinRelType joinType, RexNode condition) {
     final Double leftCount = mq.getRowCount(left);
diff --git a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java
index 31510ca..2428279 100644
--- a/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java
+++ b/core/src/main/java/org/apache/calcite/rel/mutable/MutableRels.java
@@ -32,7 +32,6 @@ import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sample;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableFunctionScan;
 import org.apache.calcite.rel.core.TableModify;
@@ -361,15 +360,6 @@ public abstract class MutableRels {
           tableFunctionScan.getRowType(), inputs, tableFunctionScan.getCall(),
           tableFunctionScan.getElementType(), tableFunctionScan.getColumnMappings());
     }
-    // It is necessary that SemiJoin is placed in front of Join here, since SemiJoin
-    // is a sub-class of Join.
-    if (rel instanceof SemiJoin) {
-      final SemiJoin semiJoin = (SemiJoin) rel;
-      final MutableRel left = toMutable(semiJoin.getLeft());
-      final MutableRel right = toMutable(semiJoin.getRight());
-      return MutableSemiJoin.of(semiJoin.getRowType(), left, right,
-          semiJoin.getCondition(), semiJoin.getLeftKeys(), semiJoin.getRightKeys());
-    }
     if (rel instanceof Join) {
       final Join join = (Join) rel;
       final MutableRel left = toMutable(join.getLeft());
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
index c166d89..d1476dd 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
@@ -24,7 +24,6 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.CorrelationId;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.logical.LogicalCorrelate;
 import org.apache.calcite.rel.logical.LogicalJoin;
 import org.apache.calcite.rex.RexBuilder;
@@ -77,9 +76,7 @@ public class JoinToCorrelateRule extends RelOptRule {
    * into a {@link org.apache.calcite.rel.logical.LogicalCorrelate}
    */
   @Deprecated // To be removed before 2.0, should use INSTANCE instead.
-  public static final JoinToCorrelateRule SEMI =
-      new JoinToCorrelateRule(SemiJoin.class, RelFactories.LOGICAL_BUILDER,
-          "SemiJoinToCorrelateRule");
+  public static final JoinToCorrelateRule SEMI = INSTANCE;
 
   //~ Constructors -----------------------------------------------------------
 
diff --git a/core/src/main/java/org/apache/calcite/tools/Programs.java b/core/src/main/java/org/apache/calcite/tools/Programs.java
index c46fd36..819aee4 100644
--- a/core/src/main/java/org/apache/calcite/tools/Programs.java
+++ b/core/src/main/java/org/apache/calcite/tools/Programs.java
@@ -86,7 +86,6 @@ public class Programs {
       ImmutableSet.of(
           EnumerableRules.ENUMERABLE_JOIN_RULE,
           EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE,
-          EnumerableRules.ENUMERABLE_SEMI_JOIN_RULE,
           EnumerableRules.ENUMERABLE_CORRELATE_RULE,
           EnumerableRules.ENUMERABLE_PROJECT_RULE,
           EnumerableRules.ENUMERABLE_FILTER_RULE,
diff --git a/site/_docs/history.md b/site/_docs/history.md
index a5d575e..8b82946 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -41,7 +41,6 @@ other software versions as specified in `pom.xml`.
 
 #### Breaking Changes
 
-* Make `EnumerableMergeJoin` extend `Join` instead of `EquiJoin`
 * `Correlate` use `JoinRelType` instead of `SemiJoinType`
 * Rename `EnumerableThetaJoin` to `EnumerableNestedLoopJoin`
 * Rename `EnumerableJoin` to `EnumerableHashJoin`