You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jp...@apache.org on 2014/12/12 20:20:05 UTC

svn commit: r1645043 - in /hive/trunk/ql/src/java/org/apache/hadoop/hive/ql: optimizer/calcite/ optimizer/calcite/rules/ optimizer/calcite/translator/ parse/

Author: jpullokk
Date: Fri Dec 12 19:20:05 2014
New Revision: 1645043

URL: http://svn.apache.org/r1645043
Log:
HIVE-9035 CBO: Disable PPD when functions are non-deterministic

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterSetOpTransposeRule.java
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterJoinRule.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/SqlFunctionConverter.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java?rev=1645043&r1=1645042&r2=1645043&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveCalciteUtil.java Fri Dec 12 19:20:05 2014
@@ -34,11 +34,14 @@ import org.apache.calcite.rel.type.RelDa
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexVisitor;
+import org.apache.calcite.rex.RexVisitorImpl;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.Util;
 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.parse.ASTNode;
@@ -78,7 +81,7 @@ public class HiveCalciteUtil {
   public static boolean validateASTForUnsupportedTokens(ASTNode ast) {
     String astTree = ast.toStringTree();
     // if any of following tokens are present in AST, bail out
-    String[] tokens = { "TOK_CHARSETLITERAL","TOK_TABLESPLITSAMPLE" };
+    String[] tokens = { "TOK_CHARSETLITERAL", "TOK_TABLESPLITSAMPLE" };
     for (String token : tokens) {
       if (astTree.contains(token)) {
         return false;
@@ -505,8 +508,8 @@ public class HiveCalciteUtil {
 
   /**
    * Get top level select starting from root. Assumption here is root can only
-   * be Sort & Project. Also the top project should be at most 2 levels
-   * below Sort; i.e Sort(Limit)-Sort(OB)-Select
+   * be Sort & Project. Also the top project should be at most 2 levels below
+   * Sort; i.e Sort(Limit)-Sort(OB)-Select
    *
    * @param rootRel
    * @return
@@ -527,4 +530,25 @@ public class HiveCalciteUtil {
 
     return (new Pair<RelNode, RelNode>(parentOforiginalProjRel, originalProjRel));
   }
+
+  public static boolean isDeterministic(RexNode expr) {
+    boolean deterministic = true;
+
+    RexVisitor<Void> visitor = new RexVisitorImpl<Void>(true) {
+      public Void visitCall(org.apache.calcite.rex.RexCall call) {
+        if (!call.getOperator().isDeterministic()) {
+          throw new Util.FoundOne(call);
+        }
+        return super.visitCall(call);
+      }
+    };
+
+    try {
+      expr.accept(visitor);
+    } catch (Util.FoundOne e) {
+        deterministic = false;
+    }
+
+    return deterministic;
+  }
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterJoinRule.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterJoinRule.java?rev=1645043&r1=1645042&r2=1645043&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterJoinRule.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterJoinRule.java Fri Dec 12 19:20:05 2014
@@ -24,6 +24,7 @@ import java.util.ListIterator;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
+import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.plan.RelOptUtil.InputFinder;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
@@ -34,6 +35,7 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveFilter;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveProject;
 
@@ -57,13 +59,21 @@ public abstract class HiveFilterJoinRule
    */
   public static class HiveFilterJoinMergeRule extends HiveFilterJoinRule {
     public HiveFilterJoinMergeRule() {
-      super(RelOptRule.operand(Filter.class,
-          RelOptRule.operand(Join.class, RelOptRule.any())),
+      super(RelOptRule.operand(Filter.class, RelOptRule.operand(Join.class, RelOptRule.any())),
           "HiveFilterJoinRule:filter", true, HiveFilter.DEFAULT_FILTER_FACTORY,
           HiveProject.DEFAULT_PROJECT_FACTORY);
     }
 
     @Override
+    public boolean matches(RelOptRuleCall call) {
+      Filter filter = call.rel(0);
+      if (!HiveCalciteUtil.isDeterministic(filter.getCondition())) {
+        return false;
+      }
+      return true;
+    }
+
+    @Override
     public void onMatch(RelOptRuleCall call) {
       Filter filter = call.rel(0);
       Join join = call.rel(1);
@@ -73,9 +83,22 @@ public abstract class HiveFilterJoinRule
 
   public static class HiveFilterJoinTransposeRule extends HiveFilterJoinRule {
     public HiveFilterJoinTransposeRule() {
-      super(RelOptRule.operand(Join.class, RelOptRule.any()),
-          "HiveFilterJoinRule:no-filter", true, HiveFilter.DEFAULT_FILTER_FACTORY,
-          HiveProject.DEFAULT_PROJECT_FACTORY);
+      super(RelOptRule.operand(Join.class, RelOptRule.any()), "HiveFilterJoinRule:no-filter", true,
+          HiveFilter.DEFAULT_FILTER_FACTORY, HiveProject.DEFAULT_PROJECT_FACTORY);
+    }
+
+    @Override
+    public boolean matches(RelOptRuleCall call) {
+      Join join = call.rel(0);
+      List<RexNode> joinConds = RelOptUtil.conjunctions(join.getCondition());
+
+      for (RexNode joinCnd : joinConds) {
+        if (!HiveCalciteUtil.isDeterministic(joinCnd)) {
+          return false;
+        }
+      }
+
+      return true;
     }
 
     @Override
@@ -140,12 +163,11 @@ public abstract class HiveFilterJoinRule
     boolean refersToBothSides = false;
 
     int joinNoOfProjects = j.getRowType().getFieldCount();
-    ImmutableBitSet filterProjs = ImmutableBitSet.FROM_BIT_SET.apply(
-            new BitSet(joinNoOfProjects));
-    ImmutableBitSet allLeftProjs = filterProjs.union(
-            ImmutableBitSet.range(0, j.getInput(0).getRowType().getFieldCount()));
-    ImmutableBitSet allRightProjs = filterProjs.union(
-            ImmutableBitSet.range(j.getInput(0).getRowType().getFieldCount(), joinNoOfProjects));
+    ImmutableBitSet filterProjs = ImmutableBitSet.FROM_BIT_SET.apply(new BitSet(joinNoOfProjects));
+    ImmutableBitSet allLeftProjs = filterProjs.union(ImmutableBitSet.range(0, j.getInput(0)
+        .getRowType().getFieldCount()));
+    ImmutableBitSet allRightProjs = filterProjs.union(ImmutableBitSet.range(j.getInput(0)
+        .getRowType().getFieldCount(), joinNoOfProjects));
 
     filterProjs = filterProjs.union(InputFinder.bits(filter));
 

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java?rev=1645043&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterProjectTransposeRule.java Fri Dec 12 19:20:05 2014
@@ -0,0 +1,47 @@
+/**
+ * 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.rules;
+
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories.FilterFactory;
+import org.apache.calcite.rel.core.RelFactories.ProjectFactory;
+import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
+import org.apache.calcite.rex.RexNode;
+import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
+
+public class HiveFilterProjectTransposeRule extends FilterProjectTransposeRule {
+
+  public HiveFilterProjectTransposeRule(Class<? extends Filter> filterClass,
+      FilterFactory filterFactory, Class<? extends Project> projectClass,
+      ProjectFactory projectFactory) {
+    super(filterClass, filterFactory, projectClass, projectFactory);
+  }
+
+  @Override
+  public boolean matches(RelOptRuleCall call) {
+    final Filter filterRel = call.rel(0);
+    RexNode condition = filterRel.getCondition();
+    if (!HiveCalciteUtil.isDeterministic(condition)) {
+      return false;
+    }
+
+    return super.matches(call);
+  }
+}

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterSetOpTransposeRule.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterSetOpTransposeRule.java?rev=1645043&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterSetOpTransposeRule.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveFilterSetOpTransposeRule.java Fri Dec 12 19:20:05 2014
@@ -0,0 +1,43 @@
+/**
+ * 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.rules;
+
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.RelFactories.FilterFactory;
+import org.apache.calcite.rel.rules.FilterSetOpTransposeRule;
+import org.apache.calcite.rex.RexNode;
+import org.apache.hadoop.hive.ql.optimizer.calcite.HiveCalciteUtil;
+
+public class HiveFilterSetOpTransposeRule extends FilterSetOpTransposeRule {
+
+  public HiveFilterSetOpTransposeRule(FilterFactory filterFactory) {
+    super(filterFactory);
+  }
+
+  @Override
+  public boolean matches(RelOptRuleCall call) {
+    Filter filterRel = call.rel(0);
+    RexNode condition = filterRel.getCondition();
+    if (!HiveCalciteUtil.isDeterministic(condition)) {
+      return false;
+    }
+
+    return super.matches(call);
+  }
+}

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/SqlFunctionConverter.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/SqlFunctionConverter.java?rev=1645043&r1=1645042&r2=1645043&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/SqlFunctionConverter.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/SqlFunctionConverter.java Fri Dec 12 19:20:05 2014
@@ -78,7 +78,8 @@ public class SqlFunctionConverter {
   }
 
   public static SqlOperator getCalciteOperator(String funcTextName, GenericUDF hiveUDF,
-      ImmutableList<RelDataType> calciteArgTypes, RelDataType retType) throws CalciteSemanticException {
+      ImmutableList<RelDataType> calciteArgTypes, RelDataType retType)
+      throws CalciteSemanticException {
     // handle overloaded methods first
     if (hiveUDF instanceof GenericUDFOPNegative) {
       return SqlStdOperatorTable.UNARY_MINUS;
@@ -87,15 +88,16 @@ public class SqlFunctionConverter {
     } // do generic lookup
     String name = null;
     if (StringUtils.isEmpty(funcTextName)) {
-      name = getName(hiveUDF); // this should probably never happen, see getName
-                               // comment
+      name = getName(hiveUDF); // this should probably never happen, see
+      // getName
+      // comment
       LOG.warn("The function text was empty, name from annotation is " + name);
     } else {
-      // We could just do toLowerCase here and let SA qualify it, but let's be
-      // proper...
+      // We could just do toLowerCase here and let SA qualify it, but
+      // let's be proper...
       name = FunctionRegistry.getNormalizedFunctionName(funcTextName);
     }
-    return getCalciteFn(name, calciteArgTypes, retType);
+    return getCalciteFn(name, calciteArgTypes, retType, FunctionRegistry.isDeterministic(hiveUDF));
   }
 
   public static GenericUDF getHiveUDF(SqlOperator op, RelDataType dt, int argsLength) {
@@ -129,7 +131,8 @@ public class SqlFunctionConverter {
     return hFn == null ? null : hFn.getGenericUDF();
   }
 
-  private static FunctionInfo handleExplicitCast(SqlOperator op, RelDataType dt) throws SemanticException {
+  private static FunctionInfo handleExplicitCast(SqlOperator op, RelDataType dt)
+      throws SemanticException {
     FunctionInfo castUDF = null;
 
     if (op.kind == SqlKind.CAST) {
@@ -158,7 +161,7 @@ public class SqlFunctionConverter {
         castUDF = FunctionRegistry.getFunctionInfo("double");
       } else if (castType.equals(TypeInfoFactory.timestampTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("timestamp");
-      }  else if (castType.equals(TypeInfoFactory.dateTypeInfo)) {
+      } else if (castType.equals(TypeInfoFactory.dateTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("date");
       } else if (castType instanceof DecimalTypeInfo) {
         castUDF = handleCastForParameterizedType(castType,
@@ -182,8 +185,8 @@ public class SqlFunctionConverter {
     return new FunctionInfo(fi.isNative(), fi.getDisplayName(), (GenericUDF) udf);
   }
 
-  // TODO: 1) handle Agg Func Name translation 2) is it correct to add func args
-  // as child of func?
+  // TODO: 1) handle Agg Func Name translation 2) is it correct to add func
+  // args as child of func?
   public static ASTNode buildAST(SqlOperator op, List<ASTNode> children) {
     HiveToken hToken = calciteToHiveToken.get(op);
     ASTNode node;
@@ -232,11 +235,9 @@ public class SqlFunctionConverter {
   }
 
   // TODO: this is not valid. Function names for built-in UDFs are specified in
-  // FunctionRegistry,
-  // and only happen to match annotations. For user UDFs, the name is what user
-  // specifies at
-  // creation time (annotation can be absent, different, or duplicate some other
-  // function).
+  // FunctionRegistry, and only happen to match annotations. For user UDFs, the
+  // name is what user specifies at creation time (annotation can be absent,
+  // different, or duplicate some other function).
   private static String getName(GenericUDF hiveUDF) {
     String udfName = null;
     if (hiveUDF instanceof GenericUDFBridge) {
@@ -268,10 +269,12 @@ public class SqlFunctionConverter {
     return udfName;
   }
 
-  /** This class is used to build immutable hashmaps in the static block above. */
+  /**
+   * This class is used to build immutable hashmaps in the static block above.
+   */
   private static class StaticBlockBuilder {
-    final Map<String, SqlOperator>    hiveToCalcite        = Maps.newHashMap();
-    final Map<SqlOperator, HiveToken> calciteToHiveToken   = Maps.newHashMap();
+    final Map<String, SqlOperator>    hiveToCalcite      = Maps.newHashMap();
+    final Map<SqlOperator, HiveToken> calciteToHiveToken = Maps.newHashMap();
     final Map<SqlOperator, String>    reverseOperatorMap = Maps.newHashMap();
 
     StaticBlockBuilder() {
@@ -317,6 +320,7 @@ public class SqlFunctionConverter {
     return new HiveToken(type, text);
   }
 
+  // UDAF is assumed to be deterministic
   public static class CalciteUDAF extends SqlAggFunction {
     public CalciteUDAF(String opName, SqlReturnTypeInference returnTypeInference,
         SqlOperandTypeInference operandTypeInference, SqlOperandTypeChecker operandTypeChecker,
@@ -326,6 +330,22 @@ public class SqlFunctionConverter {
     }
   }
 
+  private static class CalciteSqlFn extends SqlFunction {
+    private final boolean deterministic;
+
+    public CalciteSqlFn(String name, SqlKind kind, SqlReturnTypeInference returnTypeInference,
+        SqlOperandTypeInference operandTypeInference, SqlOperandTypeChecker operandTypeChecker,
+        SqlFunctionCategory category, boolean deterministic) {
+      super(name, kind, returnTypeInference, operandTypeInference, operandTypeChecker, category);
+      this.deterministic = deterministic;
+    }
+
+    @Override
+    public boolean isDeterministic() {
+      return deterministic;
+    }
+  }
+
   private static class CalciteUDFInfo {
     private String                     udfName;
     private SqlReturnTypeInference     returnTypeInference;
@@ -354,22 +374,21 @@ public class SqlFunctionConverter {
   }
 
   public static SqlOperator getCalciteFn(String hiveUdfName,
-      ImmutableList<RelDataType> calciteArgTypes, RelDataType calciteRetType)
+      ImmutableList<RelDataType> calciteArgTypes, RelDataType calciteRetType, boolean deterministic)
       throws CalciteSemanticException {
 
     if (hiveUdfName != null && hiveUdfName.trim().equals("<=>")) {
       // We can create Calcite IS_DISTINCT_FROM operator for this. But since our
       // join reordering algo cant handle this anyway there is no advantage of
-      // this.
-      // So, bail out for now.
+      // this.So, bail out for now.
       throw new CalciteSemanticException("<=> is not yet supported for cbo.");
     }
     SqlOperator calciteOp = hiveToCalcite.get(hiveUdfName);
     if (calciteOp == null) {
       CalciteUDFInfo uInf = getUDFInfo(hiveUdfName, calciteArgTypes, calciteRetType);
-      calciteOp = new SqlFunction(uInf.udfName, SqlKind.OTHER_FUNCTION, uInf.returnTypeInference,
+      calciteOp = new CalciteSqlFn(uInf.udfName, SqlKind.OTHER_FUNCTION, uInf.returnTypeInference,
           uInf.operandTypeInference, uInf.operandTypeChecker,
-          SqlFunctionCategory.USER_DEFINED_FUNCTION);
+          SqlFunctionCategory.USER_DEFINED_FUNCTION, deterministic);
     }
 
     return calciteOp;
@@ -381,8 +400,8 @@ public class SqlFunctionConverter {
     if (calciteAggFn == null) {
       CalciteUDFInfo uInf = getUDFInfo(hiveUdfName, calciteArgTypes, calciteRetType);
 
-      calciteAggFn = new CalciteUDAF(uInf.udfName, uInf.returnTypeInference, uInf.operandTypeInference,
-          uInf.operandTypeChecker, uInf.argTypes, uInf.retType);
+      calciteAggFn = new CalciteUDAF(uInf.udfName, uInf.returnTypeInference,
+          uInf.operandTypeInference, uInf.operandTypeChecker, uInf.argTypes, uInf.retType);
     }
 
     return calciteAggFn;

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1645043&r1=1645042&r2=1645043&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Fri Dec 12 19:20:05 2014
@@ -194,6 +194,8 @@ import org.apache.hadoop.hive.ql.optimiz
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan;
 import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveUnion;
 import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterJoinRule;
+import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterProjectTransposeRule;
+import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HiveFilterSetOpTransposeRule;
 import org.apache.hadoop.hive.ql.optimizer.calcite.rules.HivePartitionPruneRule;
 import org.apache.hadoop.hive.ql.optimizer.calcite.translator.ASTConverter;
 import org.apache.hadoop.hive.ql.optimizer.calcite.translator.JoinCondTypeCheckProcFactory;
@@ -12673,9 +12675,9 @@ public class SemanticAnalyzer extends Ba
               SemiJoinProjectTransposeRule.INSTANCE);
 
       basePlan = hepPlan(basePlan, true, mdProvider,
-          new FilterProjectTransposeRule(
+          new HiveFilterProjectTransposeRule(
           Filter.class, HiveFilter.DEFAULT_FILTER_FACTORY, HiveProject.class,
-          HiveProject.DEFAULT_PROJECT_FACTORY), new FilterSetOpTransposeRule(
+          HiveProject.DEFAULT_PROJECT_FACTORY), new HiveFilterSetOpTransposeRule(
           HiveFilter.DEFAULT_FILTER_FACTORY), new FilterMergeRule(
           HiveFilter.DEFAULT_FILTER_FACTORY), HiveFilterJoinRule.JOIN,
           HiveFilterJoinRule.FILTER_ON_JOIN,