TSK-1443: Implemented an option to order the result of the TaskQuery by the Workbasket-Name.

This commit is contained in:
Tim Gerversmann 2020-11-07 17:58:21 +01:00 committed by Mustapha Zorgati
parent 6133b66059
commit 0c084dc3d8
4 changed files with 78 additions and 0 deletions

View File

@ -848,6 +848,15 @@ public interface TaskQuery extends BaseQuery<TaskSummary, TaskQueryColumnName> {
*/
TaskQuery orderByWorkbasketId(SortDirection sortDirection);
/**
* This method sorts the query result according to the workbasket-Name of the tasks.
*
* @param sortDirection Determines whether the result is sorted in ascending or descending order.
* If sortDirection is null, the result is sorted in ascending order
* @return the query
*/
TaskQuery orderByWorkbasketName(SortDirection sortDirection);
/**
* This method sorts the query result according to the attachment classification key. (Should only
* be used if there is one attachment per task in other case the result would be wrong.)

View File

@ -158,6 +158,7 @@ public class TaskQueryImpl implements TaskQuery {
private boolean addAttachmentColumnsToSelectClauseForOrdering = false;
private boolean addClassificationNameToSelectClauseForOrdering = false;
private boolean addAttachmentClassificationNameToSelectClauseForOrdering = false;
private boolean addWorkbasketNameForOrdering = false;
TaskQueryImpl(InternalTaskanaEngine taskanaEngine) {
this.taskanaEngine = taskanaEngine;
@ -851,6 +852,14 @@ public class TaskQueryImpl implements TaskQuery {
return addOrderCriteria("WORKBASKET_ID", sortDirection);
}
@Override
public TaskQuery orderByWorkbasketName(SortDirection sortDirection) {
addWorkbasketNameForOrdering = true;
return DB.DB2.dbProductId.equals(getDatabaseId())
? addOrderCriteria("WNAME", sortDirection)
: addOrderCriteria("w.NAME", sortDirection);
}
@Override
public TaskQuery orderByAttachmentClassificationKey(SortDirection sortDirection) {
joinWithAttachments = true;

View File

@ -27,6 +27,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ac.NAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", w.NAME "
+ "</if>"
+ "FROM TASK t "
+ "<if test=\"joinWithAttachments\">"
+ "LEFT JOIN ATTACHMENT AS a ON t.ID = a.TASK_ID "
@ -37,6 +40,9 @@ public interface TaskQueryMapper {
+ "<if test=\"joinWithAttachmentClassifications\">"
+ "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ "LEFT JOIN WORKBASKET AS w ON t.WORKBASKET_ID = w.ID "
+ "</if>"
+ "<where>"
+ "<if test='accessIdIn != null'> "
+ "AND t.WORKBASKET_ID IN ( "
@ -217,6 +223,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ACNAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", WNAME "
+ "</if>"
+ " ) "
+ " AS (SELECT <if test=\"useDistinctKeyword\">DISTINCT</if> t.ID, t.EXTERNAL_ID, t.CREATED, t.CLAIMED, t.COMPLETED, t.MODIFIED, t.PLANNED, t.DUE, t.NAME, t.CREATOR, t.DESCRIPTION, t.NOTE, t.PRIORITY, t.STATE, t.CLASSIFICATION_KEY, "
+ " t.CLASSIFICATION_CATEGORY, t.CLASSIFICATION_ID, t.WORKBASKET_ID, t.DOMAIN, t.WORKBASKET_KEY, t.BUSINESS_PROCESS_ID, t.PARENT_BUSINESS_PROCESS_ID, t.OWNER, "
@ -231,6 +240,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ac.NAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", w.NAME "
+ "</if>"
+ " FROM TASK t "
+ "<if test=\"joinWithAttachments\">"
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
@ -241,6 +253,9 @@ public interface TaskQueryMapper {
+ "<if test=\"joinWithAttachmentClassifications\">"
+ "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ "LEFT JOIN WORKBASKET AS w ON t.WORKBASKET_ID = w.ID "
+ "</if>"
+ "<where> "
+ "<if test='taskIds != null'>AND t.ID IN(<foreach item='item' collection='taskIds' separator=',' >#{item}</foreach>)</if> "
+ "<if test='externalIdIn != null'>AND t.EXTERNAL_ID IN(<foreach item='item' collection='externalIdIn' separator=',' >#{item}</foreach>)</if> "
@ -354,6 +369,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ACNAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", WNAME "
+ "</if>"
+ ", FLAG ) "
+ "AS "
+ "(SELECT ID, EXTERNAL_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, CREATOR, DESCRIPTION, NOTE, PRIORITY, STATE, TCLASSIFICATION_KEY, "
@ -369,6 +387,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ACNAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", WNAME "
+ "</if>"
+ ", (SELECT 1 FROM WORKBASKET_ACCESS_LIST s WHERE "
+ "<if test='accessIdIn != null'> "
+ "s.ACCESS_ID IN (<foreach item='item' collection='accessIdIn' separator=',' >#{item}</foreach>) and "
@ -390,6 +411,9 @@ public interface TaskQueryMapper {
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ACNAME "
+ "</if>"
+ "<if test=\"addWorkbasketNameForOrdering\">"
+ ", WNAME "
+ "</if>"
+ " FROM Y WHERE FLAG = 1 "
+ "<if test='!orderBy.isEmpty()'>ORDER BY <foreach item='item' collection='orderBy' separator=',' >"
+ "${item}"

View File

@ -98,6 +98,42 @@ class QueryTasksWithSortingAccTest extends AbstractAccTest {
}
}
@WithAccessId(user = "admin")
@Test
void testSortByWorkbasketName() {
TaskService taskService = taskanaEngine.getTaskService();
List<TaskSummary> results = taskService.createTaskQuery().orderByWorkbasketName(asc).list();
// test is only valid with at least 2 results
assertThat(
results.stream()
.map(t -> t.getWorkbasketSummary().getName())
.distinct()
.collect(Collectors.toList()))
.hasSizeGreaterThan(2);
List<String> idsAsc =
results.stream()
.map(t -> t.getWorkbasketSummary().getName())
.sorted()
.collect(Collectors.toList());
for (int i = 0; i < results.size(); i++) {
assertThat(results.get(i).getWorkbasketSummary().getName()).isEqualTo(idsAsc.get(i));
}
results = taskService.createTaskQuery().orderByWorkbasketName(desc).list();
List<String> idsDesc =
results.stream()
.map(t -> t.getWorkbasketSummary().getName())
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
for (int i = 0; i < results.size(); i++) {
assertThat(results.get(i).getWorkbasketSummary().getName()).isEqualTo(idsDesc.get(i));
}
}
@WithAccessId(user = "admin")
@Test
void testSortByDomainNameAndCreated() {