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 {