From a6e334d6af82fbf6bfd92817843e840e946bed82 Mon Sep 17 00:00:00 2001 From: frederikheremans Date: Mon, 7 Mar 2011 11:38:32 +0000 Subject: [PATCH] ACT-672 querying tasks based on process-instance variable value --- .../activiti/engine/impl/TaskQueryImpl.java | 11 +++- .../engine/impl/TaskQueryVariableValue.java | 36 +++++++++++ .../org/activiti/engine/task/TaskQuery.java | 8 ++- .../org/activiti/db/ibatis/task.mapping.xml | 13 +++- .../engine/test/api/task/TaskQueryTest.java | 62 ++++++++++++++++++- ....testProcessVariableValueEquals.bpmn20.xml | 17 +++++ 6 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 modules/activiti-engine/src/main/java/org/activiti/engine/impl/TaskQueryVariableValue.java create mode 100644 modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskQueryTest.testProcessVariableValueEquals.bpmn20.xml 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 d97a323721..9273751006 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 0000000000..1a403f9936 --- /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 ceea657741..61a8913bb8 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 68cc5569a2..22f02743dc 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 fb88ecaaca..c5ef2e29fd 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 0000000000..41297583a1 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/engine/test/api/task/TaskQueryTest.testProcessVariableValueEquals.bpmn20.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + -- GitLab