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 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 @@ public class OperatorComparatorFactory { private static final Map, OperatorComparator> comparatorMapping = Maps.newHashMap(); + private static final Log LOG = LogFactory.getLog(OperatorComparatorFactory.class); static { comparatorMapping.put(TableScanOperator.class, new TableScanOperatorComparator()); @@ -103,13 +106,15 @@ 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 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 boolean equals(Operator op1, Operator op2) { } static class AlwaysFalseOperatorComparator implements OperatorComparator> { + // 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) {