diff --git a/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/domain/SearchQueryRenderer.java b/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/domain/SearchQueryRenderer.java index 14e3ea312fc..4468117691b 100644 --- a/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/domain/SearchQueryRenderer.java +++ b/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/domain/SearchQueryRenderer.java @@ -138,9 +138,10 @@ public class SearchQueryRenderer implements SearchQueryVisitor<QueryData> { * @param identityCache * @param rowOffset * @param rowsPerPage + * @param includeResourceData */ public SearchQueryRenderer(JDBCIdentityCache identityCache, - int rowOffset, int rowsPerPage, boolean includeResourceData) { + int rowOffset, int rowsPerPage, boolean includeResourceData) { this.identityCache = identityCache; this.rowOffset = rowOffset; this.rowsPerPage = rowsPerPage; diff --git a/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/impl/FHIRPersistenceJDBCImpl.java b/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/impl/FHIRPersistenceJDBCImpl.java index fd999509e33..d291a1fd840 100644 --- a/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/impl/FHIRPersistenceJDBCImpl.java +++ b/fhir-persistence-jdbc/src/main/java/com/ibm/fhir/persistence/jdbc/impl/FHIRPersistenceJDBCImpl.java @@ -1536,10 +1536,11 @@ private List<com.ibm.fhir.persistence.jdbc.dto.Resource> getResourceDTOs(Resourc /** * Converts the passed Resource Data Transfer Object collection to a collection of FHIR Resource objects. + * @param resourceDao * @param resourceDTOList * @param resourceType * @param elements - * @param allowNullResource + * @param includeResourceData * @return * @throws FHIRException * @throws IOException diff --git a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/MultiResourceResult.java b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/MultiResourceResult.java index eb31815e02b..21a6121fb33 100644 --- a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/MultiResourceResult.java +++ b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/MultiResourceResult.java @@ -47,7 +47,7 @@ public boolean isSuccess() { /** * The resource results returned from the interaction * @return - * An unmodifiable list containing immutable objects of type {@link ResourceResource<T>} + * An unmodifiable list containing immutable objects of type {@link ResourceResult<T>} */ public List<ResourceResult<? extends Resource>> getResourceResults() { return this.resourceResults; diff --git a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/ResourceResult.java b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/ResourceResult.java index 262a7d8e38b..91c7ae4af31 100644 --- a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/ResourceResult.java +++ b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/ResourceResult.java @@ -14,7 +14,7 @@ import com.ibm.fhir.model.resource.Resource; /** - * The base wrapper result wrapper used to represent a resource being returned from a + * The base result wrapper used to represent a resource being returned from a * persistence interaction. * Instances are immutable and can be constructed via {@code new ResourceResult.Builder<T>()}. */ @@ -40,9 +40,23 @@ private ResourceResult(Builder<T> builder) { lastUpdated = builder.lastUpdated; } + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append(resourceTypeName); + result.append("/"); + result.append(logicalId); + result.append("/_history/"); + result.append(version); + + if (deleted) { + result.append(" [deleted]"); + } + return result.toString(); + } + /** * Create a Builder for building instances of this class - * @param <T> * @return */ public static <T extends Resource> ResourceResult.Builder<T> builder() { diff --git a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/util/FHIRPersistenceUtil.java b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/util/FHIRPersistenceUtil.java index 56db3456ec1..d7ede80cc29 100644 --- a/fhir-persistence/src/main/java/com/ibm/fhir/persistence/util/FHIRPersistenceUtil.java +++ b/fhir-persistence/src/main/java/com/ibm/fhir/persistence/util/FHIRPersistenceUtil.java @@ -183,59 +183,6 @@ public static FHIRSystemHistoryContext parseSystemHistoryParameters(Map<String, return context; } - - /** - * Create a minimal deleted resource marker from the given resource - * - * @param deletedResource - * @return deletedResourceMarker - */ - @Deprecated - public static Resource createDeletedResourceMarker(Resource deletedResource) { - try { - // Build a fresh meta with only versionid/lastupdated defined - Meta meta = Meta.builder() - .versionId(deletedResource.getMeta().getVersionId()) - .lastUpdated(deletedResource.getMeta().getLastUpdated()) - .build(); - - // TODO this will clone the entire resource, but we only want the minimal parameters - Resource deletedResourceMarker = deletedResource.toBuilder() - .id(deletedResource.getId()) - .meta(meta) - .build(); - - return deletedResourceMarker; - } catch (Exception e) { - throw new IllegalStateException("Error while creating deletion marker for resource of type " - + deletedResource.getClass().getSimpleName()); - } - } - - public static Resource createDeletedResourceMarker(String resourceType, String logicalId, int version, java.time.Instant lastUpdated) { - // TODO do we even need this deletion marker now that we have ResourceResult? - try { - // Build a fresh meta with only versionid/lastupdated defined - Meta meta = Meta.builder() - .versionId(Id.of(Integer.toString(version))) - .lastUpdated(Instant.of(lastUpdated.atZone(ZoneOffset.UTC))) - .build(); - - // Build a minimal instance of Resource - Class<? extends Resource> resourceClass = ModelSupport.getResourceType(resourceType); - Resource resource = resourceClass.getDeclaredConstructor().newInstance() - .toBuilder() - .id(logicalId) - .meta(meta) - .build(); - - return resource; - } catch (Exception e) { - throw new IllegalStateException("Error while creating deletion marker for resource of type " - + resourceType); - } - } - /** * Create a new {@link ResourceResult} instance to represent a deleted or partially * erased resource diff --git a/fhir-persistence/src/test/java/com/ibm/fhir/persistence/search/test/AbstractPLSearchTest.java b/fhir-persistence/src/test/java/com/ibm/fhir/persistence/search/test/AbstractPLSearchTest.java index 01366aeef70..67e1c409cfc 100644 --- a/fhir-persistence/src/test/java/com/ibm/fhir/persistence/search/test/AbstractPLSearchTest.java +++ b/fhir-persistence/src/test/java/com/ibm/fhir/persistence/search/test/AbstractPLSearchTest.java @@ -189,7 +189,7 @@ protected boolean searchReturnsResource(Class<? extends Resource> resourceTypeTo * @throws Exception */ protected boolean searchReturnsResourceResult(Class<? extends Resource> resourceTypeToSearch, Map<String, List<String>> queryParms, String expectedLogicalId, - boolean includesData) throws Exception { + boolean includesData) throws Exception { FHIRSearchContext searchContext = SearchUtil.parseQueryParameters(resourceTypeToSearch, queryParms); searchContext.setIncludeResourceData(includesData); List<ResourceResult<? extends Resource>> resourceResults = runQueryTest( @@ -198,7 +198,7 @@ protected boolean searchReturnsResourceResult(Class<? extends Resource> resource assertNotNull(resourceResults); - // Find the logicalId in the output and check the the includesData matches + // Find the logicalId in the output and check that the includesData matches boolean result = false; for (ResourceResult<? extends Resource> rr: resourceResults) { if (rr.getLogicalId().equals(expectedLogicalId)) { diff --git a/fhir-server/src/main/java/com/ibm/fhir/server/util/FHIRRestHelper.java b/fhir-server/src/main/java/com/ibm/fhir/server/util/FHIRRestHelper.java index fa422c02293..bbf55c9bdb2 100644 --- a/fhir-server/src/main/java/com/ibm/fhir/server/util/FHIRRestHelper.java +++ b/fhir-server/src/main/java/com/ibm/fhir/server/util/FHIRRestHelper.java @@ -2234,6 +2234,10 @@ private List<Issue> performSearchReferenceChecks(String resourceType, List<Query // Loop through the resources, looking for versioned references and references to multiple resource types for the same logical ID for (ResourceResult<? extends Resource> resourceResult : matchResources) { Resource resource = resourceResult.getResource(); + if (resource == null) { + log.warning("Unexpected null resource: " + resourceResult.toString()); + throw new FHIRPersistenceException("Search reference check contained a null resource"); + } // A flag that indicates whether we need to take a closer look at the reference values or not boolean needsEval = false; @@ -2242,7 +2246,7 @@ private List<Issue> performSearchReferenceChecks(String resourceType, List<Query // then we'll need to check that they aren't used for chaining // TODO Should we pass the previously-gathered set of references into the method instead? CollectingVisitor<Reference> refCollector = new CollectingVisitor<>(Reference.class); - resource.accept(refCollector); // TODO protect against null resource? + resource.accept(refCollector); List<Reference> references = refCollector.getResult(); for (Reference ref : references) { if (ref.getReference() != null && ref.getReference().getValue() != null diff --git a/fhir-server/src/test/java/com/ibm/fhir/server/util/FHIRRestHelperTest.java b/fhir-server/src/test/java/com/ibm/fhir/server/util/FHIRRestHelperTest.java index 2b824aa7a27..4c4ec9b09a9 100644 --- a/fhir-server/src/test/java/com/ibm/fhir/server/util/FHIRRestHelperTest.java +++ b/fhir-server/src/test/java/com/ibm/fhir/server/util/FHIRRestHelperTest.java @@ -1984,7 +1984,6 @@ public void testBundleSearchBundleWithNullRsrcAndNoId() throws Exception { .build()) .build(); - // TODO make this work with the new search result semantics List<ResourceResult<? extends Resource>> resourceResults = new ArrayList<>(); resourceResults.add(ResourceResult.builder().build()); resourceResults.add(ResourceResult.builder().resource(patientNoId).build());