Closes #2246 - add grouping by sors and pors
This commit is contained in:
parent
f81b54f640
commit
c43ddbeb88
|
@ -289,6 +289,8 @@ class TaskanaConfigurationTest {
|
||||||
boolean expectedAddAdditionalUserInfo = true;
|
boolean expectedAddAdditionalUserInfo = true;
|
||||||
Set<WorkbasketPermission> expectedMinimalPermissionsToAssignDomains =
|
Set<WorkbasketPermission> expectedMinimalPermissionsToAssignDomains =
|
||||||
Set.of(WorkbasketPermission.CUSTOM_2);
|
Set.of(WorkbasketPermission.CUSTOM_2);
|
||||||
|
// database configuration
|
||||||
|
boolean expectedUseSpecificDb2Taskquery = false;
|
||||||
|
|
||||||
// when
|
// when
|
||||||
TaskanaConfiguration configuration =
|
TaskanaConfiguration configuration =
|
||||||
|
@ -346,6 +348,7 @@ class TaskanaConfigurationTest {
|
||||||
// user configuration
|
// user configuration
|
||||||
.addAdditionalUserInfo(expectedAddAdditionalUserInfo)
|
.addAdditionalUserInfo(expectedAddAdditionalUserInfo)
|
||||||
.minimalPermissionsToAssignDomains(expectedMinimalPermissionsToAssignDomains)
|
.minimalPermissionsToAssignDomains(expectedMinimalPermissionsToAssignDomains)
|
||||||
|
.useSpecificDb2Taskquery(expectedUseSpecificDb2Taskquery)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
|
@ -478,6 +481,8 @@ class TaskanaConfigurationTest {
|
||||||
// user configuration
|
// user configuration
|
||||||
.addAdditionalUserInfo(true)
|
.addAdditionalUserInfo(true)
|
||||||
.minimalPermissionsToAssignDomains(Set.of(WorkbasketPermission.CUSTOM_2))
|
.minimalPermissionsToAssignDomains(Set.of(WorkbasketPermission.CUSTOM_2))
|
||||||
|
//database configuration
|
||||||
|
.useSpecificDb2Taskquery(false)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
TaskanaConfiguration copyConfiguration = new Builder(configuration).build();
|
TaskanaConfiguration copyConfiguration = new Builder(configuration).build();
|
||||||
|
|
|
@ -179,7 +179,8 @@ class GetTaskAccTest {
|
||||||
assertThat(readTask.getCustomField(TaskCustomField.CUSTOM_16)).isEqualTo("custom16");
|
assertThat(readTask.getCustomField(TaskCustomField.CUSTOM_16)).isEqualTo("custom16");
|
||||||
assertThatCode(() -> readTask.getCustomAttributeMap().put("X", "Y")).doesNotThrowAnyException();
|
assertThatCode(() -> readTask.getCustomAttributeMap().put("X", "Y")).doesNotThrowAnyException();
|
||||||
assertThatCode(() -> readTask.getCallbackInfo().put("X", "Y")).doesNotThrowAnyException();
|
assertThatCode(() -> readTask.getCallbackInfo().put("X", "Y")).doesNotThrowAnyException();
|
||||||
assertThat(readTask).hasNoNullFieldsOrPropertiesExcept("ownerLongName", "completed");
|
assertThat(readTask)
|
||||||
|
.hasNoNullFieldsOrPropertiesExcept("ownerLongName", "completed", "groupByCount");
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithAccessId(user = "user-1-1")
|
@WithAccessId(user = "user-1-1")
|
||||||
|
|
|
@ -249,7 +249,7 @@ class TaskQueryImplAccTest {
|
||||||
List<TaskSummary> list = taskService.createTaskQuery().workbasketIdIn(wb.getId()).list();
|
List<TaskSummary> list = taskService.createTaskQuery().workbasketIdIn(wb.getId()).list();
|
||||||
|
|
||||||
assertThat(list).containsExactlyInAnyOrder(taskSummary1, taskSummary2);
|
assertThat(list).containsExactlyInAnyOrder(taskSummary1, taskSummary2);
|
||||||
assertThat(taskSummary1).hasNoNullFieldsOrPropertiesExcept("ownerLongName");
|
assertThat(taskSummary1).hasNoNullFieldsOrPropertiesExcept("ownerLongName", "groupByCount");
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithAccessId(user = "user-1-1")
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@ -697,6 +697,9 @@ class TaskQueryImplAccTest {
|
||||||
taskInWorkbasket(wb)
|
taskInWorkbasket(wb)
|
||||||
.completed(Instant.parse("2020-02-01T00:00:00Z"))
|
.completed(Instant.parse("2020-02-01T00:00:00Z"))
|
||||||
.buildAndStoreAsSummary(taskService);
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
taskInWorkbasket(wb)
|
||||||
|
.completed(null)
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithAccessId(user = "user-1-1")
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@ -871,6 +874,7 @@ class TaskQueryImplAccTest {
|
||||||
taskSummary1 = taskInWorkbasket(wb).note("Note1").buildAndStoreAsSummary(taskService);
|
taskSummary1 = taskInWorkbasket(wb).note("Note1").buildAndStoreAsSummary(taskService);
|
||||||
taskSummary2 = taskInWorkbasket(wb).note("Note2").buildAndStoreAsSummary(taskService);
|
taskSummary2 = taskInWorkbasket(wb).note("Note2").buildAndStoreAsSummary(taskService);
|
||||||
taskSummary3 = taskInWorkbasket(wb).note("Lorem ipsum").buildAndStoreAsSummary(taskService);
|
taskSummary3 = taskInWorkbasket(wb).note("Lorem ipsum").buildAndStoreAsSummary(taskService);
|
||||||
|
taskInWorkbasket(wb).note(null).buildAndStoreAsSummary(taskService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithAccessId(user = "user-1-1")
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@ -1772,8 +1776,16 @@ class TaskQueryImplAccTest {
|
||||||
wb = createWorkbasketWithPermission();
|
wb = createWorkbasketWithPermission();
|
||||||
por1 = defaultTestObjectReference().company("15").build();
|
por1 = defaultTestObjectReference().company("15").build();
|
||||||
ObjectReference por2 = defaultTestObjectReference().build();
|
ObjectReference por2 = defaultTestObjectReference().build();
|
||||||
taskSummary1 = taskInWorkbasket(wb).primaryObjRef(por1).buildAndStoreAsSummary(taskService);
|
taskSummary1 =
|
||||||
taskSummary2 = taskInWorkbasket(wb).primaryObjRef(por2).buildAndStoreAsSummary(taskService);
|
taskInWorkbasket(wb)
|
||||||
|
.primaryObjRef(por1)
|
||||||
|
.due(Instant.parse("2022-11-15T09:42:00.000Z"))
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
taskSummary2 =
|
||||||
|
taskInWorkbasket(wb)
|
||||||
|
.primaryObjRef(por2)
|
||||||
|
.due(Instant.parse("2022-11-15T09:45:00.000Z"))
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithAccessId(user = "user-1-1")
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@ -3066,13 +3078,17 @@ class TaskQueryImplAccTest {
|
||||||
.type("SecondType")
|
.type("SecondType")
|
||||||
.build();
|
.build();
|
||||||
taskSummary2 =
|
taskSummary2 =
|
||||||
taskInWorkbasket(wb).objectReferences(sor2).buildAndStoreAsSummary(taskService);
|
taskInWorkbasket(wb)
|
||||||
|
.objectReferences(sor2)
|
||||||
|
.due(Instant.parse("2022-11-15T09:42:00.000Z"))
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
|
||||||
ObjectReference sor2copy = sor2.copy();
|
ObjectReference sor2copy = sor2.copy();
|
||||||
ObjectReference sor1copy = sor1.copy();
|
ObjectReference sor1copy = sor1.copy();
|
||||||
taskSummary3 =
|
taskSummary3 =
|
||||||
taskInWorkbasket(wb)
|
taskInWorkbasket(wb)
|
||||||
.objectReferences(sor2copy, sor1copy)
|
.objectReferences(sor2copy, sor1copy)
|
||||||
|
.due(Instant.parse("2022-11-15T09:45:00.000Z"))
|
||||||
.buildAndStoreAsSummary(taskService);
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
|
||||||
ObjectReference sor3 =
|
ObjectReference sor3 =
|
||||||
|
|
|
@ -0,0 +1,334 @@
|
||||||
|
package acceptance.task.query;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static pro.taskana.testapi.DefaultTestEntities.defaultTestClassification;
|
||||||
|
import static pro.taskana.testapi.DefaultTestEntities.defaultTestObjectReference;
|
||||||
|
import static pro.taskana.testapi.DefaultTestEntities.defaultTestWorkbasket;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable;
|
||||||
|
import pro.taskana.TaskanaConfiguration;
|
||||||
|
import pro.taskana.classification.api.ClassificationService;
|
||||||
|
import pro.taskana.classification.api.models.ClassificationSummary;
|
||||||
|
import pro.taskana.common.api.BaseQuery.SortDirection;
|
||||||
|
import pro.taskana.common.api.security.CurrentUserContext;
|
||||||
|
import pro.taskana.task.api.TaskService;
|
||||||
|
import pro.taskana.task.api.models.ObjectReference;
|
||||||
|
import pro.taskana.task.api.models.TaskSummary;
|
||||||
|
import pro.taskana.testapi.TaskanaConfigurationModifier;
|
||||||
|
import pro.taskana.testapi.TaskanaInject;
|
||||||
|
import pro.taskana.testapi.TaskanaIntegrationTest;
|
||||||
|
import pro.taskana.testapi.builder.ObjectReferenceBuilder;
|
||||||
|
import pro.taskana.testapi.builder.TaskAttachmentBuilder;
|
||||||
|
import pro.taskana.testapi.builder.TaskBuilder;
|
||||||
|
import pro.taskana.testapi.builder.UserBuilder;
|
||||||
|
import pro.taskana.testapi.builder.WorkbasketAccessItemBuilder;
|
||||||
|
import pro.taskana.testapi.security.WithAccessId;
|
||||||
|
import pro.taskana.user.api.UserService;
|
||||||
|
import pro.taskana.workbasket.api.WorkbasketPermission;
|
||||||
|
import pro.taskana.workbasket.api.WorkbasketService;
|
||||||
|
import pro.taskana.workbasket.api.models.WorkbasketSummary;
|
||||||
|
|
||||||
|
@TaskanaIntegrationTest
|
||||||
|
@DisabledIfEnvironmentVariable(named = "DB", matches = "ORACLE")
|
||||||
|
class TaskQueryImplGroupByAccTest implements TaskanaConfigurationModifier {
|
||||||
|
@TaskanaInject TaskService taskService;
|
||||||
|
@TaskanaInject WorkbasketService workbasketService;
|
||||||
|
@TaskanaInject CurrentUserContext currentUserContext;
|
||||||
|
@TaskanaInject ClassificationService classificationService;
|
||||||
|
@TaskanaInject UserService userService;
|
||||||
|
|
||||||
|
ClassificationSummary defaultClassificationSummary;
|
||||||
|
WorkbasketSummary defaultWorkbasket;
|
||||||
|
TaskSummary taskSummary1;
|
||||||
|
TaskSummary taskSummary2;
|
||||||
|
TaskSummary taskSummary3;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TaskanaConfiguration.Builder modify(TaskanaConfiguration.Builder builder) {
|
||||||
|
return builder.addAdditionalUserInfo(true).useSpecificDb2Taskquery(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@BeforeAll
|
||||||
|
void setup() throws Exception {
|
||||||
|
UserBuilder.newUser()
|
||||||
|
.id("user-1-1")
|
||||||
|
.longName("Mustermann, Max - (user-1-1)")
|
||||||
|
.firstName("Max")
|
||||||
|
.lastName("Mustermann")
|
||||||
|
.buildAndStore(userService, "businessadmin");
|
||||||
|
defaultClassificationSummary =
|
||||||
|
defaultTestClassification().buildAndStoreAsSummary(classificationService, "businessadmin");
|
||||||
|
defaultWorkbasket = createWorkbasketWithPermission();
|
||||||
|
ObjectReference sor2 =
|
||||||
|
ObjectReferenceBuilder.newObjectReference()
|
||||||
|
.company("FirstCompany")
|
||||||
|
.value("FirstValue")
|
||||||
|
.type("SecondType")
|
||||||
|
.build();
|
||||||
|
ObjectReference por2 = defaultTestObjectReference().build();
|
||||||
|
taskSummary2 =
|
||||||
|
taskInWorkbasket(defaultWorkbasket)
|
||||||
|
.owner("user-1-1")
|
||||||
|
.primaryObjRef(por2)
|
||||||
|
.objectReferences(sor2)
|
||||||
|
.due(Instant.parse("2022-11-10T09:45:00.000Z"))
|
||||||
|
.name("Name2")
|
||||||
|
.attachments(
|
||||||
|
TaskAttachmentBuilder.newAttachment()
|
||||||
|
.channel("A")
|
||||||
|
.classificationSummary(defaultClassificationSummary)
|
||||||
|
.objectReference(por2)
|
||||||
|
.build())
|
||||||
|
.buildAndStore(taskService)
|
||||||
|
.asSummary();
|
||||||
|
ObjectReference por1 = defaultTestObjectReference().company("15").build();
|
||||||
|
ObjectReference sor1 =
|
||||||
|
ObjectReferenceBuilder.newObjectReference()
|
||||||
|
.company("FirstCompany")
|
||||||
|
.value("FirstValue")
|
||||||
|
.type("FirstType")
|
||||||
|
.build();
|
||||||
|
taskSummary1 =
|
||||||
|
taskInWorkbasket(defaultWorkbasket)
|
||||||
|
.owner("user-1-1")
|
||||||
|
.primaryObjRef(por1)
|
||||||
|
.objectReferences(sor1)
|
||||||
|
.due(Instant.parse("2022-11-09T09:42:00.000Z"))
|
||||||
|
.name("Name3")
|
||||||
|
.attachments(
|
||||||
|
TaskAttachmentBuilder.newAttachment()
|
||||||
|
.channel("B")
|
||||||
|
.classificationSummary(defaultClassificationSummary)
|
||||||
|
.objectReference(por1)
|
||||||
|
.build())
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
ObjectReference sor2copy = sor2.copy();
|
||||||
|
ObjectReference sor1copy = sor1.copy();
|
||||||
|
taskSummary3 =
|
||||||
|
taskInWorkbasket(defaultWorkbasket)
|
||||||
|
.owner("user-1-1")
|
||||||
|
.objectReferences(sor2copy, sor1copy)
|
||||||
|
.due(Instant.parse("2022-11-15T09:45:00.000Z"))
|
||||||
|
.name("Name1")
|
||||||
|
.attachments(
|
||||||
|
TaskAttachmentBuilder.newAttachment()
|
||||||
|
.channel("C")
|
||||||
|
.classificationSummary(defaultClassificationSummary)
|
||||||
|
.objectReference(por1)
|
||||||
|
.build())
|
||||||
|
.buildAndStoreAsSummary(taskService);
|
||||||
|
taskInWorkbasket(createWorkbasketWithPermission()).buildAndStore(taskService);
|
||||||
|
}
|
||||||
|
|
||||||
|
private TaskBuilder taskInWorkbasket(WorkbasketSummary wb) {
|
||||||
|
return TaskBuilder.newTask()
|
||||||
|
.classificationSummary(defaultClassificationSummary)
|
||||||
|
.primaryObjRef(defaultTestObjectReference().build())
|
||||||
|
.workbasketSummary(wb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private WorkbasketSummary createWorkbasketWithPermission() throws Exception {
|
||||||
|
WorkbasketSummary workbasketSummary =
|
||||||
|
defaultTestWorkbasket().buildAndStoreAsSummary(workbasketService, "businessadmin");
|
||||||
|
persistPermission(workbasketSummary);
|
||||||
|
return workbasketSummary;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void persistPermission(WorkbasketSummary workbasketSummary) throws Exception {
|
||||||
|
WorkbasketAccessItemBuilder.newWorkbasketAccessItem()
|
||||||
|
.workbasketId(workbasketSummary.getId())
|
||||||
|
.accessId(currentUserContext.getUserid())
|
||||||
|
.permission(WorkbasketPermission.OPEN)
|
||||||
|
.permission(WorkbasketPermission.READ)
|
||||||
|
.permission(WorkbasketPermission.APPEND)
|
||||||
|
.buildAndStore(workbasketService, "businessadmin");
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupByPor_When_OrderingByName() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupByPor()
|
||||||
|
.orderByName(SortDirection.ASCENDING)
|
||||||
|
.list();
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary3)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupByPor_When_JoiningWithAllTablesAndPaging() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupByPor()
|
||||||
|
.ownerLongNameNotIn("Unexisting")
|
||||||
|
.attachmentChannelNotLike("Unexisting")
|
||||||
|
.sorTypeLike("%Type%")
|
||||||
|
.orderByOwnerLongName(SortDirection.ASCENDING)
|
||||||
|
.orderByAttachmentChannel(SortDirection.ASCENDING)
|
||||||
|
.orderByClassificationName(SortDirection.ASCENDING)
|
||||||
|
.listPage(1, 1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary2)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupBySor_When_JoiningWithAllTablesAndPaging() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupBySor("SecondType")
|
||||||
|
.ownerLongNameNotIn("Unexisting")
|
||||||
|
.attachmentChannelNotLike("Unexisting")
|
||||||
|
.sorTypeLike("%Type%")
|
||||||
|
.orderByOwnerLongName(SortDirection.ASCENDING)
|
||||||
|
.orderByAttachmentChannel(SortDirection.ASCENDING)
|
||||||
|
.orderByClassificationName(SortDirection.ASCENDING)
|
||||||
|
.listPage(1, 1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary2)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupByPorWithOrderingByDue_When_OrderingByPorValue() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupByPor()
|
||||||
|
.orderByPrimaryObjectReferenceValue(SortDirection.ASCENDING)
|
||||||
|
.list();
|
||||||
|
assertThat(list).hasSize(1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary1)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupByPorWithOrderingByDue_When_NotOrdering() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService.createTaskQuery().workbasketIdIn(defaultWorkbasket.getId()).groupByPor().list();
|
||||||
|
assertThat(list).hasSize(1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary1)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_UseSingleCorrectly_When_GroupingByPor() {
|
||||||
|
TaskSummary result =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupByPor()
|
||||||
|
.single();
|
||||||
|
assertThat(result)
|
||||||
|
.usingRecursiveComparison()
|
||||||
|
.ignoringFields("groupByCount")
|
||||||
|
.isEqualTo(taskSummary1);
|
||||||
|
assertThat(result.getGroupByCount()).isEqualTo(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_UseSingleCorrectly_When_GroupingBySor() {
|
||||||
|
TaskSummary result =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupBySor("SecondType")
|
||||||
|
.single();
|
||||||
|
assertThat(result)
|
||||||
|
.usingRecursiveComparison()
|
||||||
|
.ignoringFields("groupByCount")
|
||||||
|
.isEqualTo(taskSummary2);
|
||||||
|
assertThat(result.getGroupByCount()).isEqualTo(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_Count_When_GroupingByPor() {
|
||||||
|
Long numberOfTasks =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupByPor()
|
||||||
|
.count();
|
||||||
|
assertThat(numberOfTasks).isEqualTo(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupBySor_When_OrderingByName() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupBySor("SecondType")
|
||||||
|
.orderByName(SortDirection.ASCENDING)
|
||||||
|
.list();
|
||||||
|
assertThat(list).hasSize(1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary3)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_GroupBySorWithOrderingByDue_When_NotOrdering() {
|
||||||
|
List<TaskSummary> list =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupBySor("SecondType")
|
||||||
|
.list();
|
||||||
|
assertThat(list).hasSize(1);
|
||||||
|
assertThat(list)
|
||||||
|
.usingRecursiveFieldByFieldElementComparatorIgnoringFields("groupByCount")
|
||||||
|
.containsExactly(taskSummary2)
|
||||||
|
.extracting("groupByCount")
|
||||||
|
.containsExactly(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@WithAccessId(user = "user-1-1")
|
||||||
|
@Test
|
||||||
|
void should_Count_When_GroupingBySor() {
|
||||||
|
Long numberOfTasks =
|
||||||
|
taskService
|
||||||
|
.createTaskQuery()
|
||||||
|
.workbasketIdIn(defaultWorkbasket.getId())
|
||||||
|
.groupBySor("SecondType")
|
||||||
|
.count();
|
||||||
|
assertThat(numberOfTasks).isEqualTo(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -53,6 +53,8 @@ taskana.jobs.customJobs=A | B | C
|
||||||
# user configuration
|
# user configuration
|
||||||
taskana.user.addAdditionalUserInfo=true
|
taskana.user.addAdditionalUserInfo=true
|
||||||
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
|
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
|
||||||
|
# database configuration
|
||||||
|
taskana.feature.useSpecificDb2Taskquery=false
|
||||||
# custom configuration
|
# custom configuration
|
||||||
my_custom_property1=my_custom_value1
|
my_custom_property1=my_custom_value1
|
||||||
my_custom_property2=my_custom_value2
|
my_custom_property2=my_custom_value2
|
||||||
|
|
|
@ -123,6 +123,10 @@ public class TaskanaConfiguration {
|
||||||
private final Set<WorkbasketPermission> minimalPermissionsToAssignDomains;
|
private final Set<WorkbasketPermission> minimalPermissionsToAssignDomains;
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// region database configuration
|
||||||
|
private final boolean useSpecificDb2Taskquery;
|
||||||
|
// endregion
|
||||||
|
|
||||||
// region custom configuration
|
// region custom configuration
|
||||||
private final Map<String, String> properties;
|
private final Map<String, String> properties;
|
||||||
// endregion
|
// endregion
|
||||||
|
@ -194,6 +198,8 @@ public class TaskanaConfiguration {
|
||||||
this.addAdditionalUserInfo = builder.addAdditionalUserInfo;
|
this.addAdditionalUserInfo = builder.addAdditionalUserInfo;
|
||||||
this.minimalPermissionsToAssignDomains =
|
this.minimalPermissionsToAssignDomains =
|
||||||
Collections.unmodifiableSet(builder.minimalPermissionsToAssignDomains);
|
Collections.unmodifiableSet(builder.minimalPermissionsToAssignDomains);
|
||||||
|
// database configuration
|
||||||
|
this.useSpecificDb2Taskquery = builder.useSpecificDb2Taskquery;
|
||||||
// custom configuration
|
// custom configuration
|
||||||
this.properties = Map.copyOf(builder.properties);
|
this.properties = Map.copyOf(builder.properties);
|
||||||
}
|
}
|
||||||
|
@ -388,6 +394,10 @@ public class TaskanaConfiguration {
|
||||||
return minimalPermissionsToAssignDomains;
|
return minimalPermissionsToAssignDomains;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isUseSpecificDb2Taskquery() {
|
||||||
|
return useSpecificDb2Taskquery;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return all properties loaded from taskana properties file. Per Design the normal Properties are
|
* return all properties loaded from taskana properties file. Per Design the normal Properties are
|
||||||
* not immutable, so we return here an ImmutableMap, because we don't want direct changes in the
|
* not immutable, so we return here an ImmutableMap, because we don't want direct changes in the
|
||||||
|
@ -447,6 +457,7 @@ public class TaskanaConfiguration {
|
||||||
customJobs,
|
customJobs,
|
||||||
addAdditionalUserInfo,
|
addAdditionalUserInfo,
|
||||||
minimalPermissionsToAssignDomains,
|
minimalPermissionsToAssignDomains,
|
||||||
|
useSpecificDb2Taskquery,
|
||||||
properties);
|
properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,6 +492,7 @@ public class TaskanaConfiguration {
|
||||||
&& simpleHistoryCleanupJobAllCompletedSameParentBusiness
|
&& simpleHistoryCleanupJobAllCompletedSameParentBusiness
|
||||||
== other.simpleHistoryCleanupJobAllCompletedSameParentBusiness
|
== other.simpleHistoryCleanupJobAllCompletedSameParentBusiness
|
||||||
&& taskUpdatePriorityJobEnabled == other.taskUpdatePriorityJobEnabled
|
&& taskUpdatePriorityJobEnabled == other.taskUpdatePriorityJobEnabled
|
||||||
|
&& useSpecificDb2Taskquery == other.useSpecificDb2Taskquery
|
||||||
&& taskUpdatePriorityJobBatchSize == other.taskUpdatePriorityJobBatchSize
|
&& taskUpdatePriorityJobBatchSize == other.taskUpdatePriorityJobBatchSize
|
||||||
&& userInfoRefreshJobEnabled == other.userInfoRefreshJobEnabled
|
&& userInfoRefreshJobEnabled == other.userInfoRefreshJobEnabled
|
||||||
&& addAdditionalUserInfo == other.addAdditionalUserInfo
|
&& addAdditionalUserInfo == other.addAdditionalUserInfo
|
||||||
|
@ -596,6 +608,8 @@ public class TaskanaConfiguration {
|
||||||
+ addAdditionalUserInfo
|
+ addAdditionalUserInfo
|
||||||
+ ", minimalPermissionsToAssignDomains="
|
+ ", minimalPermissionsToAssignDomains="
|
||||||
+ minimalPermissionsToAssignDomains
|
+ minimalPermissionsToAssignDomains
|
||||||
|
+ ", useSpecificDb2Taskquery="
|
||||||
|
+ useSpecificDb2Taskquery
|
||||||
+ ", properties="
|
+ ", properties="
|
||||||
+ properties
|
+ properties
|
||||||
+ "]";
|
+ "]";
|
||||||
|
@ -743,6 +757,11 @@ public class TaskanaConfiguration {
|
||||||
private Set<WorkbasketPermission> minimalPermissionsToAssignDomains = new HashSet<>();
|
private Set<WorkbasketPermission> minimalPermissionsToAssignDomains = new HashSet<>();
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// region database configuration
|
||||||
|
@TaskanaProperty("taskana.feature.useSpecificDb2Taskquery")
|
||||||
|
private boolean useSpecificDb2Taskquery = true;
|
||||||
|
// endregion
|
||||||
|
|
||||||
// region custom configuration
|
// region custom configuration
|
||||||
private Map<String, String> properties = Collections.emptyMap();
|
private Map<String, String> properties = Collections.emptyMap();
|
||||||
// endregion
|
// endregion
|
||||||
|
@ -845,6 +864,8 @@ public class TaskanaConfiguration {
|
||||||
// user configuration
|
// user configuration
|
||||||
this.addAdditionalUserInfo = conf.addAdditionalUserInfo;
|
this.addAdditionalUserInfo = conf.addAdditionalUserInfo;
|
||||||
this.minimalPermissionsToAssignDomains = conf.minimalPermissionsToAssignDomains;
|
this.minimalPermissionsToAssignDomains = conf.minimalPermissionsToAssignDomains;
|
||||||
|
// database configuration
|
||||||
|
this.useSpecificDb2Taskquery = conf.useSpecificDb2Taskquery;
|
||||||
// custom configuration
|
// custom configuration
|
||||||
this.properties = conf.properties;
|
this.properties = conf.properties;
|
||||||
}
|
}
|
||||||
|
@ -1128,6 +1149,11 @@ public class TaskanaConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
// region database configuration
|
||||||
|
public Builder useSpecificDb2Taskquery(boolean useSpecificDb2Taskquery) {
|
||||||
|
this.useSpecificDb2Taskquery = useSpecificDb2Taskquery;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public TaskanaConfiguration build() {
|
public TaskanaConfiguration build() {
|
||||||
adjustConfiguration();
|
adjustConfiguration();
|
||||||
|
|
|
@ -1217,6 +1217,29 @@ public interface TaskQuery extends BaseQuery<TaskSummary, TaskQueryColumnName> {
|
||||||
*/
|
*/
|
||||||
TaskQuery orderByPrimaryObjectReferenceValue(SortDirection sortDirection);
|
TaskQuery orderByPrimaryObjectReferenceValue(SortDirection sortDirection);
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
// region groupBy
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Group the {@linkplain Task Tasks} that will be returned by this query according to the value of
|
||||||
|
* their {@linkplain Task#getPrimaryObjRef() primary ObjectReference}. Only one Task will be
|
||||||
|
* returned for all Tasks with the same value.
|
||||||
|
*
|
||||||
|
* @return the query
|
||||||
|
*/
|
||||||
|
TaskQuery groupByPor();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Group the {@linkplain Task Tasks} that will be returned by this query according to the value of
|
||||||
|
* their {@linkplain Task#getSecondaryObjectReferences() secondary ObjectReference} with the
|
||||||
|
* specified type. Only one Task will be returned for all Tasks with the same value.
|
||||||
|
*
|
||||||
|
* @param type the type of the relevant {@linkplain Task#getSecondaryObjectReferences() secondary
|
||||||
|
* ObjectReference}
|
||||||
|
* @return the query
|
||||||
|
*/
|
||||||
|
TaskQuery groupBySor(String type);
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
// region read
|
// region read
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,16 @@ public interface TaskSummary {
|
||||||
*/
|
*/
|
||||||
Instant getReceived();
|
Instant getReceived();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of {@linkplain Task Tasks} that are grouped together with this {@linkplain
|
||||||
|
* Task} by a {@linkplain pro.taskana.task.api.TaskQuery}. It's only not NULL when using
|
||||||
|
* {@linkplain pro.taskana.task.api.TaskQuery#groupByPor()} or {@linkplain
|
||||||
|
* pro.taskana.task.api.TaskQuery#groupBySor(String)}.
|
||||||
|
*
|
||||||
|
* @return the number of {@linkplain Task Tasks} grouped toghether with this {@linkplain Task}
|
||||||
|
*/
|
||||||
|
Integer getGroupByCount();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the time when the {@linkplain Task} is due.
|
* Returns the time when the {@linkplain Task} is due.
|
||||||
*
|
*
|
||||||
|
|
|
@ -53,7 +53,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(TaskQueryImpl.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(TaskQueryImpl.class);
|
||||||
private final InternalTaskanaEngine taskanaEngine;
|
private final InternalTaskanaEngine taskanaEngine;
|
||||||
private final TaskServiceImpl taskService;
|
private final TaskServiceImpl taskService;
|
||||||
private final List<String> orderBy;
|
private final List<String> orderByOuter;
|
||||||
|
private final List<String> orderByInner;
|
||||||
|
|
||||||
private TaskQueryColumnName columnName;
|
private TaskQueryColumnName columnName;
|
||||||
private String[] accessIdIn;
|
private String[] accessIdIn;
|
||||||
|
@ -70,7 +71,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
private boolean addAttachmentClassificationNameToSelectClauseForOrdering = false;
|
private boolean addAttachmentClassificationNameToSelectClauseForOrdering = false;
|
||||||
private boolean addWorkbasketNameToSelectClauseForOrdering = false;
|
private boolean addWorkbasketNameToSelectClauseForOrdering = false;
|
||||||
private boolean joinWithUserInfo;
|
private boolean joinWithUserInfo;
|
||||||
|
private boolean groupByPor;
|
||||||
|
private String groupBySor;
|
||||||
private String[] taskId;
|
private String[] taskId;
|
||||||
private String[] taskIdNotIn;
|
private String[] taskIdNotIn;
|
||||||
private String[] externalIdIn;
|
private String[] externalIdIn;
|
||||||
|
@ -338,7 +340,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
TaskQueryImpl(InternalTaskanaEngine taskanaEngine) {
|
TaskQueryImpl(InternalTaskanaEngine taskanaEngine) {
|
||||||
this.taskanaEngine = taskanaEngine;
|
this.taskanaEngine = taskanaEngine;
|
||||||
this.taskService = (TaskServiceImpl) taskanaEngine.getEngine().getTaskService();
|
this.taskService = (TaskServiceImpl) taskanaEngine.getEngine().getTaskService();
|
||||||
this.orderBy = new ArrayList<>();
|
this.orderByOuter = new ArrayList<>();
|
||||||
|
this.orderByInner = new ArrayList<>();
|
||||||
this.filterByAccessIdIn = true;
|
this.filterByAccessIdIn = true;
|
||||||
this.withoutAttachment = false;
|
this.withoutAttachment = false;
|
||||||
this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo();
|
this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo();
|
||||||
|
@ -767,7 +770,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByClassificationName(SortDirection sortDirection) {
|
public TaskQuery orderByClassificationName(SortDirection sortDirection) {
|
||||||
joinWithClassifications = true;
|
joinWithClassifications = true;
|
||||||
addClassificationNameToSelectClauseForOrdering = true;
|
addClassificationNameToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("CNAME", sortDirection)
|
? addOrderCriteria("CNAME", sortDirection)
|
||||||
: addOrderCriteria("c.NAME", sortDirection);
|
: addOrderCriteria("c.NAME", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1066,6 +1070,30 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
return addOrderCriteria("POR_VALUE", sortDirection);
|
return addOrderCriteria("POR_VALUE", sortDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TaskQuery groupByPor() {
|
||||||
|
if (taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery()
|
||||||
|
&& getDB().equals(DB.DB2)) {
|
||||||
|
throw new SystemException(
|
||||||
|
"taskana.feature.useSpecificDb2Taskquery needs to be set to false "
|
||||||
|
+ "in order to group by por.");
|
||||||
|
}
|
||||||
|
groupByPor = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TaskQuery groupBySor(String type) {
|
||||||
|
if (taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery()
|
||||||
|
&& getDB().equals(DB.DB2)) {
|
||||||
|
throw new SystemException(
|
||||||
|
"taskana.feature.useSpecificDb2Taskquery needs to be set to false "
|
||||||
|
+ "in order to group by sor.");
|
||||||
|
}
|
||||||
|
groupBySor = type;
|
||||||
|
return sorTypeIn(type);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TaskQuery readEquals(Boolean isRead) {
|
public TaskQuery readEquals(Boolean isRead) {
|
||||||
this.isRead = isRead;
|
this.isRead = isRead;
|
||||||
|
@ -1096,7 +1124,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentClassificationId(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentClassificationId(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentColumnsToSelectClauseForOrdering = true;
|
addAttachmentColumnsToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("ACLASSIFICATION_ID", sortDirection)
|
? addOrderCriteria("ACLASSIFICATION_ID", sortDirection)
|
||||||
: addOrderCriteria("a.CLASSIFICATION_ID", sortDirection);
|
: addOrderCriteria("a.CLASSIFICATION_ID", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1133,7 +1162,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentClassificationKey(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentClassificationKey(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentColumnsToSelectClauseForOrdering = true;
|
addAttachmentColumnsToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("ACLASSIFICATION_KEY", sortDirection)
|
? addOrderCriteria("ACLASSIFICATION_KEY", sortDirection)
|
||||||
: addOrderCriteria("a.CLASSIFICATION_KEY", sortDirection);
|
: addOrderCriteria("a.CLASSIFICATION_KEY", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1170,7 +1200,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentClassificationName(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentClassificationName(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentClassificationNameToSelectClauseForOrdering = true;
|
addAttachmentClassificationNameToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("ACNAME", sortDirection)
|
? addOrderCriteria("ACNAME", sortDirection)
|
||||||
: addOrderCriteria("ac.NAME", sortDirection);
|
: addOrderCriteria("ac.NAME", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1207,7 +1238,10 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentChannel(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentChannel(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentColumnsToSelectClauseForOrdering = true;
|
addAttachmentColumnsToSelectClauseForOrdering = true;
|
||||||
return addOrderCriteria("CHANNEL", sortDirection);
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
|
? addOrderCriteria("CHANNEL", sortDirection)
|
||||||
|
: addOrderCriteria("a.CHANNEL", sortDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1242,7 +1276,10 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentReference(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentReference(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentColumnsToSelectClauseForOrdering = true;
|
addAttachmentColumnsToSelectClauseForOrdering = true;
|
||||||
return addOrderCriteria("REF_VALUE", sortDirection);
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
|
? addOrderCriteria("REF_VALUE", sortDirection)
|
||||||
|
: addOrderCriteria("a.REF_VALUE", sortDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1265,7 +1302,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByAttachmentReceived(SortDirection sortDirection) {
|
public TaskQuery orderByAttachmentReceived(SortDirection sortDirection) {
|
||||||
joinWithAttachments = true;
|
joinWithAttachments = true;
|
||||||
addAttachmentColumnsToSelectClauseForOrdering = true;
|
addAttachmentColumnsToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("ARECEIVED", sortDirection)
|
? addOrderCriteria("ARECEIVED", sortDirection)
|
||||||
: addOrderCriteria("a.RECEIVED", sortDirection);
|
: addOrderCriteria("a.RECEIVED", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1926,7 +1964,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
public TaskQuery orderByWorkbasketName(SortDirection sortDirection) {
|
public TaskQuery orderByWorkbasketName(SortDirection sortDirection) {
|
||||||
joinWithWorkbaskets = true;
|
joinWithWorkbaskets = true;
|
||||||
addWorkbasketNameToSelectClauseForOrdering = true;
|
addWorkbasketNameToSelectClauseForOrdering = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("WNAME", sortDirection)
|
? addOrderCriteria("WNAME", sortDirection)
|
||||||
: addOrderCriteria("w.NAME", sortDirection);
|
: addOrderCriteria("w.NAME", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1934,7 +1973,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
@Override
|
@Override
|
||||||
public TaskQuery orderByOwnerLongName(SortDirection sortDirection) {
|
public TaskQuery orderByOwnerLongName(SortDirection sortDirection) {
|
||||||
joinWithUserInfo = true;
|
joinWithUserInfo = true;
|
||||||
return DB.DB2 == getDB()
|
return (DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery())
|
||||||
? addOrderCriteria("ULONG_NAME", sortDirection)
|
? addOrderCriteria("ULONG_NAME", sortDirection)
|
||||||
: addOrderCriteria("u.LONG_NAME", sortDirection);
|
: addOrderCriteria("u.LONG_NAME", sortDirection);
|
||||||
}
|
}
|
||||||
|
@ -1987,7 +2027,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
try {
|
try {
|
||||||
taskanaEngine.openConnection();
|
taskanaEngine.openConnection();
|
||||||
this.columnName = columnName;
|
this.columnName = columnName;
|
||||||
this.orderBy.clear();
|
this.orderByOuter.clear();
|
||||||
|
this.orderByInner.clear();
|
||||||
this.addOrderCriteria(columnName.toString(), sortDirection);
|
this.addOrderCriteria(columnName.toString(), sortDirection);
|
||||||
checkForIllegalParamCombinations();
|
checkForIllegalParamCombinations();
|
||||||
checkOpenAndReadPermissionForSpecifiedWorkbaskets();
|
checkOpenAndReadPermissionForSpecifiedWorkbaskets();
|
||||||
|
@ -2069,7 +2110,9 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
// optimized query for db2 can't be used for now in case of selectAndClaim because of temporary
|
// optimized query for db2 can't be used for now in case of selectAndClaim because of temporary
|
||||||
// tables and the "for update" clause clashing in db2
|
// tables and the "for update" clause clashing in db2
|
||||||
private String getLinkToMapperScript() {
|
private String getLinkToMapperScript() {
|
||||||
if (DB.DB2 == getDB() && !selectAndClaim) {
|
if (DB.DB2 == getDB()
|
||||||
|
&& !selectAndClaim
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery()) {
|
||||||
return LINK_TO_MAPPER_DB2;
|
return LINK_TO_MAPPER_DB2;
|
||||||
} else if (selectAndClaim && DB.ORACLE == getDB()) {
|
} else if (selectAndClaim && DB.ORACLE == getDB()) {
|
||||||
return LINK_TO_MAPPER_ORACLE;
|
return LINK_TO_MAPPER_ORACLE;
|
||||||
|
@ -2079,7 +2122,10 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getLinkToCounterTaskScript() {
|
private String getLinkToCounterTaskScript() {
|
||||||
return DB.DB2 == getDB() ? LINK_TO_COUNTER_DB2 : LINK_TO_COUNTER;
|
return DB.DB2 == getDB()
|
||||||
|
&& taskanaEngine.getEngine().getConfiguration().isUseSpecificDb2Taskquery()
|
||||||
|
? LINK_TO_COUNTER_DB2
|
||||||
|
: LINK_TO_COUNTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateAllTimeIntervals(TimeInterval[] intervals) {
|
private void validateAllTimeIntervals(TimeInterval[] intervals) {
|
||||||
|
@ -2239,7 +2285,16 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
if (sortDirection == null) {
|
if (sortDirection == null) {
|
||||||
sortDirection = SortDirection.ASCENDING;
|
sortDirection = SortDirection.ASCENDING;
|
||||||
}
|
}
|
||||||
orderBy.add(columnName + " " + sortDirection);
|
orderByInner.add(columnName + " " + sortDirection);
|
||||||
|
if (columnName.startsWith("a") || columnName.startsWith("w") || columnName.startsWith("c")) {
|
||||||
|
orderByOuter.add(columnName.replace(".", "").toUpperCase() + " " + sortDirection);
|
||||||
|
} else {
|
||||||
|
if (columnName.startsWith("u")) {
|
||||||
|
orderByOuter.add(columnName.replace(".", "").substring(1) + " " + sortDirection);
|
||||||
|
} else {
|
||||||
|
orderByOuter.add(columnName + " " + sortDirection);
|
||||||
|
}
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2249,8 +2304,8 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
+ taskanaEngine
|
+ taskanaEngine
|
||||||
+ ", taskService="
|
+ ", taskService="
|
||||||
+ taskService
|
+ taskService
|
||||||
+ ", orderBy="
|
+ ", orderByOuter="
|
||||||
+ orderBy
|
+ orderByOuter
|
||||||
+ ", columnName="
|
+ ", columnName="
|
||||||
+ columnName
|
+ columnName
|
||||||
+ ", accessIdIn="
|
+ ", accessIdIn="
|
||||||
|
@ -2279,6 +2334,10 @@ public class TaskQueryImpl implements TaskQuery {
|
||||||
+ addAttachmentClassificationNameToSelectClauseForOrdering
|
+ addAttachmentClassificationNameToSelectClauseForOrdering
|
||||||
+ ", addWorkbasketNameToSelectClauseForOrdering="
|
+ ", addWorkbasketNameToSelectClauseForOrdering="
|
||||||
+ addWorkbasketNameToSelectClauseForOrdering
|
+ addWorkbasketNameToSelectClauseForOrdering
|
||||||
|
+ ", groupByPor="
|
||||||
|
+ groupByPor
|
||||||
|
+ ", groupBySor="
|
||||||
|
+ groupBySor
|
||||||
+ ", taskId="
|
+ ", taskId="
|
||||||
+ Arrays.toString(taskId)
|
+ Arrays.toString(taskId)
|
||||||
+ ", taskIdNotIn="
|
+ ", taskIdNotIn="
|
||||||
|
|
|
@ -43,6 +43,7 @@ public interface TaskQueryMapper {
|
||||||
@Result(property = "primaryObjRefImpl.value", column = "POR_VALUE")
|
@Result(property = "primaryObjRefImpl.value", column = "POR_VALUE")
|
||||||
@Result(property = "isRead", column = "IS_READ")
|
@Result(property = "isRead", column = "IS_READ")
|
||||||
@Result(property = "isTransferred", column = "IS_TRANSFERRED")
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")
|
||||||
|
@Result(property = "groupByCount", column = "R_COUNT")
|
||||||
@Result(property = "custom1", column = "CUSTOM_1")
|
@Result(property = "custom1", column = "CUSTOM_1")
|
||||||
@Result(property = "custom2", column = "CUSTOM_2")
|
@Result(property = "custom2", column = "CUSTOM_2")
|
||||||
@Result(property = "custom3", column = "CUSTOM_3")
|
@Result(property = "custom3", column = "CUSTOM_3")
|
||||||
|
|
|
@ -24,15 +24,22 @@ public class TaskQuerySqlProvider {
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public static String queryTaskSummaries() {
|
public static String queryTaskSummaries() {
|
||||||
return OPENING_SCRIPT_TAG
|
return OPENING_SCRIPT_TAG
|
||||||
|
+ openOuterClauseForGroupByPorOrSor()
|
||||||
+ "SELECT <if test=\"useDistinctKeyword\">DISTINCT</if> "
|
+ "SELECT <if test=\"useDistinctKeyword\">DISTINCT</if> "
|
||||||
+ commonSelectFields()
|
+ commonSelectFields()
|
||||||
|
+ "<if test='groupBySor != null'>, o.VALUE as SOR_VALUE </if>"
|
||||||
+ "<if test=\"addAttachmentColumnsToSelectClauseForOrdering\">"
|
+ "<if test=\"addAttachmentColumnsToSelectClauseForOrdering\">"
|
||||||
+ ", a.CLASSIFICATION_ID, a.CLASSIFICATION_KEY, a.CHANNEL, a.REF_VALUE, a.RECEIVED"
|
+ ", a.CLASSIFICATION_ID as ACLASSIFICATION_ID, "
|
||||||
|
+ "a.CLASSIFICATION_KEY as ACLASSIFICATION_KEY, a.CHANNEL as ACHANNEL, "
|
||||||
|
+ "a.REF_VALUE as AREF_VALUE, a.RECEIVED as ARECEIVED"
|
||||||
+ "</if>"
|
+ "</if>"
|
||||||
+ "<if test=\"addClassificationNameToSelectClauseForOrdering\">, c.NAME </if>"
|
+ "<if test=\"addClassificationNameToSelectClauseForOrdering\">, c.NAME as CNAME </if>"
|
||||||
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">, ac.NAME </if>"
|
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">, "
|
||||||
+ "<if test=\"addWorkbasketNameToSelectClauseForOrdering\">, w.NAME </if>"
|
+ "ac.NAME as ACNAME </if>"
|
||||||
|
+ "<if test=\"addWorkbasketNameToSelectClauseForOrdering\">, w.NAME as WNAME </if>"
|
||||||
+ "<if test=\"joinWithUserInfo\">, u.LONG_NAME</if>"
|
+ "<if test=\"joinWithUserInfo\">, u.LONG_NAME</if>"
|
||||||
|
+ groupByPorIfActive()
|
||||||
|
+ groupBySorIfActive()
|
||||||
+ "FROM TASK t "
|
+ "FROM TASK t "
|
||||||
+ "<if test=\"joinWithAttachments\">"
|
+ "<if test=\"joinWithAttachments\">"
|
||||||
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
||||||
|
@ -57,8 +64,10 @@ public class TaskQuerySqlProvider {
|
||||||
+ commonTaskWhereStatement()
|
+ commonTaskWhereStatement()
|
||||||
+ "<if test='selectAndClaim == true'> AND t.STATE = 'READY' </if>"
|
+ "<if test='selectAndClaim == true'> AND t.STATE = 'READY' </if>"
|
||||||
+ CLOSING_WHERE_TAG
|
+ CLOSING_WHERE_TAG
|
||||||
+ "<if test='!orderBy.isEmpty()'>"
|
+ closeOuterClauseForGroupByPor()
|
||||||
+ "ORDER BY <foreach item='item' collection='orderBy' separator=',' >${item}</foreach>"
|
+ closeOuterClauseForGroupBySor()
|
||||||
|
+ "<if test='!orderByOuter.isEmpty()'>"
|
||||||
|
+ "ORDER BY <foreach item='item' collection='orderByOuter' separator=',' >${item}</foreach>"
|
||||||
+ "</if> "
|
+ "</if> "
|
||||||
+ "<if test='selectAndClaim == true'> "
|
+ "<if test='selectAndClaim == true'> "
|
||||||
+ "FETCH FIRST ROW ONLY FOR UPDATE"
|
+ "FETCH FIRST ROW ONLY FOR UPDATE"
|
||||||
|
@ -128,8 +137,8 @@ public class TaskQuerySqlProvider {
|
||||||
+ db2selectFields()
|
+ db2selectFields()
|
||||||
+ "FROM Y "
|
+ "FROM Y "
|
||||||
+ "WHERE FLAG = 1 "
|
+ "WHERE FLAG = 1 "
|
||||||
+ "<if test='!orderBy.isEmpty()'>"
|
+ "<if test='!orderByOuter.isEmpty()'>"
|
||||||
+ "ORDER BY <foreach item='item' collection='orderBy' separator=',' >${item}</foreach>"
|
+ "ORDER BY <foreach item='item' collection='orderByOuter' separator=',' >${item}</foreach>"
|
||||||
+ "</if> "
|
+ "</if> "
|
||||||
+ "<if test='selectAndClaim == true'>"
|
+ "<if test='selectAndClaim == true'>"
|
||||||
+ "FETCH FIRST ROW ONLY FOR UPDATE WITH RS USE AND KEEP UPDATE LOCKS"
|
+ "FETCH FIRST ROW ONLY FOR UPDATE WITH RS USE AND KEEP UPDATE LOCKS"
|
||||||
|
@ -184,8 +193,8 @@ public class TaskQuerySqlProvider {
|
||||||
+ commonTaskWhereStatement()
|
+ commonTaskWhereStatement()
|
||||||
+ "<if test='selectAndClaim == true'> AND t.STATE = 'READY' </if>"
|
+ "<if test='selectAndClaim == true'> AND t.STATE = 'READY' </if>"
|
||||||
+ CLOSING_WHERE_TAG
|
+ CLOSING_WHERE_TAG
|
||||||
+ "<if test='!orderBy.isEmpty()'>"
|
+ "<if test='!orderByOuter.isEmpty()'>"
|
||||||
+ "ORDER BY <foreach item='item' collection='orderBy' separator=',' >${item}</foreach>"
|
+ "ORDER BY <foreach item='item' collection='orderByOuter' separator=',' >${item}</foreach>"
|
||||||
+ "</if> "
|
+ "</if> "
|
||||||
+ "fetch first 1 rows only "
|
+ "fetch first 1 rows only "
|
||||||
+ ") FOR UPDATE"
|
+ ") FOR UPDATE"
|
||||||
|
@ -196,6 +205,14 @@ public class TaskQuerySqlProvider {
|
||||||
public static String countQueryTasks() {
|
public static String countQueryTasks() {
|
||||||
return OPENING_SCRIPT_TAG
|
return OPENING_SCRIPT_TAG
|
||||||
+ "SELECT COUNT( <if test=\"useDistinctKeyword\">DISTINCT</if> t.ID) "
|
+ "SELECT COUNT( <if test=\"useDistinctKeyword\">DISTINCT</if> t.ID) "
|
||||||
|
+ "<if test=\"groupByPor or groupBySor != null\"> "
|
||||||
|
+ "FROM (SELECT t.ID, t.POR_VALUE "
|
||||||
|
+ "</if> "
|
||||||
|
+ "<if test=\"groupBySor != null\"> "
|
||||||
|
+ ", o.VALUE as SOR_VALUE "
|
||||||
|
+ "</if> "
|
||||||
|
+ groupByPorIfActive()
|
||||||
|
+ groupBySorIfActive()
|
||||||
+ "FROM TASK t "
|
+ "FROM TASK t "
|
||||||
+ "<if test=\"joinWithAttachments\">"
|
+ "<if test=\"joinWithAttachments\">"
|
||||||
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
||||||
|
@ -216,6 +233,8 @@ public class TaskQuerySqlProvider {
|
||||||
+ checkForAuthorization()
|
+ checkForAuthorization()
|
||||||
+ commonTaskWhereStatement()
|
+ commonTaskWhereStatement()
|
||||||
+ CLOSING_WHERE_TAG
|
+ CLOSING_WHERE_TAG
|
||||||
|
+ closeOuterClauseForGroupByPor()
|
||||||
|
+ closeOuterClauseForGroupBySor()
|
||||||
+ CLOSING_SCRIPT_TAG;
|
+ CLOSING_SCRIPT_TAG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,8 +305,8 @@ public class TaskQuerySqlProvider {
|
||||||
+ checkForAuthorization()
|
+ checkForAuthorization()
|
||||||
+ commonTaskWhereStatement()
|
+ commonTaskWhereStatement()
|
||||||
+ CLOSING_WHERE_TAG
|
+ CLOSING_WHERE_TAG
|
||||||
+ "<if test='!orderBy.isEmpty()'>"
|
+ "<if test='!orderByInner.isEmpty()'>"
|
||||||
+ "ORDER BY <foreach item='item' collection='orderBy' separator=',' >"
|
+ "ORDER BY <foreach item='item' collection='orderByInner' separator=',' >"
|
||||||
+ "<choose>"
|
+ "<choose>"
|
||||||
+ "<when test=\"item.contains('TCLASSIFICATION_KEY ASC')\">"
|
+ "<when test=\"item.contains('TCLASSIFICATION_KEY ASC')\">"
|
||||||
+ "t.CLASSIFICATION_KEY ASC"
|
+ "t.CLASSIFICATION_KEY ASC"
|
||||||
|
@ -379,6 +398,108 @@ public class TaskQuerySqlProvider {
|
||||||
+ "</if>";
|
+ "</if>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String groupByPorIfActive() {
|
||||||
|
return "<if test=\"groupByPor\"> "
|
||||||
|
+ ", ROW_NUMBER() OVER (PARTITION BY POR_VALUE "
|
||||||
|
+ "<if test='!orderByInner.isEmpty() and !orderByInner.get(0).equals(\"POR_VALUE ASC\") "
|
||||||
|
+ "and !orderByInner.get(0).equals(\"POR_VALUE DESC\")'>"
|
||||||
|
+ "ORDER BY <foreach item='item' collection='orderByInner' separator=',' >${item}</foreach>"
|
||||||
|
+ "</if> "
|
||||||
|
+ "<if test='orderByInner.isEmpty() or orderByInner.get(0).equals(\"POR_VALUE ASC\") "
|
||||||
|
+ "or orderByInner.get(0).equals(\"POR_VALUE DESC\")'>"
|
||||||
|
+ "ORDER BY DUE ASC"
|
||||||
|
+ "</if> "
|
||||||
|
+ ")"
|
||||||
|
+ "AS rn"
|
||||||
|
+ "</if> ";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String groupBySorIfActive() {
|
||||||
|
return "<if test='groupBySor != null'> "
|
||||||
|
+ ", ROW_NUMBER() OVER (PARTITION BY o.VALUE "
|
||||||
|
+ "<if test='!orderByInner.isEmpty()'>"
|
||||||
|
+ "ORDER BY <foreach item='item' collection='orderByInner' separator=',' >${item}</foreach>"
|
||||||
|
+ "</if> "
|
||||||
|
+ "<if test='orderByInner.isEmpty()'>"
|
||||||
|
+ "ORDER BY DUE ASC"
|
||||||
|
+ "</if> "
|
||||||
|
+ ")"
|
||||||
|
+ "AS rn"
|
||||||
|
+ "</if> ";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String openOuterClauseForGroupByPorOrSor() {
|
||||||
|
return "<if test=\"groupByPor or groupBySor != null\"> "
|
||||||
|
+ "SELECT * FROM ("
|
||||||
|
+ "</if> ";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String closeOuterClauseForGroupByPor() {
|
||||||
|
return "<if test=\"groupByPor\"> "
|
||||||
|
+ ") t LEFT JOIN"
|
||||||
|
+ " (SELECT POR_VALUE as PVALUE, COUNT(POR_VALUE) AS R_COUNT "
|
||||||
|
+ "FROM (SELECT DISTINCT t.id , POR_VALUE "
|
||||||
|
+ "FROM TASK t"
|
||||||
|
+ "<if test=\"joinWithAttachments\">"
|
||||||
|
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithSecondaryObjectReferences\">"
|
||||||
|
+ "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithClassifications\">"
|
||||||
|
+ "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithAttachmentClassifications\">"
|
||||||
|
+ "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithWorkbaskets\">"
|
||||||
|
+ "LEFT JOIN WORKBASKET w ON t.WORKBASKET_ID = w.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithUserInfo\">"
|
||||||
|
+ "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ OPENING_WHERE_TAG
|
||||||
|
+ checkForAuthorization()
|
||||||
|
+ commonTaskWhereStatement()
|
||||||
|
+ "<if test='selectAndClaim == true'> AND t.STATE = 'READY' </if>"
|
||||||
|
+ CLOSING_WHERE_TAG
|
||||||
|
+ ") as y "
|
||||||
|
+ "GROUP BY POR_VALUE) AS tt ON t.POR_VALUE=tt.PVALUE "
|
||||||
|
+ "WHERE rn = 1"
|
||||||
|
+ "</if> ";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String closeOuterClauseForGroupBySor() {
|
||||||
|
return "<if test='groupBySor != null'> "
|
||||||
|
+ ") t LEFT JOIN"
|
||||||
|
+ " (SELECT o.VALUE, COUNT(o.VALUE) AS R_COUNT "
|
||||||
|
+ "FROM TASK t "
|
||||||
|
+ "LEFT JOIN OBJECT_REFERENCE o on t.ID=o.TASK_ID "
|
||||||
|
+ "<if test=\"joinWithAttachments\">"
|
||||||
|
+ "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithClassifications\">"
|
||||||
|
+ "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithAttachmentClassifications\">"
|
||||||
|
+ "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithWorkbaskets\">"
|
||||||
|
+ "LEFT JOIN WORKBASKET w ON t.WORKBASKET_ID = w.ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ "<if test=\"joinWithUserInfo\">"
|
||||||
|
+ "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
|
||||||
|
+ "</if>"
|
||||||
|
+ OPENING_WHERE_TAG
|
||||||
|
+ checkForAuthorization()
|
||||||
|
+ commonTaskWhereStatement()
|
||||||
|
+ "AND o.TYPE=#{groupBySor} "
|
||||||
|
+ CLOSING_WHERE_TAG
|
||||||
|
+ "GROUP BY o.VALUE) AS tt ON t.SOR_VALUE=tt.VALUE "
|
||||||
|
+ "WHERE rn = 1"
|
||||||
|
+ "</if> ";
|
||||||
|
}
|
||||||
|
|
||||||
private static String commonTaskObjectReferenceWhereStatement() {
|
private static String commonTaskObjectReferenceWhereStatement() {
|
||||||
return "<if test='objectReferences != null'>"
|
return "<if test='objectReferences != null'>"
|
||||||
+ "AND (<foreach item='item' collection='objectReferences' separator=' OR '> "
|
+ "AND (<foreach item='item' collection='objectReferences' separator=' OR '> "
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class TaskImpl extends TaskSummaryImpl implements Task {
|
||||||
callbackInfo = new HashMap<>(copyFrom.callbackInfo);
|
callbackInfo = new HashMap<>(copyFrom.callbackInfo);
|
||||||
callbackState = copyFrom.callbackState;
|
callbackState = copyFrom.callbackState;
|
||||||
attachments = copyFrom.attachments.stream().map(Attachment::copy).collect(Collectors.toList());
|
attachments = copyFrom.attachments.stream().map(Attachment::copy).collect(Collectors.toList());
|
||||||
|
groupByCount = copyFrom.groupByCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getCustomAttributes() {
|
public Map<String, String> getCustomAttributes() {
|
||||||
|
@ -280,6 +281,7 @@ public class TaskImpl extends TaskSummaryImpl implements Task {
|
||||||
taskSummary.setNote(note);
|
taskSummary.setNote(note);
|
||||||
taskSummary.setDescription(description);
|
taskSummary.setDescription(description);
|
||||||
taskSummary.setOwner(owner);
|
taskSummary.setOwner(owner);
|
||||||
|
taskSummary.setOwnerLongName(ownerLongName);
|
||||||
taskSummary.setParentBusinessProcessId(parentBusinessProcessId);
|
taskSummary.setParentBusinessProcessId(parentBusinessProcessId);
|
||||||
taskSummary.setPlanned(planned);
|
taskSummary.setPlanned(planned);
|
||||||
taskSummary.setReceived(received);
|
taskSummary.setReceived(received);
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
protected int manualPriority = DEFAULT_MANUAL_PRIORITY;
|
protected int manualPriority = DEFAULT_MANUAL_PRIORITY;
|
||||||
protected TaskState state;
|
protected TaskState state;
|
||||||
protected ClassificationSummary classificationSummary;
|
protected ClassificationSummary classificationSummary;
|
||||||
|
protected Integer groupByCount;
|
||||||
protected WorkbasketSummary workbasketSummary;
|
protected WorkbasketSummary workbasketSummary;
|
||||||
protected String businessProcessId;
|
protected String businessProcessId;
|
||||||
protected String parentBusinessProcessId;
|
protected String parentBusinessProcessId;
|
||||||
|
@ -105,6 +106,7 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
copyFrom.secondaryObjectReferences.stream()
|
copyFrom.secondaryObjectReferences.stream()
|
||||||
.map(ObjectReference::copy)
|
.map(ObjectReference::copy)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
groupByCount = copyFrom.groupByCount;
|
||||||
custom1 = copyFrom.custom1;
|
custom1 = copyFrom.custom1;
|
||||||
custom2 = copyFrom.custom2;
|
custom2 = copyFrom.custom2;
|
||||||
custom3 = copyFrom.custom3;
|
custom3 = copyFrom.custom3;
|
||||||
|
@ -212,6 +214,11 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
this.received = received != null ? received.truncatedTo(ChronoUnit.MILLIS) : null;
|
this.received = received != null ? received.truncatedTo(ChronoUnit.MILLIS) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getGroupByCount() {
|
||||||
|
return this.groupByCount;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Instant getDue() {
|
public Instant getDue() {
|
||||||
return due != null ? due.truncatedTo(ChronoUnit.MILLIS) : null;
|
return due != null ? due.truncatedTo(ChronoUnit.MILLIS) : null;
|
||||||
|
@ -486,6 +493,10 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
setWorkbasketSummary(workbasketSummary);
|
setWorkbasketSummary(workbasketSummary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setGroupByCount(Integer n) {
|
||||||
|
groupByCount = n;
|
||||||
|
}
|
||||||
|
|
||||||
public void addAttachmentSummary(AttachmentSummary attachmentSummary) {
|
public void addAttachmentSummary(AttachmentSummary attachmentSummary) {
|
||||||
if (this.attachmentSummaries == null) {
|
if (this.attachmentSummaries == null) {
|
||||||
this.attachmentSummaries = new ArrayList<>();
|
this.attachmentSummaries = new ArrayList<>();
|
||||||
|
@ -797,6 +808,7 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
primaryObjRef,
|
primaryObjRef,
|
||||||
isRead,
|
isRead,
|
||||||
isTransferred,
|
isTransferred,
|
||||||
|
groupByCount,
|
||||||
attachmentSummaries,
|
attachmentSummaries,
|
||||||
secondaryObjectReferences,
|
secondaryObjectReferences,
|
||||||
custom1,
|
custom1,
|
||||||
|
@ -864,6 +876,7 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
&& Objects.equals(primaryObjRef, other.primaryObjRef)
|
&& Objects.equals(primaryObjRef, other.primaryObjRef)
|
||||||
&& Objects.equals(attachmentSummaries, other.attachmentSummaries)
|
&& Objects.equals(attachmentSummaries, other.attachmentSummaries)
|
||||||
&& Objects.equals(secondaryObjectReferences, other.secondaryObjectReferences)
|
&& Objects.equals(secondaryObjectReferences, other.secondaryObjectReferences)
|
||||||
|
&& Objects.equals(groupByCount, other.groupByCount)
|
||||||
&& Objects.equals(custom1, other.custom1)
|
&& Objects.equals(custom1, other.custom1)
|
||||||
&& Objects.equals(custom2, other.custom2)
|
&& Objects.equals(custom2, other.custom2)
|
||||||
&& Objects.equals(custom3, other.custom3)
|
&& Objects.equals(custom3, other.custom3)
|
||||||
|
@ -942,6 +955,8 @@ public class TaskSummaryImpl implements TaskSummary {
|
||||||
+ isRead
|
+ isRead
|
||||||
+ ", isTransferred="
|
+ ", isTransferred="
|
||||||
+ isTransferred
|
+ isTransferred
|
||||||
|
+ ", groupByCount="
|
||||||
|
+ groupByCount
|
||||||
+ ", attachmentSummaries="
|
+ ", attachmentSummaries="
|
||||||
+ attachmentSummaries
|
+ attachmentSummaries
|
||||||
+ ", objectReferences="
|
+ ", objectReferences="
|
||||||
|
|
|
@ -132,6 +132,11 @@ public class TaskBuilder implements SummaryEntityBuilder<TaskSummary, Task, Task
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TaskBuilder ownerLongName(String ownerLongName) {
|
||||||
|
testTask.setOwnerLongName(ownerLongName);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public TaskBuilder primaryObjRef(ObjectReference primaryObjRef) {
|
public TaskBuilder primaryObjRef(ObjectReference primaryObjRef) {
|
||||||
testTask.setPrimaryObjRef(primaryObjRef);
|
testTask.setPrimaryObjRef(primaryObjRef);
|
||||||
return this;
|
return this;
|
||||||
|
@ -161,6 +166,11 @@ public class TaskBuilder implements SummaryEntityBuilder<TaskSummary, Task, Task
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TaskBuilder groupByCount(Integer count) {
|
||||||
|
testTask.setGroupByCount(count);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public TaskBuilder attachments(Attachment... attachments) {
|
public TaskBuilder attachments(Attachment... attachments) {
|
||||||
testTask.setAttachments(Arrays.asList(attachments));
|
testTask.setAttachments(Arrays.asList(attachments));
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -212,7 +212,7 @@ class TaskBuilderTest {
|
||||||
expectedTask.setCallbackState(CallbackState.CALLBACK_PROCESSING_COMPLETED);
|
expectedTask.setCallbackState(CallbackState.CALLBACK_PROCESSING_COMPLETED);
|
||||||
|
|
||||||
assertThat(task)
|
assertThat(task)
|
||||||
.hasNoNullFieldsOrPropertiesExcept("ownerLongName")
|
.hasNoNullFieldsOrPropertiesExcept("ownerLongName", "groupByCount")
|
||||||
.usingRecursiveComparison()
|
.usingRecursiveComparison()
|
||||||
.ignoringFields("id")
|
.ignoringFields("id")
|
||||||
.isEqualTo(expectedTask);
|
.isEqualTo(expectedTask);
|
||||||
|
|
|
@ -123,7 +123,8 @@ public class TaskController {
|
||||||
* @param request the HTTP request
|
* @param request the HTTP request
|
||||||
* @param filterParameter the filter parameters
|
* @param filterParameter the filter parameters
|
||||||
* @param filterCustomFields the filter parameters regarding TaskCustomFields
|
* @param filterCustomFields the filter parameters regarding TaskCustomFields
|
||||||
* @param filterCustomIntFields the filter parameters regarding TaskCustomIntFields
|
* @param filterCustomIntFields the filter parameters regarding TaskCustomIntFields * @param
|
||||||
|
* @param groupByParameter the group by parameters
|
||||||
* @param sortParameter the sort parameters
|
* @param sortParameter the sort parameters
|
||||||
* @param pagingParameter the paging parameters
|
* @param pagingParameter the paging parameters
|
||||||
* @return the Tasks with the given filter, sort and paging options.
|
* @return the Tasks with the given filter, sort and paging options.
|
||||||
|
@ -135,6 +136,7 @@ public class TaskController {
|
||||||
TaskQueryFilterParameter filterParameter,
|
TaskQueryFilterParameter filterParameter,
|
||||||
TaskQueryFilterCustomFields filterCustomFields,
|
TaskQueryFilterCustomFields filterCustomFields,
|
||||||
TaskQueryFilterCustomIntFields filterCustomIntFields,
|
TaskQueryFilterCustomIntFields filterCustomIntFields,
|
||||||
|
TaskQueryGroupByParameter groupByParameter,
|
||||||
TaskQuerySortParameter sortParameter,
|
TaskQuerySortParameter sortParameter,
|
||||||
QueryPagingParameter<TaskSummary, TaskQuery> pagingParameter) {
|
QueryPagingParameter<TaskSummary, TaskQuery> pagingParameter) {
|
||||||
QueryParamsValidator.validateParams(
|
QueryParamsValidator.validateParams(
|
||||||
|
@ -142,6 +144,7 @@ public class TaskController {
|
||||||
TaskQueryFilterParameter.class,
|
TaskQueryFilterParameter.class,
|
||||||
TaskQueryFilterCustomFields.class,
|
TaskQueryFilterCustomFields.class,
|
||||||
TaskQueryFilterCustomIntFields.class,
|
TaskQueryFilterCustomIntFields.class,
|
||||||
|
TaskQueryGroupByParameter.class,
|
||||||
QuerySortParameter.class,
|
QuerySortParameter.class,
|
||||||
QueryPagingParameter.class);
|
QueryPagingParameter.class);
|
||||||
TaskQuery query = taskService.createTaskQuery();
|
TaskQuery query = taskService.createTaskQuery();
|
||||||
|
@ -149,6 +152,7 @@ public class TaskController {
|
||||||
filterParameter.apply(query);
|
filterParameter.apply(query);
|
||||||
filterCustomFields.apply(query);
|
filterCustomFields.apply(query);
|
||||||
filterCustomIntFields.apply(query);
|
filterCustomIntFields.apply(query);
|
||||||
|
groupByParameter.apply(query);
|
||||||
sortParameter.apply(query);
|
sortParameter.apply(query);
|
||||||
|
|
||||||
List<TaskSummary> taskSummaries = pagingParameter.apply(query);
|
List<TaskSummary> taskSummaries = pagingParameter.apply(query);
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package pro.taskana.task.rest;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import java.beans.ConstructorProperties;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import pro.taskana.common.api.exceptions.InvalidArgumentException;
|
||||||
|
import pro.taskana.common.rest.QueryParameter;
|
||||||
|
import pro.taskana.task.api.TaskQuery;
|
||||||
|
|
||||||
|
public class TaskQueryGroupByParameter implements QueryParameter<TaskQuery, Void> {
|
||||||
|
public enum TaskQueryGroupBy {
|
||||||
|
POR_VALUE(TaskQuery::groupByPor);
|
||||||
|
private final Consumer<TaskQuery> consumer;
|
||||||
|
|
||||||
|
TaskQueryGroupBy(Consumer<TaskQuery> consumer) {
|
||||||
|
this.consumer = consumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyGroupByForQuery(TaskQuery query) {
|
||||||
|
consumer.accept(query);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// region groupBy
|
||||||
|
@JsonProperty("group-by")
|
||||||
|
private final TaskQueryGroupBy groupByPor;
|
||||||
|
|
||||||
|
@JsonProperty("group-by-sor")
|
||||||
|
private final String groupBySor;
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
// region constructor
|
||||||
|
|
||||||
|
@ConstructorProperties({"group-by", "group-by-sor"})
|
||||||
|
public TaskQueryGroupByParameter(TaskQueryGroupBy groupBy, String groupBySor)
|
||||||
|
throws InvalidArgumentException {
|
||||||
|
this.groupByPor = groupBy;
|
||||||
|
this.groupBySor = groupBySor;
|
||||||
|
validateGroupByParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void apply(TaskQuery query) {
|
||||||
|
|
||||||
|
Optional.ofNullable(groupBySor).ifPresent(query::groupBySor);
|
||||||
|
Optional.ofNullable(groupByPor)
|
||||||
|
.ifPresent(taskQueryGroupBy -> taskQueryGroupBy.applyGroupByForQuery(query));
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateGroupByParameters() throws InvalidArgumentException {
|
||||||
|
if (groupByPor != null && groupBySor != null) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
"Only one of the following can be provided: Either group-by or group-by-sor");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -82,6 +82,7 @@ public class TaskRepresentationModelAssembler
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
repModel.setRead(task.isRead());
|
repModel.setRead(task.isRead());
|
||||||
repModel.setTransferred(task.isTransferred());
|
repModel.setTransferred(task.isTransferred());
|
||||||
|
repModel.setGroupByCount(task.getGroupByCount());
|
||||||
repModel.setAttachments(
|
repModel.setAttachments(
|
||||||
task.getAttachments().stream()
|
task.getAttachments().stream()
|
||||||
.map(attachmentAssembler::toModel)
|
.map(attachmentAssembler::toModel)
|
||||||
|
@ -159,6 +160,7 @@ public class TaskRepresentationModelAssembler
|
||||||
task.setPrimaryObjRef(objectReferenceAssembler.toEntity(repModel.getPrimaryObjRef()));
|
task.setPrimaryObjRef(objectReferenceAssembler.toEntity(repModel.getPrimaryObjRef()));
|
||||||
task.setRead(repModel.isRead());
|
task.setRead(repModel.isRead());
|
||||||
task.setTransferred(repModel.isTransferred());
|
task.setTransferred(repModel.isTransferred());
|
||||||
|
task.setGroupByCount(repModel.getGroupByCount());
|
||||||
task.setCustomField(TaskCustomField.CUSTOM_1, repModel.getCustom1());
|
task.setCustomField(TaskCustomField.CUSTOM_1, repModel.getCustom1());
|
||||||
task.setCustomField(TaskCustomField.CUSTOM_2, repModel.getCustom2());
|
task.setCustomField(TaskCustomField.CUSTOM_2, repModel.getCustom2());
|
||||||
task.setCustomField(TaskCustomField.CUSTOM_3, repModel.getCustom3());
|
task.setCustomField(TaskCustomField.CUSTOM_3, repModel.getCustom3());
|
||||||
|
|
|
@ -82,6 +82,7 @@ public class TaskSummaryRepresentationModelAssembler
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
repModel.setRead(taskSummary.isRead());
|
repModel.setRead(taskSummary.isRead());
|
||||||
repModel.setTransferred(taskSummary.isTransferred());
|
repModel.setTransferred(taskSummary.isTransferred());
|
||||||
|
repModel.setGroupByCount(taskSummary.getGroupByCount());
|
||||||
repModel.setAttachmentSummaries(
|
repModel.setAttachmentSummaries(
|
||||||
taskSummary.getAttachmentSummaries().stream()
|
taskSummary.getAttachmentSummaries().stream()
|
||||||
.map(attachmentAssembler::toModel)
|
.map(attachmentAssembler::toModel)
|
||||||
|
@ -148,6 +149,7 @@ public class TaskSummaryRepresentationModelAssembler
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
taskSummary.setRead(repModel.isRead());
|
taskSummary.setRead(repModel.isRead());
|
||||||
taskSummary.setTransferred(repModel.isTransferred());
|
taskSummary.setTransferred(repModel.isTransferred());
|
||||||
|
taskSummary.setGroupByCount(repModel.getGroupByCount());
|
||||||
taskSummary.setAttachmentSummaries(
|
taskSummary.setAttachmentSummaries(
|
||||||
repModel.getAttachmentSummaries().stream()
|
repModel.getAttachmentSummaries().stream()
|
||||||
.map(attachmentAssembler::toEntityModel)
|
.map(attachmentAssembler::toEntityModel)
|
||||||
|
|
|
@ -79,6 +79,8 @@ public class TaskSummaryRepresentationModel
|
||||||
protected boolean isRead;
|
protected boolean isRead;
|
||||||
/** Indicator if the task has been transferred. */
|
/** Indicator if the task has been transferred. */
|
||||||
protected boolean isTransferred;
|
protected boolean isTransferred;
|
||||||
|
/** Number of Tasks that are grouped together with this Task during a groupBy. */
|
||||||
|
protected Integer groupByCount;
|
||||||
/** A custom property with name "1". */
|
/** A custom property with name "1". */
|
||||||
protected String custom1;
|
protected String custom1;
|
||||||
/** A custom property with name "2". */
|
/** A custom property with name "2". */
|
||||||
|
@ -351,6 +353,14 @@ public class TaskSummaryRepresentationModel
|
||||||
this.attachmentSummaries = attachmentSummaries;
|
this.attachmentSummaries = attachmentSummaries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getGroupByCount() {
|
||||||
|
return groupByCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupByCount(Integer groupByCount) {
|
||||||
|
this.groupByCount = groupByCount;
|
||||||
|
}
|
||||||
|
|
||||||
public String getCustom1() {
|
public String getCustom1() {
|
||||||
return custom1;
|
return custom1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import static pro.taskana.rest.test.RestHelper.TEMPLATE;
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
@ -34,6 +35,7 @@ import org.springframework.http.HttpMethod;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.client.HttpStatusCodeException;
|
import org.springframework.web.client.HttpStatusCodeException;
|
||||||
|
import pro.taskana.TaskanaConfiguration;
|
||||||
import pro.taskana.classification.rest.models.ClassificationSummaryRepresentationModel;
|
import pro.taskana.classification.rest.models.ClassificationSummaryRepresentationModel;
|
||||||
import pro.taskana.common.rest.RestEndpoints;
|
import pro.taskana.common.rest.RestEndpoints;
|
||||||
import pro.taskana.rest.test.RestHelper;
|
import pro.taskana.rest.test.RestHelper;
|
||||||
|
@ -54,6 +56,7 @@ import pro.taskana.workbasket.rest.models.WorkbasketSummaryRepresentationModel;
|
||||||
@TaskanaSpringBootTest
|
@TaskanaSpringBootTest
|
||||||
class TaskControllerIntTest {
|
class TaskControllerIntTest {
|
||||||
|
|
||||||
|
@Autowired TaskanaConfiguration taskanaConfiguration;
|
||||||
private static final ParameterizedTypeReference<TaskSummaryPagedRepresentationModel>
|
private static final ParameterizedTypeReference<TaskSummaryPagedRepresentationModel>
|
||||||
TASK_SUMMARY_PAGE_MODEL_TYPE = new ParameterizedTypeReference<>() {};
|
TASK_SUMMARY_PAGE_MODEL_TYPE = new ParameterizedTypeReference<>() {};
|
||||||
|
|
||||||
|
@ -1204,6 +1207,57 @@ class TaskControllerIntTest {
|
||||||
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
|
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void should_GroupByPor() throws Exception {
|
||||||
|
Field useSpecificDb2Taskquery =
|
||||||
|
taskanaConfiguration.getClass().getDeclaredField("useSpecificDb2Taskquery");
|
||||||
|
useSpecificDb2Taskquery.setAccessible(true);
|
||||||
|
useSpecificDb2Taskquery.setBoolean(taskanaConfiguration, true);
|
||||||
|
|
||||||
|
String url = restHelper.toUrl(RestEndpoints.URL_TASKS) + "?group-by=POR_VALUE";
|
||||||
|
HttpEntity<String> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("admin"));
|
||||||
|
|
||||||
|
ResponseEntity<TaskSummaryPagedRepresentationModel> response =
|
||||||
|
TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_SUMMARY_PAGE_MODEL_TYPE);
|
||||||
|
|
||||||
|
assertThat(response.getBody()).isNotNull();
|
||||||
|
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
|
||||||
|
assertThat(response.getBody().getContent()).hasSize(14);
|
||||||
|
assertThat(
|
||||||
|
response.getBody().getContent().stream()
|
||||||
|
.filter(task -> task.getPrimaryObjRef().getValue().equals("MyValue1"))
|
||||||
|
.map(TaskSummaryRepresentationModel::getGroupByCount)
|
||||||
|
.toArray())
|
||||||
|
.containsExactly(6);
|
||||||
|
|
||||||
|
useSpecificDb2Taskquery.setBoolean(taskanaConfiguration, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void should_GroupBySor() throws Exception {
|
||||||
|
Field useSpecificDb2Taskquery =
|
||||||
|
taskanaConfiguration.getClass().getDeclaredField("useSpecificDb2Taskquery");
|
||||||
|
useSpecificDb2Taskquery.setAccessible(true);
|
||||||
|
useSpecificDb2Taskquery.setBoolean(taskanaConfiguration, true);
|
||||||
|
|
||||||
|
String url = restHelper.toUrl(RestEndpoints.URL_TASKS) + "?group-by-sor=Type2";
|
||||||
|
HttpEntity<String> auth = new HttpEntity<>(RestHelper.generateHeadersForUser("admin"));
|
||||||
|
|
||||||
|
ResponseEntity<TaskSummaryPagedRepresentationModel> response =
|
||||||
|
TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_SUMMARY_PAGE_MODEL_TYPE);
|
||||||
|
|
||||||
|
assertThat(response.getBody()).isNotNull();
|
||||||
|
assertThat((response.getBody()).getLink(IanaLinkRelations.SELF)).isNotNull();
|
||||||
|
assertThat(response.getBody().getContent()).hasSize(1);
|
||||||
|
assertThat(
|
||||||
|
response.getBody().getContent().stream()
|
||||||
|
.map(TaskSummaryRepresentationModel::getGroupByCount)
|
||||||
|
.toArray())
|
||||||
|
.containsExactly(2);
|
||||||
|
|
||||||
|
useSpecificDb2Taskquery.setBoolean(taskanaConfiguration, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testGetLastPageSortedByDueWithHiddenTasksRemovedFromResult() {
|
void testGetLastPageSortedByDueWithHiddenTasksRemovedFromResult() {
|
||||||
resetDb();
|
resetDb();
|
||||||
|
|
|
@ -96,6 +96,7 @@ class TaskRepresentationModelAssemblerTest {
|
||||||
repModel.setCustomAttributes(List.of(TaskRepresentationModel.CustomAttribute.of("abc", "def")));
|
repModel.setCustomAttributes(List.of(TaskRepresentationModel.CustomAttribute.of("abc", "def")));
|
||||||
repModel.setCallbackInfo(List.of(TaskRepresentationModel.CustomAttribute.of("ghi", "jkl")));
|
repModel.setCallbackInfo(List.of(TaskRepresentationModel.CustomAttribute.of("ghi", "jkl")));
|
||||||
repModel.setAttachments(List.of(attachment));
|
repModel.setAttachments(List.of(attachment));
|
||||||
|
repModel.setGroupByCount(0);
|
||||||
repModel.setCustom1("custom1");
|
repModel.setCustom1("custom1");
|
||||||
repModel.setCustom2("custom2");
|
repModel.setCustom2("custom2");
|
||||||
repModel.setCustom3("custom3");
|
repModel.setCustom3("custom3");
|
||||||
|
@ -195,6 +196,7 @@ class TaskRepresentationModelAssemblerTest {
|
||||||
task.setPrimaryObjRef(primaryObjRef);
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
task.setRead(true);
|
task.setRead(true);
|
||||||
task.setTransferred(true);
|
task.setTransferred(true);
|
||||||
|
task.setGroupByCount(0);
|
||||||
task.setCustomAttributeMap(Map.of("abc", "def"));
|
task.setCustomAttributeMap(Map.of("abc", "def"));
|
||||||
task.setCallbackInfo(Map.of("ghi", "jkl"));
|
task.setCallbackInfo(Map.of("ghi", "jkl"));
|
||||||
task.setAttachments(List.of(attachment));
|
task.setAttachments(List.of(attachment));
|
||||||
|
@ -268,6 +270,7 @@ class TaskRepresentationModelAssemblerTest {
|
||||||
task.setPrimaryObjRef(primaryObjRef);
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
task.setRead(true);
|
task.setRead(true);
|
||||||
task.setTransferred(true);
|
task.setTransferred(true);
|
||||||
|
task.setGroupByCount(0);
|
||||||
task.setCustomAttributeMap(Map.of("abc", "def"));
|
task.setCustomAttributeMap(Map.of("abc", "def"));
|
||||||
task.setCallbackInfo(Map.of("ghi", "jkl"));
|
task.setCallbackInfo(Map.of("ghi", "jkl"));
|
||||||
task.setAttachments(List.of(attachment));
|
task.setAttachments(List.of(attachment));
|
||||||
|
|
|
@ -104,6 +104,7 @@ class TaskSummaryRepresentationModelAssemblerTest {
|
||||||
task.setPrimaryObjRef(primaryObjRef);
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
task.setRead(true);
|
task.setRead(true);
|
||||||
task.setTransferred(true);
|
task.setTransferred(true);
|
||||||
|
task.setGroupByCount(0);
|
||||||
task.setCustom1("custom1");
|
task.setCustom1("custom1");
|
||||||
task.setCustom2("custom2");
|
task.setCustom2("custom2");
|
||||||
task.setCustom3("custom3");
|
task.setCustom3("custom3");
|
||||||
|
@ -178,6 +179,7 @@ class TaskSummaryRepresentationModelAssemblerTest {
|
||||||
repModel.setOwnerLongName("ownerLongName");
|
repModel.setOwnerLongName("ownerLongName");
|
||||||
repModel.setRead(true);
|
repModel.setRead(true);
|
||||||
repModel.setTransferred(true);
|
repModel.setTransferred(true);
|
||||||
|
repModel.setGroupByCount(0);
|
||||||
repModel.setCustom1("custom1");
|
repModel.setCustom1("custom1");
|
||||||
repModel.setCustom2("custom2");
|
repModel.setCustom2("custom2");
|
||||||
repModel.setCustom3("custom3");
|
repModel.setCustom3("custom3");
|
||||||
|
@ -276,6 +278,7 @@ class TaskSummaryRepresentationModelAssemblerTest {
|
||||||
task.setPrimaryObjRef(primaryObjRef);
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
task.setRead(true);
|
task.setRead(true);
|
||||||
task.setTransferred(true);
|
task.setTransferred(true);
|
||||||
|
task.setGroupByCount(0);
|
||||||
task.setCustom1("custom1");
|
task.setCustom1("custom1");
|
||||||
task.setCustom2("custom2");
|
task.setCustom2("custom2");
|
||||||
task.setCustom3("custom3");
|
task.setCustom3("custom3");
|
||||||
|
@ -340,6 +343,7 @@ class TaskSummaryRepresentationModelAssemblerTest {
|
||||||
taskSummary.getPrimaryObjRef(), repModel.getPrimaryObjRef());
|
taskSummary.getPrimaryObjRef(), repModel.getPrimaryObjRef());
|
||||||
assertThat(taskSummary.isRead()).isEqualTo(repModel.isRead());
|
assertThat(taskSummary.isRead()).isEqualTo(repModel.isRead());
|
||||||
assertThat(taskSummary.isTransferred()).isEqualTo(repModel.isTransferred());
|
assertThat(taskSummary.isTransferred()).isEqualTo(repModel.isTransferred());
|
||||||
|
assertThat(taskSummary.getGroupByCount()).isEqualTo(repModel.getGroupByCount());
|
||||||
assertThat(taskSummary.getCustomField(CUSTOM_1)).isEqualTo(repModel.getCustom1());
|
assertThat(taskSummary.getCustomField(CUSTOM_1)).isEqualTo(repModel.getCustom1());
|
||||||
assertThat(taskSummary.getCustomField(CUSTOM_2)).isEqualTo(repModel.getCustom2());
|
assertThat(taskSummary.getCustomField(CUSTOM_2)).isEqualTo(repModel.getCustom2());
|
||||||
assertThat(taskSummary.getCustomField(CUSTOM_3)).isEqualTo(repModel.getCustom3());
|
assertThat(taskSummary.getCustomField(CUSTOM_3)).isEqualTo(repModel.getCustom3());
|
||||||
|
|
Loading…
Reference in New Issue