Skip to content

Commit d20e2a3

Browse files
committed
Improve Redaction Performance
Closes: #318
1 parent 4370759 commit d20e2a3

File tree

7 files changed

+164
-301
lines changed

7 files changed

+164
-301
lines changed

src/main/java/de/medizininformatikinitiative/torch/management/StructureDefinitionHandler.java

Lines changed: 17 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@
77
import java.io.File;
88
import java.io.IOException;
99
import java.util.HashMap;
10-
import java.util.HashSet;
10+
import java.util.Map;
11+
import java.util.Objects;
12+
import java.util.Optional;
1113
import java.util.Set;
1214

1315
/**
14-
* Structure for loading and serving the CDS structure definitions
16+
* Handler for loading and serving structure definitions.
1517
*/
16-
1718
@Component
1819
public class StructureDefinitionHandler {
1920

20-
21-
private final HashMap<String, StructureDefinition> definitionsMap = new HashMap<>();
22-
protected ResourceReader resourceReader;
21+
private final Map<String, StructureDefinition> definitions = new HashMap<>();
22+
private final ResourceReader resourceReader;
2323

2424
public StructureDefinitionHandler(String fileDirectory, ResourceReader resourceReader) {
2525
try {
@@ -30,27 +30,20 @@ public StructureDefinitionHandler(String fileDirectory, ResourceReader resourceR
3030
}
3131
}
3232

33-
/**
34-
* @return Keyset of the underlying Map managing profiles and their Structure Definitions.
35-
*/
36-
public Set<String> knownProfiles() {
37-
return Set.copyOf(definitionsMap.keySet());
38-
}
39-
4033
/**
4134
* @param profile to check if known
4235
* @return returns if profile is known.
4336
*/
4437
public Boolean known(String profile) {
45-
return definitionsMap.containsKey(profile);
38+
return definitions.containsKey(profile);
4639
}
4740

4841
/**
4942
* Reads a StructureDefinition from a file and stores it in the definitionsMap
5043
*/
5144
public void readStructureDefinition(String filePath) throws IOException {
5245
StructureDefinition structureDefinition = (StructureDefinition) resourceReader.readResource(filePath);
53-
definitionsMap.put(structureDefinition.getUrl(), structureDefinition);
46+
definitions.put(structureDefinition.getUrl(), structureDefinition);
5447
}
5548

5649
/**
@@ -62,61 +55,37 @@ public void readStructureDefinition(String filePath) throws IOException {
6255
*/
6356
public StructureDefinition getDefinition(String url) {
6457
String[] versionSplit = url.split("\\|");
65-
return definitionsMap.get(versionSplit[0]);
58+
return definitions.get(versionSplit[0]);
6659
}
6760

6861
/**
6962
* Returns the first non-null StructureDefinition from a list of URLs.
63+
* <p>
7064
* Iterates over the list of URLs, returning the first valid StructureDefinition.
7165
*
72-
* @param urls A list of URLs for which to find the corresponding StructureDefinition.
66+
* @param urls a list of URLs for which to find the corresponding StructureDefinition.
7367
* @return The first non-null StructureDefinition found, or empty if none are found.
7468
*/
75-
public Set<StructureDefinition> getDefinitions(Set<String> urls) {
76-
Set<StructureDefinition> definitions = new HashSet<>();
77-
urls.forEach(url -> {
78-
StructureDefinition def = definitionsMap.get(url);
79-
if (def != null) {
80-
definitions.add(def);
81-
}
82-
});
83-
return definitions;
69+
public Optional<StructureDefinition> getDefinition(Set<String> urls) {
70+
return urls.stream().map(definitions::get).filter(Objects::nonNull).findFirst();
8471
}
8572

86-
/**
87-
* Returns the first non-null StructureDefinition from a list of URLs.
88-
* Iterates over the list of URLs, returning the first valid StructureDefinition.
89-
*
90-
* @param urls A list of URLs for which to find the corresponding StructureDefinition.
91-
* @return The first non-null StructureDefinition found, or null if none are found.
92-
*/
93-
public Set<StructureDefinition.StructureDefinitionSnapshotComponent> getSnapshots(Set<String> urls) {
94-
Set<StructureDefinition.StructureDefinitionSnapshotComponent> definitions = new HashSet<>();
95-
urls.forEach(url -> definitions.add(getSnapshot(url)));
96-
return definitions;
97-
}
98-
99-
10073
public StructureDefinition.StructureDefinitionSnapshotComponent getSnapshot(String url) {
101-
if (definitionsMap.get(url) != null) {
102-
return (definitionsMap.get(url)).getSnapshot();
74+
if (definitions.get(url) != null) {
75+
return (definitions.get(url)).getSnapshot();
10376
} else {
10477
throw new IllegalArgumentException("Unknown Profile: " + url);
10578
}
106-
107-
10879
}
10980

11081
public String getResourceType(String url) {
111-
if (definitionsMap.get(url) != null) {
112-
return (definitionsMap.get(url)).getType();
82+
if (definitions.get(url) != null) {
83+
return (definitions.get(url)).getType();
11384
} else {
11485
throw new IllegalArgumentException("Unknown Profile: " + url);
11586
}
116-
11787
}
11888

119-
12089
/**
12190
* Reads all JSON files in a directory and stores their StructureDefinitions in the definitionsMap
12291
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package de.medizininformatikinitiative.torch.util;
2+
3+
import com.google.common.base.Functions;
4+
import org.hl7.fhir.r4.model.ElementDefinition;
5+
import org.hl7.fhir.r4.model.StructureDefinition;
6+
7+
import java.util.Map;
8+
import java.util.stream.Collectors;
9+
import java.util.stream.Stream;
10+
11+
import static java.util.Objects.requireNonNull;
12+
13+
record Definition(StructureDefinition structureDefinition, Map<String, ElementDefinition> elementDefinitions) {
14+
15+
static Definition fromStructureDefinition(StructureDefinition structureDefinition) {
16+
return new Definition(structureDefinition, structureDefinition.getSnapshot().getElement().stream().collect(Collectors.toMap(ElementDefinition::getId, Functions.identity())));
17+
}
18+
19+
ElementDefinition elementDefinitionById(String id) {
20+
return elementDefinitions.get(requireNonNull(id));
21+
}
22+
23+
Stream<ElementDefinition> elementDefinitionByPath(String path) {
24+
String pathX = requireNonNull(path) + "[x]";
25+
return structureDefinition.getSnapshot().getElement().stream().filter(ed -> path.equals(ed.getPath()) || pathX.equals(ed.getPath()));
26+
}
27+
}

0 commit comments

Comments
 (0)