提交 a6e334d6 编写于 作者: F frederikheremans

ACT-672 querying tasks based on process-instance variable value

上级 263c5ddb
......@@ -52,7 +52,7 @@ public class TaskQueryImpl extends AbstractQuery<TaskQuery, Task> implements Tas
protected String processDefinitionKey;
protected String processDefinitionId;
protected String processDefinitionName;
protected List<QueryVariableValue> variables = new ArrayList<QueryVariableValue>();
protected List<TaskQueryVariableValue> variables = new ArrayList<TaskQueryVariableValue>();
public TaskQueryImpl(CommandContext commandContext) {
super(commandContext);
......@@ -178,7 +178,12 @@ public class TaskQueryImpl extends AbstractQuery<TaskQuery, Task> implements Tas
}
public TaskQuery taskVariableValueEquals(String variableName, Object variableValue) {
variables.add(new QueryVariableValue(variableName, variableValue, QueryOperator.EQUALS));
variables.add(new TaskQueryVariableValue(variableName, variableValue, QueryOperator.EQUALS, true));
return this;
}
public TaskQuery processVariableValueEquals(String variableName, Object variableValue) {
variables.add(new TaskQueryVariableValue(variableName, variableValue, QueryOperator.EQUALS, false));
return this;
}
......@@ -330,7 +335,7 @@ public class TaskQueryImpl extends AbstractQuery<TaskQuery, Task> implements Tas
public String getKeyLike() {
return keyLike;
}
public List<QueryVariableValue> getVariables() {
public List<TaskQueryVariableValue> getVariables() {
return variables;
}
public String getProcessDefinitionKey() {
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl;
/**
* Represents a variable value used in a task query.
*
* @author Frederik Heremans
*/
public class TaskQueryVariableValue extends QueryVariableValue {
protected boolean taskVariable;
public TaskQueryVariableValue(String name, Object value, QueryOperator operator, boolean isTaskVariable) {
super(name, value, operator);
this.taskVariable = isTaskVariable;
}
public boolean isTaskVariable() {
return taskVariable;
}
}
......@@ -89,11 +89,17 @@ public interface TaskQuery extends Query<TaskQuery, Task>{
TaskQuery taskDefinitionKeyLike(String keyLike);
/**
* Only select tasks with have a local task variable with the given name
* Only select tasks which have a local task variable with the given name
* set to the given value.
*/
TaskQuery taskVariableValueEquals(String variableName, Object variableValue);
/**
* Only select tasks which have are part of a process that have a variable
* with the given name set to the given value.
*/
TaskQuery processVariableValueEquals(String variableName, Object variableValue);
/**
* Only select tasks which are part of a process instance which have the given
* process definition key.
......
......@@ -110,7 +110,14 @@
inner join ACT_RU_IDENTITYLINK I on I.TASK_ID_ = T.ID_
</if>
<foreach collection="variables" index="index" item="var">
inner join ACT_RU_VARIABLE A${index} on T.ID_ = A${index}.TASK_ID_
<choose>
<when test="var.taskVariable">
inner join ACT_RU_VARIABLE A${index} on T.ID_ = A${index}.TASK_ID_
</when>
<otherwise>
inner join ACT_RU_VARIABLE A${index} on T.PROC_INST_ID_ = A${index}.PROC_INST_ID_
</otherwise>
</choose>
</foreach>
<if test="processDefinitionKey != null || processDefinitionName != null">
inner join ACT_RE_PROCDEF D on T.PROC_DEF_ID_ = D.ID_
......@@ -191,6 +198,10 @@
)
</if>
<foreach item="var" collection="variables" index="index">
<if test="!var.taskVariable">
<!-- When process instance variable is queried for, taskId should be null -->
and A${index}.TASK_ID_ is null
</if>
and A${index}.NAME_= #{var.name}
<if test="!var.type.equals('null')">
and A${index}.TYPE_ = #{var.type}
......
......@@ -425,7 +425,7 @@ public class TaskQueryTest extends PluggableActivitiTestCase {
assertEquals(1, taskService.createTaskQuery().taskVariableValueEquals("dateVar", date).count());
assertEquals(1, taskService.createTaskQuery().taskVariableValueEquals("nullVar", null).count());
// Test query for other values on exixting variables
// Test query for other values on existing variables
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("longVar", 999L).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("shortVar", (short) 999).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("integerVar", 999).count());
......@@ -437,6 +437,66 @@ public class TaskQueryTest extends PluggableActivitiTestCase {
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("nullVar", "999").count());
}
@Deployment
public void testProcessVariableValueEquals() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("longVar", 928374L);
variables.put("shortVar", (short) 123);
variables.put("integerVar", 1234);
variables.put("stringVar", "stringValue");
variables.put("booleanVar", true);
Date date = Calendar.getInstance().getTime();
variables.put("dateVar", date);
variables.put("nullVar", null);
// Start process-instance with all types of variables
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess", variables);
// Test query matches
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("longVar", 928374L).count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("shortVar", (short) 123).count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("integerVar", 1234).count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("stringVar", "stringValue").count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("booleanVar", true).count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("dateVar", date).count());
assertEquals(1, taskService.createTaskQuery().processVariableValueEquals("nullVar", null).count());
// Test query for other values on existing variables
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("longVar", 999L).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("shortVar", (short) 999).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("integerVar", 999).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("stringVar", "999").count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("booleanVar", false).count());
Calendar otherDate = Calendar.getInstance();
otherDate.add(Calendar.YEAR, 1);
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("dateVar", otherDate.getTime()).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("nullVar", "999").count());
// Test querying for task variables don't match the process-variables
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("longVar", 928374L).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("shortVar", (short) 123).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("integerVar", 1234).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("stringVar", "stringValue").count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("booleanVar", true).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("dateVar", date).count());
assertEquals(0, taskService.createTaskQuery().taskVariableValueEquals("nullVar", null).count());
// Test combination of task-variable and process-variable
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.setVariableLocal(task.getId(), "taskVar", "theValue");
taskService.setVariableLocal(task.getId(), "longVar", 928374L);
assertEquals(1, taskService.createTaskQuery()
.processVariableValueEquals("longVar", 928374L)
.taskVariableValueEquals("taskVar", "theValue")
.count());
assertEquals(1, taskService.createTaskQuery()
.processVariableValueEquals("longVar", 928374L)
.taskVariableValueEquals("longVar", 928374L)
.count());
}
@Deployment(resources={"org/activiti/engine/test/api/task/TaskQueryTest.testProcessDefinition.bpmn20.xml"})
public void testProcessDefinitionId() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
......
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<process id="oneTaskProcess" name="The One Task Process">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="my task" />
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册