TSK-1572: replaced CURRENT_TIMESTAMP db function with Instant

This commit is contained in:
Mustapha Zorgati 2021-02-17 08:28:12 +01:00
parent 32cf6e2b53
commit 66ef87aeef
13 changed files with 306 additions and 189 deletions

View File

@ -38,7 +38,7 @@ public interface JobMapper {
@Select(
"<script> SELECT JOB_ID, PRIORITY, CREATED, DUE, STATE, LOCKED_BY, LOCK_EXPIRES, TYPE, RETRY_COUNT, ARGUMENTS "
+ "FROM SCHEDULED_JOB "
+ "WHERE STATE IN ( 'READY') AND (DUE is null OR DUE &lt; #{now}) AND (LOCK_EXPIRES is null OR LOCK_EXPIRES &lt; CURRENT_TIMESTAMP) AND RETRY_COUNT > 0 "
+ "WHERE STATE IN ( 'READY') AND (DUE is null OR DUE &lt; #{now}) AND (LOCK_EXPIRES is null OR LOCK_EXPIRES &lt; #{now}) AND RETRY_COUNT > 0 "
+ "ORDER BY PRIORITY DESC "
+ "<if test=\"_databaseId == 'db2'\">with UR </if> "
+ "</script>")

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
@ -23,9 +24,9 @@ public interface MonitorMapper {
@Select(
"<script>"
+ "SELECT B.WORKBASKET_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT T.WORKBASKET_KEY, (DAYS(T.${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'db2'\">SELECT T.WORKBASKET_KEY, (DAYS(T.${timestamp}) - DAYS(#{now})) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', #{now}, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.${timestamp} - #{now}) as AGE_IN_DAYS </if> "
+ "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
@ -66,6 +67,7 @@ public interface MonitorMapper {
@Result(column = "AGE_IN_DAYS", property = "ageInDays")
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
List<MonitorQueryItem> getTaskCountOfWorkbaskets(
@Param("now") Instant now,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("classificationCategories") List<String> classificationCategories,
@ -80,9 +82,9 @@ public interface MonitorMapper {
@Select(
"<script>"
+ "SELECT B.CLASSIFICATION_CATEGORY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_CATEGORY, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_CATEGORY, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_CATEGORY, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_CATEGORY, (DAYS(${timestamp}) - DAYS(#{now})) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_CATEGORY, DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_CATEGORY, DATE_PART('DAY', ${timestamp} - #{now}) as AGE_IN_DAYS </if> "
+ "FROM TASK "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
@ -115,6 +117,7 @@ public interface MonitorMapper {
@Result(column = "AGE_IN_DAYS", property = "ageInDays")
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
List<MonitorQueryItem> getTaskCountOfCategories(
@Param("now") Instant now,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("classificationCategories") List<String> classificationCategories,
@ -127,9 +130,9 @@ public interface MonitorMapper {
@Select(
"<script>"
+ "SELECT B.CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_KEY, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_KEY, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_KEY, (DAYS(${timestamp}) - DAYS(#{now})) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_KEY, DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_KEY, DATE_PART('DAY', ${timestamp} - #{now}) as AGE_IN_DAYS </if> "
+ "FROM TASK "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
@ -162,6 +165,7 @@ public interface MonitorMapper {
@Result(column = "AGE_IN_DAYS", property = "ageInDays")
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
List<MonitorQueryItem> getTaskCountOfClassifications(
@Param("now") Instant now,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("classificationCategories") List<String> classificationCategories,
@ -174,9 +178,9 @@ public interface MonitorMapper {
@Select(
"<script>"
+ "SELECT B.TASK_CLASSIFICATION_KEY, B.ATTACHMENT_CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, (DAYS(T.${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATE_PART('DAY', T.${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'db2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, (DAYS(T.${timestamp}) - DAYS(#{now})) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATEDIFF('DAY', #{now}, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATE_PART('DAY', T.${timestamp} - #{now}) as AGE_IN_DAYS </if> "
+ "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
@ -210,6 +214,7 @@ public interface MonitorMapper {
@Result(column = "AGE_IN_DAYS", property = "ageInDays")
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
List<DetailedMonitorQueryItem> getTaskCountOfDetailedClassifications(
@Param("now") Instant now,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("classificationCategories") List<String> classificationCategories,
@ -222,9 +227,9 @@ public interface MonitorMapper {
@Select(
"<script>"
+ "SELECT B.CUSTOM_FIELD, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT ${customField} as CUSTOM_FIELD, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT ${customField} as CUSTOM_FIELD, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT ${customField} as CUSTOM_FIELD, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'db2'\">SELECT ${customField} as CUSTOM_FIELD, (DAYS(${timestamp}) - DAYS(#{now})) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT ${customField} as CUSTOM_FIELD, DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT ${customField} as CUSTOM_FIELD, DATE_PART('DAY', ${timestamp} - #{now}) as AGE_IN_DAYS </if> "
+ "FROM TASK "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
@ -257,6 +262,7 @@ public interface MonitorMapper {
@Result(column = "AGE_IN_DAYS", property = "ageInDays")
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
List<MonitorQueryItem> getTaskCountOfTaskCustomFieldValues(
@Param("now") Instant now,
@Param("customField") TaskCustomField taskCustomField,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@ -312,22 +318,23 @@ public interface MonitorMapper {
+ "</if>"
+ "</if>"
+ "<if test=\"_databaseId == 'db2'\">"
+ "#{selectedItem.upperAgeLimit} >= (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) "
+ "#{selectedItem.upperAgeLimit} >= (DAYS(${timestamp}) - DAYS(#{now})) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= (DAYS(${timestamp}) - DAYS(#{now})) "
+ "</if> "
+ "<if test=\"_databaseId == 'h2'\">"
+ "#{selectedItem.upperAgeLimit} >= DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) "
+ "#{selectedItem.upperAgeLimit} >= DATEDIFF('DAY', #{now}, ${timestamp}) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= DATEDIFF('DAY', #{now}, ${timestamp}) "
+ "</if> "
+ "<if test=\"_databaseId == 'postgres'\">"
+ "#{selectedItem.upperAgeLimit} >= DATE_PART('day', ${timestamp} - CURRENT_TIMESTAMP ) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= DATE_PART('day', ${timestamp} - CURRENT_TIMESTAMP ) "
+ "#{selectedItem.upperAgeLimit} >= DATE_PART('day', ${timestamp} - #{now} ) AND "
+ "#{selectedItem.lowerAgeLimit} &lt;= DATE_PART('day', ${timestamp} - #{now} ) "
+ "</if> "
+ "</foreach>) "
+ "</where>"
+ "<if test=\"_databaseId == 'db2'\">with UR </if> "
+ "</script>")
List<String> getTaskIdsForSelectedItems(
@Param("now") Instant now,
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("classificationCategories") List<String> classificationCategories,
@ -429,9 +436,9 @@ public interface MonitorMapper {
// overhead / complexity. It's worth the trade-off of not computing the AGE_IN_DAYS column
// twice.
+ "SELECT W.ORG_LEVEL_1, W.ORG_LEVEL_2, W.ORG_LEVEL_3, W.ORG_LEVEL_4, "
+ "<if test=\"_databaseId == 'db2'\">(DAYS(T.${status}) - DAYS(CURRENT_TIMESTAMP))</if>"
+ "<if test=\"_databaseId == 'h2'\">DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${status})</if>"
+ "<if test=\"_databaseId == 'postgres'\">DATE_PART('DAY', T.${status} - CURRENT_TIMESTAMP)</if>"
+ "<if test=\"_databaseId == 'db2'\">(DAYS(T.${status}) - DAYS(#{now}))</if>"
+ "<if test=\"_databaseId == 'h2'\">DATEDIFF('DAY', #{now}, T.${status})</if>"
+ "<if test=\"_databaseId == 'postgres'\">DATE_PART('DAY', T.${status} - #{now})</if>"
+ " as AGE_IN_DAYS "
+ "FROM TASK AS T INNER JOIN WORKBASKET AS W ON T.WORKBASKET_KEY=W.KEY "
+ "<where>"
@ -465,6 +472,7 @@ public interface MonitorMapper {
@Result(column = "ORG_LEVEL_3", property = "orgLevel3")
@Result(column = "ORG_LEVEL_4", property = "orgLevel4")
List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(
@Param("now") Instant now,
@Param("status") TaskTimestamp status,
@Param("classificationCategories") List<String> classificationCategories,
@Param("classificationIds") List<String> classificationIds,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -45,6 +46,7 @@ public class ClassificationCategoryReportBuilderImpl
ClassificationCategoryReport report = new ClassificationCategoryReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfCategories(
Instant.now(),
this.workbasketIds,
this.states,
this.classificationCategory,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -55,6 +56,7 @@ public class ClassificationReportBuilderImpl
ClassificationReport report = new ClassificationReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfClassifications(
Instant.now(),
this.workbasketIds,
this.states,
this.classificationCategory,
@ -104,6 +106,7 @@ public class ClassificationReportBuilderImpl
DetailedClassificationReport report = new DetailedClassificationReport(this.columnHeaders);
List<DetailedMonitorQueryItem> detailedMonitorQueryItems =
this.monitorMapper.getTaskCountOfDetailedClassifications(
Instant.now(),
this.workbasketIds,
this.states,
this.classificationCategory,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -51,6 +52,7 @@ public class TaskCustomFieldValueReportBuilderImpl
TaskCustomFieldValueReport report = new TaskCustomFieldValueReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfTaskCustomFieldValues(
Instant.now(),
this.taskCustomField,
this.workbasketIds,
this.states,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -146,6 +147,7 @@ abstract class TimeIntervalReportBuilderImpl<
selectedItems = convertWorkingDaysToDays(selectedItems, this.columnHeaders);
}
return this.monitorMapper.getTaskIdsForSelectedItems(
Instant.now(),
this.workbasketIds,
this.states,
this.classificationCategory,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -99,6 +100,7 @@ public class TimestampReportBuilderImpl
private List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(TaskTimestamp s) {
return monitorMapper.getTasksCountForStatusGroupedByOrgLevel(
Instant.now(),
s,
classificationCategory,
classificationIds,

View File

@ -1,5 +1,6 @@
package pro.taskana.monitor.internal.reports;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -51,6 +52,7 @@ public class WorkbasketReportBuilderImpl
WorkbasketReport report = new WorkbasketReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfWorkbaskets(
Instant.now(),
this.workbasketIds,
this.states,
this.classificationCategory,

View File

@ -7,17 +7,26 @@ import static com.tngtech.archunit.library.GeneralCodingRules.NO_CLASSES_SHOULD_
import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.slices;
import static org.assertj.core.api.Assertions.assertThat;
import com.tngtech.archunit.base.Optional;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.domain.JavaMethod;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.lang.ArchCondition;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.lang.ConditionEvents;
import com.tngtech.archunit.lang.SimpleConditionEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
@ -109,22 +118,7 @@ class ArchitectureTest {
)
.map(Pattern::compile)
.collect(Collectors.toList());
ArchCondition<JavaClass> condition =
new ArchCondition<JavaClass>("all be defined in TASKANA_SUB_PACKAGES") {
@Override
public void check(JavaClass item, ConditionEvents events) {
if (TASKANA_SUB_PACKAGES.stream().noneMatch(p -> item.getPackageName().startsWith(p))
&& excludePackages.stream()
.noneMatch(p -> p.matcher(item.getPackageName()).matches())) {
String message =
String.format(
"Package '%s' was not declared in TASKANA_SUB_PACKAGES",
item.getPackageName());
events.add(SimpleConditionEvent.violated(item, message));
}
}
};
ArchRule myRule = classes().should(condition);
ArchRule myRule = classes().should(beDefinedInTaskanaSubPackages(excludePackages));
myRule.check(importedClasses);
}
@ -220,4 +214,83 @@ class ArchitectureTest {
.because("we consistently want to use assertj in our tests");
rule.check(importedClasses);
}
@Test
void mapperClassesShouldNotUseCurrentTimestampSqlFunction() {
ArchRule rule =
classes()
.that()
.haveSimpleNameEndingWith("Mapper")
.should(notUseCurrentTimestampSqlFunction());
rule.check(importedClasses);
}
private static ArchCondition<JavaClass> beDefinedInTaskanaSubPackages(
List<Pattern> excludePackages) {
return new ArchCondition<>("all be defined in TASKANA_SUB_PACKAGES") {
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
if (TASKANA_SUB_PACKAGES.stream().noneMatch(p -> javaClass.getPackageName().startsWith(p))
&& excludePackages.stream()
.noneMatch(p -> p.matcher(javaClass.getPackageName()).matches())) {
String message =
String.format(
"Package '%s' was not declared in TASKANA_SUB_PACKAGES",
javaClass.getPackageName());
events.add(SimpleConditionEvent.violated(javaClass, message));
}
}
};
}
private static ArchCondition<JavaClass> notUseCurrentTimestampSqlFunction() {
Function<JavaMethod, List<String>> getSqlStringsFromMethod =
(method) -> {
List<String> values = new ArrayList<>();
final Optional<Select> selectAnnotation = method.tryGetAnnotationOfType(Select.class);
final Optional<Update> updateAnnotation = method.tryGetAnnotationOfType(Update.class);
final Optional<Insert> insertAnnotation = method.tryGetAnnotationOfType(Insert.class);
final Optional<Delete> deleteAnnotation = method.tryGetAnnotationOfType(Delete.class);
if (selectAnnotation.isPresent()) {
values.addAll(Arrays.asList(selectAnnotation.get().value()));
}
if (updateAnnotation.isPresent()) {
values.addAll(Arrays.asList(updateAnnotation.get().value()));
}
if (insertAnnotation.isPresent()) {
values.addAll(Arrays.asList(insertAnnotation.get().value()));
}
if (deleteAnnotation.isPresent()) {
values.addAll(Arrays.asList(deleteAnnotation.get().value()));
}
return values;
};
return new ArchCondition<>("not use the SQL function 'CURRENT_TIMESTAMP'") {
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
for (JavaMethod method : javaClass.getAllMethods()) {
List<String> sqlStrings = getSqlStringsFromMethod.apply(method);
if (sqlStrings.isEmpty()) {
String message =
String.format(
"Method '%s#%s' does not contain any MyBatis SQL annotation",
javaClass.getName(), method.getName());
events.add(SimpleConditionEvent.violated(javaClass, message));
}
if (sqlStrings.stream().anyMatch(s -> s.contains("CURRENT_TIMESTAMP"))) {
String message =
String.format(
"Method '%s#%s' uses 'CURRENT_TIMESTAMP' SQL function",
javaClass.getName(), method.getName());
events.add(SimpleConditionEvent.violated(javaClass, message));
}
}
}
};
}
}

View File

@ -66,14 +66,15 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfCategories(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
final ClassificationCategoryReport actualResult =
@ -92,7 +93,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
verify(taskanaEngineMock).checkRoleMembership(any());
verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(monitorMapperMock)
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(
internalTaskanaEngineMock,
@ -125,14 +126,15 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfCategories(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
final ClassificationCategoryReport actualResult =
@ -152,7 +154,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
verify(taskanaEngineMock).checkRoleMembership(any());
verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(monitorMapperMock)
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(
internalTaskanaEngineMock,
@ -183,18 +185,19 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
List<String> expectedResult = List.of("TKI:000000000000000000000000000000000001");
when(monitorMapperMock.getTaskIdsForSelectedItems(
workbasketIds,
states,
categories,
domains,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
null,
"CLASSIFICATION_CATEGORY",
TaskTimestamp.DUE,
selectedItems,
false))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(null),
eq("CLASSIFICATION_CATEGORY"),
eq(TaskTimestamp.DUE),
eq(selectedItems),
eq(false)))
.thenReturn(expectedResult);
final List<String> actualResult =
@ -224,6 +227,7 @@ class ClassificationClassificationCategoryReportBuilderImplTest {
any(),
any(),
any(),
any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));

View File

@ -80,14 +80,15 @@ class ClassificationReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfClassifications(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
ClassificationQuery queryMock = mock(ClassificationQuery.class);
@ -114,7 +115,8 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(3)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfClassifications(
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(queryMock);
@ -147,14 +149,15 @@ class ClassificationReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfClassifications(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
ClassificationQuery queryMock = mock(ClassificationQuery.class);
when(classificationService.createClassificationQuery()).thenReturn(queryMock);
@ -181,7 +184,8 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(3)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfClassifications(
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(queryMock);
verifyNoMoreInteractions(mocks);
@ -212,14 +216,15 @@ class ClassificationReportBuilderImplTest {
detailedMonitorQueryItem.setNumberOfTasks(1);
expectedResult.add(detailedMonitorQueryItem);
when(monitorMapperMock.getTaskCountOfDetailedClassifications(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
ClassificationQuery queryMock = mock(ClassificationQuery.class);
when(classificationService.createClassificationQuery()).thenReturn(queryMock);
@ -246,7 +251,7 @@ class ClassificationReportBuilderImplTest {
verify(monitorMapperMock)
.getTaskCountOfDetailedClassifications(
any(), any(), any(), any(), any(), any(), any(), any());
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(queryMock);
verifyNoMoreInteractions(mocks);
@ -281,14 +286,15 @@ class ClassificationReportBuilderImplTest {
detailedMonitorQueryItem.setNumberOfTasks(1);
expectedResult.add(detailedMonitorQueryItem);
when(monitorMapperMock.getTaskCountOfDetailedClassifications(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
ClassificationQuery queryMock = mock(ClassificationQuery.class);
when(classificationService.createClassificationQuery()).thenReturn(queryMock);
@ -316,7 +322,7 @@ class ClassificationReportBuilderImplTest {
verify(monitorMapperMock)
.getTaskCountOfDetailedClassifications(
any(), any(), any(), any(), any(), any(), any(), any());
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(queryMock);
verifyNoMoreInteractions(mocks);
@ -351,18 +357,19 @@ class ClassificationReportBuilderImplTest {
final List<String> expectedResult = List.of("TKI:000000000000000000000000000000000001");
when(monitorMapperMock.getTaskIdsForSelectedItems(
workbasketIds,
states,
categories,
domains,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
null,
"CLASSIFICATION_KEY",
TaskTimestamp.DUE,
selectedItems,
false))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(null),
eq("CLASSIFICATION_KEY"),
eq(TaskTimestamp.DUE),
eq(selectedItems),
eq(false)))
.thenReturn(expectedResult);
final List<String> actualResult =
@ -393,6 +400,7 @@ class ClassificationReportBuilderImplTest {
any(),
any(),
any(),
any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));

View File

@ -2,6 +2,7 @@ package pro.taskana.monitor.internal;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@ -64,15 +65,16 @@ class TaskCustomFieldValueReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfTaskCustomFieldValues(
TaskCustomField.CUSTOM_1,
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(TaskCustomField.CUSTOM_1),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
final TaskCustomFieldValueReport actualResult =
@ -92,7 +94,7 @@ class TaskCustomFieldValueReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfTaskCustomFieldValues(
any(), any(), any(), any(), any(), any(), any(), any(), any());
any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(
internalTaskanaEngineMock,
@ -125,15 +127,16 @@ class TaskCustomFieldValueReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfTaskCustomFieldValues(
TaskCustomField.CUSTOM_1,
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter))
any(),
eq(TaskCustomField.CUSTOM_1),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter)))
.thenReturn(expectedResult);
final TaskCustomFieldValueReport actualResult =
@ -154,7 +157,7 @@ class TaskCustomFieldValueReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfTaskCustomFieldValues(
any(), any(), any(), any(), any(), any(), any(), any(), any());
any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(
internalTaskanaEngineMock,

View File

@ -73,15 +73,16 @@ class WorkbasketReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfWorkbaskets(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
combinedClassificationFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(combinedClassificationFilter)))
.thenReturn(expectedResult);
when(internalTaskanaEngineMock.runAsAdmin(any())).thenReturn(Map.of());
@ -102,7 +103,8 @@ class WorkbasketReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(3)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfWorkbaskets(
any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verify(internalTaskanaEngineMock).runAsAdmin(any());
verify(taskanaEngineMock).getWorkbasketService();
@ -139,15 +141,16 @@ class WorkbasketReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfWorkbaskets(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.DUE,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
combinedClassificationFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.DUE),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(combinedClassificationFilter)))
.thenReturn(expectedResult);
when(internalTaskanaEngineMock.runAsAdmin(any())).thenReturn(Map.of());
@ -169,7 +172,8 @@ class WorkbasketReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(3)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any(), any());
.getTaskCountOfWorkbaskets(
any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection();
verify(taskanaEngineMock).getWorkbasketService();
verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock);
@ -199,18 +203,19 @@ class WorkbasketReportBuilderImplTest {
List<String> expectedResult = List.of("TKI:000000000000000000000000000000000001");
when(monitorMapperMock.getTaskIdsForSelectedItems(
workbasketIds,
states,
categories,
domains,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
null,
"WORKBASKET_KEY",
TaskTimestamp.DUE,
selectedItems,
false))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(null),
eq("WORKBASKET_KEY"),
eq(TaskTimestamp.DUE),
eq(selectedItems),
eq(false)))
.thenReturn(expectedResult);
final List<String> actualResult =
@ -240,6 +245,7 @@ class WorkbasketReportBuilderImplTest {
any(),
any(),
any(),
any(),
eq(TaskTimestamp.DUE),
any(),
eq(false));
@ -349,15 +355,16 @@ class WorkbasketReportBuilderImplTest {
monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfWorkbaskets(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.PLANNED,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
combinedClassificationFilter))
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.PLANNED),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(combinedClassificationFilter)))
.thenReturn(expectedResult);
when(internalTaskanaEngineMock.runAsAdmin(any())).thenReturn(Map.of());
@ -380,15 +387,16 @@ class WorkbasketReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(3)).getEngine();
verify(monitorMapperMock)
.getTaskCountOfWorkbaskets(
workbasketIds,
states,
categories,
domains,
TaskTimestamp.PLANNED,
classificationIds,
excludedClassificationIds,
customAttributeFilter,
combinedClassificationFilter);
any(),
eq(workbasketIds),
eq(states),
eq(categories),
eq(domains),
eq(TaskTimestamp.PLANNED),
eq(classificationIds),
eq(excludedClassificationIds),
eq(customAttributeFilter),
eq(combinedClassificationFilter));
verify(internalTaskanaEngineMock).returnConnection();
verify(taskanaEngineMock).getWorkbasketService();
verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock);