diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java index d16500ef05..9670aae405 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/TopNKeyOperator.java @@ -30,9 +30,11 @@ import java.io.Serializable; import java.util.Comparator; +import java.util.List; import java.util.PriorityQueue; import static org.apache.hadoop.hive.ql.plan.api.OperatorType.TOPNKEY; +import static org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.NullValueOption; /** * TopNKeyOperator passes rows that contains top N keys only. @@ -60,25 +62,22 @@ public TopNKeyOperator(CompilationOpContext ctx) { public static class KeyWrapperComparator implements Comparator { - private final ObjectInspector[] keyObjectInspectors; - private final boolean[] columnSortOrderIsDesc; - private final ObjectInspectorUtils.NullValueOption[] nullSortOrder; + private final List> comparatorList; KeyWrapperComparator(ObjectInspector[] keyObjectInspectors, String columnSortOrder, String nullSortOrder) { - this.keyObjectInspectors = keyObjectInspectors; - this.columnSortOrderIsDesc = new boolean[columnSortOrder.length()]; - this.nullSortOrder = new ObjectInspectorUtils.NullValueOption[nullSortOrder.length()]; + boolean[] columnSortOrderIsDesc = new boolean[columnSortOrder.length()]; + NullValueOption[] nullSortOrderArray = new NullValueOption[nullSortOrder.length()]; for (int i = 0; i < columnSortOrder.length(); ++i) { - this.columnSortOrderIsDesc[i] = columnSortOrder.charAt(i) == '-'; - this.nullSortOrder[i] = NullOrdering.fromSign(nullSortOrder.charAt(i)).getNullValueOption(); + columnSortOrderIsDesc[i] = columnSortOrder.charAt(i) == '-'; + nullSortOrderArray[i] = NullOrdering.fromSign(nullSortOrder.charAt(i)).getNullValueOption(); } + comparatorList = ObjectInspectorUtils.getComparator( + keyObjectInspectors, keyObjectInspectors, columnSortOrderIsDesc, nullSortOrderArray); } @Override public int compare(KeyWrapper key1, KeyWrapper key2) { - return ObjectInspectorUtils.compare( - key1.getKeyArray(), keyObjectInspectors, key2.getKeyArray(), keyObjectInspectors, - columnSortOrderIsDesc, nullSortOrder); + return ObjectInspectorUtils.compare(comparatorList, key1.getKeyArray(), key2.getKeyArray()); } } diff --git serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java index ab1cfdcdb5..1f3bbaf87d 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java +++ serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java @@ -948,14 +948,12 @@ public static int compare(Object[] o1, ObjectInspector[] oi1, Object[] o2, return 0; } - public static int compare( - Object[] objectArray1, ObjectInspector[] oi1, Object[] objectArray2, ObjectInspector[] oi2, + public static List> getComparator( + ObjectInspector[] oi1, ObjectInspector[] oi2, boolean[] columnSortOrderIsDesc, NullValueOption[] nullSortOrder) { - assert (objectArray1.length == objectArray2.length); - assert (objectArray1.length == oi1.length); - assert (objectArray2.length == oi2.length); - assert (columnSortOrderIsDesc.length == objectArray1.length); - assert (nullSortOrder.length == objectArray1.length); + assert (oi1.length == oi2.length); + assert (columnSortOrderIsDesc.length == oi1.length); + assert (nullSortOrder.length == oi1.length); List> comparators = new ArrayList<>(oi1.length); for (int i = 0; i < oi1.length; i++) { @@ -975,7 +973,7 @@ public static int compare( } } - return compare(comparators, objectArray1, objectArray2); + return comparators; } public static int compare(List> comparatorList, T[] o1, T[] o2) {