You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2015/08/02 05:35:16 UTC

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

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/1df842e8
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/1df842e8
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/1df842e8

Branch: refs/heads/branch-1
Commit: 1df842e8392d5000cbd5afcfb4d35c9a5de5c7c7
Parents: 850e42c
Author: Rui Li <ru...@intel.com>
Authored: Tue Jun 30 15:29:43 2015 +0800
Committer: xzhang <xz...@xzdt>
Committed: Sat Aug 1 20:26:09 2015 -0700

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


http://git-wip-us.apache.org/repos/asf/hive/blob/1df842e8/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) {