diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/migration/CaseInstanceMigrationManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/migration/CaseInstanceMigrationManagerImpl.java index 93330694e68..262f0b51763 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/migration/CaseInstanceMigrationManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/migration/CaseInstanceMigrationManagerImpl.java @@ -105,11 +105,11 @@ public CaseInstanceMigrationValidationResult validateMigrateCaseInstancesOfCaseD CmmnModel newModel = CaseDefinitionUtil.getCmmnModel(caseDefinition.getId()); CaseInstanceEntityManager caseInstanceEntityManager = cmmnEngineConfiguration.getCaseInstanceEntityManager(); - List caseInstances = caseInstanceEntityManager.findByCriteria( + List caseInstanceIds = caseInstanceEntityManager.findIdsByCriteria( new CaseInstanceQueryImpl(commandContext, cmmnEngineConfiguration).caseDefinitionId(caseDefinitionId)); - for (CaseInstance caseInstance : caseInstances) { - doValidateCaseInstanceMigration(caseInstance.getId(), newModel, document, validationResult, commandContext); + for (String caseInstanceId : caseInstanceIds) { + doValidateCaseInstanceMigration(caseInstanceId, newModel, document, validationResult, commandContext); } } } @@ -497,9 +497,10 @@ public Batch batchMigrateHistoricCaseInstancesOfCaseDefinition(String caseDefini CaseDefinition caseDefinition = resolveCaseDefinition(document, commandContext); CmmnEngineConfiguration engineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(); - HistoricCaseInstanceQueryImpl historicCaseInstanceQuery = new HistoricCaseInstanceQueryImpl(commandContext, cmmnEngineConfiguration).caseDefinitionId(caseDefinitionId).finished(); - List historicCaseInstances = engineConfiguration.getHistoricCaseInstanceEntityManager() - .findByCriteria(historicCaseInstanceQuery); + HistoricCaseInstanceQueryImpl historicCaseInstanceQuery = new HistoricCaseInstanceQueryImpl(commandContext, cmmnEngineConfiguration).caseDefinitionId( + caseDefinitionId).finished(); + List historicCaseInstanceIds = engineConfiguration.getHistoricCaseInstanceEntityManager() + .findIdsByCriteria(historicCaseInstanceQuery); BatchService batchService = engineConfiguration.getBatchServiceConfiguration().getBatchService(); Batch batch = batchService.createBatchBuilder().batchType(Batch.CASE_MIGRATION_TYPE) @@ -510,20 +511,20 @@ public Batch batchMigrateHistoricCaseInstancesOfCaseDefinition(String caseDefini .create(); JobService jobService = engineConfiguration.getJobServiceConfiguration().getJobService(); - for (HistoricCaseInstance historicCaseInstance : historicCaseInstances) { + for (String historicCaseInstanceId : historicCaseInstanceIds) { BatchPart batchPart = batchService.createBatchPart(batch, CaseInstanceBatchMigrationResult.STATUS_WAITING, - historicCaseInstance.getId(), null, ScopeTypes.CMMN); + historicCaseInstanceId, null, ScopeTypes.CMMN); JobEntity job = jobService.createJob(); job.setJobHandlerType(HistoricCaseInstanceMigrationJobHandler.TYPE); - job.setScopeId(historicCaseInstance.getId()); + job.setScopeId(historicCaseInstanceId); job.setScopeType(ScopeTypes.CMMN); job.setJobHandlerConfiguration(HistoricCaseInstanceMigrationJobHandler.getHandlerCfgForBatchPartId(batchPart.getId())); jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } - if (!historicCaseInstances.isEmpty()) { + if (!historicCaseInstanceIds.isEmpty()) { TimerJobService timerJobService = engineConfiguration.getJobServiceConfiguration().getTimerJobService(); TimerJobEntity timerJob = timerJobService.createTimerJob(); timerJob.setJobType(JobEntity.JOB_TYPE_TIMER); diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseDefinitionEntityManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseDefinitionEntityManagerImpl.java index d3217073068..78cbbdc98af 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseDefinitionEntityManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseDefinitionEntityManagerImpl.java @@ -15,11 +15,9 @@ import java.util.List; -import org.flowable.cmmn.api.history.HistoricCaseInstance; import org.flowable.cmmn.api.history.HistoricMilestoneInstance; import org.flowable.cmmn.api.repository.CaseDefinition; import org.flowable.cmmn.api.repository.CaseDefinitionQuery; -import org.flowable.cmmn.api.runtime.CaseInstance; import org.flowable.cmmn.engine.CmmnEngineConfiguration; import org.flowable.cmmn.engine.impl.history.CmmnHistoryHelper; import org.flowable.cmmn.engine.impl.history.HistoricCaseInstanceQueryImpl; @@ -90,22 +88,23 @@ public CaseDefinition findCaseDefinitionByKeyAndVersionAndTenantId(String caseDe @Override public void deleteCaseDefinitionAndRelatedData(String caseDefinitionId, boolean cascadeHistory) { - + // Case instances CaseInstanceEntityManager caseInstanceEntityManager = getCaseInstanceEntityManager(); CommandContext commandContext = Context.getCommandContext(); - List caseInstances = caseInstanceEntityManager.findByCriteria( + List caseInstanceIds = caseInstanceEntityManager.findIdsByCriteria( new CaseInstanceQueryImpl(commandContext, engineConfiguration).caseDefinitionId(caseDefinitionId)); - for (CaseInstance caseInstance : caseInstances) { - caseInstanceEntityManager.delete(caseInstance.getId(), true, null); + for (String caseInstanceId : caseInstanceIds) { + caseInstanceEntityManager.delete(caseInstanceId, true, null); } - + if (cascadeHistory) { - engineConfiguration.getTaskServiceConfiguration().getHistoricTaskService().deleteHistoricTaskLogEntriesForScopeDefinition(ScopeTypes.CMMN, caseDefinitionId); + engineConfiguration.getTaskServiceConfiguration().getHistoricTaskService() + .deleteHistoricTaskLogEntriesForScopeDefinition(ScopeTypes.CMMN, caseDefinitionId); HistoricIdentityLinkEntityManager historicIdentityLinkEntityManager = getHistoricIdentityLinkEntityManager(); historicIdentityLinkEntityManager.deleteHistoricIdentityLinksByScopeDefinitionIdAndScopeType(caseDefinitionId, ScopeTypes.CMMN); - + // Historic milestone HistoricMilestoneInstanceEntityManager historicMilestoneInstanceEntityManager = getHistoricMilestoneInstanceEntityManager(); List historicMilestoneInstances = historicMilestoneInstanceEntityManager @@ -117,7 +116,7 @@ public void deleteCaseDefinitionAndRelatedData(String caseDefinitionId, boolean // Historic tasks HistoricTaskInstanceEntityManager historicTaskInstanceEntityManager = getHistoricTaskInstanceEntityManager(); List historicTaskInstances = historicTaskInstanceEntityManager - .findHistoricTaskInstancesByQueryCriteria(new HistoricTaskInstanceQueryImpl().scopeDefinitionId(caseDefinitionId).scopeType(ScopeTypes.CMMN)); + .findHistoricTaskInstancesByQueryCriteria(new HistoricTaskInstanceQueryImpl().scopeDefinitionId(caseDefinitionId).scopeType(ScopeTypes.CMMN)); for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) { TaskHelper.deleteHistoricTask(historicTaskInstance.getId(), engineConfiguration); } @@ -128,10 +127,10 @@ public void deleteCaseDefinitionAndRelatedData(String caseDefinitionId, boolean .forEach(p -> historicPlanItemInstanceEntityManager.delete(p.getId())); HistoricCaseInstanceEntityManager historicCaseInstanceEntityManager = getHistoricCaseInstanceEntityManager(); - List historicCaseInstanceEntities = historicCaseInstanceEntityManager - .findByCriteria(new HistoricCaseInstanceQueryImpl().caseDefinitionId(caseDefinitionId)); - for (HistoricCaseInstance historicCaseInstanceEntity : historicCaseInstanceEntities) { - CmmnHistoryHelper.deleteHistoricCaseInstance(engineConfiguration, historicCaseInstanceEntity.getId()); + List historicCaseInstanceIds = historicCaseInstanceEntityManager + .findIdsByCriteria(new HistoricCaseInstanceQueryImpl().caseDefinitionId(caseDefinitionId)); + for (String historicCaseInstanceId : historicCaseInstanceIds) { + CmmnHistoryHelper.deleteHistoricCaseInstance(engineConfiguration, historicCaseInstanceId); } } diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManager.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManager.java index 831bdd6e0be..df8599f6f28 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManager.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManager.java @@ -35,14 +35,16 @@ public interface CaseInstanceEntityManager extends EntityManager findByCriteria(CaseInstanceQuery query); + List findIdsByCriteria(CaseInstanceQuery query); + List findWithVariablesByCriteria(CaseInstanceQuery query); long countByCriteria(CaseInstanceQuery query); void delete(String caseInstanceId, boolean cascade, String deleteReason); - + void updateCaseInstanceBusinessKey(CaseInstanceEntity caseInstanceEntity, String businessKey); - + void updateCaseInstanceBusinessStatus(CaseInstanceEntity caseInstanceEntity, String businessStatus); void updateLockTime(String caseInstanceId, String lockOwner, Date lockTime); diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManagerImpl.java index 39f254be09c..8b642181867 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/CaseInstanceEntityManagerImpl.java @@ -84,6 +84,11 @@ public List findByCriteria(CaseInstanceQuery query) { return dataManager.findByCriteria((CaseInstanceQueryImpl) query); } + @Override + public List findIdsByCriteria(CaseInstanceQuery query) { + return dataManager.findIdsByCriteria((CaseInstanceQueryImpl) query); + } + @Override public List findWithVariablesByCriteria(CaseInstanceQuery query) { return dataManager.findWithVariablesByCriteria((CaseInstanceQueryImpl) query); diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManager.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManager.java index 9bd717f3805..ce93fbbb66e 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManager.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManager.java @@ -27,20 +27,22 @@ public interface HistoricCaseInstanceEntityManager extends EntityManager { HistoricCaseInstanceEntity create(CaseInstance caseInstance); - + HistoricCaseInstanceQuery createHistoricCaseInstanceQuery(); - + List findHistoricCaseInstancesByCaseDefinitionId(String caseDefinitionId); - + List findHistoricCaseInstanceIdsByParentIds(Collection caseInstanceIds); - + List findByCriteria(HistoricCaseInstanceQuery query); + List findIdsByCriteria(HistoricCaseInstanceQuery query); + List findWithVariablesByQueryCriteria(HistoricCaseInstanceQuery query); long countByCriteria(HistoricCaseInstanceQuery query); - + void deleteHistoricCaseInstances(HistoricCaseInstanceQueryImpl historicCaseInstanceQuery); - + void bulkDeleteHistoricCaseInstances(Collection caseInstanceIds); } \ No newline at end of file diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManagerImpl.java index 61c9929e55f..f2360670641 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/HistoricCaseInstanceEntityManagerImpl.java @@ -60,6 +60,11 @@ public List findByCriteria(HistoricCaseInstanceQuery query return dataManager.findByCriteria((HistoricCaseInstanceQueryImpl) query); } + @Override + public List findIdsByCriteria(HistoricCaseInstanceQuery query) { + return dataManager.findIdsByCriteria((HistoricCaseInstanceQueryImpl) query); + } + @Override @SuppressWarnings("unchecked") public List findWithVariablesByQueryCriteria(HistoricCaseInstanceQuery query) { diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/CaseInstanceDataManager.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/CaseInstanceDataManager.java index 2690b582d95..72fad0a9374 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/CaseInstanceDataManager.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/CaseInstanceDataManager.java @@ -36,6 +36,8 @@ public interface CaseInstanceDataManager extends DataManager List findByCriteria(CaseInstanceQueryImpl query); + List findIdsByCriteria(CaseInstanceQueryImpl query); + List findWithVariablesByCriteria(CaseInstanceQueryImpl query); long countByCriteria(CaseInstanceQueryImpl query); diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/HistoricCaseInstanceDataManager.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/HistoricCaseInstanceDataManager.java index 271299e1caa..156f7203d38 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/HistoricCaseInstanceDataManager.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/HistoricCaseInstanceDataManager.java @@ -27,20 +27,22 @@ public interface HistoricCaseInstanceDataManager extends DataManager { HistoricCaseInstanceEntity create(CaseInstance caseInstance); - + List findHistoricCaseInstancesByCaseDefinitionId(String caseDefinitionId); - + List findHistoricCaseInstanceIdsByParentIds(Collection caseInstanceIds); - + List findByCriteria(HistoricCaseInstanceQueryImpl query); - + + List findIdsByCriteria(HistoricCaseInstanceQueryImpl query); + long countByCriteria(HistoricCaseInstanceQueryImpl query); List findWithVariablesByQueryCriteria(HistoricCaseInstanceQueryImpl historicCaseInstanceQuery); void deleteByCaseDefinitionId(String caseDefinitionId); - + void deleteHistoricCaseInstances(HistoricCaseInstanceQueryImpl historicCaseInstanceQuery); - + void bulkDeleteHistoricCaseInstances(Collection caseInstanceIds); } diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseInstanceDataManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseInstanceDataManagerImpl.java index 19cf76eaeb6..cdebbd61666 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseInstanceDataManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseInstanceDataManagerImpl.java @@ -172,6 +172,15 @@ public List findByCriteria(CaseInstanceQueryImpl query) { return getDbSqlSession().selectListNoCacheLoadAndStore("selectCaseInstancesByQueryCriteria", query, getManagedEntityClass()); } + @Override + @SuppressWarnings("unchecked") + public List findIdsByCriteria(CaseInstanceQueryImpl query) { + // Not going through cache as the case instance should always be loaded with all related plan item instances + // when not doing a query call + setSafeInValueLists(query); + return getDbSqlSession().selectListNoCacheLoadAndStore("selectCaseInstanceIdsByQueryCriteria", query, getManagedEntityClass()); + } + @SuppressWarnings("unchecked") @Override public List findWithVariablesByCriteria(CaseInstanceQueryImpl query) { diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisHistoricCaseInstanceDataManagerImpl.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisHistoricCaseInstanceDataManagerImpl.java index 1171fb7df9e..8b5c375b189 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisHistoricCaseInstanceDataManagerImpl.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisHistoricCaseInstanceDataManagerImpl.java @@ -69,6 +69,13 @@ public List findByCriteria(HistoricCaseInstanceQueryImpl q return getDbSqlSession().selectList("selectHistoricCaseInstancesByQueryCriteria", query, getManagedEntityClass()); } + @Override + @SuppressWarnings("unchecked") + public List findIdsByCriteria(HistoricCaseInstanceQueryImpl query) { + setSafeInValueLists(query); + return getDbSqlSession().selectList("selectHistoricCaseInstanceIdsByQueryCriteria", query, getManagedEntityClass()); + } + @Override public long countByCriteria(HistoricCaseInstanceQueryImpl query) { setSafeInValueLists(query); diff --git a/modules/flowable-cmmn-engine/src/main/resources/org/flowable/cmmn/db/mapping/entity/CaseInstance.xml b/modules/flowable-cmmn-engine/src/main/resources/org/flowable/cmmn/db/mapping/entity/CaseInstance.xml index 94ade73eee4..4f207110d27 100644 --- a/modules/flowable-cmmn-engine/src/main/resources/org/flowable/cmmn/db/mapping/entity/CaseInstance.xml +++ b/modules/flowable-cmmn-engine/src/main/resources/org/flowable/cmmn/db/mapping/entity/CaseInstance.xml @@ -288,14 +288,26 @@ + + @@ -304,7 +316,7 @@ select count(distinct RES.ID_) from ${prefix}ACT_CMMN_RU_CASE_INST RES inner join ${prefix}ACT_CMMN_CASEDEF CASE_DEF on RES.CASE_DEF_ID_ = CASE_DEF.ID_ - + - ${limitBefore} select RES.* ${limitBetween}, - CASE_DEF.KEY_ as CaseDefinitionKey, - CASE_DEF.NAME_ as CaseDefinitionName, - CASE_DEF.VERSION_ as CaseDefinitionVersion, - CASE_DEF.DEPLOYMENT_ID_ as CaseDefinitionDeploymentId - + CASE_DEF.KEY_ as CaseDefinitionKey, + CASE_DEF.NAME_ as CaseDefinitionName, + CASE_DEF.VERSION_ as CaseDefinitionVersion, + CASE_DEF.DEPLOYMENT_ID_ as CaseDefinitionDeploymentId + + ${orderBy} + ${limitAfter} + + + - select count(distinct RES.ID_) - +