Skip to content

Commit b993032

Browse files
committed
Update to 0.37.9-public
1 parent a3337ec commit b993032

40 files changed

+2540
-255
lines changed

odps-sdk-impl/odps-mapred-bridge/src/main/java/com/aliyun/odps/mapred/bridge/type/ColumnBasedRecordComparator.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.Map;
2424

2525
import com.aliyun.odps.Column;
26-
import com.aliyun.odps.mapred.conf.JobConf;
2726
import com.aliyun.odps.mapred.conf.JobConf.SortOrder;
2827

2928
/**
@@ -32,7 +31,7 @@
3231
public 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

Comments
 (0)