Dont crash indexing contained references on Bundle (#4881)

* Dont crash indexing contained references on Bundle

* Add changelog
This commit is contained in:
James Agnew 2023-05-14 21:33:32 -04:00 committed by GitHub
parent a308f60e16
commit 8cf14c8c0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1,6 @@
---
type: fix
issue: 4881
title: "When _Index Contained References_ is enabled in the JPA server, Bundle resources could not be
stored or indexed due to an incompatibility with the default Bundle search parameters. This has been
corrected."

View File

@ -224,6 +224,9 @@ public class SearchParamExtractorService {
@Override
public IBaseResource fetchResourceAtPath(@Nonnull PathAndRef thePathAndRef) {
if (thePathAndRef.getRef() == null) {
return null;
}
return findContainedResource(containedResources, thePathAndRef.getRef());
}
};

View File

@ -1,5 +1,6 @@
package ca.uhn.fhir.jpa.dao.r4;
import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.i18n.Msg;
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
import ca.uhn.fhir.jpa.api.dao.IFhirResourceDao;
@ -13,11 +14,14 @@ import ca.uhn.fhir.rest.api.server.IBundleProvider;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import org.hl7.fhir.instance.model.api.IIdType;
import org.hl7.fhir.r4.model.AuditEvent;
import org.hl7.fhir.r4.model.Bundle;
import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.Device;
import org.hl7.fhir.r4.model.DomainResource;
import org.hl7.fhir.r4.model.Encounter;
import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.Location;
import org.hl7.fhir.r4.model.MessageHeader;
import org.hl7.fhir.r4.model.Observation;
import org.hl7.fhir.r4.model.Organization;
import org.hl7.fhir.r4.model.Patient;
@ -37,6 +41,7 @@ import java.util.List;
import static org.apache.commons.lang3.StringUtils.countMatches;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.in;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
@ -72,6 +77,37 @@ public class ChainingR4SearchTest extends BaseJpaR4Test {
myStorageSettings.setIndexMissingFields(JpaStorageSettings.IndexEnabledEnum.DISABLED);
}
@Test
public void testIndexSearchParamPointingToResource() {
// Setup
myStorageSettings.setIndexOnContainedResources(true);
Bundle inputBundle = new Bundle();
inputBundle.setType(Bundle.BundleType.MESSAGE);
MessageHeader msgHeader = new MessageHeader();
msgHeader.setEvent(new Coding("http://foo", "bar", "blah"));
inputBundle.addEntry().setResource(msgHeader);
RuntimeSearchParam sp = mySearchParamRegistry.getActiveSearchParam("Bundle", "message");
assertEquals("Bundle.entry[0].resource", sp.getPath());
assertThat(sp.getBase(), contains("Bundle"));
assertEquals(RuntimeSearchParam.RuntimeSearchParamStatusEnum.ACTIVE, sp.getStatus());
// Test
myBundleDao.create(inputBundle, mySrd);
// Verify - We'll check that the right indexes got written, but the main test is that
// the create step didn't crash
runInTransaction(()->{
assertEquals(0, myResourceIndexedSearchParamStringDao.count());
assertEquals(1, myResourceIndexedSearchParamTokenDao.count());
assertEquals(0, myResourceLinkDao.count());
});
}
@Test
public void testShouldResolveATwoLinkChainWithStandAloneResourcesWithoutContainedResourceIndexing() throws Exception {