Skip to content

Commit 95480d9

Browse files
committed
Merge #409 from '380-addOptionToSortTriplesNumerically' of https://github.com/metafacture/metafacture-core
2 parents 478c6cb + 26aeeaf commit 95480d9

File tree

4 files changed

+390
-54
lines changed

4 files changed

+390
-54
lines changed

metafacture-triples/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,10 @@ dependencies {
2424
testImplementation 'junit:junit:4.12'
2525
testImplementation 'org.mockito:mockito-core:2.5.5'
2626
}
27+
28+
test {
29+
testLogging {
30+
showStandardStreams = true
31+
exceptionFormat = 'full'
32+
}
33+
}

metafacture-triples/src/main/java/org/metafacture/triples/AbstractTripleSort.java

Lines changed: 40 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@
3030
import java.util.Comparator;
3131
import java.util.List;
3232
import java.util.PriorityQueue;
33+
import java.util.function.Function;
3334

3435
/**
3536
* @author markus geipel
3637
*
3738
*/
3839
public 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
}

metafacture-triples/src/main/java/org/metafacture/triples/TripleSort.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* @author markus geipel
2828
*
2929
*/
30-
@Description("Sorts triples")
30+
@Description("Sorts triples. Several options can be combined, e.g. `by=\"object\",numeric=\"true\",order=\"decreasing\"` will numerically sort the Object of the triples in decreasing order (given that all Objects are indeed of numeric type).")
3131
@In(Triple.class)
3232
@Out(Triple.class)
3333
@FluxCommand("sort-triples")
@@ -49,4 +49,8 @@ public void setOrder(final Order order) {
4949
setSortOrder(order);
5050
}
5151

52+
public void setNumeric(final boolean numeric) {
53+
setSortNumeric(numeric);
54+
}
55+
5256
}

0 commit comments

Comments
 (0)