From 01cee64673df786c7cfc8c0647c9fc3a27a1bd6f Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Mon, 29 Jan 2018 13:15:14 +0100 Subject: [PATCH] TSK-167 Implement Workbasket query extensions --- .../java/pro/taskana/WorkbasketQuery.java | 45 +++++++++- .../java/pro/taskana/WorkbasketService.java | 1 + .../java/pro/taskana/impl/WorkbasketImpl.java | 4 +- .../pro/taskana/impl/WorkbasketQueryImpl.java | 87 +++++++++++++++---- .../taskana/model/mappings/QueryMapper.java | 21 +++-- .../workbasket/QueryWorkbasketAccTest.java | 23 ++--- .../impl/ClassificationServiceImplTest.java | 3 +- .../TaskServiceImplIntExplicitTest.java | 3 +- ...orkbasketServiceImplIntAutocommitTest.java | 11 +-- 9 files changed, 143 insertions(+), 55 deletions(-) diff --git a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketQuery.java b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketQuery.java index f7fad13b3..66461a1e6 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketQuery.java @@ -12,7 +12,8 @@ import pro.taskana.model.WorkbasketType; public interface WorkbasketQuery extends BaseQuery { /** - * Add your keys to your query. + * Add your keys to your query. The keys are compared case-insensitively to the keys of workbaskets with the IN + * operator. * * @param key * the keys as Strings @@ -21,7 +22,18 @@ public interface WorkbasketQuery extends BaseQuery { WorkbasketQuery keyIn(String... key); /** - * Add your names to your query. + * Add keys to your query. The keys are compared case-insensitively to the keys of workbaskets with the SQL LIKE + * operator. You may add a wildcard like '%' to search generically. If you specify multiple keys they are connected + * with an OR operator, this is, the query searches workbaskets whose keys are like key1 or like key2, etc. + * + * @param key + * the keys as Strings + * @return the query + */ + BaseQuery keyLike(String... key); + + /** + * Add your names to your query. The names are compared case-insensitively to the names of workbaskets * * @param name * the names as Strings @@ -29,6 +41,30 @@ public interface WorkbasketQuery extends BaseQuery { */ WorkbasketQuery nameIn(String... name); + /** + * Add names to your query. The names are compared case-insensitively to the names of workbaskets with the SQL LIKE + * operator. You may add a wildcard like '%' to search generically. If you specify multiple names, they are + * connected with an OR operator, this is, the query searches workbaskets whose names are like name1 or like name2, + * etc. + * + * @param name + * the names as Strings + * @return the query + */ + BaseQuery nameLike(String... name); + + /** + * Add search strings to your query that are searched case-insensitively in the key and name fields of workbaskets. + * You may add a wildcard like '%' to search generically. If you specify multiple keys they are connected with an OR + * operator, this is, the query searches workbaskets whose keys are like string1 or whose names are like string1 or + * whose keys are like string2 or whose names are like string2, etc... + * + * @param searchString + * the seach strings + * @return the query + */ + BaseQuery keyOrNameLike(String... searchString); + /** * Add your domains to your query. * @@ -84,8 +120,8 @@ public interface WorkbasketQuery extends BaseQuery { WorkbasketQuery modifiedBefore(Instant modifiedBefore); /** - * Add your description to your query. It will be compared in SQL with an LIKE. If you use a wildcard like % tehn it - * will be transmitted to the database. + * Add your description to your query. It will be compared case-insensitively to the descriptions of workbaskets. + * You may use a wildcard like '%' to search generically. * * @param description * your description @@ -130,4 +166,5 @@ public interface WorkbasketQuery extends BaseQuery { * when permission OR accessIds of the userContext are NULL. */ WorkbasketQuery callerHasPermission(WorkbasketAuthorization permission) throws InvalidArgumentException; + } diff --git a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketService.java b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketService.java index ba006e32d..271f939a7 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketService.java @@ -171,6 +171,7 @@ public interface WorkbasketService { * Returns a set with all permissions of the current user at this workbasket. * * @param workbasketKey + * The key of the referenced workbasket * @return a Set with all permissions */ List getPermissionsForWorkbasket(String workbasketKey); diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketImpl.java index 19a0996ba..25793d496 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketImpl.java @@ -237,9 +237,9 @@ public class WorkbasketImpl implements Workbasket { builder.append(", key="); builder.append(key); builder.append(", created="); - builder.append(created.toString()); + builder.append(created); builder.append(", modified="); - builder.append(modified.toString()); + builder.append(modified); builder.append(", name="); builder.append(name); builder.append(", description="); diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketQueryImpl.java index cf7e32333..fba60bfb9 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketQueryImpl.java @@ -8,6 +8,7 @@ import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.BaseQuery; import pro.taskana.TaskanaEngine; import pro.taskana.WorkbasketQuery; import pro.taskana.WorkbasketSummary; @@ -30,15 +31,18 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { private static final Logger LOGGER = LoggerFactory.getLogger(WorkbasketQueryImpl.class); private String[] accessId; private WorkbasketAuthorization authorization; - private String[] name; - private String[] key; + private String[] nameIn; + private String[] nameLike; + private String[] keyIn; + private String[] keyLike; + private String[] keyOrNameLike; private String[] domain; private WorkbasketType[] type; private Instant createdAfter; private Instant createdBefore; private Instant modifiedAfter; private Instant modifiedBefore; - private String description; + private String descriptionLike; private String[] owner; private TaskanaEngineImpl taskanaEngineImpl; @@ -48,7 +52,7 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { @Override public WorkbasketQuery keyIn(String... key) { - this.key = key; + this.keyIn = toUpperCopy(key); return this; } @@ -66,7 +70,25 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { @Override public WorkbasketQuery nameIn(String... names) { - this.name = names; + this.nameIn = toUpperCopy(names); + return this; + } + + @Override + public BaseQuery nameLike(String... names) { + this.nameLike = toUpperCopy(names); + return this; + } + + @Override + public BaseQuery keyLike(String... keys) { + this.keyLike = toUpperCopy(keys); + return this; + } + + @Override + public BaseQuery keyOrNameLike(String... keysOrNames) { + this.keyOrNameLike = toUpperCopy(keysOrNames); return this; } @@ -96,7 +118,7 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { @Override public WorkbasketQuery descriptionLike(String description) { - this.description = description; + this.descriptionLike = description.toUpperCase(); return this; } @@ -207,12 +229,24 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { return authorization; } - public String[] getName() { - return name; + public String[] getNameIn() { + return nameIn; } - public String[] getKey() { - return key; + public String[] getNameLike() { + return nameLike; + } + + public String[] getKeyIn() { + return keyIn; + } + + public String[] getKeyLike() { + return keyLike; + } + + public String[] getKeyOrNameLike() { + return keyOrNameLike; } public String[] getDomain() { @@ -239,8 +273,8 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { return modifiedBefore; } - public String getDescription() { - return description; + public String getDescriptionLike() { + return descriptionLike; } public String[] getOwner() { @@ -254,10 +288,16 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { builder.append(Arrays.toString(accessId)); builder.append(", authorization="); builder.append(authorization); - builder.append(", name="); - builder.append(Arrays.toString(name)); - builder.append(", key="); - builder.append(Arrays.toString(key)); + builder.append(", nameIn="); + builder.append(Arrays.toString(nameIn)); + builder.append(", nameLike="); + builder.append(Arrays.toString(nameLike)); + builder.append(", keyIn="); + builder.append(Arrays.toString(keyIn)); + builder.append(", keyLike="); + builder.append(Arrays.toString(keyLike)); + builder.append(", keyOrNameLike="); + builder.append(Arrays.toString(keyOrNameLike)); builder.append(", domain="); builder.append(Arrays.toString(domain)); builder.append(", type="); @@ -270,10 +310,12 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { builder.append(modifiedAfter); builder.append(", modifiedBefore="); builder.append(modifiedBefore); - builder.append(", description="); - builder.append(description); + builder.append(", descriptionLike="); + builder.append(descriptionLike); builder.append(", owner="); builder.append(Arrays.toString(owner)); + builder.append(", taskanaEngineImpl="); + builder.append(taskanaEngineImpl); builder.append("]"); return builder.toString(); } @@ -288,4 +330,13 @@ public class WorkbasketQueryImpl implements WorkbasketQuery { } } } + + private String[] toUpperCopy(String... source) { + String[] target = new String[source.length]; + for (int i = 0; i < source.length; i++) { + target[i] = source[i].toUpperCase(); + } + return target; + } + } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java index b1887a95f..73364bcd8 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/mappings/QueryMapper.java @@ -52,7 +52,7 @@ public interface QueryMapper { + "AND (t.CUSTOM_1 IN(#{item}) OR t.CUSTOM_2 IN(#{item}) OR t.CUSTOM_3 IN(#{item}) OR t.CUSTOM_4 IN(#{item}) OR t.CUSTOM_5 IN(#{item}) OR t.CUSTOM_6 IN(#{item}) OR t.CUSTOM_7 IN(#{item}) OR t.CUSTOM_8 IN(#{item}) OR t.CUSTOM_9 IN(#{item}) OR t.CUSTOM_10 IN(#{item})) " + "" + "") - @Results(value = { @Result(property = "taskId", column = "ID"), + @Results(value = {@Result(property = "taskId", column = "ID"), @Result(property = "created", column = "CREATED"), @Result(property = "claimed", column = "CLAIMED"), @Result(property = "completed", column = "COMPLETED"), @@ -86,7 +86,7 @@ public interface QueryMapper { @Result(property = "custom7", column = "CUSTOM_7"), @Result(property = "custom8", column = "CUSTOM_8"), @Result(property = "custom9", column = "CUSTOM_9"), - @Result(property = "custom10", column = "CUSTOM_10") }) + @Result(property = "custom10", column = "CUSTOM_10")}) List queryTasks(TaskQueryImpl taskQuery); @Select("") - @Results({ @Result(property = "id", column = "ID"), + @Results({@Result(property = "id", column = "ID"), @Result(property = "key", column = "KEY"), @Result(property = "category", column = "CATEGORY"), @Result(property = "type", column = "TYPE"), @Result(property = "domain", column = "DOMAIN"), - @Result(property = "name", column = "NAME") }) + @Result(property = "name", column = "NAME")}) List queryClassification(ClassificationQueryImpl classificationQuery); @Select("