TSK-1378: now support combinedClassificationfilter in WorkbasketReport#listTaskIdsForSelectedItems
This commit is contained in:
parent
83feab0955
commit
51a2410afc
|
@ -304,10 +304,18 @@ public interface MonitorMapper {
|
||||||
+ "<if test='customAttributeFilter != null'>"
|
+ "<if test='customAttributeFilter != null'>"
|
||||||
+ "AND (<foreach collection='customAttributeFilter.keys' item='key' separator=' AND '>(${key} = '${customAttributeFilter.get(key)}')</foreach>) "
|
+ "AND (<foreach collection='customAttributeFilter.keys' item='key' separator=' AND '>(${key} = '${customAttributeFilter.get(key)}')</foreach>) "
|
||||||
+ "</if>"
|
+ "</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 ( "
|
+ "AND T.${timestamp} IS NOT NULL AND ( "
|
||||||
+ "<foreach collection='selectedItems' item='selectedItem' separator=' OR '>"
|
+ "<foreach collection='selectedItems' item='selectedItem' separator=' OR '>"
|
||||||
+ "#{selectedItem.key} = T.${groupedBy} AND "
|
+ "#{selectedItem.key} = T.${groupedBy} AND "
|
||||||
+ "<if test=\"joinWithAttachments\">"
|
+ "<if test=\"joinWithAttachments and combinedClassificationFilter == null\">"
|
||||||
+ "<if test='selectedItem.subKey != null'>"
|
+ "<if test='selectedItem.subKey != null'>"
|
||||||
+ "A.CLASSIFICATION_KEY = #{selectedItem.subKey} AND "
|
+ "A.CLASSIFICATION_KEY = #{selectedItem.subKey} AND "
|
||||||
+ "</if>"
|
+ "</if>"
|
||||||
|
@ -336,6 +344,8 @@ public interface MonitorMapper {
|
||||||
@Param("classificationIds") List<String> classificationIds,
|
@Param("classificationIds") List<String> classificationIds,
|
||||||
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
|
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
|
||||||
@Param("customAttributeFilter") Map<TaskCustomField, String> customAttributeFilter,
|
@Param("customAttributeFilter") Map<TaskCustomField, String> customAttributeFilter,
|
||||||
|
@Param("combinedClassificationFilter")
|
||||||
|
List<CombinedClassificationFilter> combinedClassificationFilter,
|
||||||
@Param("groupedBy") String groupedBy,
|
@Param("groupedBy") String groupedBy,
|
||||||
@Param("timestamp") TaskTimestamp timestamp,
|
@Param("timestamp") TaskTimestamp timestamp,
|
||||||
@Param("selectedItems") List<SelectedItem> selectedItems,
|
@Param("selectedItems") List<SelectedItem> selectedItems,
|
||||||
|
|
|
@ -14,6 +14,7 @@ import pro.taskana.common.api.WorkingDaysToDaysConverter;
|
||||||
import pro.taskana.common.api.exceptions.InvalidArgumentException;
|
import pro.taskana.common.api.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.common.api.exceptions.NotAuthorizedException;
|
import pro.taskana.common.api.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.common.internal.InternalTaskanaEngine;
|
import pro.taskana.common.internal.InternalTaskanaEngine;
|
||||||
|
import pro.taskana.monitor.api.CombinedClassificationFilter;
|
||||||
import pro.taskana.monitor.api.SelectedItem;
|
import pro.taskana.monitor.api.SelectedItem;
|
||||||
import pro.taskana.monitor.api.TaskTimestamp;
|
import pro.taskana.monitor.api.TaskTimestamp;
|
||||||
import pro.taskana.monitor.api.reports.ClassificationReport;
|
import pro.taskana.monitor.api.reports.ClassificationReport;
|
||||||
|
@ -138,6 +139,9 @@ abstract class TimeIntervalReportBuilderImpl<
|
||||||
if (!(this instanceof ClassificationReport.Builder) && joinWithAttachments) {
|
if (!(this instanceof ClassificationReport.Builder) && joinWithAttachments) {
|
||||||
throw new InvalidArgumentException("SubKeys are supported for ClassificationReport only.");
|
throw new InvalidArgumentException("SubKeys are supported for ClassificationReport only.");
|
||||||
}
|
}
|
||||||
|
List<CombinedClassificationFilter> combinedClassificationFilter =
|
||||||
|
getCombinedClassificationFilter();
|
||||||
|
joinWithAttachments |= combinedClassificationFilter != null;
|
||||||
if (this.inWorkingDays) {
|
if (this.inWorkingDays) {
|
||||||
selectedItems = convertWorkingDaysToDays(selectedItems, this.columnHeaders);
|
selectedItems = convertWorkingDaysToDays(selectedItems, this.columnHeaders);
|
||||||
}
|
}
|
||||||
|
@ -149,6 +153,7 @@ abstract class TimeIntervalReportBuilderImpl<
|
||||||
this.classificationIds,
|
this.classificationIds,
|
||||||
this.excludedClassificationIds,
|
this.excludedClassificationIds,
|
||||||
this.customAttributeFilter,
|
this.customAttributeFilter,
|
||||||
|
combinedClassificationFilter,
|
||||||
determineGroupedBy(),
|
determineGroupedBy(),
|
||||||
timestamp,
|
timestamp,
|
||||||
selectedItems,
|
selectedItems,
|
||||||
|
@ -189,6 +194,13 @@ abstract class TimeIntervalReportBuilderImpl<
|
||||||
|
|
||||||
protected abstract String determineGroupedBy();
|
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(
|
private List<SelectedItem> convertWorkingDaysToDays(
|
||||||
List<SelectedItem> selectedItems, List<H> columnHeaders) throws InvalidArgumentException {
|
List<SelectedItem> selectedItems, List<H> columnHeaders) throws InvalidArgumentException {
|
||||||
WorkingDaysToDaysReportConverter instance =
|
WorkingDaysToDaysReportConverter instance =
|
||||||
|
|
|
@ -101,4 +101,9 @@ public class WorkbasketReportBuilderImpl
|
||||||
protected String determineGroupedBy() {
|
protected String determineGroupedBy() {
|
||||||
return "WORKBASKET_KEY";
|
return "WORKBASKET_KEY";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<CombinedClassificationFilter> getCombinedClassificationFilter() {
|
||||||
|
return combinedClassificationFilter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.junit.jupiter.api.function.ThrowingConsumer;
|
||||||
import pro.taskana.common.api.exceptions.NotAuthorizedException;
|
import pro.taskana.common.api.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.common.internal.security.JaasExtension;
|
import pro.taskana.common.internal.security.JaasExtension;
|
||||||
import pro.taskana.common.internal.security.WithAccessId;
|
import pro.taskana.common.internal.security.WithAccessId;
|
||||||
|
import pro.taskana.monitor.api.CombinedClassificationFilter;
|
||||||
import pro.taskana.monitor.api.MonitorService;
|
import pro.taskana.monitor.api.MonitorService;
|
||||||
import pro.taskana.monitor.api.SelectedItem;
|
import pro.taskana.monitor.api.SelectedItem;
|
||||||
import pro.taskana.monitor.api.TaskTimestamp;
|
import pro.taskana.monitor.api.TaskTimestamp;
|
||||||
|
@ -129,6 +130,40 @@ class GetTaskIdsOfWorkbasketReportAccTest extends AbstractReportAccTest {
|
||||||
"TKI:000000000000000000000000000000000050");
|
"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() {
|
private List<TimeIntervalColumnHeader> getListOfColumnHeaders() {
|
||||||
List<TimeIntervalColumnHeader> columnHeaders = new ArrayList<>();
|
List<TimeIntervalColumnHeader> columnHeaders = new ArrayList<>();
|
||||||
columnHeaders.add(new TimeIntervalColumnHeader(Integer.MIN_VALUE, -11));
|
columnHeaders.add(new TimeIntervalColumnHeader(Integer.MIN_VALUE, -11));
|
||||||
|
|
|
@ -197,6 +197,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
|
||||||
classificationIds,
|
classificationIds,
|
||||||
excludedClassificationIds,
|
excludedClassificationIds,
|
||||||
customAttributeFilter,
|
customAttributeFilter,
|
||||||
|
null,
|
||||||
"CLASSIFICATION_CATEGORY",
|
"CLASSIFICATION_CATEGORY",
|
||||||
TaskTimestamp.DUE,
|
TaskTimestamp.DUE,
|
||||||
selectedItems,
|
selectedItems,
|
||||||
|
@ -229,6 +230,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
|
any(),
|
||||||
eq(TaskTimestamp.DUE),
|
eq(TaskTimestamp.DUE),
|
||||||
any(),
|
any(),
|
||||||
eq(false));
|
eq(false));
|
||||||
|
|
|
@ -367,6 +367,7 @@ class ClassificationReportBuilderImplTest {
|
||||||
classificationIds,
|
classificationIds,
|
||||||
excludedClassificationIds,
|
excludedClassificationIds,
|
||||||
customAttributeFilter,
|
customAttributeFilter,
|
||||||
|
null,
|
||||||
"CLASSIFICATION_KEY",
|
"CLASSIFICATION_KEY",
|
||||||
TaskTimestamp.DUE,
|
TaskTimestamp.DUE,
|
||||||
selectedItems,
|
selectedItems,
|
||||||
|
@ -400,6 +401,7 @@ class ClassificationReportBuilderImplTest {
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
|
any(),
|
||||||
eq(TaskTimestamp.DUE),
|
eq(TaskTimestamp.DUE),
|
||||||
any(),
|
any(),
|
||||||
eq(false));
|
eq(false));
|
||||||
|
|
|
@ -213,6 +213,7 @@ class WorkbasketReportBuilderImplTest {
|
||||||
classificationIds,
|
classificationIds,
|
||||||
excludedClassificationIds,
|
excludedClassificationIds,
|
||||||
customAttributeFilter,
|
customAttributeFilter,
|
||||||
|
null,
|
||||||
"WORKBASKET_KEY",
|
"WORKBASKET_KEY",
|
||||||
TaskTimestamp.DUE,
|
TaskTimestamp.DUE,
|
||||||
selectedItems,
|
selectedItems,
|
||||||
|
@ -245,6 +246,7 @@ class WorkbasketReportBuilderImplTest {
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
any(),
|
any(),
|
||||||
|
any(),
|
||||||
eq(TaskTimestamp.DUE),
|
eq(TaskTimestamp.DUE),
|
||||||
any(),
|
any(),
|
||||||
eq(false));
|
eq(false));
|
||||||
|
|
Loading…
Reference in New Issue