3030import java .util .Comparator ;
3131import java .util .List ;
3232import java .util .PriorityQueue ;
33+ import java .util .function .Function ;
3334
3435/**
3536 * @author markus geipel
3637 *
3738 */
3839public abstract class AbstractTripleSort extends DefaultObjectPipe <Triple , ObjectReceiver <Triple >> implements MemoryWarningSystem .Listener {
40+
3941 /**
4042 * specifies the comparator
4143 */
@@ -63,17 +65,16 @@ public int order(final int indicator) {
6365 public abstract int order (int indicator );
6466 }
6567
66- private final List <Triple > buffer = new ArrayList <Triple >();
68+ private final List <Triple > buffer = new ArrayList <>();
6769 private final List <File > tempFiles ;
6870 private Compare compare = Compare .SUBJECT ;
6971 private Order order = Order .INCREASING ;
72+ private boolean numeric ;
7073 private volatile boolean memoryLow ;
7174
7275 public AbstractTripleSort () {
7376 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.
7778 }
7879
7980 @ Override
@@ -93,6 +94,10 @@ protected final void setSortOrder(final Order newOrder) {
9394 order = newOrder ;
9495 }
9596
97+ protected final void setSortNumeric (final boolean newNumeric ) {
98+ numeric = newNumeric ;
99+ }
100+
96101 @ Override
97102 public final void process (final Triple namedValue ) {
98103 if (memoryLow ) {
@@ -112,47 +117,38 @@ public final void process(final Triple namedValue) {
112117 }
113118
114119 private void nextBatch () throws IOException {
115- Collections .sort (buffer , createComparator (compare , order ));
120+ Collections .sort (buffer , createComparator ());
116121 final File tempFile = File .createTempFile ("sort" , "namedValues" , null );
117122 tempFile .deleteOnExit ();
118- final ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream (tempFile ));
119123
120- try {
124+ try ( ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream ( tempFile ))) {
121125 for (final Triple triple : buffer ) {
122126 triple .write (out );
123127 }
124128 }
125- finally {
126- out .close ();
127- }
129+
128130 buffer .clear ();
129131 tempFiles .add (tempFile );
130132 }
131133
132134 @ Override
133135 public final void onCloseStream () {
134-
135136 if (tempFiles .isEmpty ()) {
136- Collections .sort (buffer , createComparator (compare , order ));
137+ Collections .sort (buffer , createComparator ());
138+
137139 for (final Triple triple : buffer ) {
138140 sortedTriple (triple );
139141 }
142+
140143 onFinished ();
141144 }
142145 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+
154149 try {
155150 nextBatch ();
151+
156152 for (final File file : tempFiles ) {
157153 queue .add (new SortedTripleFileFacade (file ));
158154 }
@@ -168,6 +164,7 @@ public int compare(final SortedTripleFileFacade o1, final SortedTripleFileFacade
168164 queue .add (sortedFileFacade );
169165 }
170166 }
167+
171168 onFinished ();
172169 }
173170 catch (final IOException e ) {
@@ -179,6 +176,7 @@ public int compare(final SortedTripleFileFacade o1, final SortedTripleFileFacade
179176 }
180177 }
181178 }
179+
182180 MemoryWarningSystem .removeListener (this );
183181 }
184182
@@ -189,58 +187,47 @@ protected void onFinished() {
189187 protected abstract void sortedTriple (Triple namedValue );
190188
191189 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 );
193195 }
194196
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 ) {
198200 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 ));
206202 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 ;
213204 break ;
214205 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 ;
221207 break ;
222208 case PREDICATE :
223209 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 ;
230211 break ;
231212 }
232213
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 )));
234218 }
235219
236220 @ Override
237221 public final void onResetStream () {
238222 buffer .clear ();
223+
239224 for (final File file : tempFiles ) {
240225 if (file .exists ()) {
241226 file .delete ();
242227 }
243228 }
229+
244230 tempFiles .clear ();
245231 }
232+
246233}
0 commit comments