diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java index 8ec617e6084..ec4e07107de 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/search/reindex/ResourceReindexingSvcImpl.java @@ -148,7 +148,7 @@ public class ResourceReindexingSvcImpl implements IResourceReindexingSvc { initExecutor(); } - private void initExecutor() { + public void initExecutor() { // Create the threadpool executor used for reindex jobs int reindexThreadCount = myDaoConfig.getReindexThreadCount(); RejectedExecutionHandler rejectHandler = new Executors.BlockPolicy(); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4UniqueSearchParamTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4UniqueSearchParamTest.java index 6e82e9f4887..6822403acce 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4UniqueSearchParamTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4UniqueSearchParamTest.java @@ -9,10 +9,12 @@ import ca.uhn.fhir.jpa.model.entity.ResourceIndexedCompositeStringUnique; import ca.uhn.fhir.jpa.model.entity.ResourceTable; import ca.uhn.fhir.jpa.model.search.StorageProcessingMessage; import ca.uhn.fhir.jpa.search.DatabaseBackedPagingProvider; +import ca.uhn.fhir.jpa.search.reindex.ResourceReindexingSvcImpl; import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam; import ca.uhn.fhir.jpa.searchparam.SearchParamConstants; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry; +import ca.uhn.fhir.jpa.util.SpringObjectCaster; import ca.uhn.fhir.rest.api.server.IBundleProvider; import ca.uhn.fhir.rest.param.DateParam; import ca.uhn.fhir.rest.param.ReferenceParam; @@ -30,7 +32,9 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatchers; +import org.springframework.aop.framework.AopProxyUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.ProxyUtils; import org.springframework.test.context.TestPropertySource; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; @@ -64,11 +68,15 @@ public class FhirResourceDaoR4UniqueSearchParamTest extends BaseJpaR4Test { private List myMessages = new ArrayList<>(); @After - public void after() { + public void after() throws Exception { myModelConfig.setDefaultSearchParamsCanBeOverridden(new ModelConfig().isDefaultSearchParamsCanBeOverridden()); myDaoConfig.setUniqueIndexesCheckedBeforeSave(new DaoConfig().isUniqueIndexesCheckedBeforeSave()); myDaoConfig.setSchedulingDisabled(new DaoConfig().isSchedulingDisabled()); myDaoConfig.setUniqueIndexesEnabled(new DaoConfig().isUniqueIndexesEnabled()); + myDaoConfig.setReindexThreadCount(new DaoConfig().getReindexThreadCount()); + + ResourceReindexingSvcImpl svc = SpringObjectCaster.getTargetObject(myResourceReindexingSvc, ResourceReindexingSvcImpl.class); + svc.initExecutor(); } @Before @@ -647,8 +655,15 @@ public class FhirResourceDaoR4UniqueSearchParamTest extends BaseJpaR4Test { } @Test - public void testDuplicateUniqueValuesAreReIndexed() { + public void testDuplicateUniqueValuesAreReIndexed() throws Exception { myDaoConfig.setSchedulingDisabled(true); + myDaoConfig.setReindexThreadCount(1); + + ResourceReindexingSvcImpl svc = SpringObjectCaster.getTargetObject(myResourceReindexingSvc, ResourceReindexingSvcImpl.class); + svc.initExecutor(); + + List uniqueSearchParams = mySearchParamRegistry.getActiveUniqueSearchParams("Observation"); + assertEquals(0, uniqueSearchParams.size()); Patient pt1 = new Patient(); pt1.setActive(true); @@ -676,7 +691,7 @@ public class FhirResourceDaoR4UniqueSearchParamTest extends BaseJpaR4Test { createUniqueObservationSubjectDateCode(); - List uniqueSearchParams = mySearchParamRegistry.getActiveUniqueSearchParams("Observation"); + uniqueSearchParams = mySearchParamRegistry.getActiveUniqueSearchParams("Observation"); assertEquals(1, uniqueSearchParams.size()); assertEquals(3, uniqueSearchParams.get(0).getComponents().size()); @@ -685,12 +700,14 @@ public class FhirResourceDaoR4UniqueSearchParamTest extends BaseJpaR4Test { assertEquals(1, myResourceReindexingSvc.forceReindexingPass()); assertEquals(0, myResourceReindexingSvc.forceReindexingPass()); - List uniques = myResourceIndexedCompositeStringUniqueDao.findAll(); - assertEquals(uniques.toString(), 1, uniques.size()); - assertThat(uniques.get(0).getResource().getIdDt().toUnqualifiedVersionless().getValue(), either(equalTo("Observation/" + id2.getIdPart())).or(equalTo("Observation/" + id3.getIdPart()))); - assertEquals("Observation?code=foo%7Cbar&date=2011-01-01&subject=Patient%2F" + id1.getIdPart(), uniques.get(0).getIndexString()); + runInTransaction(()->{ + List uniques = myResourceIndexedCompositeStringUniqueDao.findAll(); + assertEquals(uniques.toString(), 1, uniques.size()); + assertThat(uniques.get(0).getResource().getIdDt().toUnqualifiedVersionless().getValue(), either(equalTo("Observation/" + id2.getIdPart())).or(equalTo("Observation/" + id3.getIdPart()))); + assertEquals("Observation?code=foo%7Cbar&date=2011-01-01&subject=Patient%2F" + id1.getIdPart(), uniques.get(0).getIndexString()); - myResourceIndexedCompositeStringUniqueDao.deleteAll(); + myResourceIndexedCompositeStringUniqueDao.deleteAll(); + }); assertEquals(1, mySearchParamRegistry.getActiveUniqueSearchParams("Observation").size()); @@ -700,10 +717,12 @@ public class FhirResourceDaoR4UniqueSearchParamTest extends BaseJpaR4Test { myResourceReindexingSvc.forceReindexingPass(); assertEquals(0, myResourceReindexingSvc.forceReindexingPass()); - uniques = myResourceIndexedCompositeStringUniqueDao.findAll(); - assertEquals(uniques.toString(), 1, uniques.size()); - assertThat(uniques.get(0).getResource().getIdDt().toUnqualifiedVersionless().getValue(), either(equalTo("Observation/" + id2.getIdPart())).or(equalTo("Observation/" + id3.getIdPart()))); - assertEquals("Observation?code=foo%7Cbar&date=2011-01-01&subject=Patient%2F" + id1.getIdPart(), uniques.get(0).getIndexString()); + runInTransaction(()->{ + List uniques = myResourceIndexedCompositeStringUniqueDao.findAll(); + assertEquals(uniques.toString(), 1, uniques.size()); + assertThat(uniques.get(0).getResource().getIdDt().toUnqualifiedVersionless().getValue(), either(equalTo("Observation/" + id2.getIdPart())).or(equalTo("Observation/" + id3.getIdPart()))); + assertEquals("Observation?code=foo%7Cbar&date=2011-01-01&subject=Patient%2F" + id1.getIdPart(), uniques.get(0).getIndexString()); + }); }