1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 package net.sf.flatpack.ordering;
34
35 import java.text.ParseException;
36 import java.text.SimpleDateFormat;
37 import java.util.ArrayList;
38 import java.util.Calendar;
39 import java.util.Comparator;
40 import java.util.Date;
41 import java.util.GregorianCalendar;
42 import java.util.List;
43 import java.util.Locale;
44
45 import net.sf.flatpack.Parser;
46 import net.sf.flatpack.structure.Row;
47 import net.sf.flatpack.util.FPConstants;
48 import net.sf.flatpack.util.ParserUtils;
49 import net.sf.flatpack.xml.MetaData;
50
51
52
53
54
55
56
57
58
59 public class OrderBy implements Comparator<Row> {
60
61 private final List<OrderColumn> orderbys = new ArrayList<>();
62
63 private MetaData metaData;
64
65 private Parser parser;
66
67
68
69
70
71
72
73 public void addOrderColumn(final OrderColumn oc) {
74 orderbys.add(oc);
75 }
76
77
78
79
80
81
82
83
84 @Override
85 public int compare(final Row row0, final Row row1) {
86 int result = 0;
87
88 for (int i = 0; i < orderbys.size(); i++) {
89 final OrderColumn oc = orderbys.get(i);
90
91
92 final String mdkey0 = row0.getMdkey() == null ? FPConstants.DETAIL_ID : row0.getMdkey();
93 final String mdkey1 = row1.getMdkey() == null ? FPConstants.DETAIL_ID : row1.getMdkey();
94
95
96 if (!mdkey0.equals(FPConstants.DETAIL_ID) && !mdkey1.equals(FPConstants.DETAIL_ID)) {
97
98
99 return 0;
100 } else if (!mdkey0.equals(FPConstants.DETAIL_ID) || !mdkey1.equals(FPConstants.DETAIL_ID)) {
101 return !mdkey0.equals(FPConstants.DETAIL_ID) ? 1 : 0;
102 }
103
104 result = compareCol(row0, row1, oc);
105
106
107
108 if (result != 0) {
109 break;
110 }
111 }
112
113 return result;
114 }
115
116 private int compareCol(final Row row0, final Row row1, final OrderColumn oc) {
117 int result;
118
119
120 Comparable comp0 = null;
121 Comparable comp1 = null;
122 final String str0 = row0
123 .getValue(ParserUtils.getColumnIndex(row0.getMdkey(), metaData, oc.getColumnName(), parser.isColumnNamesCaseSensitive()))
124 .toLowerCase(Locale.getDefault());
125 final String str1 = row1
126 .getValue(ParserUtils.getColumnIndex(row1.getMdkey(), metaData, oc.getColumnName(), parser.isColumnNamesCaseSensitive()))
127 .toLowerCase(Locale.getDefault());
128 switch (oc.getSelectedColType()) {
129 case OrderColumn.COLTYPE_NUMERIC:
130 comp0 = Double.valueOf(ParserUtils.stripNonDoubleChars(str0));
131 comp1 = Double.valueOf(ParserUtils.stripNonDoubleChars(str1));
132 break;
133 case OrderColumn.COLTYPE_DATE:
134 final SimpleDateFormat sdf = new SimpleDateFormat(oc.getDateFormatPattern());
135 try {
136 comp0 = sdf.parse(str0);
137 } catch (final ParseException e) {
138 comp0 = getBadDateDefault();
139
140 }
141
142 try {
143 comp1 = sdf.parse(str1);
144 } catch (final ParseException e) {
145 comp1 = getBadDateDefault();
146 }
147 break;
148 case OrderColumn.COLTYPE_STRING:
149 default:
150 comp0 = str0;
151 comp1 = str1;
152 break;
153 }
154
155
156 result = comp0.compareTo(comp1) * oc.getSortIndicator();
157 return result;
158 }
159
160 private Date getBadDateDefault() {
161 final Calendar defaultBadDt = new GregorianCalendar();
162 defaultBadDt.set(Calendar.MONTH, 1);
163 defaultBadDt.set(Calendar.YEAR, 1900);
164 defaultBadDt.set(Calendar.DAY_OF_MONTH, 1);
165 return defaultBadDt.getTime();
166 }
167
168
169
170
171 public void setMetaData(final MetaData metaData) {
172 this.metaData = metaData;
173 }
174
175
176
177
178 public void setParser(final Parser parser) {
179 this.parser = parser;
180 }
181
182 }