mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-16 09:55:09 +00:00
Reindex batch job fails when processing deleted resources. (#4482)
* adding changelog. * Providing solution and adding changelog. * Adding new test. --------- Co-authored-by: peartree <etienne.poirier@smilecdr.com>
This commit is contained in:
parent
67ace43492
commit
dd8c8a3b24
@ -0,0 +1,5 @@
|
||||
---
|
||||
type: fix
|
||||
issue: 4481
|
||||
jira: SMILE-4961
|
||||
title: "Previously, a reindex batch job would fail when executing on deleted resources. This issue has been fixed."
|
@ -51,6 +51,7 @@ import javax.annotation.Nullable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
|
||||
|
||||
public class Batch2DaoSvcImpl implements IBatch2DaoSvc {
|
||||
|
||||
@ -99,8 +100,9 @@ public class Batch2DaoSvcImpl implements IBatch2DaoSvc {
|
||||
List<IResourcePersistentId> ids = dao.searchForIds(searchParamMap, request);
|
||||
|
||||
Date lastDate = null;
|
||||
if (ids.size() > 0) {
|
||||
lastDate = dao.readByPid(ids.get(ids.size() - 1)).getMeta().getLastUpdated();
|
||||
if (isNotEmpty(ids)) {
|
||||
IResourcePersistentId lastResourcePersistentId = ids.get(ids.size() - 1);
|
||||
lastDate = dao.readByPid(lastResourcePersistentId, true).getMeta().getLastUpdated();
|
||||
}
|
||||
|
||||
return new HomogeneousResourcePidList(resourceType, ids, lastDate);
|
||||
|
@ -9,6 +9,7 @@ import ca.uhn.fhir.batch2.model.StatusEnum;
|
||||
import ca.uhn.fhir.interceptor.api.IAnonymousInterceptor;
|
||||
import ca.uhn.fhir.interceptor.api.Pointcut;
|
||||
import ca.uhn.fhir.jpa.batch.models.Batch2JobStartResponse;
|
||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||
import ca.uhn.fhir.jpa.test.BaseJpaR4Test;
|
||||
import ca.uhn.fhir.jpa.test.PatientReindexTestHelper;
|
||||
@ -23,15 +24,19 @@ import org.junit.jupiter.params.provider.MethodSource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.hasSize;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class ReindexJobTest extends BaseJpaR4Test {
|
||||
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ReindexJobTest.class);
|
||||
|
||||
@Autowired
|
||||
private IJobCoordinator myJobCoordinator;
|
||||
|
||||
@ -89,6 +94,41 @@ public class ReindexJobTest extends BaseJpaR4Test {
|
||||
myDaoConfig.setMarkResourcesForReindexingUponSearchParameterChange(reindexPropertyCache);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReindexDeletedResources_byUrl_willRemoveDeletedResourceEntriesFromIndexTables(){
|
||||
IIdType obsId = myReindexTestHelper.createObservationWithAlleleExtension(Observation.ObservationStatus.FINAL);
|
||||
|
||||
runInTransaction(() -> {
|
||||
int entriesInSpIndexTokenTable = myResourceIndexedSearchParamTokenDao.countForResourceId(obsId.getIdPartAsLong());
|
||||
assertThat(entriesInSpIndexTokenTable, equalTo(1));
|
||||
|
||||
// simulate resource deletion
|
||||
ResourceTable resource = myResourceTableDao.findById(obsId.getIdPartAsLong()).get();
|
||||
Date currentDate = new Date();
|
||||
resource.setDeleted(currentDate);
|
||||
resource.setUpdated(currentDate);
|
||||
resource.setHashSha256(null);
|
||||
resource.setVersion(2L);
|
||||
myResourceTableDao.save(resource);
|
||||
});
|
||||
|
||||
// execute reindexing
|
||||
ReindexJobParameters parameters = new ReindexJobParameters();
|
||||
parameters.addUrl("Observation?status=final");
|
||||
|
||||
JobInstanceStartRequest startRequest = new JobInstanceStartRequest();
|
||||
startRequest.setJobDefinitionId(ReindexAppCtx.JOB_REINDEX);
|
||||
startRequest.setParameters(parameters);
|
||||
Batch2JobStartResponse res = myJobCoordinator.startInstance(startRequest);
|
||||
myBatch2JobHelper.awaitJobCompletion(res);
|
||||
|
||||
// then
|
||||
runInTransaction(() -> {
|
||||
int entriesInSpIndexTokenTablePostReindexing = myResourceIndexedSearchParamTokenDao.countForResourceId(obsId.getIdPartAsLong());
|
||||
assertThat(entriesInSpIndexTokenTablePostReindexing, equalTo(0));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReindex_Everything() {
|
||||
// setup
|
||||
|
Loading…
x
Reference in New Issue
Block a user