30
30
import java .util .Comparator ;
31
31
import java .util .List ;
32
32
import java .util .PriorityQueue ;
33
+ import java .util .function .Function ;
33
34
34
35
/**
35
36
* @author markus geipel
36
37
*
37
38
*/
38
39
public abstract class AbstractTripleSort extends DefaultObjectPipe <Triple , ObjectReceiver <Triple >> implements MemoryWarningSystem .Listener {
40
+
39
41
/**
40
42
* specifies the comparator
41
43
*/
@@ -63,17 +65,16 @@ public int order(final int indicator) {
63
65
public abstract int order (int indicator );
64
66
}
65
67
66
- private final List <Triple > buffer = new ArrayList <Triple >();
68
+ private final List <Triple > buffer = new ArrayList <>();
67
69
private final List <File > tempFiles ;
68
70
private Compare compare = Compare .SUBJECT ;
69
71
private Order order = Order .INCREASING ;
72
+ private boolean numeric ;
70
73
private volatile boolean memoryLow ;
71
74
72
75
public AbstractTripleSort () {
73
76
MemoryWarningSystem .addListener (this );
74
- tempFiles = new ArrayList <File >(); // Initialized here to let the
75
- // compiler enforce the call to
76
- // super() in subclasses.
77
+ tempFiles = new ArrayList <>(); // Initialized here to let the compiler enforce the call to super() in subclasses.
77
78
}
78
79
79
80
@ Override
@@ -93,6 +94,10 @@ protected final void setSortOrder(final Order newOrder) {
93
94
order = newOrder ;
94
95
}
95
96
97
+ protected final void setSortNumeric (final boolean newNumeric ) {
98
+ numeric = newNumeric ;
99
+ }
100
+
96
101
@ Override
97
102
public final void process (final Triple namedValue ) {
98
103
if (memoryLow ) {
@@ -112,47 +117,38 @@ public final void process(final Triple namedValue) {
112
117
}
113
118
114
119
private void nextBatch () throws IOException {
115
- Collections .sort (buffer , createComparator (compare , order ));
120
+ Collections .sort (buffer , createComparator ());
116
121
final File tempFile = File .createTempFile ("sort" , "namedValues" , null );
117
122
tempFile .deleteOnExit ();
118
- final ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream (tempFile ));
119
123
120
- try {
124
+ try ( ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream ( tempFile ))) {
121
125
for (final Triple triple : buffer ) {
122
126
triple .write (out );
123
127
}
124
128
}
125
- finally {
126
- out .close ();
127
- }
129
+
128
130
buffer .clear ();
129
131
tempFiles .add (tempFile );
130
132
}
131
133
132
134
@ Override
133
135
public final void onCloseStream () {
134
-
135
136
if (tempFiles .isEmpty ()) {
136
- Collections .sort (buffer , createComparator (compare , order ));
137
+ Collections .sort (buffer , createComparator ());
138
+
137
139
for (final Triple triple : buffer ) {
138
140
sortedTriple (triple );
139
141
}
142
+
140
143
onFinished ();
141
144
}
142
145
else {
143
- final Comparator <Triple > comparator = createComparator (compare , order );
144
- final PriorityQueue <SortedTripleFileFacade > queue = new PriorityQueue <SortedTripleFileFacade >(11 ,
145
- new Comparator <SortedTripleFileFacade >() {
146
- // private final Comparator<Triple> comparator =
147
- // getComparator();
148
-
149
- @ Override
150
- public int compare (final SortedTripleFileFacade o1 , final SortedTripleFileFacade o2 ) {
151
- return comparator .compare (o1 .peek (), o2 .peek ());
152
- }
153
- });
146
+ final Comparator <Triple > comparator = createComparator ();
147
+ final PriorityQueue <SortedTripleFileFacade > queue = new PriorityQueue <>(11 , (o1 , o2 ) -> comparator .compare (o1 .peek (), o2 .peek ()));
148
+
154
149
try {
155
150
nextBatch ();
151
+
156
152
for (final File file : tempFiles ) {
157
153
queue .add (new SortedTripleFileFacade (file ));
158
154
}
@@ -168,6 +164,7 @@ public int compare(final SortedTripleFileFacade o1, final SortedTripleFileFacade
168
164
queue .add (sortedFileFacade );
169
165
}
170
166
}
167
+
171
168
onFinished ();
172
169
}
173
170
catch (final IOException e ) {
@@ -179,6 +176,7 @@ public int compare(final SortedTripleFileFacade o1, final SortedTripleFileFacade
179
176
}
180
177
}
181
178
}
179
+
182
180
MemoryWarningSystem .removeListener (this );
183
181
}
184
182
@@ -189,58 +187,47 @@ protected void onFinished() {
189
187
protected abstract void sortedTriple (Triple namedValue );
190
188
191
189
public final Comparator <Triple > createComparator () {
192
- return createComparator (compare , order );
190
+ return createComparator (compare , order , numeric );
191
+ }
192
+
193
+ public static Comparator <Triple > createComparator (final Compare compare , final Order order ) {
194
+ return createComparator (compare , order , false );
193
195
}
194
196
195
- public static Comparator <Triple > createComparator (final Compare compareBy , final Order order ) {
196
- final Comparator <Triple > comparator ;
197
- switch (compareBy ) {
197
+ private static Comparator <Triple > createComparator (final Compare compare , final Order order , final boolean numeric ) {
198
+ final Function <Triple , String > tripleFunction ;
199
+ switch (compare ) {
198
200
case ALL :
199
- comparator = new Comparator <Triple >() {
200
- @ Override
201
- public int compare (final Triple o1 , final Triple o2 ) {
202
- return order .order (o1 .compareTo (o2 ));
203
- }
204
- };
205
- break ;
201
+ return (o1 , o2 ) -> order .order (o1 .compareTo (o2 ));
206
202
case OBJECT :
207
- comparator = new Comparator <Triple >() {
208
- @ Override
209
- public int compare (final Triple o1 , final Triple o2 ) {
210
- return order .order (o1 .getObject ().compareTo (o2 .getObject ()));
211
- }
212
- };
203
+ tripleFunction = Triple ::getObject ;
213
204
break ;
214
205
case SUBJECT :
215
- comparator = new Comparator <Triple >() {
216
- @ Override
217
- public int compare (final Triple o1 , final Triple o2 ) {
218
- return order .order (o1 .getSubject ().compareTo (o2 .getSubject ()));
219
- }
220
- };
206
+ tripleFunction = Triple ::getSubject ;
221
207
break ;
222
208
case PREDICATE :
223
209
default :
224
- comparator = new Comparator <Triple >() {
225
- @ Override
226
- public int compare (final Triple o1 , final Triple o2 ) {
227
- return order .order (o1 .getPredicate ().compareTo (o2 .getPredicate ()));
228
- }
229
- };
210
+ tripleFunction = Triple ::getPredicate ;
230
211
break ;
231
212
}
232
213
233
- return comparator ;
214
+ final Function <Triple , Integer > numericFunction = tripleFunction .andThen (Integer ::valueOf );
215
+ return numeric ?
216
+ (o1 , o2 ) -> order .order (numericFunction .apply (o1 ).compareTo (numericFunction .apply (o2 ))) :
217
+ (o1 , o2 ) -> order .order (tripleFunction .apply (o1 ).compareTo (tripleFunction .apply (o2 )));
234
218
}
235
219
236
220
@ Override
237
221
public final void onResetStream () {
238
222
buffer .clear ();
223
+
239
224
for (final File file : tempFiles ) {
240
225
if (file .exists ()) {
241
226
file .delete ();
242
227
}
243
228
}
229
+
244
230
tempFiles .clear ();
245
231
}
232
+
246
233
}
0 commit comments