提交 4ca8e77a 编写于 作者: T Tijs Rademakers

Manual merge of PR #580

上级 fad0d832
......@@ -416,6 +416,85 @@ public class HistoricTaskAndVariablesQueryTest extends PluggableFlowableTestCase
assertEquals(1, tasks.size());
}
}
@Deployment(resources = { "org/flowable/engine/test/api/history/HistoricTaskAndVariablesQueryTest.testCandidate.bpmn20.xml" })
public void testIgnoreAssigneeValue() {
if (HistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.ACTIVITY, processEngineConfiguration)) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
waitForHistoryJobExecutorToProcessAllJobs(5000, 100);
String taskId = taskService
.createTaskQuery()
.processInstanceId(processInstance.getProcessInstanceId())
.list()
.get(0)
.getId();
taskService.setAssignee(taskId, "kermit");
List<HistoricTaskInstance> tasks = historyService
.createHistoricTaskInstanceQuery()
.taskCandidateUser("kermit")
.list();
assertEquals(2, tasks.size());
tasks = historyService
.createHistoricTaskInstanceQuery()
.taskCandidateUser("kermit")
.ignoreAssigneeValue()
.list();
assertEquals(3, tasks.size());
tasks = historyService
.createHistoricTaskInstanceQuery()
.taskCandidateGroup("management")
.list();
assertEquals(0, tasks.size());
tasks = historyService
.createHistoricTaskInstanceQuery()
.taskCandidateGroup("management")
.ignoreAssigneeValue()
.list();
assertEquals(1, tasks.size());
}
}
@Deployment(resources = {"org/flowable/engine/test/api/history/HistoricTaskAndVariablesQueryTest.testCandidate.bpmn20.xml"})
public void testIgnoreAssigneeValueOr() {
if (HistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.ACTIVITY, processEngineConfiguration)) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
waitForHistoryJobExecutorToProcessAllJobs(5000, 100);
String taskId = taskService
.createTaskQuery()
.processInstanceId(processInstance.getProcessInstanceId())
.list()
.get(0)
.getId();
taskService.setAssignee(taskId, "kermit");
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
.or()
.taskCandidateUser("kermit")
.taskAssignee("gonzo")
.ignoreAssigneeValue()
.endOr()
.list();
assertEquals(4, tasks.size());
tasks = historyService.createHistoricTaskInstanceQuery()
.or()
.taskCandidateUser("kermit")
.taskAssignee("gonzo")
.endOr()
.list();
assertEquals(3, tasks.size());
}
}
public void testQueryWithPagingAndVariables() {
if (HistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.AUDIT, processEngineConfiguration)) {
......
......@@ -31,6 +31,7 @@ import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.test.Deployment;
import org.flowable.identitylink.service.IdentityLinkInfo;
import org.flowable.task.service.DelegationState;
import org.flowable.task.service.Task;
import org.flowable.task.service.TaskQuery;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;
......@@ -880,6 +881,146 @@ public class TaskQueryTest extends PluggableFlowableTestCase {
historyService.deleteHistoricTaskInstance(assigneeToKermit.getId());
}
}
public void testQueryIgnoreAssigneeValue() {
List<String> createdTasks = new ArrayList<>();
Task kermitAssigneeTask = taskService.newTask();
kermitAssigneeTask.setName("new kermit assignee task");
taskService.saveTask(kermitAssigneeTask);
taskService.setAssignee(kermitAssigneeTask.getId(), "kermit");
createdTasks.add(kermitAssigneeTask.getId());
Task magementTask = taskService.newTask();
magementTask.setName("new management task");
taskService.saveTask(magementTask);
taskService.setAssignee(magementTask.getId(), "gozzie");
taskService.addCandidateGroup(magementTask.getId(), "management");
createdTasks.add(magementTask.getId());
List<Task> kermitCandidateTasks = taskService.createTaskQuery()
.taskCandidateUser("kermit")
.taskName("testTask")
.list();
for (Task t : kermitCandidateTasks) {
taskService.setAssignee(t.getId(), "gonzo");
}
List<Task> tasks = taskService.createTaskQuery()
.taskCandidateUser("kermit")
.list();
assertEquals(5, tasks.size());
tasks = taskService.createTaskQuery()
.taskCandidateUser("kermit")
.ignoreAssigneeValue()
.list();
assertEquals(12, tasks.size());
tasks = taskService.createTaskQuery()
.taskCandidateOrAssigned("kermit")
.list();
assertEquals(6, tasks.size());
tasks = taskService.createTaskQuery()
.taskCandidateOrAssigned("kermit")
.ignoreAssigneeValue()
.list();
assertEquals(13, tasks.size());
tasks = taskService.createTaskQuery()
.taskCandidateOrAssigned("gonzo")
.taskCandidateGroup("management")
.list();
assertEquals(10, tasks.size());
tasks = taskService.createTaskQuery()
.taskCandidateOrAssigned("gonzo")
.taskCandidateGroup("management")
.ignoreAssigneeValue()
.list();
assertEquals(11, tasks.size());
taskService.deleteTasks(createdTasks, true);
}
public void testQueryIgnoreAssigneeValueOr() {
List<String> createdTasks = new ArrayList<>();
Task kermitAssigneeTask = taskService.newTask();
kermitAssigneeTask.setName("new kermit assignee task");
taskService.saveTask(kermitAssigneeTask);
taskService.setAssignee(kermitAssigneeTask.getId(), "kermit");
createdTasks.add(kermitAssigneeTask.getId());
Task magementTask = taskService.newTask();
magementTask.setName("new management task");
taskService.saveTask(magementTask);
taskService.setAssignee(magementTask.getId(), "gozzie");
taskService.addCandidateGroup(magementTask.getId(), "management");
createdTasks.add(magementTask.getId());
List<Task> kermitCandidateTasks = taskService.createTaskQuery()
.taskCandidateUser("kermit")
.taskName("testTask")
.list();
for (Task t : kermitCandidateTasks) {
taskService.setAssignee(t.getId(), "gonzo");
}
List<Task> tasks = taskService.createTaskQuery()
.or()
.taskCandidateUser("kermit")
.taskCandidateGroup("management")
.endOr()
.list();
assertEquals(3, tasks.size());
tasks = taskService.createTaskQuery()
.or()
.taskCandidateUser("kermit")
.taskCandidateGroup("management")
.ignoreAssigneeValue()
.endOr()
.list();
assertEquals(10, tasks.size());
tasks = taskService.createTaskQuery()
.or()
.taskCandidateOrAssigned("kermit")
.endOr()
.list();
assertEquals(6, tasks.size());
tasks = taskService.createTaskQuery()
.or()
.taskCandidateOrAssigned("kermit")
.ignoreAssigneeValue()
.endOr()
.list();
assertEquals(13, tasks.size());
tasks = taskService.createTaskQuery()
.or()
.taskCandidateOrAssigned("gonzo")
.taskCandidateGroup("management")
.endOr()
.list();
assertEquals(10, tasks.size());
tasks = taskService.createTaskQuery()
.or()
.taskCandidateOrAssigned("gonzo")
.taskCandidateGroup("management")
.ignoreAssigneeValue()
.endOr()
.list();
assertEquals(11, tasks.size());
taskService.deleteTasks(createdTasks, true);
}
public void testQueryByNullCandidateGroup() {
try {
......
......@@ -139,6 +139,11 @@ public interface TaskInfoQuery<T extends TaskInfoQuery<?, ?>, V extends TaskInfo
* Only select tasks for which there exist an {@link IdentityLink} with the given user, including tasks which have been assigned to the given user (assignee) or owned by the given user (owner).
*/
T taskInvolvedUser(String involvedUser);
/**
* Allows to select a task using {@link #taskCandidateGroup(String)} {@link #taskCandidateGroupIn(List)} or {@link #taskCandidateUser(String)} but ignore the assignee value instead of querying for an empty assignee.
*/
T ignoreAssigneeValue();
/** Only select tasks for which users in the given group are candidates. */
T taskCandidateGroup(String candidateGroup);
......
......@@ -23,7 +23,6 @@ import org.flowable.engine.common.impl.interceptor.CommandContext;
import org.flowable.engine.common.impl.interceptor.CommandExecutor;
import org.flowable.idm.api.Group;
import org.flowable.idm.api.IdmIdentityService;
import org.flowable.task.service.TaskQuery;
import org.flowable.task.service.TaskServiceConfiguration;
import org.flowable.task.service.history.HistoricTaskInstance;
import org.flowable.task.service.history.HistoricTaskInstanceQuery;
......@@ -88,6 +87,7 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
protected String candidateGroup;
private List<String> candidateGroups;
protected String involvedUser;
protected boolean ignoreAssigneeValue;
protected Integer taskPriority;
protected Integer taskMinPriority;
protected Integer taskMaxPriority;
......@@ -1213,6 +1213,16 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
}
return this;
}
@Override
public HistoricTaskInstanceQuery ignoreAssigneeValue() {
if (inOrStatement) {
this.currentOrQueryObject.ignoreAssigneeValue = true;
} else {
this.ignoreAssigneeValue = true;
}
return this;
}
@Override
public HistoricTaskInstanceQuery taskTenantId(String tenantId) {
......@@ -1752,6 +1762,10 @@ public class HistoricTaskInstanceQueryImpl extends AbstractVariableQueryImpl<His
return involvedUser;
}
public boolean isIgnoreAssigneeValue() {
return ignoreAssigneeValue;
}
public String getProcessDefinitionKeyLikeIgnoreCase() {
return processDefinitionKeyLikeIgnoreCase;
}
......
......@@ -69,6 +69,7 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
protected String candidateUser;
protected String candidateGroup;
protected List<String> candidateGroups;
protected boolean ignoreAssigneeValue;
protected String tenantId;
protected String tenantIdLike;
protected boolean withoutTenantId;
......@@ -567,6 +568,16 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
}
return this;
}
@Override
public TaskQuery ignoreAssigneeValue() {
if (orActive) {
currentOrQueryObject.ignoreAssigneeValue = true;
} else {
this.ignoreAssigneeValue = true;
}
return this;
}
@Override
public TaskQuery taskTenantId(String tenantId) {
......@@ -1556,6 +1567,10 @@ public class TaskQueryImpl extends AbstractVariableQueryImpl<TaskQuery, Task> im
return candidateGroup;
}
public boolean isIgnoreAssigneeValue() {
return ignoreAssigneeValue;
}
public String getProcessInstanceId() {
return processInstanceId;
}
......
......@@ -796,7 +796,9 @@
and (RES.TENANT_ID_ = '' or RES.TENANT_ID_ is null)
</if>
<if test="candidateUser != null || candidateGroups != null">
and RES.ASSIGNEE_ is null
<if test="!ignoreAssigneeValue">
and RES.ASSIGNEE_ is null
</if>
and HI.TYPE_ = 'candidate'
and
(
......@@ -1120,8 +1122,12 @@
or (RES.TENANT_ID_ = '' or RES.TENANT_ID_ is null)
</if>
<if test="orQueryObject.candidateUser != null || orQueryObject.candidateGroups != null">
or (RES.ASSIGNEE_ is null
and HI_OR${orIndex}.TYPE_ = 'candidate'
or (HI_OR${orIndex}.TYPE_ = 'candidate'
<if test="!orQueryObject.ignoreAssigneeValue">
and RES.ASSIGNEE_ is null
</if>
and
(
<if test="orQueryObject.candidateUser != null">
......
......@@ -777,7 +777,9 @@
and RES.PARENT_TASK_ID_ IS NULL
</if>
<if test="!bothCandidateAndAssigned &amp;&amp; (candidateUser != null || candidateGroups != null)">
and RES.ASSIGNEE_ is null
<if test="!ignoreAssigneeValue">
and RES.ASSIGNEE_ is null
</if>
and I.TYPE_ = 'candidate'
and
(
......@@ -893,23 +895,31 @@
<!-- if dbIdentityUsed set true in process engine configuration -->
<if test="userIdForCandidateAndAssignee != null">
<if test="candidateGroups == null">
and (RES.ASSIGNEE_ = #{userIdForCandidateAndAssignee} or (RES.ASSIGNEE_ is null and (I.USER_ID_ = #{userIdForCandidateAndAssignee}
or I.GROUP_ID_ IN (select g.GROUP_ID_ from ${prefix}ACT_ID_MEMBERSHIP g where g.USER_ID_ = #{userIdForCandidateAndAssignee} ) ) ) )
and (RES.ASSIGNEE_ = #{userIdForCandidateAndAssignee}
or (
<if test="!ignoreAssigneeValue">
RES.ASSIGNEE_ is null
</if>
and (I.USER_ID_ = #{userIdForCandidateAndAssignee}
or I.GROUP_ID_ IN (select g.GROUP_ID_ from ${prefix}ACT_ID_MEMBERSHIP g where g.USER_ID_ = #{userIdForCandidateAndAssignee} ) ) ) )
</if>
</if>
<!-- if dbIdentityUsed set false in process engine configuration of using custom session factory of GroupIdentityManager -->
<if test="candidateGroups != null">
and (RES.ASSIGNEE_ = #{userIdForCandidateAndAssignee}
or (RES.ASSIGNEE_ is null
and I.TYPE_ = 'candidate' and (I.USER_ID_ = #{userIdForCandidateAndAssignee}
<if test="candidateGroups.size() &gt; 0">
or I.GROUP_ID_ IN
<foreach item="group" index="index" collection="candidateGroups"
open="(" separator="," close=")">
#{group}
</foreach>
</if>
)))
or (
<if test="!ignoreAssigneeValue">
RES.ASSIGNEE_ is null and
</if>
I.TYPE_ = 'candidate' and (I.USER_ID_ = #{userIdForCandidateAndAssignee}
<if test="candidateGroups.size() &gt; 0">
or I.GROUP_ID_ IN
<foreach item="group" index="index" collection="candidateGroups" open="(" separator="," close=")">
#{group}
</foreach>
</if>
)))
</if>
</when>
</choose>
......@@ -1121,10 +1131,13 @@
</if>
<if test="!orQueryObject.bothCandidateAndAssigned &amp;&amp; (orQueryObject.candidateUser != null || orQueryObject.candidateGroups != null)">
or (RES.ASSIGNEE_ is null
and I_OR${orIndex}.TYPE_ = 'candidate'
and
(
or (
<if test="!orQueryObject.ignoreAssigneeValue">
RES.ASSIGNEE_ is null and
</if>
I_OR${orIndex}.TYPE_ = 'candidate'
and
(
<if test="orQueryObject.candidateUser != null">
I_OR${orIndex}.USER_ID_ = #{orQueryObject.candidateUser}
</if>
......@@ -1245,22 +1258,29 @@
<!-- if dbIdentityUsed set true in process engine configuration -->
<if test="orQueryObject.userIdForCandidateAndAssignee != null">
<if test="orQueryObject.candidateGroups == null">
or (RES.ASSIGNEE_ = #{orQueryObject.userIdForCandidateAndAssignee} or (RES.ASSIGNEE_ is null and (I_OR${orIndex}.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee}
or I_OR${orIndex}.GROUP_ID_ IN (select g.GROUP_ID_ from ${prefix}ACT_ID_MEMBERSHIP g where g.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee} ) ) ) )
or (RES.ASSIGNEE_ = #{orQueryObject.userIdForCandidateAndAssignee}
or (
<if test="!orQueryObject.ignoreAssigneeValue">
RES.ASSIGNEE_ is null and
</if>
(I_OR${orIndex}.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee}
or I_OR${orIndex}.GROUP_ID_ IN (select g.GROUP_ID_ from ${prefix}ACT_ID_MEMBERSHIP g where g.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee} ) ) ) )
</if>
</if>
<!-- if dbIdentityUsed set false in process engine configuration of using custom session factory of GroupIdentityManager -->
<if test="orQueryObject.candidateGroups != null">
or (RES.ASSIGNEE_ = #{orQueryObject.userIdForCandidateAndAssignee}
or (RES.ASSIGNEE_ is null
and I_OR${orIndex}.TYPE_ = 'candidate' and (I_OR${orIndex}.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee}
<if test="orQueryObject.candidateGroups.size() &gt; 0">
or I_OR${orIndex}.GROUP_ID_ IN
<foreach item="group" index="index" collection="orQueryObject.candidateGroups"
open="(" separator="," close=")">
#{group}
</foreach>
</if>
or (
<if test="!orQueryObject.ignoreAssigneeValue">
RES.ASSIGNEE_ is null and
</if>
I_OR${orIndex}.TYPE_ = 'candidate' and (I_OR${orIndex}.USER_ID_ = #{orQueryObject.userIdForCandidateAndAssignee}
<if test="orQueryObject.candidateGroups.size() &gt; 0">
or I_OR${orIndex}.GROUP_ID_ IN
<foreach item="group" index="index" collection="orQueryObject.candidateGroups" open="(" separator="," close=")">
#{group}
</foreach>
</if>
)))
</if>
</when>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册