Skip to content

Commit

Permalink
Update sde for non-retrieve or in-cql resource return (#129)
Browse files Browse the repository at this point in the history
* distinguish instance return besides retrieve

* throe ResourceNotFound instead of Null pointer

* assert contained resource

* fix test

* the reference for instance resource to be #preceeded
  • Loading branch information
mdnazmulkarim authored Aug 2, 2022
1 parent a4f1a21 commit 394fd90
Show file tree
Hide file tree
Showing 6 changed files with 5,174 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.Collections;
import java.util.List;

import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.hl7.fhir.r4.model.Group;
Expand Down Expand Up @@ -32,22 +33,35 @@ public List<String> getSubjects(MeasureEvalType measureEvalType, String subjectI

return ids;
} else if (subjectId.indexOf("/") == -1) {
IBaseResource r = fhirDal.read(new IdType("Patient/" + subjectId));
IdType id = new IdType("Patient/" + subjectId);
IBaseResource r = fhirDal.read(id);

if (r == null) {
throw new ResourceNotFoundException(id);
}
return Collections
.singletonList(r.getIdElement().getResourceType() + "/" + r.getIdElement().getIdPart());
}
else if (subjectId.startsWith("Group")) {
Group r = (Group)fhirDal.read(new IdType(subjectId));
List<String> subjectIds = new ArrayList<>();
} else if (subjectId.startsWith("Group")) {
IdType id = new IdType(subjectId);
Group r = (Group) fhirDal.read(id);

if (r == null) {
throw new ResourceNotFoundException(id);
}

List<String> subjectIds = new ArrayList<>();
for (GroupMemberComponent gmc : r.getMember()) {
IIdType ref = gmc.getEntity().getReferenceElement();
subjectIds.add(ref.getResourceType() + "/" + ref.getIdPart());
}

return subjectIds;
} else {
IBaseResource r = fhirDal.read(new IdType(subjectId));
IdType id = new IdType(subjectId);
IBaseResource r = fhirDal.read(id);
if (r == null) {
throw new ResourceNotFoundException(id);
}
return Collections
.singletonList(r.getIdElement().getResourceType() + "/" + r.getIdElement().getIdPart());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ protected void processSdes(Measure measure, MeasureDef measureDef, List<String>
Map<ValueWrapper, Long> accumulated = sde.getValues().stream().map(x -> new ValueWrapper(x))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

processSdeEvaluatedResourceExtension(sde);
processSdeEvaluatedResourceExt(sde);

String sdeCode = sde.getCode();
CodeableConcept originalConcept = generateOriginalConcept(sde);
Expand Down Expand Up @@ -395,7 +395,7 @@ protected void processSdes(Measure measure, MeasureDef measureDef, List<String>
break;
}
report.addContained(obs);
processCoreSdeEvaluatedResourceExtension(createSdeCriteriaReferenceExtension(sde.getId()),
processCoreSdeEvaluatedResourceExt(createSdeCriteriaReferenceExt(sde.getId()),
createContainedResourceReferenceValue(obs.getId()), sde.getId());
}
}
Expand Down Expand Up @@ -430,7 +430,7 @@ private CodeableConcept generateOriginalConcept(SdeDef sde) {

private Map<String, HashSet<String>> extensionSet;

private Map<String, HashSet<String>> getExtensionKeySetMap() {
private Map<String, HashSet<String>> getExtKeySetMap() {
if (extensionSet == null) {
extensionSet = new HashMap<String, HashSet<String>>();
}
Expand All @@ -447,48 +447,51 @@ private void updateKeySetMap(Map<String, HashSet<String>> keySetMap, String key,
}
}

private void processSdeEvaluatedResourceExtension(SdeDef sdeDef) {
for (Object object : sdeDef.getValues()) {
if (object instanceof IBaseResource) {
IBaseResource iBaseResource = (IBaseResource) object;
Extension criteriaReferenceExtension = createSdeCriteriaReferenceExtension(sdeDef.getId());
String resourceReferenceValue = createResourceReferenceValue(iBaseResource.getIdElement().getResourceType(),
iBaseResource.getIdElement().getIdPart());
processCoreSdeEvaluatedResourceExtension(criteriaReferenceExtension, resourceReferenceValue, sdeDef.getId());
private void processSdeEvaluatedResourceExt(SdeDef sdeDef) {
for (Object obj : sdeDef.getValues()) {
if (obj instanceof IBaseResource) {
IBaseResource res = (IBaseResource) obj;
Extension sdeCriteriaReferenceExt = createSdeCriteriaReferenceExt(sdeDef.getId());
String referenceValue;
if (sdeDef.isInstanceExpression()) {
report.addContained((DomainResource) res);
referenceValue = createContainedResourceReferenceValue(res.getIdElement().getIdPart());
} else {
referenceValue = createResourceReference(res.fhirType(), res.getIdElement().getIdPart());
}
processCoreSdeEvaluatedResourceExt(sdeCriteriaReferenceExt, referenceValue, sdeDef.getId());
}
}
}

private void processCoreSdeEvaluatedResourceExtension(Extension criteriaReferenceExtension,
String resourceReferenceValue, String populationReference) {
if (!getExtensionKeySetMap().containsKey(resourceReferenceValue)) {
Extension extension = new Extension(MeasureConstants.SDE_EXT_URL);
Reference reference = new Reference(resourceReferenceValue);
reference.addExtension(criteriaReferenceExtension);
extension.setValue(reference);
report.getExtension().add(extension);
updateKeySetMap(getExtensionKeySetMap(), resourceReferenceValue, populationReference);
} else if (!(getExtensionKeySetMap().get(resourceReferenceValue).contains(populationReference))) {
updateExtensionInExisingList(report.getExtensionsByUrl(MeasureConstants.SDE_EXT_URL),
criteriaReferenceExtension, resourceReferenceValue);
updateKeySetMap(getExtensionKeySetMap(), resourceReferenceValue, populationReference);
private void processCoreSdeEvaluatedResourceExt(Extension criteriaRefExt, String referenceVal, String populationRef) {
if (!getExtKeySetMap().containsKey(referenceVal)) {
Extension ext = new Extension(MeasureConstants.SDE_EXT_URL);
Reference ref = new Reference(referenceVal);
ref.addExtension(criteriaRefExt);
ext.setValue(ref);
report.getExtension().add(ext);
updateKeySetMap(getExtKeySetMap(), referenceVal, populationRef);
} else if (!(getExtKeySetMap().get(referenceVal).contains(populationRef))) {
updateExtInExisingList(report.getExtensionsByUrl(MeasureConstants.SDE_EXT_URL), criteriaRefExt, referenceVal);
updateKeySetMap(getExtKeySetMap(), referenceVal, populationRef);
}
}

private Extension createSdeCriteriaReferenceExtension(String value) {
private Extension createSdeCriteriaReferenceExt(String value) {
return new Extension(MeasureConstants.EXT_CRITERIA_REFERENCE_URL)
.setValue(new StringType(value));
}

private String createResourceReferenceValue(String resourceType, String id) {
private String createResourceReference(String resourceType, String id) {
return new StringBuilder(resourceType).append("/").append(id).toString();
}

private String createContainedResourceReferenceValue(String id) {
return new StringBuilder("#").append(id).toString();
}

private void updateExtensionInExisingList(List<Extension> list, Extension criteriaReferenceExtension, String value) {
private void updateExtInExisingList(List<Extension> list, Extension criteriaReferenceExtension, String value) {
list.stream().filter(extension -> ((Reference) extension.getValue()).getReference().equals(value))
.collect(Collectors.toList()).stream().findFirst().get().getValue().addExtension(criteriaReferenceExtension);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.opencds.cqf.cql.evaluator.measure.r4;

import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
import org.hl7.fhir.r4.model.MeasureReport;
import org.testng.annotations.Test;

import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.assertTrue;

public class MeasureProcessorSdeInstanceExpressionTest extends BaseMeasureProcessorTest {
public MeasureProcessorSdeInstanceExpressionTest() {
super("ConditionCategoryPoc.json");
}

@Test
public void measure_eval_non_retrieve_resource() {

assertThrows(ResourceNotFoundException.class,
() -> this.measureProcessor.evaluateMeasure("https://build.fhir.org/ig/HL7/davinci-ra/ConditionCategoryPOC",
"2022-01-01", "2022-12-31", "subject",
"Patient/hist-open-HCC189", null, null,
endpoint, endpoint, endpoint, null));

MeasureReport report = this.measureProcessor.evaluateMeasure("https://build.fhir.org/ig/HL7/davinci-ra/ConditionCategoryPOC",
"2022-01-01", "2022-12-31", "subject",
"Patient/hist-closed-HCC189", null, null,
endpoint, endpoint, endpoint, null);

assertNotNull(report);

assertTrue(report.getContained().stream().anyMatch(
item -> item.getId().startsWith("hist-closed-HCC189-suspecting-algorithm-encounter")));
}
}
Loading

0 comments on commit 394fd90

Please sign in to comment.