use of org.hl7.fhir.r4.model.ResourceType in project pathling by aehrc.
the class ManifestConverterTest method convertsManifest.
@Test
void convertsManifest() {
database = new Database(configuration, spark, fhirEncoders, executor);
final PassportScope passportScope = new PassportScope();
final VisaManifest manifest = new VisaManifest();
manifest.setPatientIds(Arrays.asList(PATIENT_ID_1, PATIENT_ID_2, PATIENT_ID_3, PATIENT_ID_4));
final ManifestConverter manifestConverter = new ManifestConverter(configuration, fhirContext);
manifestConverter.populateScope(passportScope, manifest);
// Convert the scope to JSON and compare it to a test fixture.
final Gson gson = new GsonBuilder().create();
final String json = gson.toJson(passportScope);
assertJson("responses/ManifestConverterTest/convertsManifest.json", json);
// our test patients.
for (final ResourceType resourceType : passportScope.keySet()) {
if (AVAILABLE_RESOURCE_TYPES.contains(resourceType)) {
boolean found = false;
for (final String filter : passportScope.get(resourceType)) {
final Dataset<Row> dataset = assertThatResultOf(resourceType, filter).isElementPath(BooleanPath.class).selectResult().apply(result -> result.filter(result.columns()[1])).getDataset();
if (dataset.count() > 0) {
found = true;
}
}
assertTrue(found, "No results found for " + resourceType.toCode());
}
}
}
use of org.hl7.fhir.r4.model.ResourceType in project pathling by aehrc.
the class AbstractParserTest method mockResource.
void mockResource(final ResourceType... resourceTypes) {
for (final ResourceType resourceType : resourceTypes) {
final Dataset<Row> dataset = TestHelpers.getDatasetForResourceType(spark, resourceType);
when(database.read(resourceType)).thenReturn(dataset);
}
}
use of org.hl7.fhir.r4.model.ResourceType in project pathling by aehrc.
the class ImportExecutor method execute.
/**
* Executes an import request.
*
* @param inParams a FHIR {@link Parameters} object describing the import request
* @return a FHIR {@link OperationOutcome} resource describing the result
*/
@Nonnull
public OperationOutcome execute(@Nonnull @ResourceParam final Parameters inParams) {
// Parse and validate the JSON request.
final List<ParametersParameterComponent> sourceParams = inParams.getParameter().stream().filter(param -> "source".equals(param.getName())).collect(Collectors.toList());
if (sourceParams.isEmpty()) {
throw new InvalidUserInputError("Must provide at least one source parameter");
}
log.info("Received $import request");
// the corresponding table in the warehouse.
for (final ParametersParameterComponent sourceParam : sourceParams) {
final ParametersParameterComponent resourceTypeParam = sourceParam.getPart().stream().filter(param -> "resourceType".equals(param.getName())).findFirst().orElseThrow(() -> new InvalidUserInputError("Must provide resourceType for each source"));
final ParametersParameterComponent urlParam = sourceParam.getPart().stream().filter(param -> "url".equals(param.getName())).findFirst().orElseThrow(() -> new InvalidUserInputError("Must provide url for each source"));
// The mode parameter defaults to 'overwrite'.
final ImportMode importMode = sourceParam.getPart().stream().filter(param -> "mode".equals(param.getName()) && param.getValue() instanceof CodeType).findFirst().map(param -> ImportMode.fromCode(((CodeType) param.getValue()).asStringValue())).orElse(ImportMode.OVERWRITE);
final String resourceCode = ((CodeType) resourceTypeParam.getValue()).getCode();
final ResourceType resourceType = ResourceType.fromCode(resourceCode);
// Get an encoder based on the declared resource type within the source parameter.
final ExpressionEncoder<IBaseResource> fhirEncoder;
try {
fhirEncoder = fhirEncoders.of(resourceType.toCode());
} catch (final UnsupportedResourceError e) {
throw new InvalidUserInputError("Unsupported resource type: " + resourceCode);
}
// Read the resources from the source URL into a dataset of strings.
final Dataset<String> jsonStrings = readStringsFromUrl(urlParam);
// Parse each line into a HAPI FHIR object, then encode to a Spark dataset.
final Dataset<IBaseResource> resources = jsonStrings.map(jsonToResourceConverter(), fhirEncoder);
log.info("Importing {} resources (mode: {})", resourceType.toCode(), importMode.getCode());
if (importMode == ImportMode.OVERWRITE) {
database.overwrite(resourceType, resources.toDF());
} else {
database.merge(resourceType, resources.toDF());
}
}
// We return 200, as this operation is currently synchronous.
log.info("Import complete");
// Construct a response.
final OperationOutcome opOutcome = new OperationOutcome();
final OperationOutcomeIssueComponent issue = new OperationOutcomeIssueComponent();
issue.setSeverity(IssueSeverity.INFORMATION);
issue.setCode(IssueType.INFORMATIONAL);
issue.setDiagnostics("Data import completed successfully");
opOutcome.getIssue().add(issue);
return opOutcome;
}
use of org.hl7.fhir.r4.model.ResourceType in project pathling by aehrc.
the class UpdateProvider method update.
/**
* Implements the update operation.
*
* @param id the id of the resource to be updated
* @param resource the resource to be updated
* @return a {@link MethodOutcome} describing the result of the operation
* @see <a href="https://hl7.org/fhir/R4/http.html#update">update</a>
*/
@Update
@OperationAccess("update")
@SuppressWarnings("UnusedReturnValue")
public MethodOutcome update(@Nullable @IdParam final IdType id, @Nullable @ResourceParam final IBaseResource resource) {
checkUserInput(id != null && !id.isEmpty(), "ID must be supplied");
checkUserInput(resource != null, "Resource must be supplied");
final String resourceId = id.getIdPart();
final IBaseResource preparedResource = prepareResourceForUpdate(resource, resourceId);
database.merge(resourceType, preparedResource);
final MethodOutcome outcome = new MethodOutcome();
outcome.setId(resource.getIdElement());
outcome.setResource(preparedResource);
return outcome;
}
use of org.hl7.fhir.r4.model.ResourceType in project pathling by aehrc.
the class BatchProvider method batch.
@Transaction
@OperationAccess("batch")
public Bundle batch(@Nullable @TransactionParam final Bundle bundle) {
checkUserInput(bundle != null, "Bundle must be provided");
final Map<ResourceType, List<IBaseResource>> resourcesForUpdate = new EnumMap<>(ResourceType.class);
final Bundle response = new Bundle();
response.setType(BATCHRESPONSE);
// the responses should these operations be successful.
for (final Bundle.BundleEntryComponent entry : bundle.getEntry()) {
processEntry(resourcesForUpdate, response, entry);
}
if (!resourcesForUpdate.isEmpty()) {
// Merge in any updated resources into their respective tables.
update(resourcesForUpdate);
}
return response;
}
Aggregations