HIVE-10667 : Upgrade Calcite dependency to newest version (Jesus Camacho 
Rodriguez via Ashutosh Chauhan)

Signed-off-by: Ashutosh Chauhan <hashut...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/7556361c
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/7556361c
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/7556361c

Branch: refs/heads/spark
Commit: 7556361c2a43b47547a9ccdf9f9bec42964a75ae
Parents: d5fdf14
Author: Jesus Camacho Rodriguez <jcama...@apache.org>
Authored: Tue Jun 2 03:59:00 2015 -0700
Committer: Ashutosh Chauhan <hashut...@apache.org>
Committed: Tue Jun 2 13:04:58 2015 -0700

----------------------------------------------------------------------
 pom.xml                                         |   2 +-
 .../ql/optimizer/calcite/HiveCalciteUtil.java   |   2 +-
 .../ql/optimizer/calcite/HiveRelOptUtil.java    | 414 -------------------
 .../calcite/reloperators/HiveProject.java       |   5 +-
 .../calcite/reloperators/HiveSemiJoin.java      |  79 ++++
 .../calcite/translator/HiveOpConverter.java     |   6 +-
 .../hadoop/hive/ql/parse/CalcitePlanner.java    |  10 +-
 7 files changed, 91 insertions(+), 427 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index b21d894..e60bb35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,7 +100,7 @@
     <antlr.version>3.4</antlr.version>
     <avro.version>1.7.7</avro.version>
     <bonecp.version>0.8.0.RELEASE</bonecp.version>
-    <calcite.version>1.2.0-incubating</calcite.version>
+    <calcite.version>1.3.0-incubating</calcite.version>
     <datanucleus-api-jdo.version>3.2.6</datanucleus-api-jdo.version>
     <datanucleus-core.version>3.2.10</datanucleus-core.version>
     <datanucleus-rdbms.version>3.2.9</datanucleus-rdbms.version>

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
index f4e7c45..199a358 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
@@ -504,7 +504,7 @@ public class HiveCalciteUtil {
       }
 
       // 1. Split leaf join predicate to expressions from left, right
-      HiveRelOptUtil.splitJoinCondition(systemFieldList, inputs, pe,
+      RelOptUtil.splitJoinCondition(systemFieldList, inputs, pe,
           joinKeyExprs, filterNulls, null);
 
       // 2. Collect child projection indexes used

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
deleted file mode 100644
index 2827c3b..0000000
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRelOptUtil.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.hadoop.hive.ql.optimizer.calcite;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelOptUtil;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.rex.RexBuilder;
-import org.apache.calcite.rex.RexCall;
-import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.sql.SqlKind;
-import org.apache.calcite.sql.SqlOperator;
-import org.apache.calcite.sql.fun.SqlStdOperatorTable;
-import org.apache.calcite.util.ImmutableBitSet;
-import org.apache.calcite.util.Util;
-
-import com.google.common.collect.ImmutableList;
-
-
-public class HiveRelOptUtil extends RelOptUtil {
-
-  /**
-   * Splits out the equi-join (and optionally, a single non-equi) components
-   * of a join condition, and returns what's left. Projection might be
-   * required by the caller to provide join keys that are not direct field
-   * references.
-   *
-   * @param sysFieldList  list of system fields
-   * @param leftRel       left join input
-   * @param rightRel      right join input
-   * @param condition     join condition
-   * @param leftJoinKeys  The join keys from the left input which are equi-join
-   *                      keys
-   * @param rightJoinKeys The join keys from the right input which are
-   *                      equi-join keys
-   * @param filterNulls   The join key positions for which null values will not
-   *                      match. null values only match for the "is not 
distinct
-   *                      from" condition.
-   * @param rangeOp       if null, only locate equi-joins; otherwise, locate a
-   *                      single non-equi join predicate and return its 
operator
-   *                      in this list; join keys associated with the non-equi
-   *                      join predicate are at the end of the key lists
-   *                      returned
-   * @return What's left, never null
-   */
-  public static RexNode splitJoinCondition(
-      List<RelDataTypeField> sysFieldList,
-      RelNode leftRel,
-      RelNode rightRel,
-      RexNode condition,
-      List<RexNode> leftJoinKeys,
-      List<RexNode> rightJoinKeys,
-      List<Integer> filterNulls,
-      List<SqlOperator> rangeOp) {
-    return splitJoinCondition(
-        sysFieldList,
-        ImmutableList.of(leftRel, rightRel),
-        condition,
-        ImmutableList.of(leftJoinKeys, rightJoinKeys),
-        filterNulls,
-        rangeOp);
-  }
-
-  /**
-   * Splits out the equi-join (and optionally, a single non-equi) components
-   * of a join condition, and returns what's left. Projection might be
-   * required by the caller to provide join keys that are not direct field
-   * references.
-   *
-   * @param sysFieldList  list of system fields
-   * @param inputs        join inputs
-   * @param condition     join condition
-   * @param joinKeys      The join keys from the inputs which are equi-join
-   *                      keys
-   * @param filterNulls   The join key positions for which null values will not
-   *                      match. null values only match for the "is not 
distinct
-   *                      from" condition.
-   * @param rangeOp       if null, only locate equi-joins; otherwise, locate a
-   *                      single non-equi join predicate and return its 
operator
-   *                      in this list; join keys associated with the non-equi
-   *                      join predicate are at the end of the key lists
-   *                      returned
-   * @return What's left, never null
-   */
-  public static RexNode splitJoinCondition(
-      List<RelDataTypeField> sysFieldList,
-      List<RelNode> inputs,
-      RexNode condition,
-      List<List<RexNode>> joinKeys,
-      List<Integer> filterNulls,
-      List<SqlOperator> rangeOp) {
-    final List<RexNode> nonEquiList = new ArrayList<>();
-
-    splitJoinCondition(
-        sysFieldList,
-        inputs,
-        condition,
-        joinKeys,
-        filterNulls,
-        rangeOp,
-        nonEquiList);
-
-    // Convert the remainders into a list that are AND'ed together.
-    return RexUtil.composeConjunction(
-        inputs.get(0).getCluster().getRexBuilder(), nonEquiList, false);
-  }
-
-  private static void splitJoinCondition(
-      List<RelDataTypeField> sysFieldList,
-      List<RelNode> inputs,
-      RexNode condition,
-      List<List<RexNode>> joinKeys,
-      List<Integer> filterNulls,
-      List<SqlOperator> rangeOp,
-      List<RexNode> nonEquiList) {
-    final int sysFieldCount = sysFieldList.size();
-    final RelOptCluster cluster = inputs.get(0).getCluster();
-    final RexBuilder rexBuilder = cluster.getRexBuilder();
-    final RelDataTypeFactory typeFactory = cluster.getTypeFactory();
-
-    int[] firstFieldInputs = new int[inputs.size()];
-    int totalFieldCount = 0;
-    for (int i = 0; i < inputs.size(); i++) {
-      firstFieldInputs[i] = totalFieldCount + sysFieldCount;
-      totalFieldCount += sysFieldCount
-              + inputs.get(i).getRowType().getFieldCount();
-    }
-
-    // adjustment array
-    int[] adjustments = new int[totalFieldCount];
-    for (int i = 0; i < inputs.size(); i++) {
-      int limit = i == inputs.size() - 1
-              ? totalFieldCount : firstFieldInputs[i + 1];
-      for (int j = firstFieldInputs[i]; j < limit; j++) {
-        adjustments[j] = -firstFieldInputs[i];
-      }
-    }
-
-    if (condition instanceof RexCall) {
-      RexCall call = (RexCall) condition;
-      if (call.getOperator() == SqlStdOperatorTable.AND) {
-        for (RexNode operand : call.getOperands()) {
-          splitJoinCondition(
-              sysFieldList,
-              inputs,
-              operand,
-              joinKeys,
-              filterNulls,
-              rangeOp,
-              nonEquiList);
-        }
-        return;
-      }
-
-      RexNode leftKey = null;
-      RexNode rightKey = null;
-      int leftInput = 0;
-      int rightInput = 0;
-      List<RelDataTypeField> leftFields = null;
-      List<RelDataTypeField> rightFields = null;
-      boolean reverse = false;
-
-      SqlKind kind = call.getKind();
-
-      // Only consider range operators if we haven't already seen one
-      if ((kind == SqlKind.EQUALS)
-          || (filterNulls != null
-          && kind == SqlKind.IS_NOT_DISTINCT_FROM)
-          || (rangeOp != null
-          && rangeOp.isEmpty()
-          && (kind == SqlKind.GREATER_THAN
-          || kind == SqlKind.GREATER_THAN_OR_EQUAL
-          || kind == SqlKind.LESS_THAN
-          || kind == SqlKind.LESS_THAN_OR_EQUAL))) {
-        final List<RexNode> operands = call.getOperands();
-        RexNode op0 = operands.get(0);
-        RexNode op1 = operands.get(1);
-
-        final ImmutableBitSet projRefs0 = InputFinder.bits(op0);
-        final ImmutableBitSet projRefs1 = InputFinder.bits(op1);
-
-        boolean foundBothInputs = false;
-        for (int i = 0; i < inputs.size() && !foundBothInputs; i++) {
-          final int lowerLimit = firstFieldInputs[i];
-          final int upperLimit = i == inputs.size() - 1
-                  ? totalFieldCount : firstFieldInputs[i + 1];
-          if (projRefs0.nextSetBit(lowerLimit) != -1
-                  && projRefs0.nextSetBit(upperLimit) == -1
-                  && projRefs0.nextSetBit(0) == 
projRefs0.nextSetBit(lowerLimit)
-                  && projRefs0.nextSetBit(lowerLimit) < upperLimit) {
-            if (leftKey == null) {
-              leftKey = op0;
-              leftInput = i;
-              leftFields = inputs.get(leftInput).getRowType().getFieldList();
-            } else {
-              rightKey = op0;
-              rightInput = i;
-              rightFields = inputs.get(rightInput).getRowType().getFieldList();
-              reverse = true;
-              foundBothInputs = true;
-            }
-          } else if (projRefs1.nextSetBit(lowerLimit) != -1
-                  && projRefs1.nextSetBit(upperLimit) == -1
-                  && projRefs1.nextSetBit(0) == 
projRefs1.nextSetBit(lowerLimit)
-                  && projRefs1.nextSetBit(lowerLimit) < upperLimit) {
-            if (leftKey == null) {
-              leftKey = op1;
-              leftInput = i;
-              leftFields = inputs.get(leftInput).getRowType().getFieldList();
-            } else {
-              rightKey = op1;
-              rightInput = i;
-              rightFields = inputs.get(rightInput).getRowType().getFieldList();
-              foundBothInputs = true;
-            }
-          }
-        }
-
-        if ((leftKey != null) && (rightKey != null)) {
-          // replace right Key input ref
-          rightKey =
-              rightKey.accept(
-                  new RelOptUtil.RexInputConverter(
-                      rexBuilder,
-                      rightFields,
-                      rightFields,
-                      adjustments));
-
-          // left key only needs to be adjusted if there are system
-          // fields, but do it for uniformity
-          leftKey =
-              leftKey.accept(
-                  new RelOptUtil.RexInputConverter(
-                      rexBuilder,
-                      leftFields,
-                      leftFields,
-                      adjustments));
-
-          RelDataType leftKeyType = leftKey.getType();
-          RelDataType rightKeyType = rightKey.getType();
-
-          if (leftKeyType != rightKeyType) {
-            // perform casting
-            RelDataType targetKeyType =
-                typeFactory.leastRestrictive(
-                    ImmutableList.of(leftKeyType, rightKeyType));
-
-            if (targetKeyType == null) {
-              throw Util.newInternal(
-                  "Cannot find common type for join keys "
-                  + leftKey + " (type " + leftKeyType + ") and "
-                  + rightKey + " (type " + rightKeyType + ")");
-            }
-
-            if (leftKeyType != targetKeyType) {
-              leftKey =
-                  rexBuilder.makeCast(targetKeyType, leftKey);
-            }
-
-            if (rightKeyType != targetKeyType) {
-              rightKey =
-                  rexBuilder.makeCast(targetKeyType, rightKey);
-            }
-          }
-        }
-      }
-
-      if ((rangeOp == null)
-          && ((leftKey == null) || (rightKey == null))) {
-        // no equality join keys found yet:
-        // try transforming the condition to
-        // equality "join" conditions, e.g.
-        //     f(LHS) > 0 ===> ( f(LHS) > 0 ) = TRUE,
-        // and make the RHS produce TRUE, but only if we're strictly
-        // looking for equi-joins
-        final ImmutableBitSet projRefs = InputFinder.bits(condition);
-        leftKey = null;
-        rightKey = null;
-
-        boolean foundInput = false;
-        for (int i = 0; i < inputs.size() && !foundInput; i++) {
-          final int lowerLimit = firstFieldInputs[i];
-          final int upperLimit = i == inputs.size() - 1
-                  ? totalFieldCount : firstFieldInputs[i + 1];
-          if (projRefs.nextSetBit(lowerLimit) < upperLimit) {
-            leftInput = i;
-            leftFields = inputs.get(leftInput).getRowType().getFieldList();
-
-            leftKey = condition.accept(
-                new RelOptUtil.RexInputConverter(
-                    rexBuilder,
-                    leftFields,
-                    leftFields,
-                    adjustments));
-
-            rightKey = rexBuilder.makeLiteral(true);
-
-            // effectively performing an equality comparison
-            kind = SqlKind.EQUALS;
-
-            foundInput = true;
-          }
-        }
-      }
-
-      if ((leftKey != null) && (rightKey != null)) {
-        // found suitable join keys
-        // add them to key list, ensuring that if there is a
-        // non-equi join predicate, it appears at the end of the
-        // key list; also mark the null filtering property
-        addJoinKey(
-            joinKeys.get(leftInput),
-            leftKey,
-            (rangeOp != null) && !rangeOp.isEmpty());
-        addJoinKey(
-            joinKeys.get(rightInput),
-            rightKey,
-            (rangeOp != null) && !rangeOp.isEmpty());
-        if (filterNulls != null
-            && kind == SqlKind.EQUALS) {
-          // nulls are considered not matching for equality comparison
-          // add the position of the most recently inserted key
-          filterNulls.add(joinKeys.get(leftInput).size() - 1);
-        }
-        if (rangeOp != null
-            && kind != SqlKind.EQUALS
-            && kind != SqlKind.IS_DISTINCT_FROM) {
-          if (reverse) {
-            kind = reverse(kind);
-          }
-          rangeOp.add(op(kind, call.getOperator()));
-        }
-        return;
-      } // else fall through and add this condition as nonEqui condition
-    }
-
-    // The operator is not of RexCall type
-    // So we fail. Fall through.
-    // Add this condition to the list of non-equi-join conditions.
-    nonEquiList.add(condition);
-  }
-
-  private static SqlKind reverse(SqlKind kind) {
-    switch (kind) {
-    case GREATER_THAN:
-      return SqlKind.LESS_THAN;
-    case GREATER_THAN_OR_EQUAL:
-      return SqlKind.LESS_THAN_OR_EQUAL;
-    case LESS_THAN:
-      return SqlKind.GREATER_THAN;
-    case LESS_THAN_OR_EQUAL:
-      return SqlKind.GREATER_THAN_OR_EQUAL;
-    default:
-      return kind;
-    }
-  }
-
-  private static SqlOperator op(SqlKind kind, SqlOperator operator) {
-    switch (kind) {
-    case EQUALS:
-      return SqlStdOperatorTable.EQUALS;
-    case NOT_EQUALS:
-      return SqlStdOperatorTable.NOT_EQUALS;
-    case GREATER_THAN:
-      return SqlStdOperatorTable.GREATER_THAN;
-    case GREATER_THAN_OR_EQUAL:
-      return SqlStdOperatorTable.GREATER_THAN_OR_EQUAL;
-    case LESS_THAN:
-      return SqlStdOperatorTable.LESS_THAN;
-    case LESS_THAN_OR_EQUAL:
-      return SqlStdOperatorTable.LESS_THAN_OR_EQUAL;
-    case IS_DISTINCT_FROM:
-      return SqlStdOperatorTable.IS_DISTINCT_FROM;
-    case IS_NOT_DISTINCT_FROM:
-      return SqlStdOperatorTable.IS_NOT_DISTINCT_FROM;
-    default:
-      return operator;
-    }
-  }
-
-  private static void addJoinKey(
-      List<RexNode> joinKeyList,
-      RexNode key,
-      boolean preserveLastElementInList) {
-    if (!joinKeyList.isEmpty() && preserveLastElementInList) {
-      joinKeyList.add(joinKeyList.size() - 1, key);
-    } else {
-      joinKeyList.add(key);
-    }
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
index cf0c462..4b7887a 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveProject.java
@@ -39,10 +39,10 @@ import org.apache.calcite.util.Util;
 import org.apache.calcite.util.mapping.Mapping;
 import org.apache.calcite.util.mapping.MappingType;
 import org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException;
+import 
org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException.UnsupportedFeature;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.TraitsUtil;
-import 
org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException.UnsupportedFeature;
-import org.apache.hadoop.hive.ql.optimizer.calcite.cost.HiveCost;
+
 import com.google.common.collect.ImmutableList;
 
 public class HiveProject extends Project implements HiveRelNode {
@@ -68,6 +68,7 @@ public class HiveProject extends Project implements 
HiveRelNode {
   public HiveProject(RelOptCluster cluster, RelTraitSet traitSet, RelNode 
child,
       List<? extends RexNode> exps, RelDataType rowType, int flags) {
     super(cluster, traitSet, child, exps, rowType, flags);
+    assert traitSet.containsIfApplicable(HiveRelNode.CONVENTION);
     virtualCols = ImmutableList.copyOf(HiveCalciteUtil.getVirtualCols(exps));
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveSemiJoin.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveSemiJoin.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveSemiJoin.java
new file mode 100644
index 0000000..dd1691c
--- /dev/null
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/reloperators/HiveSemiJoin.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.optimizer.calcite.reloperators;
+
+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.RelNode;
+import org.apache.calcite.rel.core.JoinInfo;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories.SemiJoinFactory;
+import org.apache.calcite.rel.core.SemiJoin;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.util.ImmutableIntList;
+
+public class HiveSemiJoin extends SemiJoin implements HiveRelNode {
+
+  public static final SemiJoinFactory HIVE_SEMIJOIN_FACTORY = new 
HiveSemiJoinFactoryImpl();
+
+  public HiveSemiJoin(RelOptCluster cluster,
+          RelTraitSet traitSet,
+          RelNode left,
+          RelNode right,
+          RexNode condition,
+          ImmutableIntList leftKeys,
+          ImmutableIntList rightKeys) {
+    super(cluster, traitSet, left, right, condition, leftKeys, rightKeys);
+  }
+
+  @Override
+  public SemiJoin copy(RelTraitSet traitSet, RexNode condition,
+          RelNode left, RelNode right, JoinRelType joinType, boolean 
semiJoinDone) {
+    final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
+    return new HiveSemiJoin(getCluster(), traitSet, left, right, condition,
+            joinInfo.leftKeys, joinInfo.rightKeys);
+  }
+
+  @Override
+  public void implement(Implementor implementor) {
+  }
+
+  @Override
+  public RelOptCost computeSelfCost(RelOptPlanner planner) {
+    return RelMetadataQuery.getNonCumulativeCost(this);
+  }
+
+  /**
+   * Implementation of {@link SemiJoinFactory} that returns
+   * {@link 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSemiJoin}
+   * .
+   */
+  private static class HiveSemiJoinFactoryImpl implements SemiJoinFactory {
+    @Override
+    public RelNode createSemiJoin(RelNode left, RelNode right,
+            RexNode condition) {
+      final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
+      final RelOptCluster cluster = left.getCluster();
+      return new HiveSemiJoin(cluster, left.getTraitSet(), left, right, 
condition,
+          joinInfo.leftKeys, joinInfo.rightKeys);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java
index 4f19caf..9c21238 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java
@@ -32,7 +32,6 @@ import org.apache.calcite.rel.RelDistribution;
 import org.apache.calcite.rel.RelDistribution.Type;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.rules.MultiJoin;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
@@ -63,6 +62,7 @@ import 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveAggregate;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveFilter;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
+import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSemiJoin;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSort;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSortExchange;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan;
@@ -156,8 +156,8 @@ public class HiveOpConverter {
       return visit((MultiJoin) rn);
     } else if (rn instanceof HiveJoin) {
       return visit((HiveJoin) rn);
-    } else if (rn instanceof SemiJoin) {
-      SemiJoin sj = (SemiJoin) rn;
+    } else if (rn instanceof HiveSemiJoin) {
+      HiveSemiJoin sj = (HiveSemiJoin) rn;
       HiveJoin hj = HiveJoin.getJoin(sj.getCluster(), sj.getLeft(), 
sj.getRight(),
           sj.getCondition(), sj.getJoinType(), true);
       return visit(hj);

http://git-wip-us.apache.org/repos/asf/hive/blob/7556361c/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java 
b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
index d545bf0..02fc796 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
@@ -59,8 +59,6 @@ import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Project;
-import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
 import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider;
@@ -121,7 +119,6 @@ import 
org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException.Unsu
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveConfigContext;
 import 
org.apache.hadoop.hive.ql.optimizer.calcite.HiveDefaultRelMetadataProvider;
-import org.apache.hadoop.hive.ql.optimizer.calcite.HiveRelOptUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.HiveTypeSystemImpl;
 import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable;
 import org.apache.hadoop.hive.ql.optimizer.calcite.TraitsUtil;
@@ -133,6 +130,7 @@ import 
org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveGroupingID;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveJoin;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveRelNode;
+import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSemiJoin;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSort;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveUnion;
@@ -956,7 +954,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
       // 5. Projection Pruning
       HiveRelFieldTrimmer fieldTrimmer = new HiveRelFieldTrimmer(null, 
HiveProject.DEFAULT_PROJECT_FACTORY,
           HiveFilter.DEFAULT_FILTER_FACTORY, HiveJoin.HIVE_JOIN_FACTORY,
-          RelFactories.DEFAULT_SEMI_JOIN_FACTORY, 
HiveSort.HIVE_SORT_REL_FACTORY,
+          HiveSemiJoin.HIVE_SEMIJOIN_FACTORY, HiveSort.HIVE_SORT_REL_FACTORY,
           HiveAggregate.HIVE_AGGR_REL_FACTORY, HiveUnion.UNION_REL_FACTORY);
       basePlan = fieldTrimmer.trim(basePlan);
 
@@ -1196,7 +1194,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
         List<RexNode> leftJoinKeys = new ArrayList<RexNode>();
         List<RexNode> rightJoinKeys = new ArrayList<RexNode>();
 
-        RexNode nonEquiConds = HiveRelOptUtil.splitJoinCondition(sysFieldList, 
leftRel, rightRel,
+        RexNode nonEquiConds = RelOptUtil.splitJoinCondition(sysFieldList, 
leftRel, rightRel,
             calciteJoinCond, leftJoinKeys, rightJoinKeys, null, null);
 
         if (!nonEquiConds.isAlwaysTrue()) {
@@ -1211,7 +1209,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
             HiveProject.DEFAULT_PROJECT_FACTORY, inputRels, leftJoinKeys, 
rightJoinKeys, 0,
             leftKeys, rightKeys);
 
-        joinRel = new SemiJoin(cluster, 
cluster.traitSetOf(HiveRelNode.CONVENTION), inputRels[0],
+        joinRel = new HiveSemiJoin(cluster, 
cluster.traitSetOf(HiveRelNode.CONVENTION), inputRels[0],
             inputRels[1], calciteJoinCond, ImmutableIntList.copyOf(leftKeys),
             ImmutableIntList.copyOf(rightKeys));
       } else {

Reply via email to