diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java index d97a323721fb4b77653612b248710d604dbe0412..9273751006fc6b27c5af0f78d708807fd4c96e8d 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java @@ -52,7 +52,7 @@ public class TaskQueryImpl extends AbstractQuery implements Tas protected String processDefinitionKey; protected String processDefinitionId; protected String processDefinitionName; - protected List variables = new ArrayList(); + protected List variables = new ArrayList(); public TaskQueryImpl(CommandContext commandContext) { super(commandContext); @@ -178,7 +178,12 @@ public class TaskQueryImpl extends AbstractQuery 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 implements Tas public String getKeyLike() { return keyLike; } - public List getVariables() { + public List getVariables() { return variables; } public String getProcessDefinitionKey() { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryVariableValue.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryVariableValue.java new file mode 100644 index 0000000000000000000000000000000000000000..1a403f9936835d242ba1628666545e834312ba8d --- /dev/null +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryVariableValue.java @@ -0,0 +1,36 @@ +/* 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; + } + +} 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 ceea65774130ddb9b852d707e3e6ed9d3245ba71..61a8913bb850a9e9dc288a0fb4a565447255ccd6 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 @@ -89,11 +89,17 @@ public interface TaskQuery extends Query{ 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. diff --git a/modules/activiti-engine/src/main/resources/org/activiti/db/ibatis/task.mapping.xml b/modules/activiti-engine/src/main/resources/org/activiti/db/ibatis/task.mapping.xml index 68cc5569a21a77e7de94e05f37dbcf4986884294..22f02743dce99ec637af81d7168a7e750f083ffe 100644 --- a/modules/activiti-engine/src/main/resources/org/activiti/db/ibatis/task.mapping.xml +++ b/modules/activiti-engine/src/main/resources/org/activiti/db/ibatis/task.mapping.xml @@ -110,7 +110,14 @@ inner join ACT_RU_IDENTITYLINK I on I.TASK_ID_ = T.ID_ - inner join ACT_RU_VARIABLE A${index} on T.ID_ = A${index}.TASK_ID_ + + + inner join ACT_RU_VARIABLE A${index} on T.ID_ = A${index}.TASK_ID_ + + + inner join ACT_RU_VARIABLE A${index} on T.PROC_INST_ID_ = A${index}.PROC_INST_ID_ + + inner join ACT_RE_PROCDEF D on T.PROC_DEF_ID_ = D.ID_ @@ -191,6 +198,10 @@ ) + + + and A${index}.TASK_ID_ is null + and A${index}.NAME_= #{var.name} and A${index}.TYPE_ = #{var.type} 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 fb88ecaaca4e86f4f639bc8898edf337a526ac26..c5ef2e29fdf8ddef5c445820ad13a8a7d44fbafd 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 @@ -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 variables = new HashMap(); + 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"); diff --git a/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskQueryTest.testProcessVariableValueEquals.bpmn20.xml b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskQueryTest.testProcessVariableValueEquals.bpmn20.xml new file mode 100644 index 0000000000000000000000000000000000000000..41297583a191a557f4e1aac81ae5ce13d27e44e1 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskQueryTest.testProcessVariableValueEquals.bpmn20.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + +