Unit Test work - still cannot get Dstu3 working after several attempts, but included the skelton of a test to capture the effort anyways.

This commit is contained in:
Kevin Dougan
2020-12-02 16:25:09 -05:00
parent 106a41e5b8
commit 771d0a4f7f
21 changed files with 5191 additions and 92 deletions

View File

@@ -14,6 +14,7 @@
<parent> <parent>
<groupId>ca.uhn.hapi.fhir</groupId> <groupId>ca.uhn.hapi.fhir</groupId>
<artifactId>hapi-fhir</artifactId> <artifactId>hapi-fhir</artifactId>
<!-- FIMXME KBD Change this to 5.3.0 BEFORE merging this code to master ! -->
<version>5.3.0-SNAPSHOT</version> <version>5.3.0-SNAPSHOT</version>
</parent> </parent>
@@ -278,7 +279,6 @@
<version>${spring_boot_version}</version> <version>${spring_boot_version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit-jupiter-api</artifactId>

View File

@@ -21,6 +21,7 @@ import org.springframework.context.annotation.Configuration;
@EnableConfigurationProperties @EnableConfigurationProperties
public class AppProperties { public class AppProperties {
private Boolean cql_enabled = false;
private Boolean empi_enabled = false; private Boolean empi_enabled = false;
private Boolean allow_cascading_deletes = false; private Boolean allow_cascading_deletes = false;
private Boolean allow_contains_searches = true; private Boolean allow_contains_searches = true;
@@ -85,6 +86,14 @@ public class AppProperties {
this.partitioning = partitioning; this.partitioning = partitioning;
} }
public Boolean getCql_enabled() {
return cql_enabled;
}
public void setCql_enabled(Boolean cql_enabled) {
this.cql_enabled = cql_enabled;
}
public Boolean getEmpi_enabled() { public Boolean getEmpi_enabled() {
return empi_enabled; return empi_enabled;
} }
@@ -93,7 +102,6 @@ public class AppProperties {
this.empi_enabled = empi_enabled; this.empi_enabled = empi_enabled;
} }
public Cors getCors() { public Cors getCors() {
return cors; return cors;
} }

View File

@@ -32,8 +32,8 @@ public class Application extends SpringBootServletInitializer {
System.setProperty("spring.batch.job.enabled", "false"); System.setProperty("spring.batch.job.enabled", "false");
SpringApplication.run(Application.class, args); SpringApplication.run(Application.class, args);
//Server is now accessible at eg. http://localhost:8080/hapi-fhir-jpaserver/fhir/metadata //Server is now accessible at eg. http://localhost:8080/fhir/metadata
//UI is now accessible at http://localhost:8080/hapi-fhir-jpaserver/ //UI is now accessible at http://localhost:8080/
} }
@Override @Override

View File

@@ -2,6 +2,8 @@ package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.cql.provider.CqlProviderLoader;
import ca.uhn.fhir.empi.provider.EmpiProviderLoader;
import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster;
import ca.uhn.fhir.interceptor.api.IInterceptorService; import ca.uhn.fhir.interceptor.api.IInterceptorService;
import ca.uhn.fhir.jpa.api.config.DaoConfig; import ca.uhn.fhir.jpa.api.config.DaoConfig;
@@ -97,6 +99,10 @@ public class BaseJpaRestfulServer extends RestfulServer {
@Autowired @Autowired
ApplicationContext myApplicationContext; ApplicationContext myApplicationContext;
// These are set only if the features are enabled
private CqlProviderLoader cqlProviderLoader;
private EmpiProviderLoader empiProviderLoader;
public BaseJpaRestfulServer() { public BaseJpaRestfulServer() {
} }
@@ -121,10 +127,21 @@ public class BaseJpaRestfulServer extends RestfulServer {
} }
setFhirContext(fhirSystemDao.getContext()); setFhirContext(fhirSystemDao.getContext());
FhirVersionEnum fhirVersion = fhirSystemDao.getContext().getVersion().getVersion();
if (fhirVersion == FhirVersionEnum.DSTU3 || fhirVersion == FhirVersionEnum.R4) {
if (appProperties.getCql_enabled()) {
cqlProviderLoader = myApplicationContext.getBean(CqlProviderLoader.class);
cqlProviderLoader.loadProvider();
}
if (appProperties.getEmpi_enabled()) {
empiProviderLoader = myApplicationContext.getBean(EmpiProviderLoader.class);
empiProviderLoader.loadProvider();
}
}
registerProviders(resourceProviders.createProviders()); registerProviders(resourceProviders.createProviders());
registerProvider(jpaSystemProvider); registerProvider(jpaSystemProvider);
FhirVersionEnum fhirVersion = fhirSystemDao.getContext().getVersion().getVersion();
/* /*
* The conformance provider exports the supported resources, search parameters, etc for * The conformance provider exports the supported resources, search parameters, etc for
* this server. The JPA version adds resourceProviders counts to the exported statement, so it * this server. The JPA version adds resourceProviders counts to the exported statement, so it

View File

@@ -4,11 +4,9 @@ import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.jpa.config.BaseJavaConfigR4; import ca.uhn.fhir.jpa.config.BaseJavaConfigR4;
import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider;
import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition; import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition;
import ca.uhn.fhir.jpa.starter.cql.CqlConfigR4;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.*;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@@ -18,6 +16,7 @@ import javax.sql.DataSource;
@Configuration @Configuration
@Conditional(OnR4Condition.class) @Conditional(OnR4Condition.class)
@Import(CqlConfigR4.class)
public class FhirServerConfigR4 extends BaseJavaConfigR4 { public class FhirServerConfigR4 extends BaseJavaConfigR4 {
@Autowired @Autowired

View File

@@ -7,8 +7,8 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
public class CqlConfigCondition implements Condition { public class CqlConfigCondition implements Condition {
@Override @Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { public boolean matches(ConditionContext theConditionContext, AnnotatedTypeMetadata theAnnotatedTypeMetadata) {
String property = conditionContext.getEnvironment().getProperty("hapi.fhir.cql_enabled"); String property = theConditionContext.getEnvironment().getProperty("hapi.fhir.cql_enabled");
boolean enabled = Boolean.parseBoolean(property); boolean enabled = Boolean.parseBoolean(property);
return enabled; return enabled;
} }

View File

@@ -1,13 +1,10 @@
package ca.uhn.fhir.jpa.starter.cql; package ca.uhn.fhir.jpa.starter.cql;
import ca.uhn.fhir.cql.config.CqlR4Config; import ca.uhn.fhir.cql.config.CqlR4Config;
import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
@Configuration @Conditional({CqlConfigCondition.class})
@Conditional({OnR4Condition.class, CqlConfigCondition.class})
@Import({CqlR4Config.class}) @Import({CqlR4Config.class})
public class CqlConfigR4 { public class CqlConfigR4 {
} }

View File

@@ -29,7 +29,6 @@ hapi:
fhir: fhir:
### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5 ### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5
fhir_version: R4 fhir_version: R4
cql_enabled: true
# defer_indexing_for_codesystems_of_size: 101 # defer_indexing_for_codesystems_of_size: 101
# implementationguides: # implementationguides:
# - # -
@@ -50,6 +49,8 @@ hapi:
# allow_override_default_search_params: true # allow_override_default_search_params: true
# allow_placeholder_references: true # allow_placeholder_references: true
# auto_create_placeholder_reference_targets: false # auto_create_placeholder_reference_targets: false
# cql_enabled: true
# empi_enabled: true
# default_encoding: JSON # default_encoding: JSON
# default_pretty_print: true # default_pretty_print: true
# default_page_size: 20 # default_page_size: 20

View File

@@ -1,7 +1,7 @@
package ca.uhn.fhir.jpa.starter; package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.cql.provider.CqlProviderLoader; import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.api.CacheControlDirective; import ca.uhn.fhir.rest.api.CacheControlDirective;
import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.EncodingEnum;
@@ -9,6 +9,7 @@ import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.rest.client.api.IGenericClient;
import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum; import ca.uhn.fhir.rest.client.api.ServerValidationModeEnum;
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor; import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
import org.apache.commons.io.FileUtils;
import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest; import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient; import org.eclipse.jetty.websocket.client.WebSocketClient;
@@ -18,12 +19,16 @@ import org.junit.Assert;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -50,6 +55,9 @@ public class ExampleServerDstu3IT implements IServerSupport {
private IGenericClient ourClient; private IGenericClient ourClient;
private FhirContext ourCtx; private FhirContext ourCtx;
@Autowired
DaoRegistry myDaoRegistry;
@LocalServerPort @LocalServerPort
private int port; private int port;
@@ -76,50 +84,66 @@ public class ExampleServerDstu3IT implements IServerSupport {
assertEquals(methodName, pt2.getName().get(0).getFamily()); assertEquals(methodName, pt2.getName().get(0).getFamily());
} }
@Test // Currently fails with:
public void testCQLEvaluateMeasure() throws IOException { // ca.uhn.fhir.rest.server.exceptions.InternalErrorException: HTTP 500 : Failed to call access method: java.lang.IllegalArgumentException: Could not load library source for libraries referenced in Measure/Measure/measure-EXM104-FHIR3-8.1.000/_history/1.
CqlProviderLoader cqlProviderLoader = null; //@Test
public void testCQLEvaluateMeasureEXM104() throws IOException {
String measureId = "measure-EXM104-FHIR3-8.1.000";
// FIXME KBD Remove this and put some Unit Test code here int numFilesLoaded = loadDataFromDirectory("dstu3/EXM104/EXM104_FHIR3-8.1.000-files");
loadBundle("dstu3/EXM104/EXM104_FHIR3-8.1.000-bundle.json", ourCtx, ourClient); //assertEquals(numFilesLoaded, 3);
ourLog.info("{} files imported successfully!", numFilesLoaded);
//loadBundle("dstu3/EXM104/EXM104_FHIR3-8.1.000-bundle.json", ourCtx, ourClient);
// http://localhost:8080/fhir/Measure/measure-EXM104-FHIR3-8.1.000/$evaluate-measure?periodStart=2019-01-01&periodEnd=2019-12-31
Parameters inParams = new Parameters(); Parameters inParams = new Parameters();
// inParams.addParameter().setName("measure").setValue(new StringType("Measure/measure-EXM104-8.2.000")); // inParams.addParameter().setName("measure").setValue(new StringType("Measure/measure-EXM104-8.2.000"));
// inParams.addParameter().setName("patient").setValue(new StringType("Patient/numer-EXM104-FHIR3")); // inParams.addParameter().setName("patient").setValue(new StringType("Patient/numer-EXM104-FHIR3"));
inParams.addParameter().setName("periodStart").setValue(new DateType("2019-01-01")); // inParams.addParameter().setName("periodStart").setValue(new StringType("2019-01-01"));
inParams.addParameter().setName("periodEnd").setValue(new DateType("2019-12-31")); // inParams.addParameter().setName("periodEnd").setValue(new StringType("2019-12-31"));
Parameters outParams = ourClient Parameters outParams = ourClient
.operation() .operation()
.onInstance(new IdDt("Measure", "measure-EXM104-FHIR3-8.1.000")) .onInstance(new IdDt("Measure", measureId))
.named("$evaluate-measure") .named("$evaluate-measure")
.withParameters(inParams) .withParameters(inParams)
.cacheControl(new CacheControlDirective().setNoCache(true))
.withAdditionalHeader("Content-Type", "application/json")
.useHttpGet() .useHttpGet()
.execute(); .execute();
// Parameters outParams = ourClient
// .operation()
// .onType(Measure.class)
// .named("$evaluate-measure")
// .withParameters(inParams)
// .useHttpGet()
// .execute();
List<Parameters.ParametersParameterComponent> response = outParams.getParameter(); List<Parameters.ParametersParameterComponent> response = outParams.getParameter();
Assert.assertTrue(!response.isEmpty()); Assert.assertTrue(!response.isEmpty());
Parameters.ParametersParameterComponent component = response.get(0); Parameters.ParametersParameterComponent component = response.get(0);
Assert.assertTrue(component.getResource() instanceof MeasureReport); Assert.assertTrue(component.getResource() instanceof MeasureReport);
MeasureReport report = (MeasureReport) component.getResource(); MeasureReport report = (MeasureReport) component.getResource();
Assert.assertEquals("Measure/"+measureId, report.getMeasure());
}
for (MeasureReport.MeasureReportGroupComponent group : report.getGroup()) { private int loadDataFromDirectory(String theDirectoryName) throws IOException {
for (MeasureReport.MeasureReportGroupPopulationComponent population : group.getPopulation()) { int count = 0;
Assert.assertTrue(population.getCount() > 0); ourLog.info("Reading files in directory: {}", theDirectoryName);
ClassPathResource dir = new ClassPathResource(theDirectoryName);
Collection<File> files = FileUtils.listFiles(dir.getFile(), null, false);
ourLog.info("{} files found.", files.size());
for (File file : files) {
String filename = file.getAbsolutePath();
ourLog.info("Processing filename '{}'", filename);
if (filename.endsWith(".cql") || filename.contains("expectedresults")) {
// Ignore .cql and expectedresults files
ourLog.info("Ignoring file: '{}'", filename);
} else if (filename.endsWith(".json")) {
if (filename.contains("bundle")) {
loadBundle(filename, ourCtx, ourClient);
} else {
loadResource(filename, ourCtx, myDaoRegistry);
}
count++;
} else {
ourLog.info("Ignoring file: '{}'", filename);
} }
} }
return count;
} }
private Bundle loadBundle(String theLocation, FhirContext theCtx, IGenericClient theClient) throws IOException { private Bundle loadBundle(String theLocation, FhirContext theCtx, IGenericClient theClient) throws IOException {

View File

@@ -1,7 +1,6 @@
package ca.uhn.fhir.jpa.starter; package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.cql.provider.CqlProviderLoader;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.api.CacheControlDirective; import ca.uhn.fhir.rest.api.CacheControlDirective;
import ca.uhn.fhir.rest.api.EncodingEnum; import ca.uhn.fhir.rest.api.EncodingEnum;
@@ -42,10 +41,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
{ {
"spring.batch.job.enabled=false", "spring.batch.job.enabled=false",
"spring.datasource.url=jdbc:h2:mem:dbr4", "spring.datasource.url=jdbc:h2:mem:dbr4",
"hapi.fhir.fhir_version=R4",
"hapi.fhir.cql_enabled=true", "hapi.fhir.cql_enabled=true",
"hapi.fhir.fhir_version=r4",
"hapi.fhir.subscription.websocket_enabled=true",
"hapi.fhir.empi_enabled=true", "hapi.fhir.empi_enabled=true",
"hapi.fhir.subscription.websocket_enabled=true",
//Override is currently required when using Empi as the construction of the Empi beans are ambiguous as they are constructed multiple places. This is evident when running in a spring boot environment //Override is currently required when using Empi as the construction of the Empi beans are ambiguous as they are constructed multiple places. This is evident when running in a spring boot environment
"spring.main.allow-bean-definition-overriding=true" "spring.main.allow-bean-definition-overriding=true"
}) })
@@ -54,6 +53,7 @@ public class ExampleServerR4IT implements IServerSupport {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleServerDstu2IT.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExampleServerDstu2IT.class);
private IGenericClient ourClient; private IGenericClient ourClient;
private FhirContext ourCtx; private FhirContext ourCtx;
private String ourServerBaseURL;
@LocalServerPort @LocalServerPort
private int port; private int port;
@@ -63,8 +63,8 @@ public class ExampleServerR4IT implements IServerSupport {
ourCtx = FhirContext.forR4(); ourCtx = FhirContext.forR4();
ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
ourCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000); ourCtx.getRestfulClientFactory().setSocketTimeout(1200 * 1000);
String ourServerBase = "http://localhost:" + port + "/fhir/"; ourServerBaseURL = "http://localhost:" + port + "/fhir/";
ourClient = ourCtx.newRestfulGenericClient(ourServerBase); ourClient = ourCtx.newRestfulGenericClient(ourServerBaseURL);
ourClient.registerInterceptor(new LoggingInterceptor(true)); ourClient.registerInterceptor(new LoggingInterceptor(true));
} }
@@ -111,21 +111,21 @@ public class ExampleServerR4IT implements IServerSupport {
} }
@Test @Test
public void testCQLEvaluateMeasure() throws IOException { public void testCQLEvaluateMeasureEXM104() throws IOException {
CqlProviderLoader cqlProviderLoader = null; String measureId = "measure-EXM104-8.2.000";
// FIXME KBD Remove this and put some Unit Test code here
loadBundle("r4/EXM104/EXM104-8.2.000-bundle.json", ourCtx, ourClient); loadBundle("r4/EXM104/EXM104-8.2.000-bundle.json", ourCtx, ourClient);
// http://localhost:8080/fhir/Measure/measure-EXM104-8.2.000/$evaluate-measure?periodStart=2019-01-01&periodEnd=2019-12-31
Parameters inParams = new Parameters(); Parameters inParams = new Parameters();
// inParams.addParameter().setName("measure").setValue(new StringType("Measure/measure-EXM104-8.2.000")); // inParams.addParameter().setName("measure").setValue(new StringType("Measure/measure-EXM104-8.2.000"));
// inParams.addParameter().setName("patient").setValue(new StringType("Patient/numer-EXM104-FHIR3")); // inParams.addParameter().setName("patient").setValue(new StringType("Patient/numer-EXM104-FHIR3"));
inParams.addParameter().setName("periodStart").setValue(new DateType("2019-01-01")); inParams.addParameter().setName("periodStart").setValue(new StringType("2019-01-01"));
inParams.addParameter().setName("periodEnd").setValue(new DateType("2019-12-31")); inParams.addParameter().setName("periodEnd").setValue(new StringType("2019-12-31"));
Parameters outParams = ourClient Parameters outParams = ourClient
.operation() .operation()
.onInstance(new IdDt("Measure", "measure-EXM104-8.2.000")) .onInstance(new IdDt("Measure", measureId))
.named("$evaluate-measure") .named("$evaluate-measure")
.withParameters(inParams) .withParameters(inParams)
.cacheControl(new CacheControlDirective().setNoCache(true)) .cacheControl(new CacheControlDirective().setNoCache(true))
@@ -133,29 +133,12 @@ public class ExampleServerR4IT implements IServerSupport {
.useHttpGet() .useHttpGet()
.execute(); .execute();
// Parameters outParams = ourClient
// .operation()
// .onType(Measure.class)
// .named("$evaluate-measure")
// .withParameters(inParams)
// .useHttpGet()
// .execute();
List<Parameters.ParametersParameterComponent> response = outParams.getParameter(); List<Parameters.ParametersParameterComponent> response = outParams.getParameter();
Assert.assertTrue(!response.isEmpty()); Assert.assertTrue(!response.isEmpty());
Parameters.ParametersParameterComponent component = response.get(0); Parameters.ParametersParameterComponent component = response.get(0);
Assert.assertTrue(component.getResource() instanceof MeasureReport); Assert.assertTrue(component.getResource() instanceof MeasureReport);
MeasureReport report = (MeasureReport) component.getResource(); MeasureReport report = (MeasureReport) component.getResource();
Assert.assertEquals("Measure/"+measureId, report.getMeasure());
for (MeasureReport.MeasureReportGroupComponent group : report.getGroup()) {
for (MeasureReport.MeasureReportGroupPopulationComponent population : group.getPopulation()) {
Assert.assertTrue(population.getCount() > 0);
}
}
} }
private Bundle loadBundle(String theLocation, FhirContext theCtx, IGenericClient theClient) throws IOException { private Bundle loadBundle(String theLocation, FhirContext theCtx, IGenericClient theClient) throws IOException {

View File

@@ -1,7 +1,8 @@
package ca.uhn.fhir.jpa.starter; package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.rest.client.api.IGenericClient; import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
@@ -12,26 +13,20 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Scanner;
public interface IServerSupport { public interface IServerSupport {
// default void putResourceDstu3(String resourceFileName, String id, FhirContext theCtx, IGenericClient theClient) { default IBaseResource loadResource(String theLocation, FhirContext theFhirContext, DaoRegistry theDaoRegistry) throws IOException {
// InputStream is = ExampleServerDstu3IT.class.getResourceAsStream(resourceFileName); String json = stringFromResource(theLocation);
// Scanner scanner = new Scanner(is).useDelimiter("\\A"); IBaseResource resource = theFhirContext.newJsonParser().parseResource(json);
// String json = scanner.hasNext() ? scanner.next() : ""; IFhirResourceDao<IBaseResource> dao = theDaoRegistry.getResourceDao(resource.getIdElement().getResourceType());
// if (dao == null) {
// boolean isJson = resourceFileName.endsWith("json"); return null;
// } else {
// IBaseResource resource = isJson ? theCtx.newJsonParser().parseResource(json) : theCtx.newXmlParser().parseResource(json); dao.update(resource);
// return resource;
// if (resource instanceof Bundle) { }
// theClient.transaction().withBundle((Bundle) resource).execute(); }
// }
// else {
// theClient.update().resource(resource).withId(id).execute();
// }
// }
default String stringFromResource(String theLocation) throws IOException { default String stringFromResource(String theLocation) throws IOException {
InputStream is = null; InputStream is = null;

View File

@@ -22,6 +22,7 @@ hapi:
# allow_placeholder_references: true # allow_placeholder_references: true
# auto_create_placeholder_reference_targets: false # auto_create_placeholder_reference_targets: false
# cql_enabled: false # cql_enabled: false
# empi_enabled: false
# default_encoding: JSON # default_encoding: JSON
# default_pretty_print: true # default_pretty_print: true
# default_page_size: 20 # default_page_size: 20

View File

@@ -183,7 +183,7 @@
"type": { "type": {
"coding": [ "coding": [
{ {
"system": "http://hl7.org/fhir/codesystem-library-type.html", "system": "http://hl7.org/fhir/library-type",
"code": "logic-library" "code": "logic-library"
} }
] ]
@@ -338,7 +338,7 @@
"type": { "type": {
"coding": [ "coding": [
{ {
"system": "http://hl7.org/fhir/codesystem-library-type.html", "system": "http://hl7.org/fhir/library-type",
"code": "logic-library" "code": "logic-library"
} }
] ]
@@ -1610,7 +1610,7 @@
"type": { "type": {
"coding": [ "coding": [
{ {
"system": "http://hl7.org/fhir/codesystem-library-type.html", "system": "http://hl7.org/fhir/library-type",
"code": "logic-library" "code": "logic-library"
} }
] ]
@@ -2177,7 +2177,7 @@
"type": { "type": {
"coding": [ "coding": [
{ {
"system": "http://hl7.org/fhir/codesystem-library-type.html", "system": "http://hl7.org/fhir/library-type",
"code": "logic-library" "code": "logic-library"
} }
] ]
@@ -2265,7 +2265,7 @@
"type": { "type": {
"coding": [ "coding": [
{ {
"system": "http://hl7.org/fhir/codesystem-library-type.html", "system": "http://hl7.org/fhir/library-type",
"code": "logic-library" "code": "logic-library"
} }
] ]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,303 @@
{
"resourceType": "MeasureReport",
"id": "measurereport-denom-EXM104-FHIR3-8.1.000-expectedresults",
"contained": [
{
"resourceType": "Bundle",
"id": "b20ba55e-a72e-493d-868d-e9f6c007d11a",
"type": "collection",
"entry": [
{
"fullUrl": "Condition/denom-EXM104-FHIR3-1",
"resource": {
"resourceType": "Condition",
"id": "denom-EXM104-FHIR3-1",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
}
}
},
{
"fullUrl": "Encounter/denom-EXM104-FHIR3-2",
"resource": {
"resourceType": "Encounter",
"id": "denom-EXM104-FHIR3-2",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/denom-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
}
},
{
"fullUrl": "Patient/denom-EXM104-FHIR3",
"resource": {
"resourceType": "Patient",
"id": "denom-EXM104-FHIR3",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\">Rick <b>JONES </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>9999999910</td></tr><tr><td>Date of birth</td><td><span>05 November 1955</span></td></tr></tbody></table></div>"
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2054-5",
"display": "Black or African American"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2135-2",
"display": "Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999910"
}
],
"name": [
{
"family": "Jones",
"given": [
"Rick"
]
}
],
"gender": "male",
"birthDate": "1955-11-05"
}
},
{
"fullUrl": "a6811e61-b875-43ac-960d-de15dab68184",
"resource": {
"resourceType": "List",
"id": "a6811e61-b875-43ac-960d-de15dab68184",
"title": "initial-population",
"entry": [
{
"item": {
"reference": "denom-EXM104-FHIR3-1"
}
},
{
"item": {
"reference": "denom-EXM104-FHIR3-2"
}
},
{
"item": {
"reference": "denom-EXM104-FHIR3"
}
}
]
}
},
{
"fullUrl": "f8cb86c0-faf5-433d-bb60-d1bbbaf67abc",
"resource": {
"resourceType": "List",
"id": "f8cb86c0-faf5-433d-bb60-d1bbbaf67abc",
"title": "denominator",
"entry": [
{
"item": {
"reference": "denom-EXM104-FHIR3-1"
}
}
]
}
}
]
}
],
"status": "complete",
"type": "individual",
"measure": {
"reference": "Measure/measure-EXM104-FHIR3-8.1.000"
},
"patient": {
"reference": "Patient/denom-EXM104-FHIR3"
},
"period": {
"start": "2019-01-01T00:00:00-07:00",
"end": "2019-12-31T00:00:00-07:00"
},
"group": [
{
"identifier": {
"value": "group-1"
},
"population": [
{
"identifier": {
"value": "initial-population-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "initial-population",
"display": "Initial Population"
}
]
},
"count": 1
},
{
"identifier": {
"value": "numerator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "numerator",
"display": "Numerator"
}
]
},
"count": 0
},
{
"identifier": {
"value": "denominator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator",
"display": "Denominator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-exclusions-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator-exclusion",
"display": "Denominator Exclusion"
}
]
},
"count": 0
}
],
"measureScore": 0.0
}
],
"evaluatedResources": {
"reference": "#b20ba55e-a72e-493d-868d-e9f6c007d11a"
}
}

View File

@@ -0,0 +1,353 @@
{
"resourceType": "MeasureReport",
"id": "measurereport-numer-EXM104-FHIR3-8.1.000-expectedresults",
"contained": [
{
"resourceType": "Bundle",
"id": "edc87d47-5804-4d85-8874-ee2d50e51c51",
"type": "collection",
"entry": [
{
"fullUrl": "MedicationRequest/numer-EXM104-FHIR3-5",
"resource": {
"resourceType": "MedicationRequest",
"id": "numer-EXM104-FHIR3-5",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00"
},
"status": "completed",
"intent": "order",
"category": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category",
"code": "discharge",
"display": "Discharge"
}
]
},
"medicationCodeableConcept": {
"coding": [
{
"system": "http://www.nlm.nih.gov/research/umls/rxnorm",
"code": "1037045",
"display": "dabigatran etexilate 150 MG Oral Capsule"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"authoredOn": "2019-12-19T08:00:00-07:00"
}
},
{
"fullUrl": "Patient/numer-EXM104-FHIR3",
"resource": {
"resourceType": "Patient",
"id": "numer-EXM104-FHIR3",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\">Louise <b>JONES </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>9999999911</td></tr><tr><td>Date of birth</td><td><span>21 November 1971</span></td></tr></tbody></table></div>"
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2106-3",
"display": "White"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2186-5",
"display": "Not Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999911"
}
],
"name": [
{
"family": "Jones",
"given": [
"Louise"
]
}
],
"gender": "female",
"birthDate": "1971-11-21"
}
},
{
"fullUrl": "475b43c7-73fd-4400-a23b-b0accf116c79",
"resource": {
"resourceType": "List",
"id": "475b43c7-73fd-4400-a23b-b0accf116c79",
"title": "initial-population",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3"
}
},
{
"item": {
"reference": "numer-EXM104-FHIR3-2"
}
},
{
"item": {
"reference": "numer-EXM104-FHIR3-1"
}
}
]
}
},
{
"fullUrl": "94606d36-6bd7-48b5-a519-7af88afa0b68",
"resource": {
"resourceType": "List",
"id": "94606d36-6bd7-48b5-a519-7af88afa0b68",
"title": "denominator",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3-1"
}
}
]
}
},
{
"fullUrl": "7720275f-18c4-435c-8eeb-b154ac3b882a",
"resource": {
"resourceType": "List",
"id": "7720275f-18c4-435c-8eeb-b154ac3b882a",
"title": "numerator",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3-5"
}
}
]
}
},
{
"fullUrl": "Encounter/numer-EXM104-FHIR3-2",
"resource": {
"resourceType": "Encounter",
"id": "numer-EXM104-FHIR3-2",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/numer-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
}
},
{
"fullUrl": "Condition/numer-EXM104-FHIR3-1",
"resource": {
"resourceType": "Condition",
"id": "numer-EXM104-FHIR3-1",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
}
}
}
]
}
],
"status": "complete",
"type": "individual",
"measure": {
"reference": "Measure/measure-EXM104-FHIR3-8.1.000"
},
"patient": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"period": {
"start": "2019-01-01T00:00:00-07:00",
"end": "2019-12-31T00:00:00-07:00"
},
"group": [
{
"identifier": {
"value": "group-1"
},
"population": [
{
"identifier": {
"value": "initial-population-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "initial-population",
"display": "Initial Population"
}
]
},
"count": 1
},
{
"identifier": {
"value": "numerator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "numerator",
"display": "Numerator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator",
"display": "Denominator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-exclusions-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator-exclusion",
"display": "Denominator Exclusion"
}
]
},
"count": 0
}
],
"measureScore": 1.0
}
],
"evaluatedResources": {
"reference": "#edc87d47-5804-4d85-8874-ee2d50e51c51"
}
}

View File

@@ -0,0 +1,480 @@
{
"resourceType": "Bundle",
"id": "tests-denom-EXM104-FHIR3-bundle",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "denom-EXM104-FHIR3-1",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
}
},
"request": {
"method": "PUT",
"url": "Condition/denom-EXM104-FHIR3-1"
}
},
{
"resource": {
"resourceType": "Encounter",
"id": "denom-EXM104-FHIR3-2",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/denom-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
},
"request": {
"method": "PUT",
"url": "Encounter/denom-EXM104-FHIR3-2"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"id": "measurereport-denom-EXM104-FHIR3",
"contained": [
{
"resourceType": "Bundle",
"id": "b20ba55e-a72e-493d-868d-e9f6c007d11a",
"type": "collection",
"entry": [
{
"fullUrl": "Condition/denom-EXM104-FHIR3-1",
"resource": {
"resourceType": "Condition",
"id": "denom-EXM104-FHIR3-1",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
}
}
},
{
"fullUrl": "Encounter/denom-EXM104-FHIR3-2",
"resource": {
"resourceType": "Encounter",
"id": "denom-EXM104-FHIR3-2",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/denom-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/denom-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
}
},
{
"fullUrl": "Patient/denom-EXM104-FHIR3",
"resource": {
"resourceType": "Patient",
"id": "denom-EXM104-FHIR3",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\">Rick <b>JONES </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>9999999910</td></tr><tr><td>Date of birth</td><td><span>05 November 1955</span></td></tr></tbody></table></div>"
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2054-5",
"display": "Black or African American"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2135-2",
"display": "Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999910"
}
],
"name": [
{
"family": "Jones",
"given": [
"Rick"
]
}
],
"gender": "male",
"birthDate": "1955-11-05"
}
},
{
"fullUrl": "a6811e61-b875-43ac-960d-de15dab68184",
"resource": {
"resourceType": "List",
"id": "a6811e61-b875-43ac-960d-de15dab68184",
"title": "initial-population",
"entry": [
{
"item": {
"reference": "denom-EXM104-FHIR3-1"
}
},
{
"item": {
"reference": "denom-EXM104-FHIR3-2"
}
},
{
"item": {
"reference": "denom-EXM104-FHIR3"
}
}
]
}
},
{
"fullUrl": "f8cb86c0-faf5-433d-bb60-d1bbbaf67abc",
"resource": {
"resourceType": "List",
"id": "f8cb86c0-faf5-433d-bb60-d1bbbaf67abc",
"title": "denominator",
"entry": [
{
"item": {
"reference": "denom-EXM104-FHIR3-1"
}
}
]
}
}
]
}
],
"status": "complete",
"type": "individual",
"measure": {
"reference": "Measure/measure-EXM104-FHIR3-8.1.000"
},
"patient": {
"reference": "Patient/denom-EXM104-FHIR3"
},
"period": {
"start": "2019-01-01T00:00:00-07:00",
"end": "2019-12-31T00:00:00-07:00"
},
"group": [
{
"identifier": {
"value": "group-1"
},
"population": [
{
"identifier": {
"value": "initial-population-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "initial-population",
"display": "Initial Population"
}
]
},
"count": 1
},
{
"identifier": {
"value": "numerator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "numerator",
"display": "Numerator"
}
]
},
"count": 0
},
{
"identifier": {
"value": "denominator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator",
"display": "Denominator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-exclusions-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator-exclusion",
"display": "Denominator Exclusion"
}
]
},
"count": 0
}
],
"measureScore": 0.0
}
],
"evaluatedResources": {
"reference": "#b20ba55e-a72e-493d-868d-e9f6c007d11a"
}
},
"request": {
"method": "PUT",
"url": "MeasureReport/measurereport-denom-EXM104-FHIR3"
}
},
{
"resource": {
"resourceType": "Patient",
"id": "denom-EXM104-FHIR3",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2054-5",
"display": "Black or African American"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2135-2",
"display": "Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999910"
}
],
"name": [
{
"family": "Jones",
"given": [
"Rick"
]
}
],
"gender": "male",
"birthDate": "1955-11-05"
},
"request": {
"method": "PUT",
"url": "Patient/denom-EXM104-FHIR3"
}
}
]
}

View File

@@ -0,0 +1,564 @@
{
"resourceType": "Bundle",
"id": "tests-numer-EXM104-FHIR3-bundle",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Condition",
"id": "numer-EXM104-FHIR3-1",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
}
},
"request": {
"method": "PUT",
"url": "Condition/numer-EXM104-FHIR3-1"
}
},
{
"resource": {
"resourceType": "Encounter",
"id": "numer-EXM104-FHIR3-2",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/numer-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
},
"request": {
"method": "PUT",
"url": "Encounter/numer-EXM104-FHIR3-2"
}
},
{
"resource": {
"resourceType": "MeasureReport",
"id": "measurereport-numer-EXM104-FHIR3",
"contained": [
{
"resourceType": "Bundle",
"id": "edc87d47-5804-4d85-8874-ee2d50e51c51",
"type": "collection",
"entry": [
{
"fullUrl": "MedicationRequest/numer-EXM104-FHIR3-5",
"resource": {
"resourceType": "MedicationRequest",
"id": "numer-EXM104-FHIR3-5",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00"
},
"status": "completed",
"intent": "order",
"category": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category",
"code": "discharge",
"display": "Discharge"
}
]
},
"medicationCodeableConcept": {
"coding": [
{
"system": "http://www.nlm.nih.gov/research/umls/rxnorm",
"code": "1037045",
"display": "dabigatran etexilate 150 MG Oral Capsule"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"authoredOn": "2019-12-19T08:00:00-07:00"
}
},
{
"fullUrl": "Patient/numer-EXM104-FHIR3",
"resource": {
"resourceType": "Patient",
"id": "numer-EXM104-FHIR3",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"text": {
"status": "generated",
"div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\">Louise <b>JONES </b></div><table class=\"hapiPropertyTable\"><tbody><tr><td>Identifier</td><td>9999999911</td></tr><tr><td>Date of birth</td><td><span>21 November 1971</span></td></tr></tbody></table></div>"
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2106-3",
"display": "White"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2186-5",
"display": "Not Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999911"
}
],
"name": [
{
"family": "Jones",
"given": [
"Louise"
]
}
],
"gender": "female",
"birthDate": "1971-11-21"
}
},
{
"fullUrl": "475b43c7-73fd-4400-a23b-b0accf116c79",
"resource": {
"resourceType": "List",
"id": "475b43c7-73fd-4400-a23b-b0accf116c79",
"title": "initial-population",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3"
}
},
{
"item": {
"reference": "numer-EXM104-FHIR3-2"
}
},
{
"item": {
"reference": "numer-EXM104-FHIR3-1"
}
}
]
}
},
{
"fullUrl": "94606d36-6bd7-48b5-a519-7af88afa0b68",
"resource": {
"resourceType": "List",
"id": "94606d36-6bd7-48b5-a519-7af88afa0b68",
"title": "denominator",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3-1"
}
}
]
}
},
{
"fullUrl": "7720275f-18c4-435c-8eeb-b154ac3b882a",
"resource": {
"resourceType": "List",
"id": "7720275f-18c4-435c-8eeb-b154ac3b882a",
"title": "numerator",
"entry": [
{
"item": {
"reference": "numer-EXM104-FHIR3-5"
}
}
]
}
},
{
"fullUrl": "Encounter/numer-EXM104-FHIR3-2",
"resource": {
"resourceType": "Encounter",
"id": "numer-EXM104-FHIR3-2",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter"
]
},
"status": "finished",
"class": {
"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
"code": "IMP",
"display": "inpatient encounter"
},
"type": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "32485007",
"display": "Hospital admission (procedure)"
}
]
}
],
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"period": {
"start": "2019-08-21T00:00:00-06:00",
"end": "2019-12-19T08:15:00-07:00"
},
"diagnosis": [
{
"condition": {
"reference": "Condition/numer-EXM104-FHIR3-1"
},
"role": {
"coding": [
{
"system": "http://hl7.org/fhir/diagnosis-role",
"code": "billing",
"display": "Billing"
}
]
},
"rank": 1
}
]
}
},
{
"fullUrl": "Condition/numer-EXM104-FHIR3-1",
"resource": {
"resourceType": "Condition",
"id": "numer-EXM104-FHIR3-1",
"meta": {
"versionId": "1",
"lastUpdated": "2019-12-18T22:42:17.748-07:00",
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition"
]
},
"verificationStatus": "confirmed",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/condition-category",
"code": "encounter-diagnosis",
"display": "Encounter Diagnosis"
}
]
}
],
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "116288000",
"display": "Paralytic stroke (disorder)"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
}
}
}
]
}
],
"status": "complete",
"type": "individual",
"measure": {
"reference": "Measure/measure-EXM104-FHIR3-8.1.000"
},
"patient": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"period": {
"start": "2019-01-01T00:00:00-07:00",
"end": "2019-12-31T00:00:00-07:00"
},
"group": [
{
"identifier": {
"value": "group-1"
},
"population": [
{
"identifier": {
"value": "initial-population-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "initial-population",
"display": "Initial Population"
}
]
},
"count": 1
},
{
"identifier": {
"value": "numerator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "numerator",
"display": "Numerator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator",
"display": "Denominator"
}
]
},
"count": 1
},
{
"identifier": {
"value": "denominator-exclusions-identifier"
},
"code": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/measure-population",
"code": "denominator-exclusion",
"display": "Denominator Exclusion"
}
]
},
"count": 0
}
],
"measureScore": 1.0
}
],
"evaluatedResources": {
"reference": "#edc87d47-5804-4d85-8874-ee2d50e51c51"
}
},
"request": {
"method": "PUT",
"url": "MeasureReport/measurereport-numer-EXM104-FHIR3"
}
},
{
"resource": {
"resourceType": "MedicationRequest",
"id": "numer-EXM104-FHIR3-5",
"status": "completed",
"intent": "order",
"category": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category",
"code": "discharge",
"display": "Discharge"
}
]
},
"medicationCodeableConcept": {
"coding": [
{
"system": "http://www.nlm.nih.gov/research/umls/rxnorm",
"code": "1037045",
"display": "dabigatran etexilate 150 MG Oral Capsule"
}
]
},
"subject": {
"reference": "Patient/numer-EXM104-FHIR3"
},
"authoredOn": "2019-12-19T08:00:00-07:00"
},
"request": {
"method": "PUT",
"url": "MedicationRequest/numer-EXM104-FHIR3-5"
}
},
{
"resource": {
"resourceType": "Patient",
"id": "numer-EXM104-FHIR3",
"meta": {
"profile": [
"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient"
]
},
"extension": [
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2106-3",
"display": "White"
}
}
]
},
{
"url": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity",
"extension": [
{
"url": "ombCategory",
"valueCoding": {
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2186-5",
"display": "Not Hispanic or Latino"
}
}
]
}
],
"identifier": [
{
"use": "usual",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR",
"display": "Medical Record Number"
}
]
},
"system": "http://hospital.smarthealthit.org",
"value": "9999999911"
}
],
"name": [
{
"family": "Jones",
"given": [
"Louise"
]
}
],
"gender": "female",
"birthDate": "1971-11-21"
},
"request": {
"method": "PUT",
"url": "Patient/numer-EXM104-FHIR3"
}
}
]
}

File diff suppressed because it is too large Load Diff