Repository: hive
Updated Branches:
  refs/heads/spark e0a5f3fd1 -> 9604e08cd


HIVE-11138: Query fails when there isn't a comparator for an operator [Spark 
Branch] (Rui reviewed by Chengxiang & Xuefu)


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

Branch: refs/heads/spark
Commit: 9604e08cd71d5fe81bb2b9dcc18f1b8349d916db
Parents: e0a5f3f
Author: Rui Li <rui...@intel.com>
Authored: Tue Jun 30 15:29:43 2015 +0800
Committer: Rui Li <rui...@intel.com>
Committed: Tue Jun 30 15:30:14 2015 +0800

----------------------------------------------------------------------
 .../ql/optimizer/OperatorComparatorFactory.java  | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/9604e08c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java
index c6a43d9..d93bd72 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/OperatorComparatorFactory.java
@@ -23,6 +23,8 @@ import java.util.Map;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hive.ql.exec.CollectOperator;
 import org.apache.hadoop.hive.ql.exec.CommonMergeJoinOperator;
 import org.apache.hadoop.hive.ql.exec.DemuxOperator;
@@ -72,6 +74,7 @@ import org.apache.hadoop.hive.ql.plan.UDTFDesc;
 
 public class OperatorComparatorFactory {
   private static final Map<Class<?>, OperatorComparator> comparatorMapping = 
Maps.newHashMap();
+  private static final Log LOG = 
LogFactory.getLog(OperatorComparatorFactory.class);
 
   static {
     comparatorMapping.put(TableScanOperator.class, new 
TableScanOperatorComparator());
@@ -103,13 +106,15 @@ public class OperatorComparatorFactory {
     comparatorMapping.put(ListSinkOperator.class, new 
AlwaysTrueOperatorComparator());
     comparatorMapping.put(CollectOperator.class, new 
AlwaysTrueOperatorComparator());
     // do not support PTFOperator comparing now.
-    comparatorMapping.put(PTFOperator.class, new 
AlwaysFalseOperatorComparator());
+    comparatorMapping.put(PTFOperator.class, 
AlwaysFalseOperatorComparator.getInstance());
   }
 
   public static OperatorComparator getOperatorComparator(Class<? extends 
Operator> operatorClass) {
     OperatorComparator operatorComparator = 
comparatorMapping.get(operatorClass);
     if (operatorComparator == null) {
-      throw new RuntimeException("No OperatorComparator is registered for " + 
operatorClass.getName() + "yet.");
+      LOG.warn("No OperatorComparator is registered for " + 
operatorClass.getName() +
+          ". Default to always false comparator.");
+      return AlwaysFalseOperatorComparator.getInstance();
     }
 
     return operatorComparator;
@@ -130,6 +135,16 @@ public class OperatorComparatorFactory {
   }
 
   static class AlwaysFalseOperatorComparator implements 
OperatorComparator<Operator<?>> {
+    // the outer class is responsible for maintaining the comparator singleton
+    private AlwaysFalseOperatorComparator() {
+    }
+
+    private static final AlwaysFalseOperatorComparator instance =
+        new AlwaysFalseOperatorComparator();
+
+    public static AlwaysFalseOperatorComparator getInstance() {
+      return instance;
+    }
 
     @Override
     public boolean equals(Operator<?> op1, Operator<?> op2) {

Reply via email to