getAllCustomAttributes(boolean lockForUpdate);
@Update("UPDATE CONFIGURATION SET CUSTOM_ATTRIBUTES = #{customAttributes} WHERE NAME = 'MASTER'")
diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java
index 7ab8931c3..3e42cc0f7 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java
@@ -1,5 +1,8 @@
package pro.taskana.common.internal;
+import static pro.taskana.common.internal.util.SqlProviderUtil.CLOSING_SCRIPT_TAG;
+import static pro.taskana.common.internal.util.SqlProviderUtil.OPENING_SCRIPT_TAG;
+
import java.time.Instant;
import java.util.List;
import java.util.Map;
@@ -18,11 +21,11 @@ import pro.taskana.common.internal.persistence.MapTypeHandler;
public interface JobMapper {
@Insert(
- "")
+ + CLOSING_SCRIPT_TAG)
@Result(property = "jobId", column = "JOB_ID")
Integer insertJob(@Param("job") ScheduledJob job);
@Select(
- "")
+ + CLOSING_SCRIPT_TAG)
@Result(property = "jobId", column = "JOB_ID")
@Result(property = "priority", column = "PRIORITY")
@Result(property = "created", column = "CREATED")
diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/OracleSqlSessionFactory.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/OracleSqlSessionFactory.java
new file mode 100644
index 000000000..3df95d34c
--- /dev/null
+++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/OracleSqlSessionFactory.java
@@ -0,0 +1,95 @@
+package pro.taskana.common.internal;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.TransactionIsolationLevel;
+import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * MyBatis SqlSession Factory for Oracle Databases.
+ *
+ * After Connection the SQL session is alterd with SORT and COMP Settings for Oracle. PLease have
+ * a look at alterSession Method
+ */
+public class OracleSqlSessionFactory extends DefaultSqlSessionFactory {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OracleSqlSessionFactory.class);
+
+ public OracleSqlSessionFactory(Configuration configuration) {
+ super(configuration);
+ }
+
+ @Override
+ public SqlSession openSession() {
+ SqlSession sqlSession = super.openSession();
+ alterSession(sqlSession);
+ return sqlSession;
+ }
+
+ @Override
+ public SqlSession openSession(boolean autoCommit) {
+ SqlSession session = super.openSession(autoCommit);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(Connection connection) {
+ SqlSession session = super.openSession(connection);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(ExecutorType execType) {
+ SqlSession session = super.openSession(execType);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(ExecutorType execType, boolean autoCommit) {
+ SqlSession session = super.openSession(execType, autoCommit);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(ExecutorType execType, Connection connection) {
+ SqlSession session = super.openSession(execType, connection);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level) {
+ SqlSession session = super.openSession(execType, level);
+ alterSession(session);
+ return session;
+ }
+
+ @Override
+ public SqlSession openSession(TransactionIsolationLevel level) {
+ SqlSession session = super.openSession(level);
+ alterSession(session);
+ return session;
+ }
+
+ private void alterSession(SqlSession session) {
+ try (Statement statement = session.getConnection().createStatement()) {
+ statement.addBatch("ALTER SESSION SET NLS_COMP = LINGUISTIC");
+ // https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#NLSPG293
+ statement.addBatch("ALTER SESSION SET NLS_SORT = BINARY_CI");
+ statement.executeBatch();
+ LOGGER.debug("Altered newly created session parameters.");
+ } catch (SQLException e) {
+ LOGGER.error("Alter session failed!", e);
+ }
+ }
+}
diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java
index 6f88c41bf..4e72c466b 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java
@@ -46,6 +46,7 @@ import pro.taskana.common.internal.configuration.DB;
import pro.taskana.common.internal.configuration.DbSchemaCreator;
import pro.taskana.common.internal.persistence.InstantTypeHandler;
import pro.taskana.common.internal.persistence.MapTypeHandler;
+import pro.taskana.common.internal.persistence.StringTypeHandler;
import pro.taskana.common.internal.security.CurrentUserContextImpl;
import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.internal.MonitorMapper;
@@ -335,10 +336,10 @@ public class TaskanaEngineImpl implements TaskanaEngine {
Configuration configuration = new Configuration(environment);
// set databaseId
+ String databaseProductName;
try (Connection con = taskanaEngineConfiguration.getDatasource().getConnection()) {
- String databaseProductName = con.getMetaData().getDatabaseProductName();
- String databaseProductId = DB.getDatabaseProductId(databaseProductName);
- configuration.setDatabaseId(databaseProductId);
+ databaseProductName = DB.getDatabaseProductName(con);
+ configuration.setDatabaseId(DB.getDatabaseProductId(con));
} catch (SQLException e) {
throw new SystemException(
@@ -348,6 +349,13 @@ public class TaskanaEngineImpl implements TaskanaEngine {
}
// register type handlers
+ if (DB.isOracleDb(databaseProductName)) {
+ // Use NULL instead of OTHER when jdbcType is not specified for null values,
+ // otherwise oracle driver will chunck on null values
+ configuration.setJdbcTypeForNull(JdbcType.NULL);
+ configuration.getTypeHandlerRegistry().register(String.class, new StringTypeHandler());
+ }
+
configuration.getTypeHandlerRegistry().register(new MapTypeHandler());
configuration.getTypeHandlerRegistry().register(Instant.class, new InstantTypeHandler());
configuration.getTypeHandlerRegistry().register(JdbcType.TIMESTAMP, new InstantTypeHandler());
@@ -368,7 +376,20 @@ public class TaskanaEngineImpl implements TaskanaEngine {
configuration.addMapper(JobMapper.class);
configuration.addMapper(UserMapper.class);
configuration.addMapper(ConfigurationMapper.class);
- SqlSessionFactory localSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
+
+ SqlSessionFactory localSessionFactory;
+ if (DB.isOracleDb(databaseProductName)) {
+ localSessionFactory =
+ new SqlSessionFactoryBuilder() {
+ @Override
+ public SqlSessionFactory build(Configuration config) {
+ return new OracleSqlSessionFactory(config);
+ }
+ }.build(configuration);
+ } else {
+ localSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
+ }
+
return SqlSessionManager.newInstance(localSessionFactory);
}
diff --git a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapperSqlProvider.java b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapperSqlProvider.java
index 468ec2c1e..6c45e8c80 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapperSqlProvider.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/monitor/internal/MonitorMapperSqlProvider.java
@@ -25,13 +25,18 @@ public class MonitorMapperSqlProvider {
+ "SELECT T.WORKBASKET_KEY, (DAYS(T.${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP))) "
+ "as AGE_IN_DAYS "
+ " "
+ + ""
+ + "SELECT T.WORKBASKET_KEY, (TRUNC(T.${timestamp}) - TRUNC(CAST(#{now} as TIMESTAMP)))"
+ + " as AGE_IN_DAYS "
+ + " "
+ ""
+ "SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', #{now}, T.${timestamp}) as AGE_IN_DAYS "
+ " "
+ ""
+ "SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.${timestamp} - #{now}) as AGE_IN_DAYS "
+ " "
- + "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ + "FROM TASK T "
+ + "LEFT JOIN ATTACHMENT A ON T.ID = A.TASK_ID "
+ OPENING_WHERE_TAG
+ taskWhereStatements()
+ ""
@@ -45,7 +50,7 @@ public class MonitorMapperSqlProvider {
+ ""
+ "AND T.${timestamp} IS NOT NULL "
+ CLOSING_WHERE_TAG
- + ") AS B "
+ + ") B "
+ "GROUP BY B.WORKBASKET_KEY, B.AGE_IN_DAYS"
+ CLOSING_SCRIPT_TAG;
}
@@ -59,6 +64,9 @@ public class MonitorMapperSqlProvider {
+ ""
+ "(DAYS(${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ " "
+ + ""
+ + "(TRUNC(${timestamp}) - TRUNC(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ + " "
+ ""
+ "DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS "
+ " "
@@ -70,7 +78,7 @@ public class MonitorMapperSqlProvider {
+ taskWhereStatements()
+ "AND ${timestamp} IS NOT NULL "
+ CLOSING_WHERE_TAG
- + ") AS B "
+ + ") B "
+ "GROUP BY B.CLASSIFICATION_CATEGORY, B.AGE_IN_DAYS "
+ CLOSING_SCRIPT_TAG;
}
@@ -84,6 +92,9 @@ public class MonitorMapperSqlProvider {
+ ""
+ "(DAYS(${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ " "
+ + ""
+ + "(TRUNC(T.${timestamp}) - TRUNC(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ + " "
+ ""
+ "DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS "
+ " "
@@ -95,7 +106,7 @@ public class MonitorMapperSqlProvider {
+ taskWhereStatements()
+ "AND ${timestamp} IS NOT NULL "
+ CLOSING_WHERE_TAG
- + ") AS B "
+ + ") B "
+ "GROUP BY B.CLASSIFICATION_KEY, B.AGE_IN_DAYS "
+ CLOSING_SCRIPT_TAG;
}
@@ -110,18 +121,22 @@ public class MonitorMapperSqlProvider {
+ ""
+ "(DAYS(T.${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ " "
+ + ""
+ + "(TRUNC(T.${timestamp}) - TRUNC(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ + " "
+ ""
+ "DATEDIFF('DAY', #{now}, T.${timestamp}) as AGE_IN_DAYS "
+ " "
+ ""
+ "DATE_PART('DAY', T.${timestamp} - #{now}) as AGE_IN_DAYS "
+ " "
- + "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ + "FROM TASK T "
+ + "LEFT JOIN ATTACHMENT A ON T.ID = A.TASK_ID "
+ OPENING_WHERE_TAG
+ taskWhereStatements()
+ "AND T.${timestamp} IS NOT NULL "
+ CLOSING_WHERE_TAG
- + ") AS B "
+ + ") B "
+ "GROUP BY B.TASK_CLASSIFICATION_KEY, B.ATTACHMENT_CLASSIFICATION_KEY, B.AGE_IN_DAYS "
+ CLOSING_SCRIPT_TAG;
}
@@ -134,6 +149,9 @@ public class MonitorMapperSqlProvider {
+ ""
+ "(DAYS(${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ " "
+ + ""
+ + "(TRUNC(T.${timestamp}) - TRUNC(CAST(#{now} as TIMESTAMP))) as AGE_IN_DAYS "
+ + " "
+ ""
+ "DATEDIFF('DAY', #{now}, ${timestamp}) as AGE_IN_DAYS "
+ " "
@@ -145,7 +163,7 @@ public class MonitorMapperSqlProvider {
+ taskWhereStatements()
+ "AND ${timestamp} IS NOT NULL "
+ CLOSING_WHERE_TAG
- + ") AS B "
+ + ") B "
+ "GROUP BY B.CUSTOM_FIELD, B.AGE_IN_DAYS "
+ CLOSING_SCRIPT_TAG;
}
@@ -176,10 +194,17 @@ public class MonitorMapperSqlProvider {
+ ""
+ ""
+ ""
- + "#{selectedItem.upperAgeLimit} >= (DAYS(${timestamp})"
- + " - DAYS(CAST(#{now} as TIMESTAMP))) AND "
- + "#{selectedItem.lowerAgeLimit} <= (DAYS(${timestamp})"
- + " - DAYS(CAST(#{now} as TIMESTAMP))) "
+ + "#{selectedItem.upperAgeLimit} >= (DAYS(${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP)))"
+ + " AND "
+ + "#{selectedItem.lowerAgeLimit} <= (DAYS(${timestamp}) - DAYS(CAST(#{now} as TIMESTAMP"
+ + "))) "
+ + " "
+ + ""
+ + "#{selectedItem.upperAgeLimit} >= (TRUNC(${timestamp}) - "
+ + "TRUNC(CAST(#{now} as TIMESTAMP))) "
+ + "AND "
+ + "#{selectedItem.lowerAgeLimit} <= (TRUNC(${timestamp}) - "
+ + "TRUNC(CAST(#{now} as TIMESTAMP))) "
+ " "
+ ""
+ "#{selectedItem.upperAgeLimit} >= DATEDIFF('DAY', #{now}, ${timestamp}) AND "
@@ -199,7 +224,7 @@ public class MonitorMapperSqlProvider {
public static String getTasksCountByState() {
return OPENING_SCRIPT_TAG
+ "SELECT WORKBASKET_KEY, STATE, COUNT(STATE) as COUNT "
- + "FROM TASK AS T"
+ + "FROM TASK T"
+ OPENING_WHERE_TAG
+ whereIn("domains", "DOMAIN")
+ whereIn("states", "STATE")
@@ -227,6 +252,9 @@ public class MonitorMapperSqlProvider {
+ ""
+ "(DAYS(T.${status}) - DAYS(CAST(#{now} as TIMESTAMP)))"
+ ""
+ + ""
+ + "(TRUNC(T.${status}) - TRUNC(CAST(#{now} as TIMESTAMP))) "
+ + " "
+ ""
+ "DATEDIFF('DAY', #{now}, T.${status})"
+ ""
@@ -234,14 +262,15 @@ public class MonitorMapperSqlProvider {
+ "DATE_PART('DAY', T.${status} - #{now})"
+ ""
+ " as AGE_IN_DAYS "
- + "FROM TASK AS T INNER JOIN WORKBASKET AS W ON T.WORKBASKET_KEY=W.KEY "
+ + "FROM TASK T "
+ + "INNER JOIN WORKBASKET W ON T.WORKBASKET_KEY=W.KEY "
+ OPENING_WHERE_TAG
+ ""
+ "T.COMPLETED IS NOT NULL "
+ ""
+ taskWhereStatements()
+ CLOSING_WHERE_TAG
- + ") AS A "
+ + ") A "
+ "GROUP BY A.AGE_IN_DAYS, A.ORG_LEVEL_1, A.ORG_LEVEL_2, A.ORG_LEVEL_3, A.ORG_LEVEL_4 "
+ CLOSING_SCRIPT_TAG;
}
@@ -272,8 +301,8 @@ public class MonitorMapperSqlProvider {
public static String getTaskCountByPriority() {
return OPENING_SCRIPT_TAG
+ "SELECT T.WORKBASKET_KEY, T.PRIORITY, COUNT(T.PRIORITY) as COUNT "
- + "FROM TASK as T "
- + "INNER JOIN WORKBASKET as W ON W.ID = T.WORKBASKET_ID "
+ + "FROM TASK T "
+ + "INNER JOIN WORKBASKET W ON W.ID = T.WORKBASKET_ID "
+ OPENING_WHERE_TAG
+ taskWhereStatements()
+ workbasketWhereStatements()
diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/AttachmentMapper.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/AttachmentMapper.java
index 59754a43e..bef31486b 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/AttachmentMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/AttachmentMapper.java
@@ -112,8 +112,8 @@ public interface AttachmentMapper {
@Select(
"")
@Result(property = "left", column = "ID")
diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskCommentQuerySqlProvider.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskCommentQuerySqlProvider.java
index 267c8f43d..5abd46780 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskCommentQuerySqlProvider.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskCommentQuerySqlProvider.java
@@ -30,9 +30,9 @@ public class TaskCommentQuerySqlProvider {
+ ", u.FULL_NAME"
+ ""
+ "FROM TASK_COMMENT tc "
- + "LEFT JOIN Task AS t ON tc.TASK_ID = t.ID "
+ + "LEFT JOIN Task t ON tc.TASK_ID = t.ID "
+ ""
- + "LEFT JOIN USER_INFO AS u ON tc.CREATOR = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON tc.CREATOR = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ checkForAuthorization()
@@ -49,7 +49,7 @@ public class TaskCommentQuerySqlProvider {
return OPENING_SCRIPT_TAG
+ "SELECT COUNT(tc.ID) "
+ "FROM TASK_COMMENT tc "
- + "LEFT JOIN Task AS t ON tc.TASK_ID = t.ID "
+ + "LEFT JOIN Task t ON tc.TASK_ID = t.ID "
+ OPENING_WHERE_TAG
+ checkForAuthorization()
+ commonTaskCommentWhereStatement()
@@ -62,9 +62,9 @@ public class TaskCommentQuerySqlProvider {
return OPENING_SCRIPT_TAG
+ "SELECT DISTINCT ${queryColumnName} "
+ "FROM TASK_COMMENT tc "
- + "LEFT JOIN Task AS t ON tc.TASK_ID = t.ID "
+ + "LEFT JOIN Task t ON tc.TASK_ID = t.ID "
+ ""
- + "LEFT JOIN USER_INFO AS u ON tc.CREATOR = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON tc.CREATOR = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ checkForAuthorization()
@@ -106,10 +106,18 @@ public class TaskCommentQuerySqlProvider {
return " AND t.WORKBASKET_ID IN ("
+ "SELECT WID "
+ "FROM ("
+ + ""
+ + ""
+ + "SELECT WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ "
+ + ""
+ + ""
+ "SELECT WORKBASKET_ID as WID, MAX(PERM_READ::int) as MAX_READ "
- + "FROM WORKBASKET_ACCESS_LIST AS s where ACCESS_ID IN "
+ + ""
+ + ""
+ + "FROM WORKBASKET_ACCESS_LIST s "
+ + "WHERE ACCESS_ID IN "
+ "(#{item}) "
- + "GROUP by WORKBASKET_ID) as f "
+ + "GROUP by WORKBASKET_ID) f "
+ "WHERE MAX_READ = 1) "
+ "";
}
diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java
index 67282b4a1..e0afa0326 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskMapper.java
@@ -289,15 +289,15 @@ public interface TaskMapper {
+ "SELECT t.ID, t.WORKBASKET_ID FROM TASK t WHERE t.ID IN(#{taskSummary.taskId})"
+ "AND NOT (t.WORKBASKET_ID IN ( "
+ ""
- + ""
- + "SELECT WID from (SELECT WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ FROM WORKBASKET_ACCESS_LIST AS s where "
+ + ""
+ + "SELECT WID from (SELECT WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ FROM WORKBASKET_ACCESS_LIST s where "
+ ""
+ ""
- + "SELECT WID from (SELECT WORKBASKET_ID as WID, MAX(PERM_READ::int) as MAX_READ FROM WORKBASKET_ACCESS_LIST AS s where "
+ + "SELECT WID from (SELECT WORKBASKET_ID as WID, MAX(PERM_READ::int) as MAX_READ FROM WORKBASKET_ACCESS_LIST s where "
+ ""
+ ""
+ "ACCESS_ID IN (#{item}) "
- + "group by WORKBASKET_ID ) AS f where max_read = 1 ))"
+ + "group by WORKBASKET_ID ) f WHERE max_read = 1 )) "
+ ""
+ ""
+ "")
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 268d683d3..a7a7c55e0 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
@@ -41,6 +41,8 @@ public class TaskQueryImpl implements TaskQuery {
"pro.taskana.task.internal.TaskQueryMapper.queryTaskSummaries";
private static final String LINK_TO_MAPPER_DB2 =
"pro.taskana.task.internal.TaskQueryMapper.queryTaskSummariesDb2";
+ private static final String LINK_TO_MAPPER_ORACLE =
+ "pro.taskana.task.internal.TaskQueryMapper.queryTaskSummariesOracle";
private static final String LINK_TO_COUNTER =
"pro.taskana.task.internal.TaskQueryMapper.countQueryTasks";
private static final String LINK_TO_COUNTER_DB2 =
@@ -2021,6 +2023,8 @@ public class TaskQueryImpl implements TaskQuery {
private String getLinkToMapperScript() {
if (DB.isDb2(getDatabaseId()) && !selectAndClaim) {
return LINK_TO_MAPPER_DB2;
+ } else if (selectAndClaim && DB.isOracle(getDatabaseId())) {
+ return LINK_TO_MAPPER_ORACLE;
} else {
return LINK_TO_MAPPER;
}
diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryMapper.java
index e40ffe479..6d17d4e0e 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskQueryMapper.java
@@ -131,6 +131,67 @@ public interface TaskQueryMapper {
@Result(property = "customInt8", column = "CUSTOM_INT_8")
List queryTaskSummariesDb2(TaskQueryImpl taskQuery);
+ @SelectProvider(type = TaskQuerySqlProvider.class, method = "queryTaskSummariesOracle")
+ @Result(property = "id", column = "ID")
+ @Result(property = "externalId", column = "EXTERNAL_ID")
+ @Result(property = "created", column = "CREATED")
+ @Result(property = "claimed", column = "CLAIMED")
+ @Result(property = "completed", column = "COMPLETED")
+ @Result(property = "modified", column = "MODIFIED")
+ @Result(property = "planned", column = "PLANNED")
+ @Result(property = "received", column = "RECEIVED")
+ @Result(property = "due", column = "DUE")
+ @Result(property = "name", column = "NAME")
+ @Result(property = "creator", column = "CREATOR")
+ @Result(property = "note", column = "NOTE")
+ @Result(property = "description", column = "DESCRIPTION")
+ @Result(property = "priority", column = "PRIORITY")
+ @Result(property = "manualPriority", column = "MANUAL_PRIORITY")
+ @Result(property = "state", column = "STATE")
+ @Result(property = "workbasketSummaryImpl.domain", column = "DOMAIN")
+ @Result(property = "workbasketSummaryImpl.key", column = "WORKBASKET_KEY")
+ @Result(property = "workbasketSummaryImpl.id", column = "WORKBASKET_ID")
+ @Result(property = "classificationSummaryImpl.key", column = "CLASSIFICATION_KEY")
+ @Result(property = "classificationSummaryImpl.id", column = "CLASSIFICATION_ID")
+ @Result(property = "classificationSummaryImpl.domain", column = "DOMAIN")
+ @Result(property = "classificationSummaryImpl.category", column = "CLASSIFICATION_CATEGORY")
+ @Result(property = "businessProcessId", column = "BUSINESS_PROCESS_ID")
+ @Result(property = "parentBusinessProcessId", column = "PARENT_BUSINESS_PROCESS_ID")
+ @Result(property = "owner", column = "OWNER")
+ @Result(property = "ownerLongName", column = "ULONG_NAME")
+ @Result(property = "primaryObjRefImpl.company", column = "POR_COMPANY")
+ @Result(property = "primaryObjRefImpl.system", column = "POR_SYSTEM")
+ @Result(property = "primaryObjRefImpl.systemInstance", column = "POR_INSTANCE")
+ @Result(property = "primaryObjRefImpl.type", column = "POR_TYPE")
+ @Result(property = "primaryObjRefImpl.value", column = "POR_VALUE")
+ @Result(property = "isRead", column = "IS_READ")
+ @Result(property = "isTransferred", column = "IS_TRANSFERRED")
+ @Result(property = "custom1", column = "CUSTOM_1")
+ @Result(property = "custom2", column = "CUSTOM_2")
+ @Result(property = "custom3", column = "CUSTOM_3")
+ @Result(property = "custom4", column = "CUSTOM_4")
+ @Result(property = "custom5", column = "CUSTOM_5")
+ @Result(property = "custom6", column = "CUSTOM_6")
+ @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 = "custom11", column = "CUSTOM_11")
+ @Result(property = "custom12", column = "CUSTOM_12")
+ @Result(property = "custom13", column = "CUSTOM_13")
+ @Result(property = "custom14", column = "CUSTOM_14")
+ @Result(property = "custom15", column = "CUSTOM_15")
+ @Result(property = "custom16", column = "CUSTOM_16")
+ @Result(property = "customInt1", column = "CUSTOM_INT_1")
+ @Result(property = "customInt2", column = "CUSTOM_INT_2")
+ @Result(property = "customInt3", column = "CUSTOM_INT_3")
+ @Result(property = "customInt4", column = "CUSTOM_INT_4")
+ @Result(property = "customInt5", column = "CUSTOM_INT_5")
+ @Result(property = "customInt6", column = "CUSTOM_INT_6")
+ @Result(property = "customInt7", column = "CUSTOM_INT_7")
+ @Result(property = "customInt8", column = "CUSTOM_INT_8")
+ List queryTaskSummariesOracle(TaskQueryImpl taskQuery);
+
@SelectProvider(type = TaskQuerySqlProvider.class, method = "countQueryTasks")
Long countQueryTasks(TaskQueryImpl taskQuery);
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 5bbec8dd1..067ab2025 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
@@ -36,22 +36,22 @@ public class TaskQuerySqlProvider {
+ ", u.LONG_NAME "
+ "FROM TASK t "
+ ""
- + "LEFT JOIN ATTACHMENT AS a ON t.ID = a.TASK_ID "
+ + "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN OBJECT_REFERENCE AS o ON t.ID = o.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS c ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
+ ""
+ ""
- + "LEFT JOIN WORKBASKET AS w ON t.WORKBASKET_ID = w.ID "
+ + "LEFT JOIN WORKBASKET w ON t.WORKBASKET_ID = w.ID "
+ ""
+ ""
- + "LEFT JOIN USER_INFO AS u ON t.owner = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ checkForAuthorization()
@@ -62,7 +62,7 @@ public class TaskQuerySqlProvider {
+ "ORDER BY ${item}"
+ " "
+ " "
- + "FETCH FIRST ROW ONLY FOR UPDATE "
+ + "FETCH FIRST ROW ONLY FOR UPDATE"
+ ""
+ "WITH RS USE AND KEEP UPDATE LOCKS "
+ CLOSING_SCRIPT_TAG;
@@ -91,16 +91,16 @@ public class TaskQuerySqlProvider {
+ "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS c ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
+ ""
+ ""
- + "LEFT JOIN WORKBASKET AS w ON t.WORKBASKET_ID = w.ID "
+ + "LEFT JOIN WORKBASKET w ON t.WORKBASKET_ID = w.ID "
+ ""
+ ""
- + "LEFT JOIN USER_INFO AS u ON t.owner = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ commonTaskWhereStatement()
@@ -139,25 +139,79 @@ public class TaskQuerySqlProvider {
+ CLOSING_SCRIPT_TAG;
}
+ /**
+ * you cant lock a view in oracle. the sql code `FETCH FIRST ROW ONLY` would create in oracle a
+ * view therefore we must first select a rowid based on where criteria then we select everything
+ * based on rowid and lock this rowid
+ *
+ * @return SELECT Statement for oracle claiming
+ */
+ @SuppressWarnings("unused")
+ public static String queryTaskSummariesOracle() {
+ return OPENING_SCRIPT_TAG
+ + "SELECT "
+ + commonSelectFieldsOracle()
+ + ""
+ + ", a2.CLASSIFICATION_ID, a2.CLASSIFICATION_KEY, a2.CHANNEL, a2.REF_VALUE, a2.RECEIVED"
+ + ""
+ + ", c2.NAME "
+ + ", ac2.NAME "
+ + ", w2.NAME "
+ + ", u2.LONG_NAME "
+ + "FROM TASK t2 "
+ + "LEFT JOIN ATTACHMENT a2 ON t2.ID = a2.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o2 "
+ + "ON t2.ID = o2.TASK_ID "
+ + "LEFT JOIN CLASSIFICATION c2 "
+ + "ON t2.CLASSIFICATION_ID = c2.ID "
+ + "LEFT JOIN CLASSIFICATION ac2 "
+ + "ON a2.CLASSIFICATION_ID = ac2.ID "
+ + "LEFT JOIN WORKBASKET w2 "
+ + "ON t2.WORKBASKET_ID = w2.ID "
+ + "LEFT JOIN USER_INFO u2 ON t2.owner = u2.USER_ID "
+ + "WHERE t2.rowid = (SELECT DISTINCT t.rowid "
+ + "FROM TASK t "
+ + "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o "
+ + "ON t.ID = o.TASK_ID "
+ + "LEFT JOIN CLASSIFICATION c "
+ + "ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION ac "
+ + "ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN WORKBASKET w "
+ + "ON t.WORKBASKET_ID = w.ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ + OPENING_WHERE_TAG
+ + commonTaskWhereStatement()
+ + " AND t.STATE = 'READY' "
+ + CLOSING_WHERE_TAG
+ + ""
+ + "ORDER BY ${item}"
+ + " "
+ + "fetch first 1 rows only "
+ + ") FOR UPDATE"
+ + CLOSING_SCRIPT_TAG;
+ }
+
@SuppressWarnings("unused")
public static String countQueryTasks() {
return OPENING_SCRIPT_TAG
+ "SELECT COUNT( DISTINCT t.ID) "
+ "FROM TASK t "
+ ""
- + "LEFT JOIN ATTACHMENT AS a ON t.ID = a.TASK_ID "
+ + "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN OBJECT_REFERENCE AS o ON t.ID = o.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS c ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
+ ""
+ ""
- + "LEFT JOIN USER_INFO AS u ON t.owner = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ checkForAuthorization()
@@ -173,19 +227,19 @@ public class TaskQuerySqlProvider {
+ "SELECT DISTINCT "
+ "t.ID, t.WORKBASKET_ID FROM TASK t "
+ ""
- + "LEFT JOIN ATTACHMENT AS a ON t.ID = a.TASK_ID "
+ + "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS c ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
+ ""
+ ""
- + "LEFT JOIN OBJECT_REFERENCE AS o ON t.ID = o.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN USER_INFO AS u ON t.owner = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ commonTaskWhereStatement()
@@ -215,19 +269,19 @@ public class TaskQuerySqlProvider {
+ ", u.LONG_NAME "
+ "FROM TASK t "
+ ""
- + "LEFT JOIN ATTACHMENT AS a ON t.ID = a.TASK_ID "
+ + "LEFT JOIN ATTACHMENT a ON t.ID = a.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS c ON t.CLASSIFICATION_ID = c.ID "
+ + "LEFT JOIN CLASSIFICATION c ON t.CLASSIFICATION_ID = c.ID "
+ ""
+ ""
- + "LEFT JOIN CLASSIFICATION AS ac ON a.CLASSIFICATION_ID = ac.ID "
+ + "LEFT JOIN CLASSIFICATION ac ON a.CLASSIFICATION_ID = ac.ID "
+ ""
+ ""
- + "LEFT JOIN OBJECT_REFERENCE AS o ON t.ID = o.TASK_ID "
+ + "LEFT JOIN OBJECT_REFERENCE o ON t.ID = o.TASK_ID "
+ ""
+ ""
- + "LEFT JOIN USER_INFO AS u ON t.owner = u.USER_ID "
+ + "LEFT JOIN USER_INFO u ON t.owner = u.USER_ID "
+ ""
+ OPENING_WHERE_TAG
+ checkForAuthorization()
@@ -282,6 +336,10 @@ public class TaskQuerySqlProvider {
.collect(Collectors.joining(", "));
}
+ private static String commonSelectFieldsOracle() {
+ return commonSelectFields().replace("t.id", "t2.id").replace(", t", ", t2");
+ }
+
private static String db2selectFields() {
// needs to be the same order as the commonSelectFields (TaskQueryColumnValue)
return "ID, EXTERNAL_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, RECEIVED, DUE, NAME, "
@@ -307,10 +365,17 @@ public class TaskQuerySqlProvider {
return " AND t.WORKBASKET_ID IN ("
+ "SELECT WID "
+ "FROM ("
+ + ""
+ + ""
+ + "SELECT WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ "
+ + ""
+ + ""
+ "SELECT WORKBASKET_ID as WID, MAX(PERM_READ::int) as MAX_READ "
- + "FROM WORKBASKET_ACCESS_LIST AS s where ACCESS_ID IN "
+ + ""
+ + ""
+ + "FROM WORKBASKET_ACCESS_LIST s where ACCESS_ID IN "
+ "(#{item}) "
- + "GROUP by WORKBASKET_ID) as f "
+ + "GROUP by WORKBASKET_ID) f "
+ "WHERE MAX_READ = 1) "
+ "";
}
diff --git a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskServiceImpl.java
index 47b0cfe0f..c2c0562a5 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskServiceImpl.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/task/internal/TaskServiceImpl.java
@@ -331,7 +331,10 @@ public class TaskServiceImpl implements TaskService {
// primary key violation: "UC_EXTERNAL_ID_INDEX_2 ON TASKANA.TASK(EXTERNAL_ID) ...
String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : null;
if (msg != null
- && (msg.contains("violation") || msg.contains("violates") || msg.contains("verletzt"))
+ && (msg.contains("violation")
+ || msg.contains("violates")
+ || msg.contains("violated")
+ || msg.contains("verletzt"))
&& msg.contains("external_id")) {
throw new TaskAlreadyExistException(task.getExternalId());
} else {
diff --git a/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapper.java b/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapper.java
index fe52feef9..4b628f496 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapper.java
@@ -54,6 +54,10 @@ public interface UserMapper {
@InsertProvider(type = UserMapperSqlProvider.class, method = "insert")
void insert(User user);
+ @InsertProvider(
+ type = UserMapperSqlProvider.class,
+ method = "insertGroupsOracle",
+ databaseId = "oracle")
@InsertProvider(type = UserMapperSqlProvider.class, method = "insertGroups")
void insertGroups(User user);
diff --git a/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapperSqlProvider.java b/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapperSqlProvider.java
index 9b5f374d5..94b03c0e4 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapperSqlProvider.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/user/internal/UserMapperSqlProvider.java
@@ -48,14 +48,23 @@ public class UserMapperSqlProvider {
public static String insertGroups() {
return OPENING_SCRIPT_TAG
- + "INSERT INTO GROUP_INFO "
- + "(USER_ID, GROUP_ID) VALUES "
+ + "INSERT INTO GROUP_INFO (USER_ID, GROUP_ID) VALUES "
+ ""
+ "#{id}, #{group}"
+ " "
+ CLOSING_SCRIPT_TAG;
}
+ public static String insertGroupsOracle() {
+ return OPENING_SCRIPT_TAG
+ + "INSERT ALL "
+ + ""
+ + "INTO GROUP_INFO (USER_ID, GROUP_ID) VALUES ( #{id}, #{group} )"
+ + " "
+ + "SELECT 1 FROM DUAL"
+ + CLOSING_SCRIPT_TAG;
+ }
+
public static String update() {
return "UPDATE USER_INFO "
+ "SET FIRST_NAME = #{firstName}, "
diff --git a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketAccessSqlProvider.java b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketAccessSqlProvider.java
index 91ce050e9..13c8910c0 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketAccessSqlProvider.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketAccessSqlProvider.java
@@ -56,8 +56,8 @@ public class WorkbasketAccessSqlProvider {
+ "SELECT "
+ "WBA.ID, WB.KEY, "
+ commonSelectStatements()
- + "FROM WORKBASKET_ACCESS_LIST AS WBA "
- + "LEFT JOIN WORKBASKET AS WB ON WORKBASKET_ID = WB.ID "
+ + "FROM WORKBASKET_ACCESS_LIST WBA "
+ + "LEFT JOIN WORKBASKET WB ON WORKBASKET_ID = WB.ID "
+ "WHERE WORKBASKET_ID = #{id} "
+ DB2_WITH_UR
+ CLOSING_SCRIPT_TAG;
@@ -68,8 +68,8 @@ public class WorkbasketAccessSqlProvider {
+ "SELECT "
+ "WBA.ID, WB.KEY, "
+ commonSelectStatements()
- + "FROM WORKBASKET_ACCESS_LIST AS WBA "
- + "LEFT JOIN WORKBASKET AS WB ON WORKBASKET_ID = WB.ID "
+ + "FROM WORKBASKET_ACCESS_LIST WBA "
+ + "LEFT JOIN WORKBASKET WB ON WORKBASKET_ID = WB.ID "
+ "WHERE ACCESS_ID = #{id} "
+ DB2_WITH_UR
+ CLOSING_SCRIPT_TAG;
@@ -104,7 +104,7 @@ public class WorkbasketAccessSqlProvider {
public static String findByWorkbasketAndAccessId() {
return OPENING_SCRIPT_TAG
+ ""
- + ""
+ + ""
+ "SELECT "
+ getMaximumPermissionStatement(false)
+ ""
@@ -123,7 +123,7 @@ public class WorkbasketAccessSqlProvider {
public static String findByWorkbasketKeyDomainAndAccessId() {
return OPENING_SCRIPT_TAG
+ ""
- + ""
+ + ""
+ "SELECT "
+ getMaximumPermissionStatement(false)
+ ""
@@ -156,12 +156,12 @@ public class WorkbasketAccessSqlProvider {
.collect(Collectors.joining(", ", "", " "));
}
- private static String getMaximumPermissionStatement(boolean isNotDb2) {
+ private static String getMaximumPermissionStatement(boolean isNotDb2AndNotOracle) {
return PERMISSIONS.stream()
.map(
perm -> {
String temp = "MAX(" + perm.getLeft();
- if (isNotDb2) {
+ if (isNotDb2AndNotOracle) {
temp += "::int";
}
temp += ") AS " + perm.getLeft();
diff --git a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketQueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketQueryMapper.java
index 1bbae8b58..18d69df55 100644
--- a/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketQueryMapper.java
+++ b/lib/taskana-core/src/main/java/pro/taskana/workbasket/internal/WorkbasketQueryMapper.java
@@ -18,7 +18,7 @@ public interface WorkbasketQueryMapper {
+ "w.ID, w.KEY, w.NAME, w.DOMAIN, W.TYPE, w.DESCRIPTION, w.OWNER, w.CUSTOM_1, w.CUSTOM_2, w.CUSTOM_3, w.CUSTOM_4, w.ORG_LEVEL_1, w.ORG_LEVEL_2, w.ORG_LEVEL_3, w.ORG_LEVEL_4, w.MARKED_FOR_DELETION from WORKBASKET w "
+ " "
+ ""
- + ""
+ + ""
+ "LEFT OUTER JOIN (select WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ, MAX(PERM_OPEN) as MAX_OPEN, "
+ "MAX(PERM_APPEND) as MAX_APPEND, MAX(PERM_TRANSFER) as MAX_TRANSFER, MAX(PERM_DISTRIBUTE) as MAX_DISTRIBUTE, MAX(PERM_CUSTOM_1) as MAX_CUSTOM_1, MAX(PERM_CUSTOM_2) as MAX_CUSTOM_2, "
+ "MAX(PERM_CUSTOM_3) as MAX_CUSTOM_3, MAX(PERM_CUSTOM_4) as MAX_CUSTOM_4, MAX(PERM_CUSTOM_5) as MAX_CUSTOM_5, MAX(PERM_CUSTOM_6) as MAX_CUSTOM_6, MAX(PERM_CUSTOM_7) as MAX_CUSTOM_7, "
@@ -121,7 +121,8 @@ public interface WorkbasketQueryMapper {
+ "SELECT "
+ "WBA.ID, WORKBASKET_ID, WB.KEY, ACCESS_ID, ACCESS_NAME, PERM_READ, PERM_OPEN, PERM_APPEND, PERM_TRANSFER, PERM_DISTRIBUTE, PERM_CUSTOM_1, PERM_CUSTOM_2, "
+ "PERM_CUSTOM_3, PERM_CUSTOM_4, PERM_CUSTOM_5, PERM_CUSTOM_6, PERM_CUSTOM_7, PERM_CUSTOM_8, PERM_CUSTOM_9, PERM_CUSTOM_10, PERM_CUSTOM_11, PERM_CUSTOM_12 "
- + "from WORKBASKET_ACCESS_LIST AS WBA LEFT JOIN WORKBASKET AS WB ON WORKBASKET_ID = WB.ID"
+ + "from WORKBASKET_ACCESS_LIST WBA "
+ + "LEFT JOIN WORKBASKET WB ON WORKBASKET_ID = WB.ID"
+ ""
+ "AND WBA.ID IN(#{item}) "
+ "AND WORKBASKET_ID IN(#{item}) "
@@ -162,7 +163,7 @@ public interface WorkbasketQueryMapper {
+ "SELECT COUNT(w.ID) from WORKBASKET w "
+ " "
+ ""
- + ""
+ + ""
+ "LEFT OUTER JOIN (select WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ, MAX(PERM_OPEN) as MAX_OPEN, "
+ "MAX(PERM_APPEND) as MAX_APPEND, MAX(PERM_TRANSFER) as MAX_TRANSFER, MAX(PERM_DISTRIBUTE) as MAX_DISTRIBUTE, MAX(PERM_CUSTOM_1) as MAX_CUSTOM_1, MAX(PERM_CUSTOM_2) as MAX_CUSTOM_2, "
+ "MAX(PERM_CUSTOM_3) as MAX_CUSTOM_3, MAX(PERM_CUSTOM_4) as MAX_CUSTOM_4, MAX(PERM_CUSTOM_5) as MAX_CUSTOM_5, MAX(PERM_CUSTOM_6) as MAX_CUSTOM_6, MAX(PERM_CUSTOM_7) as MAX_CUSTOM_7, "
@@ -258,7 +259,7 @@ public interface WorkbasketQueryMapper {
+ "FROM WORKBASKET w "
+ " "
+ ""
- + ""
+ + ""
+ "LEFT OUTER JOIN (select WORKBASKET_ID as WID, MAX(PERM_READ) as MAX_READ, MAX(PERM_OPEN) as MAX_OPEN, "
+ "MAX(PERM_APPEND) as MAX_APPEND, MAX(PERM_TRANSFER) as MAX_TRANSFER, MAX(PERM_DISTRIBUTE) as MAX_DISTRIBUTE, MAX(PERM_CUSTOM_1) as MAX_CUSTOM_1, MAX(PERM_CUSTOM_2) as MAX_CUSTOM_2, "
+ "MAX(PERM_CUSTOM_3) as MAX_CUSTOM_3, MAX(PERM_CUSTOM_4) as MAX_CUSTOM_4, MAX(PERM_CUSTOM_5) as MAX_CUSTOM_5, MAX(PERM_CUSTOM_6) as MAX_CUSTOM_6, MAX(PERM_CUSTOM_7) as MAX_CUSTOM_7, "
@@ -343,7 +344,8 @@ public interface WorkbasketQueryMapper {
@Select(
"