TSK-1378: now support combinedClassificationfilter in WorkbasketReport#listTaskIdsForSelectedItems

This commit is contained in:
Mustapha Zorgati 2020-09-14 16:00:49 +02:00
parent 83feab0955
commit 51a2410afc
7 changed files with 69 additions and 1 deletions

View File

@ -304,10 +304,18 @@ public interface MonitorMapper {
+ "<if test='customAttributeFilter != null'>"
+ "AND (<foreach collection='customAttributeFilter.keys' item='key' separator=' AND '>(${key} = '${customAttributeFilter.get(key)}')</foreach>) "
+ "</if>"
+ "<if test=\"combinedClassificationFilter != null\">"
+ "AND <foreach collection='combinedClassificationFilter' item='item' separator='OR'> "
+ "T.CLASSIFICATION_ID = #{item.taskClassificationId} "
+ "<if test=\"item.attachmentClassificationId != null\">"
+ "AND A.CLASSIFICATION_ID = #{item.attachmentClassificationId} "
+ "</if>"
+ "</foreach>"
+ "</if>"
+ "AND T.${timestamp} IS NOT NULL AND ( "
+ "<foreach collection='selectedItems' item='selectedItem' separator=' OR '>"
+ "#{selectedItem.key} = T.${groupedBy} AND "
+ "<if test=\"joinWithAttachments\">"
+ "<if test=\"joinWithAttachments and combinedClassificationFilter == null\">"
+ "<if test='selectedItem.subKey != null'>"
+ "A.CLASSIFICATION_KEY = #{selectedItem.subKey} AND "
+ "</if>"
@ -336,6 +344,8 @@ public interface MonitorMapper {
@Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<TaskCustomField, String> customAttributeFilter,
@Param("combinedClassificationFilter")
List<CombinedClassificationFilter> combinedClassificationFilter,
@Param("groupedBy") String groupedBy,
@Param("timestamp") TaskTimestamp timestamp,
@Param("selectedItems") List<SelectedItem> selectedItems,

View File

@ -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> 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<CombinedClassificationFilter> 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<SelectedItem> convertWorkingDaysToDays(
List<SelectedItem> selectedItems, List<H> columnHeaders) throws InvalidArgumentException {
WorkingDaysToDaysReportConverter instance =

View File

@ -101,4 +101,9 @@ public class WorkbasketReportBuilderImpl
protected String determineGroupedBy() {
return "WORKBASKET_KEY";
}
@Override
protected List<CombinedClassificationFilter> getCombinedClassificationFilter() {
return combinedClassificationFilter;
}
}

View File

@ -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<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
final List<SelectedItem> selectedItems =
Collections.singletonList(
new SelectedItem("USER-1-1", null, Integer.MIN_VALUE, Integer.MAX_VALUE));
final List<CombinedClassificationFilter> combinedClassificationFilters =
Arrays.asList(
new CombinedClassificationFilter(
"CLI:000000000000000000000000000000000003",
"CLI:000000000000000000000000000000000008"),
new CombinedClassificationFilter(
"CLI:000000000000000000000000000000000001",
"CLI:000000000000000000000000000000000006"));
List<String> 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<TimeIntervalColumnHeader> getListOfColumnHeaders() {
List<TimeIntervalColumnHeader> columnHeaders = new ArrayList<>();
columnHeaders.add(new TimeIntervalColumnHeader(Integer.MIN_VALUE, -11));

View File

@ -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));

View File

@ -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));

View File

@ -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));