diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/ExecutionQueryImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/ExecutionQueryImpl.java index 2e4bcd831dd959ebc6e2ba32a60fb9a110f1dbb8..6d3c1e970d058ea5711c0c07263f31571c3c0a1b 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/ExecutionQueryImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/ExecutionQueryImpl.java @@ -41,6 +41,7 @@ public class ExecutionQueryImpl extends ExecutionVariableQueryImpl implements Tas protected String processDefinitionKey; protected String processDefinitionId; protected String processDefinitionName; + protected String processInstanceBusinessKey; protected List variables = new ArrayList(); protected Date dueDate; protected Date dueBefore; @@ -216,6 +217,11 @@ public class TaskQueryImpl extends AbstractQuery implements Tas return this; } + public TaskQueryImpl processInstanceBusinessKey(String processInstanceBusinessKey) { + this.processInstanceBusinessKey = processInstanceBusinessKey; + return this; + } + public TaskQueryImpl executionId(String executionId) { this.executionId = executionId; return this; @@ -437,4 +443,9 @@ public class TaskQueryImpl extends AbstractQuery implements Tas public String getProcessDefinitionName() { return processDefinitionName; } + + + public String getProcessInstanceBusinessKey() { + return processInstanceBusinessKey; + } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/runtime/ExecutionQuery.java b/modules/activiti-engine/src/main/java/org/activiti/engine/runtime/ExecutionQuery.java index 45cfa71e819913ae935a5d4448783670e788dfdc..ec337b1cc293e02a7f05d576ebe64ec163cc1c21 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/runtime/ExecutionQuery.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/runtime/ExecutionQuery.java @@ -35,6 +35,9 @@ public interface ExecutionQuery extends Query{ /** Only select executions which have the given process instance id. **/ ExecutionQuery processInstanceId(String processInstanceId); + /** Only executions with the given business key */ + ExecutionQuery processInstanceBusinessKey(String processInstanceBusinessKey); + /** Only select executions with the given id. **/ ExecutionQuery executionId(String executionId); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/task/TaskQuery.java b/modules/activiti-engine/src/main/java/org/activiti/engine/task/TaskQuery.java index 44f91dad01a9c57942b80272b9b48b47935d7d91..51ee2ee9ea1737bf76dc572e6e0eb7268e553312 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/task/TaskQuery.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/task/TaskQuery.java @@ -84,6 +84,9 @@ public interface TaskQuery extends Query{ /** Only select tasks for the given process instance id. */ TaskQuery processInstanceId(String processInstanceId); + + /** Only select tasks foe the given business key */ + TaskQuery processInstanceBusinessKey(String processInstanceBusinessKey); /** Only select tasks for the given execution. */ TaskQuery executionId(String executionId); diff --git a/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Task.xml b/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Task.xml index 577be0779f26b3d7cd4ea81966018fa7948e0d3d..f76f4e68fe79ce7f04479d3a32b9aefd5f3c58eb 100644 --- a/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Task.xml +++ b/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Task.xml @@ -138,7 +138,10 @@ inner join ACT_RE_PROCDEF D on T.PROC_DEF_ID_ = D.ID_ - + + inner join ACT_RU_EXECUTION E on T.PROC_INST_ID_ = E.ID_ + + T.ID_ = #{taskId} @@ -175,6 +178,9 @@ and T.PROC_INST_ID_ = #{processInstanceId} + + and E.BUSINESS_KEY_ = #{processInstanceBusinessKey} + and T.EXECUTION_ID_ = #{executionId} diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ExecutionQueryTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ExecutionQueryTest.java index b6e4a46c68fd11a1e987c180acdc137ec8a4d4a3..96e558bdd0f2c1b7b8cbe05e4b03fbd6b691026d 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ExecutionQueryTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/runtime/ExecutionQueryTest.java @@ -68,7 +68,7 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase { sequentialProcessInstanceIds = new ArrayList(); for (int i = 0; i < 4; i++) { - concurrentProcessInstanceIds.add(runtimeService.startProcessInstanceByKey(CONCURRENT_PROCESS_KEY).getId()); + concurrentProcessInstanceIds.add(runtimeService.startProcessInstanceByKey(CONCURRENT_PROCESS_KEY, "BUSINESS-KEY-" + i).getId()); } sequentialProcessInstanceIds.add(runtimeService.startProcessInstanceByKey(SEQUENTIAL_PROCESS_KEY).getId()); } @@ -172,6 +172,12 @@ public class ExecutionQueryTest extends PluggableActivitiTestCase { } } + public void testQueryByBusinessKey() { + assertEquals(1, runtimeService.createExecutionQuery().processDefinitionKey(CONCURRENT_PROCESS_KEY).processInstanceBusinessKey("BUSINESS-KEY-1").list().size()); + assertEquals(1, runtimeService.createExecutionQuery().processDefinitionKey(CONCURRENT_PROCESS_KEY).processInstanceBusinessKey("BUSINESS-KEY-2").list().size()); + assertEquals(0, runtimeService.createExecutionQuery().processDefinitionKey(CONCURRENT_PROCESS_KEY).processInstanceBusinessKey("NON-EXISTING").list().size()); + } + @Deployment(resources={ "org/activiti/engine/test/api/oneTaskProcess.bpmn20.xml"}) public void testQueryStringVariable() { diff --git a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskQueryTest.java b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskQueryTest.java index 3166278b422ec3bdcb738e1cb5d0225f6d02d684..1952faf516bce7e659f765a3160fede7adedd1c9 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskQueryTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/engine/test/api/task/TaskQueryTest.java @@ -577,7 +577,16 @@ public class TaskQueryTest extends PluggableActivitiTestCase { assertEquals(0, taskService.createTaskQuery().processDefinitionName("unexisting").count()); } - + + @Deployment(resources={"org/activiti/engine/test/api/task/TaskQueryTest.testProcessDefinition.bpmn20.xml"}) + public void testProcessInstanceBusinessKey() throws Exception { + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", "BUSINESS-KEY-1"); + + assertEquals(1, taskService.createTaskQuery().processDefinitionName("The One Task Process").processInstanceBusinessKey("BUSINESS-KEY-1").list().size()); + assertEquals(1, taskService.createTaskQuery().processInstanceBusinessKey("BUSINESS-KEY-1").list().size()); + assertEquals(0, taskService.createTaskQuery().processInstanceBusinessKey("NON-EXISTING").count()); + } + @Deployment(resources={"org/activiti/engine/test/api/task/TaskQueryTest.testProcessDefinition.bpmn20.xml"}) public void testTaskDueDate() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");