diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java
index bf2bc75f1..e51588a23 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapper.java
@@ -304,10 +304,18 @@ public interface MonitorMapper {
+ ""
+ "AND ((${key} = '${customAttributeFilter.get(key)}')) "
+ ""
+ + ""
+ + "AND "
+ + "T.CLASSIFICATION_ID = #{item.taskClassificationId} "
+ + ""
+ + "AND A.CLASSIFICATION_ID = #{item.attachmentClassificationId} "
+ + ""
+ + ""
+ + ""
+ "AND T.${timestamp} IS NOT NULL AND ( "
+ ""
+ "#{selectedItem.key} = T.${groupedBy} AND "
- + ""
+ + ""
+ ""
+ "A.CLASSIFICATION_KEY = #{selectedItem.subKey} AND "
+ ""
@@ -336,6 +344,8 @@ public interface MonitorMapper {
@Param("classificationIds") List classificationIds,
@Param("excludedClassificationIds") List excludedClassificationIds,
@Param("customAttributeFilter") Map customAttributeFilter,
+ @Param("combinedClassificationFilter")
+ List combinedClassificationFilter,
@Param("groupedBy") String groupedBy,
@Param("timestamp") TaskTimestamp timestamp,
@Param("selectedItems") List selectedItems,
diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java
index 0b5bff67f..ca2b0e57e 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/TimeIntervalReportBuilderImpl.java
@@ -14,6 +14,7 @@ import pro.taskana.common.api.WorkingDaysToDaysConverter;
import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine;
+import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationReport;
@@ -138,6 +139,9 @@ abstract class TimeIntervalReportBuilderImpl<
if (!(this instanceof ClassificationReport.Builder) && joinWithAttachments) {
throw new InvalidArgumentException("SubKeys are supported for ClassificationReport only.");
}
+ List combinedClassificationFilter =
+ getCombinedClassificationFilter();
+ joinWithAttachments |= combinedClassificationFilter != null;
if (this.inWorkingDays) {
selectedItems = convertWorkingDaysToDays(selectedItems, this.columnHeaders);
}
@@ -149,6 +153,7 @@ abstract class TimeIntervalReportBuilderImpl<
this.classificationIds,
this.excludedClassificationIds,
this.customAttributeFilter,
+ combinedClassificationFilter,
determineGroupedBy(),
timestamp,
selectedItems,
@@ -189,6 +194,13 @@ abstract class TimeIntervalReportBuilderImpl<
protected abstract String determineGroupedBy();
+ protected List getCombinedClassificationFilter() {
+ // we are currently aware that this is a code smell. Unfortunately the resolution of this would
+ // cause havoc in our queries, since we do not have a concept for a user validation yet. As soon
+ // as that is done we can resolve this code smell.
+ return null;
+ }
+
private List convertWorkingDaysToDays(
List selectedItems, List columnHeaders) throws InvalidArgumentException {
WorkingDaysToDaysReportConverter instance =
diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java
index 35c05882b..453ec59d6 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/WorkbasketReportBuilderImpl.java
@@ -101,4 +101,9 @@ public class WorkbasketReportBuilderImpl
protected String determineGroupedBy() {
return "WORKBASKET_KEY";
}
+
+ @Override
+ protected List getCombinedClassificationFilter() {
+ return combinedClassificationFilter;
+ }
}
diff --git a/lib/taskana-core/src/test/java/acceptance/report/GetTaskIdsOfWorkbasketReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/GetTaskIdsOfWorkbasketReportAccTest.java
index b81ca1609..b71c1c2ac 100644
--- a/lib/taskana-core/src/test/java/acceptance/report/GetTaskIdsOfWorkbasketReportAccTest.java
+++ b/lib/taskana-core/src/test/java/acceptance/report/GetTaskIdsOfWorkbasketReportAccTest.java
@@ -20,6 +20,7 @@ import org.junit.jupiter.api.function.ThrowingConsumer;
import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId;
+import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
@@ -129,6 +130,40 @@ class GetTaskIdsOfWorkbasketReportAccTest extends AbstractReportAccTest {
"TKI:000000000000000000000000000000000050");
}
+ @WithAccessId(user = "monitor")
+ @Test
+ void should_ReturnTaskIdsOfWorkbasketReport_When_CombinedClassificationFilterIsUsed()
+ throws Exception {
+ final List columnHeaders = getListOfColumnHeaders();
+ final List selectedItems =
+ Collections.singletonList(
+ new SelectedItem("USER-1-1", null, Integer.MIN_VALUE, Integer.MAX_VALUE));
+ final List combinedClassificationFilters =
+ Arrays.asList(
+ new CombinedClassificationFilter(
+ "CLI:000000000000000000000000000000000003",
+ "CLI:000000000000000000000000000000000008"),
+ new CombinedClassificationFilter(
+ "CLI:000000000000000000000000000000000001",
+ "CLI:000000000000000000000000000000000006"));
+
+ List ids =
+ MONITOR_SERVICE
+ .createWorkbasketReportBuilder()
+ .withColumnHeaders(columnHeaders)
+ .inWorkingDays()
+ .combinedClassificationFilterIn(combinedClassificationFilters)
+ .listTaskIdsForSelectedItems(selectedItems, TaskTimestamp.DUE);
+
+ assertThat(ids)
+ .containsExactlyInAnyOrder(
+ "TKI:000000000000000000000000000000000001", // from second filter
+ "TKI:000000000000000000000000000000000013", // from second filter
+ "TKI:000000000000000000000000000000000025", // from first filter
+ "TKI:000000000000000000000000000000000036", // from first filter
+ "TKI:000000000000000000000000000000000044"); // from first filter
+ }
+
private List getListOfColumnHeaders() {
List columnHeaders = new ArrayList<>();
columnHeaders.add(new TimeIntervalColumnHeader(Integer.MIN_VALUE, -11));
diff --git a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationClassificationCategoryReportBuilderImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationClassificationCategoryReportBuilderImplTest.java
index 01482ba04..4724e4305 100644
--- a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationClassificationCategoryReportBuilderImplTest.java
+++ b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationClassificationCategoryReportBuilderImplTest.java
@@ -197,6 +197,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
classificationIds,
excludedClassificationIds,
customAttributeFilter,
+ null,
"CLASSIFICATION_CATEGORY",
TaskTimestamp.DUE,
selectedItems,
@@ -229,6 +230,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
any(),
any(),
any(),
+ any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));
diff --git a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationReportBuilderImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationReportBuilderImplTest.java
index f31d123f7..daa6511d7 100644
--- a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationReportBuilderImplTest.java
+++ b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/ClassificationReportBuilderImplTest.java
@@ -367,6 +367,7 @@ class ClassificationReportBuilderImplTest {
classificationIds,
excludedClassificationIds,
customAttributeFilter,
+ null,
"CLASSIFICATION_KEY",
TaskTimestamp.DUE,
selectedItems,
@@ -400,6 +401,7 @@ class ClassificationReportBuilderImplTest {
any(),
any(),
any(),
+ any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));
diff --git a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/WorkbasketReportBuilderImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/WorkbasketReportBuilderImplTest.java
index d364ec7d1..1914c62a5 100644
--- a/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/WorkbasketReportBuilderImplTest.java
+++ b/lib/taskana-core/src/test/java/pro/taskana/monitor/internal/WorkbasketReportBuilderImplTest.java
@@ -213,6 +213,7 @@ class WorkbasketReportBuilderImplTest {
classificationIds,
excludedClassificationIds,
customAttributeFilter,
+ null,
"WORKBASKET_KEY",
TaskTimestamp.DUE,
selectedItems,
@@ -245,6 +246,7 @@ class WorkbasketReportBuilderImplTest {
any(),
any(),
any(),
+ any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));