2323import java .util .Map ;
2424
2525import com .aliyun .odps .Column ;
26- import com .aliyun .odps .mapred .conf .JobConf ;
2726import com .aliyun .odps .mapred .conf .JobConf .SortOrder ;
2827
2928/**
3231public class ColumnBasedRecordComparator extends NaturalRecordComparator {
3332
3433 int [] selIdxs ;
35- SortOrder [] sortOrder ;
34+ SortOrder [] sortOrders ;
3635
3736 /**
3837 * ColumnBasedRecordComparator的构造方法,指定排序列的下标索引。例如指定排序列的下标索引为0,3,则比较时先用第0列比较,
@@ -46,7 +45,7 @@ public class ColumnBasedRecordComparator extends NaturalRecordComparator {
4645 public ColumnBasedRecordComparator (int [] selIdxs , Column [] schema ) {
4746 super (schema );
4847 this .selIdxs = selIdxs ;
49- this .sortOrder = null ;
48+ this .sortOrders = null ;
5049 }
5150
5251 /**
@@ -60,11 +59,17 @@ public ColumnBasedRecordComparator(String[] selCols, Column[] schema) {
6059 this (selCols , schema , null );
6160 }
6261
63- public ColumnBasedRecordComparator (String [] selCols , Column [] schema , SortOrder [] sortOrder ) {
62+ public ColumnBasedRecordComparator (String [] selCols , Column [] schema , SortOrder [] sortOrders ) {
6463 super (schema );
65- this .sortOrder = sortOrder ;
64+
65+ if (sortOrders != null && selCols .length != sortOrders .length ) {
66+ throw new IllegalArgumentException (
67+ "Number of sort column is not equal to length of sort order array." );
68+ }
69+
70+ this .sortOrders = sortOrders ;
6671 this .selIdxs = new int [selCols .length ];
67- Map <String , Integer > reverseLookupMap = new HashMap <String , Integer >();
72+ Map <String , Integer > reverseLookupMap = new HashMap <>();
6873 int i = 0 ;
6974 for (Column c : schema ) {
7075 reverseLookupMap .put (c .getName (), i );
@@ -80,21 +85,29 @@ public ColumnBasedRecordComparator(String[] selCols, Column[] schema, SortOrder[
8085 @ Override
8186 public int compare (Object [] l , Object [] r ) {
8287 int result = 0 ;
88+ int index = 0 ;
8389 for (int i : selIdxs ) {
8490 if (r .length < i ) {
91+ if (sortOrders != null && sortOrders [index ] == SortOrder .DESC ) {
92+ return 1 ;
93+ }
8594 return -1 ;
8695 }
8796 if (l .length < i ) {
97+ if (sortOrders != null && sortOrders [index ] == SortOrder .DESC ) {
98+ return -1 ;
99+ }
88100 return 1 ;
89101 }
90- if (sortOrder != null && sortOrder [i ] == JobConf .SortOrder .DESC ) {
91- result = compare (r [i ], l [i ], comparators [i ]);
92- } else {
93- result = compare (l [i ], r [i ], comparators [i ]);
94- }
102+ result = compare (l [i ], r [i ], comparators [i ]);
95103 if (result != 0 ) {
104+ if (sortOrders != null && sortOrders .length == selIdxs .length
105+ && sortOrders [index ] == SortOrder .DESC ) {
106+ return (0 - result );
107+ }
96108 return result ;
97109 }
110+ index ++;
98111 }
99112 return 0 ;
100113 }
0 commit comments