Skip to content

Commit f55b89b

Browse files
committed
Refactoring
1 parent 3d735b7 commit f55b89b

File tree

1 file changed

+25
-27
lines changed

1 file changed

+25
-27
lines changed

whelk-core/src/main/groovy/whelk/search2/FacetTree.java

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44

55
import java.util.*;
66
import java.util.concurrent.ConcurrentLinkedQueue;
7+
import java.util.function.Function;
78
import java.util.stream.Collectors;
89

910
import static whelk.util.DocumentUtil.getAtPath;
1011

1112
public class FacetTree {
1213

1314
private final JsonLd jsonLd;
14-
private List<String> observationsAsTypeKeys = new ArrayList<>();
15+
private Map<String, Map<String, Object>> keyToObservation = new HashMap<>();
1516

1617
public FacetTree(JsonLd jsonLd) {
1718
this.jsonLd = jsonLd;
@@ -22,39 +23,36 @@ public List<Map<String, Object>> sortObservationsAsTree(List<Map<String, Object>
2223
Queue<Map<String, Object>> queue = new ConcurrentLinkedQueue<>();
2324
Set<String> intermediateClasses = new HashSet<>();
2425

25-
observationsAsTypeKeys = observations.stream()
26-
.map(o -> jsonLd.toTermKey(get(o, List.of("object", "@id"), "")))
27-
.collect(Collectors.toList());
26+
keyToObservation = observations.stream()
27+
.collect(Collectors.toMap(o -> jsonLd.toTermKey(get(o, List.of("object", "@id"), "")), Function.identity()));
2828

29-
List<String> rootCandidates = observationsAsTypeKeys.stream().filter(this::isRootNode).toList();
30-
String rootKey;
31-
Map<String, Object> root;
29+
List<String> rootCandidates = keyToObservation.keySet().stream().filter(this::isRootNode).toList();
30+
String rootKey = "";
3231

3332
if (rootCandidates.size() == 1) {
34-
root = observations.stream()
35-
.filter(o -> jsonLd.toTermKey(get(o, List.of("object", "@id"), "")).equals(rootCandidates.getFirst()))
36-
.findFirst()
37-
.orElse(null);
38-
rootKey = jsonLd.toTermKey(get(root, List.of("object", "@id"), ""));
33+
rootKey = rootCandidates.getFirst();
34+
var root = keyToObservation.get(rootKey);
3935
tree.add(root);
4036
queue.add(root);
4137
} else {
42-
rootKey = getAbsentRoot(observationsAsTypeKeys.getFirst());
43-
//TODO: should not be null
44-
if (rootKey != null) {
45-
observationsAsTypeKeys.add(rootKey);
46-
root = createFakeObservation(rootKey);
47-
observations.add(root);
48-
tree.add(root);
49-
queue.add(root);
38+
Optional<String> first = keyToObservation.keySet().stream().findFirst();
39+
if (first.isPresent()) {
40+
Optional<String> rootKeyOpt = getAbsentRoot(first.get());
41+
if (rootKeyOpt.isPresent()) {
42+
rootKey = rootKeyOpt.get();
43+
var root = createFakeObservation(rootKey);
44+
observations.add(root);
45+
tree.add(root);
46+
queue.add(root);
47+
}
5048
}
5149
}
5250

53-
observationsAsTypeKeys.forEach(typeKey -> {
51+
for (String typeKey : keyToObservation.keySet()) {
5452
if (!typeKey.equals(rootKey)) {
5553
intermediateClasses.addAll(getIntermediateClassesFor(typeKey));
5654
}
57-
});
55+
}
5856

5957
observations.addAll(intermediateClasses.stream().map(this::createFakeObservation).toList());
6058

@@ -93,27 +91,27 @@ private List<String> getAbsentSuperClasses(String typeKey) {
9391
List<String> allSuperClasses = jsonLd.getSuperClasses(typeKey);
9492

9593
return allSuperClasses.stream()
96-
.takeWhile(s -> !observationsAsTypeKeys.contains(s))
94+
.takeWhile(s -> !keyToObservation.containsKey(s))
9795
.toList();
9896
}
9997

100-
private String getAbsentRoot(String typeKey) {
98+
private Optional<String> getAbsentRoot(String typeKey) {
10199
List<String> allSuperClasses = jsonLd.getSuperClasses(typeKey);
102100
return allSuperClasses.stream()
103101
.filter(this::subClassesContainsAllObservations)
104-
.findFirst().orElse(null);
102+
.findFirst();
105103
}
106104

107105
private boolean subClassesContainsAllObservations(String c) {
108106
Set<String> subClasses = jsonLd.getSubClasses(c);
109-
return subClasses.containsAll(observationsAsTypeKeys);
107+
return subClasses.containsAll(keyToObservation.keySet());
110108
}
111109

112110
private boolean hasParentInObservations(String typeKey) {
113111
List<String> allSuperClasses = jsonLd.getSuperClasses(typeKey);
114112

115113
return allSuperClasses.stream()
116-
.anyMatch(s -> observationsAsTypeKeys.contains(s));
114+
.anyMatch(s -> keyToObservation.containsKey(s));
117115
}
118116

119117
private boolean isRootNode(String typeKey) {

0 commit comments

Comments
 (0)