From a2d79c8a7be4c2d032aacfb8a49ed18301f9da04 Mon Sep 17 00:00:00 2001 From: Mustapha Zorgati <15628173+mustaphazorgati@users.noreply.github.com> Date: Tue, 15 Sep 2020 12:21:49 +0200 Subject: [PATCH] TSK-1375: fixed SQL Error during display name augmentation in the reports --- .../monitor/internal/MonitorMapper.java | 2 +- .../ClassificationReportBuilderImpl.java | 11 +++-- ...deClassificationCategoryReportAccTest.java | 17 ++++++++ .../ProvideClassificationReportAccTest.java | 17 ++++++++ ...deDetailedClassificationReportAccTest.java | 17 ++++++++ ...videTaskCustomFieldValueReportAccTest.java | 17 ++++++++ .../ProvideTaskStatusReportAccTest.java | 17 ++++++++ .../report/ProvideTimestampReportAccTest.java | 40 +++++++++++++++++++ .../ProvideWorkbasketReportAccTest.java | 16 ++++++++ 9 files changed, 149 insertions(+), 5 deletions(-) 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 c2e3c5fb0..b62ba4f05 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 @@ -459,7 +459,7 @@ public interface MonitorMapper { + "AND T.CLASSIFICATION_ID NOT IN (#{excludedClassificationId}) " + "" + "" - + "AND DOMAIN IN (#{domain}) " + + "AND T.DOMAIN IN (#{domain}) " + "" + "" + "AND ((T.${key} = '${customAttributeFilter.get(key)}')) " diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java index 3a522aed2..179b6136b 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/reports/ClassificationReportBuilderImpl.java @@ -70,7 +70,10 @@ public class ClassificationReportBuilderImpl Map displayMap = classificationService .createClassificationQuery() - .keyIn(report.getRows().keySet().toArray(new String[0])) + .keyIn( + report.getRows().isEmpty() + ? null + : report.getRows().keySet().toArray(new String[0])) .domainIn(domains != null ? domains.toArray(new String[0]) : null) .list() .stream() @@ -119,12 +122,12 @@ public class ClassificationReportBuilderImpl .map(report::getRow) .flatMap(row -> row.getFoldableRows().values().stream()) .map(Row::getKey); + String[] keys = + Stream.concat(attachmentKeys, report.getRows().keySet().stream()).toArray(String[]::new); Map displayMap = classificationService .createClassificationQuery() - .keyIn( - Stream.concat(attachmentKeys, report.getRows().keySet().stream()) - .toArray(String[]::new)) + .keyIn(keys.length == 0 ? null : keys) .domainIn(domains != null ? domains.toArray(new String[0]) : null) .list() .stream() diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationCategoryReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationCategoryReportAccTest.java index 0a154a6e9..c89933070 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationCategoryReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationCategoryReportAccTest.java @@ -25,6 +25,7 @@ import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.ClassificationCategoryReport; +import pro.taskana.monitor.api.reports.ClassificationCategoryReport.Builder; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.task.api.TaskCustomField; import pro.taskana.task.api.TaskState; @@ -54,6 +55,22 @@ class ProvideClassificationCategoryReportAccTest extends AbstractReportAccTest { assertThat(report.getRow("MANUAL").getDisplayName()).isEqualTo("MANUAL"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + Builder builder = + MONITOR_SERVICE + .createClassificationCategoryReportBuilder() + .classificationIdIn(Collections.singletonList("DOES NOT EXIST")); + ThrowingCallable test = + () -> { + ClassificationCategoryReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void should_FilterTasksAccordingToClassificationId_When_ClassificationIdFilterIsApplied() diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationReportAccTest.java index cf0efd60e..f604652ac 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideClassificationReportAccTest.java @@ -25,6 +25,7 @@ import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.ClassificationReport; +import pro.taskana.monitor.api.reports.ClassificationReport.Builder; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.task.api.TaskCustomField; import pro.taskana.task.api.TaskState; @@ -54,6 +55,22 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest { assertThat(report.getRow("L50000").getDisplayName()).isEqualTo("Dynamik-Ablehnung"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + Builder builder = + MONITOR_SERVICE + .createClassificationReportBuilder() + .classificationIdIn(Collections.singletonList("DOES NOT EXIST")); + ThrowingCallable test = + () -> { + ClassificationReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void should_FilterTasksAccordingToClassificationId_When_ClassificationIdFilterIsApplied() diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java index 949b7872b..a83d1b5d9 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java @@ -24,6 +24,7 @@ import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.TaskTimestamp; +import pro.taskana.monitor.api.reports.ClassificationReport.Builder; import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem; @@ -107,6 +108,22 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest { assertThat(row.getFoldableRow("N/A").getDisplayName()).isEqualTo("N/A"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_DetailedReportContainsNoRows() { + Builder builder = + MONITOR_SERVICE + .createClassificationReportBuilder() + .classificationIdIn(Collections.singletonList("DOES NOT EXIST")); + ThrowingCallable test = + () -> { + DetailedClassificationReport report = builder.buildDetailedReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void testGetTotalNumbersOfTasksOfDetailedClassificationReport() throws Exception { diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskCustomFieldValueReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskCustomFieldValueReportAccTest.java index 3460b5972..205ca222a 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskCustomFieldValueReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskCustomFieldValueReportAccTest.java @@ -25,6 +25,7 @@ import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.TaskTimestamp; import pro.taskana.monitor.api.reports.TaskCustomFieldValueReport; +import pro.taskana.monitor.api.reports.TaskCustomFieldValueReport.Builder; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.task.api.TaskCustomField; import pro.taskana.task.api.TaskState; @@ -63,6 +64,22 @@ class ProvideTaskCustomFieldValueReportAccTest extends AbstractReportAccTest { .isEqualTo("Geschaeftsstelle C"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + Builder builder = + MONITOR_SERVICE + .createTaskCustomFieldValueReportBuilder(TaskCustomField.CUSTOM_1) + .classificationIdIn(Collections.singletonList("DOES NOT EXIST")); + ThrowingCallable test = + () -> { + TaskCustomFieldValueReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void testGetTotalNumbersOfTasksOfCustomFieldValueReportForCustom1() throws Exception { diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java index e3618b1a1..88887f7da 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java @@ -7,6 +7,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.Arrays; import java.util.Collections; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestTemplate; @@ -68,6 +69,22 @@ class ProvideTaskStatusReportAccTest extends AbstractReportAccTest { assertThat(report.getRow("USER-1-3").getDisplayName()).isEqualTo("PPK User 1 KSC 3"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + TaskStatusReport.Builder builder = + MONITOR_SERVICE + .createTaskStatusReportBuilder() + .domainIn(Collections.singletonList("DOES NOT EXIST")); + ThrowingCallable test = + () -> { + TaskStatusReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void testCompleteTaskStatusReport() throws Exception { diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java index f61663331..ccad78ff1 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java @@ -1,6 +1,7 @@ package acceptance.report; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import java.util.Arrays; import java.util.Collections; @@ -8,6 +9,7 @@ import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -35,6 +37,44 @@ class ProvideTimestampReportAccTest extends AbstractReportAccTest { assertThat(report.getRow("COMPLETED").getDisplayName()).isEqualTo("COMPLETED"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + TimestampReport.Builder builder = + MONITOR_SERVICE + .createTimestampReportBuilder() + .domainIn(Collections.singletonList("DOES_NOT_EXIST")); + ThrowingCallable test = + () -> { + TimestampReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + + @WithAccessId(user = "monitor") + @Test + void should_FilterTasksAccordingToDomain_When_DomainFilterIsApplied() throws Exception { + List headers = + IntStream.rangeClosed(-14, 0) + .mapToObj(TimeIntervalColumnHeader.Date::new) + .collect(Collectors.toList()); + TimestampReport report = + MONITOR_SERVICE + .createTimestampReportBuilder() + .withColumnHeaders(headers) + .domainIn(Collections.singletonList("DOMAIN_A")) + .buildReport(); + assertThat(report).isNotNull(); + + assertThat(report.rowSize()).isEqualTo(2); + assertThat(report.getRow("CREATED").getCells()) + .isEqualTo(new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26}); + assertThat(report.getRow("COMPLETED").getCells()) + .isEqualTo(new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}); + } + @WithAccessId(user = "monitor") @Test void should_FilterTasksAccordingToClassificationId_When_ClassificationIdFilterIsApplied() diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideWorkbasketReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideWorkbasketReportAccTest.java index 9a8cc679f..1d4c3d2ce 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideWorkbasketReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideWorkbasketReportAccTest.java @@ -52,6 +52,22 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest { assertThat(report.getRow("USER-1-3").getDisplayName()).isEqualTo("PPK User 1 KSC 3"); } + @WithAccessId(user = "monitor") + @Test + void should_NotThrowSqlExceptionDuringAugmentation_When_ReportContainsNoRows() { + WorkbasketReport.Builder builder = + MONITOR_SERVICE + .createWorkbasketReportBuilder() + .domainIn(Collections.singletonList("DOES_NOT_EXIST")); + ThrowingCallable test = + () -> { + WorkbasketReport report = builder.buildReport(); + assertThat(report).isNotNull(); + assertThat(report.rowSize()).isZero(); + }; + assertThatCode(test).doesNotThrowAnyException(); + } + @WithAccessId(user = "monitor") @Test void testGetTotalNumbersOfTasksOfWorkbasketReportBasedOnDueDate() throws Exception {