diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/api/GroupBulkDataExportOptions.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/api/GroupBulkDataExportOptions.java index ee267f38043..fb80bf2843f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/api/GroupBulkDataExportOptions.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/api/GroupBulkDataExportOptions.java @@ -7,13 +7,19 @@ import java.util.Set; public class GroupBulkDataExportOptions extends BulkDataExportOptions { private final IIdType myGroupId; + private final boolean myMdm; - public GroupBulkDataExportOptions(String theOutputFormat, Set theResourceTypes, Date theSince, Set theFilters, IIdType theGroupId) { + public GroupBulkDataExportOptions(String theOutputFormat, Set theResourceTypes, Date theSince, Set theFilters, IIdType theGroupId, boolean theMdm) { super(theOutputFormat, theResourceTypes, theSince, theFilters); myGroupId = theGroupId; + myMdm = theMdm; } public IIdType getGroupId() { return myGroupId; } + + public boolean isMdm() { + return myMdm; + } } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/provider/BulkDataExportProvider.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/provider/BulkDataExportProvider.java index 21ed3826114..1f4fd095a91 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/provider/BulkDataExportProvider.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/provider/BulkDataExportProvider.java @@ -191,6 +191,7 @@ public class BulkDataExportProvider { @OperationParam(name = JpaConstants.PARAM_EXPORT_TYPE, min = 0, max = 1, typeName = "string") IPrimitiveType theType, @OperationParam(name = JpaConstants.PARAM_EXPORT_SINCE, min = 0, max = 1, typeName = "instant") IPrimitiveType theSince, @OperationParam(name = JpaConstants.PARAM_EXPORT_TYPE_FILTER, min = 0, max = 1, typeName = "string") IPrimitiveType theTypeFilter, + @OperationParam(name = JpaConstants.PARAM_EXPORT_MDM, min = 0, max = 1, typeName = "boolean") IPrimitiveType theMdm, ServletRequestDetails theRequestDetails ) { @@ -216,7 +217,7 @@ public class BulkDataExportProvider { if (theTypeFilter != null) { filters = ArrayUtil.commaSeparatedListToCleanSet(theTypeFilter.getValueAsString()); } - IBulkDataExportSvc.JobInfo outcome = myBulkDataExportSvc.submitJob(new GroupBulkDataExportOptions(outputFormat, resourceTypes, since, filters, theIdParam)); + IBulkDataExportSvc.JobInfo outcome = myBulkDataExportSvc.submitJob(new GroupBulkDataExportOptions(outputFormat, resourceTypes, since, filters, theIdParam, theMdm.getValue())); String serverBase = getServerBase(theRequestDetails); String pollLocation = serverBase + "/" + JpaConstants.OPERATION_EXPORT_POLL_STATUS + "?" + JpaConstants.PARAM_EXPORT_POLL_STATUS_JOB_ID + "=" + outcome.getJobId(); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/svc/BulkDataExportSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/svc/BulkDataExportSvcImpl.java index 8a28665c589..cd74be4c4f4 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/svc/BulkDataExportSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/bulk/svc/BulkDataExportSvcImpl.java @@ -26,6 +26,7 @@ import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.api.model.ExpungeOptions; import ca.uhn.fhir.jpa.batch.api.IBatchJobSubmitter; import ca.uhn.fhir.jpa.bulk.api.BulkDataExportOptions; +import ca.uhn.fhir.jpa.bulk.api.GroupBulkDataExportOptions; import ca.uhn.fhir.jpa.bulk.api.IBulkDataExportSvc; import ca.uhn.fhir.jpa.bulk.model.BulkJobStatusEnum; import ca.uhn.fhir.jpa.dao.data.IBulkExportCollectionDao; @@ -76,7 +77,7 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { private static final Long READ_CHUNK_SIZE = 10L; private static final Logger ourLog = LoggerFactory.getLogger(BulkDataExportSvcImpl.class); - private int myReuseBulkExportForMillis = (int) (60 * DateUtils.MILLIS_PER_MINUTE); + private final int myReuseBulkExportForMillis = (int) (60 * DateUtils.MILLIS_PER_MINUTE); @Autowired private IBulkExportJobDao myBulkExportJobDao; @@ -101,7 +102,7 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { @Qualifier("bulkExportJob") private org.springframework.batch.core.Job myBulkExportJob; - private int myRetentionPeriod = (int) (2 * DateUtils.MILLIS_PER_HOUR); + private final int myRetentionPeriod = (int) (2 * DateUtils.MILLIS_PER_HOUR); /** * This method is called by the scheduler to run a pass of the @@ -253,6 +254,10 @@ public class BulkDataExportSvcImpl implements IBulkDataExportSvc { if (theBulkDataExportOptions.getFilters() != null && theBulkDataExportOptions.getFilters().size() > 0) { requestBuilder.append("&").append(JpaConstants.PARAM_EXPORT_TYPE_FILTER).append("=").append(String.join(",", escapeUrlParams(theBulkDataExportOptions.getFilters()))); } + if (theBulkDataExportOptions instanceof GroupBulkDataExportOptions) { + GroupBulkDataExportOptions groupOptions = (GroupBulkDataExportOptions) theBulkDataExportOptions; + requestBuilder.append("&").append(JpaConstants.PARAM_EXPORT_GROUP_ID).append("=").append(groupOptions.getGroupId().getValue()); + } String request = requestBuilder.toString(); Date cutoff = DateUtils.addMilliseconds(new Date(), -myReuseBulkExportForMillis); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/bulk/BulkDataExportProviderTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/bulk/BulkDataExportProviderTest.java index 136fdad7e95..408866667d6 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/bulk/BulkDataExportProviderTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/bulk/BulkDataExportProviderTest.java @@ -27,6 +27,7 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; +import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.IdType; import org.hl7.fhir.r4.model.InstantType; import org.hl7.fhir.r4.model.Parameters; @@ -50,6 +51,7 @@ import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.notNullValue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; @@ -306,6 +308,7 @@ public class BulkDataExportProviderTest { input.addParameter(JpaConstants.PARAM_EXPORT_TYPE, new StringType("Observation, DiagnosticReport")); input.addParameter(JpaConstants.PARAM_EXPORT_SINCE, now); input.addParameter(JpaConstants.PARAM_EXPORT_TYPE_FILTER, new StringType("Observation?code=OBSCODE,DiagnosticReport?code=DRCODE")); + input.addParameter(JpaConstants.PARAM_EXPORT_MDM, new BooleanType(true)); ourLog.info(myCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(input)); @@ -327,5 +330,6 @@ public class BulkDataExportProviderTest { assertThat(options.getSince(), notNullValue()); assertThat(options.getFilters(), containsInAnyOrder("Observation?code=OBSCODE", "DiagnosticReport?code=DRCODE")); assertEquals(GROUP_ID, options.getGroupId().getValue()); + assertTrue(options.isMdm()); } } diff --git a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/util/JpaConstants.java b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/util/JpaConstants.java index f08e9775eac..b70ba1ccfba 100644 --- a/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/util/JpaConstants.java +++ b/hapi-fhir-jpaserver-model/src/main/java/ca/uhn/fhir/jpa/model/util/JpaConstants.java @@ -183,6 +183,16 @@ public class JpaConstants { */ public static final String PARAM_EXPORT_TYPE_FILTER = "_typeFilter"; + /** + * The [id] of the group when $export is called on /Group/[id]/$export + */ + public static final Object PARAM_EXPORT_GROUP_ID = "_groupId"; + + /** + * Whether mdm should be performed on group export items to expand the group items to linked items before performing the export + */ + public static final String PARAM_EXPORT_MDM = "_mdm"; + /** * Parameter for delete to indicate the deleted resources should also be expunged */