diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/api/TaskQuery.java b/lib/taskana-core/src/main/java/pro/taskana/task/api/TaskQuery.java index 740420bf9..24a455b8d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/api/TaskQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/api/TaskQuery.java @@ -202,6 +202,14 @@ public interface TaskQuery extends BaseQuery { */ TaskQuery ownerIn(String... owners); + /** + * Filter out owners. + * + * @param owners the owners as String + * @return the query + */ + TaskQuery ownerNotIn(String... owners); + /** * Add the owner for pattern matching to your query. It will be compared in SQL with the LIKE * operator. You may use a wildcard like % to specify the pattern. diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java index d4f0e8b79..187891a9e 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryImpl.java @@ -75,6 +75,7 @@ public class TaskQueryImpl implements TaskQuery { private String[] classificationNameIn; private String[] classificationNameLike; private String[] ownerIn; + private String[] ownerNotIn; private String[] ownerLike; private Boolean isRead; private Boolean isTransferred; @@ -317,6 +318,12 @@ public class TaskQueryImpl implements TaskQuery { return this; } + @Override + public TaskQuery ownerNotIn(String... owners) { + this.ownerNotIn = owners; + return this; + } + @Override public TaskQuery ownerLike(String... owners) { this.ownerLike = toUpperCopy(owners); @@ -992,7 +999,7 @@ public class TaskQueryImpl implements TaskQuery { @Override public List list(int offset, int limit) { - List result = new ArrayList<>(); + List result; try { taskanaEngine.openConnection(); checkForIllegalParamCombinations(); @@ -1020,7 +1027,7 @@ public class TaskQueryImpl implements TaskQuery { @Override public List listValues(TaskQueryColumnName columnName, SortDirection sortDirection) { - List result = new ArrayList<>(); + List result; try { taskanaEngine.openConnection(); this.columnName = columnName; @@ -1052,7 +1059,7 @@ public class TaskQueryImpl implements TaskQuery { @Override public TaskSummary single() { - TaskSummary result = null; + TaskSummary result; try { taskanaEngine.openConnection(); checkOpenAndReadPermissionForSpecifiedWorkbaskets(); @@ -1077,7 +1084,7 @@ public class TaskQueryImpl implements TaskQuery { @Override public long count() { - Long rowCount = null; + Long rowCount; try { taskanaEngine.openConnection(); checkOpenAndReadPermissionForSpecifiedWorkbaskets(); @@ -1186,6 +1193,10 @@ public class TaskQueryImpl implements TaskQuery { return ownerIn; } + public String[] getOwnerNotIn() { + return ownerNotIn; + } + public String[] getOwnerLike() { return ownerLike; } diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQuerySqlProvider.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQuerySqlProvider.java index 2ba3ba6ff..74660441b 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQuerySqlProvider.java +++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQuerySqlProvider.java @@ -321,6 +321,7 @@ public class TaskQuerySqlProvider { whereIn("classificationNameIn", "c.NAME", sb); whereIn("attachmentClassificationNameIn", "ac.NAME", sb); whereIn("ownerIn", "OWNER", sb); + whereNotIn("ownerNotIn", "OWNER", sb); whereIn("porCompanyIn", "POR_COMPANY", sb); whereIn("porSystemIn", "POR_SYSTEM", sb); whereIn("porSystemInstanceIn", "POR_INSTANCE", sb); diff --git a/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java index d46dbccbe..2a376e79d 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/QueryTasksAccTest.java @@ -80,19 +80,20 @@ class QueryTasksAccTest extends AbstractAccTest { @WithAccessId(user = "admin") @Test - void testQueryForOwnerLike() { - + void should_ReturnCorrectResults_When_QueryingForOwnerLike() { List results = TASK_SERVICE.createTaskQuery().ownerLike("%a%", "%u%").orderByCreated(ASCENDING).list(); - assertThat(results).hasSize(39); - TaskSummary previousSummary = null; - for (TaskSummary taskSummary : results) { - if (previousSummary != null) { - assertThat(previousSummary.getCreated().isAfter(taskSummary.getCreated())).isFalse(); - } - previousSummary = taskSummary; - } + assertThat(results).hasSize(39).extracting(TaskSummary::getCreated).isSorted(); + } + + @WithAccessId(user = "admin") + @Test + void should_FilterOutOwner_When_OwnerNotInIsSet() { + List results = + TASK_SERVICE.createTaskQuery().ownerNotIn("user-1-1", "user-1-2").list(); + + assertThat(results).hasSize(3).extracting(TaskSummary::getOwner).containsOnly("user-b-1"); } @WithAccessId(user = "admin")