You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2019/01/08 15:55:02 UTC

[syncope] branch master updated: [SYNCOPE-1424] changes the way to build the task search query and fixes some test weeknesses

This is an automated email from the ASF dual-hosted git repository.

fmartelli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new f07a31c  [SYNCOPE-1424] changes the way to build the task search query and fixes some test weeknesses
f07a31c is described below

commit f07a31cdba32df0ced32e9583d6a1c4237ebb57e
Author: fmartelli <fa...@gmail.com>
AuthorDate: Tue Jan 8 15:57:57 2019 +0100

    [SYNCOPE-1424] changes the way to build the task search query and fixes some test weeknesses
---
 .../core/persistence/jpa/dao/JPATaskDAO.java       | 92 +++++++++++-----------
 .../resources/mariadb/domains/Master.properties    |  2 +-
 .../main/resources/mysql/domains/Master.properties |  2 +-
 .../syncope/fit/core/PropagationTaskITCase.java    |  6 +-
 .../apache/syncope/fit/core/PullTaskITCase.java    |  3 +-
 5 files changed, 54 insertions(+), 51 deletions(-)

diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
index 9e71908..3e8f80e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
@@ -231,22 +231,28 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
             throw new IllegalArgumentException(type + " is not related to notifications");
         }
 
-        StringBuilder queryString = new StringBuilder("SELECT ").
-                append(AbstractTask.TABLE).
-                append(".id FROM ").
-                append(AbstractTask.TABLE);
+        StringBuilder queryString = new StringBuilder("SELECT ").append(AbstractTask.TABLE).append(".*");
+
         if (orderByTaskExecInfo) {
-            queryString.append(" LEFT OUTER JOIN ").
-                    append(JPATaskExec.TABLE).
-                    append(" ON ").
-                    append(AbstractTask.TABLE).
-                    append(".id = ").
-                    append(JPATaskExec.TABLE).
-                    append(".task_id");
+            queryString.append(",").append(JPATaskExec.TABLE).append(".startDate AS startDate").
+                    append(",").append(JPATaskExec.TABLE).append(".endDate AS endDate").
+                    append(",").append(JPATaskExec.TABLE).append(".status AS status").
+                    append(" FROM ").append(AbstractTask.TABLE).
+                    append(",").append(JPATaskExec.TABLE).append(",").append("(SELECT ").
+                    append(JPATaskExec.TABLE).append(".task_id, ").
+                    append("MAX(").append(JPATaskExec.TABLE).append(".startDate) AS startDate").
+                    append(" FROM ").append(JPATaskExec.TABLE).
+                    append(" GROUP BY ").append(JPATaskExec.TABLE).append(".task_id) GRP").
+                    append(" WHERE ").
+                    append(AbstractTask.TABLE).append(".id=").append(JPATaskExec.TABLE).append(".task_id").
+                    append(" AND ").append(AbstractTask.TABLE).append(".id=").append("GRP.task_id").
+                    append(" AND ").append(JPATaskExec.TABLE).append(".startDate=").append("GRP.startDate").
+                    append(" AND ").append(AbstractTask.TABLE).append(".DTYPE = ?1");
+        } else {
+            queryString.append(", null AS startDate, null AS endDate, null AS status FROM ").append(AbstractTask.TABLE).
+                    append(" WHERE ").append(AbstractTask.TABLE).append(".DTYPE = ?1");
         }
-        queryString.append(" WHERE ").
-                append(AbstractTask.TABLE).
-                append(".DTYPE = ?1");
+
         queryParameters.add(getEntityTableName(type));
         if (type == TaskType.SCHEDULED) {
             queryString.append(" AND ").
@@ -294,34 +300,15 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
         return queryString;
     }
 
-    private String toOrderByStatement(
-            final Class<? extends Task> beanClass,
-            final List<OrderByClause> orderByClauses,
-            final boolean orderByTaskExecInfo) {
+    private String toOrderByStatement(final Class<? extends Task> beanClass, final List<OrderByClause> orderByClauses) {
 
         StringBuilder statement = new StringBuilder();
 
-        if (orderByTaskExecInfo) {
-            statement.append(" AND (").
-                    append(JPATaskExec.TABLE).
-                    append(".startDate IS NULL OR ").
-                    append(JPATaskExec.TABLE).
-                    append(".startDate = (SELECT MAX(").
-                    append(JPATaskExec.TABLE).
-                    append(".startDate) FROM ").
-                    append(JPATaskExec.TABLE).
-                    append(" WHERE ").
-                    append(AbstractTask.TABLE).
-                    append(".id = ").
-                    append(JPATaskExec.TABLE).
-                    append(".task_id))");
-        }
         statement.append(" ORDER BY ");
 
         StringBuilder subStatement = new StringBuilder();
         orderByClauses.forEach(clause -> {
             String field = clause.getField().trim();
-            String table = JPATaskExec.TABLE;
             switch (field) {
                 case "latestExecStatus":
                     field = "status";
@@ -342,19 +329,13 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
                             || beanField.getAnnotation(OneToMany.class) != null)) {
                         field += "_id";
                     }
-                    table = AbstractTask.TABLE;
             }
-            subStatement.append(table).
-                    append(".").
-                    append(field).
-                    append(' ').
-                    append(clause.getDirection().name()).
-                    append(',');
+
+            subStatement.append(field).append(' ').append(clause.getDirection().name()).append(',');
         });
 
         if (subStatement.length() == 0) {
-            statement.append(AbstractTask.TABLE).
-                    append(".id DESC");
+            statement.append("id DESC");
         } else {
             subStatement.deleteCharAt(subStatement.length() - 1);
             statement.append(subStatement);
@@ -390,8 +371,27 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
                 anyTypeKind,
                 entityKey,
                 orderByTaskExecInfo,
-                queryParameters).
-                append(toOrderByStatement(getEntityReference(type), orderByClauses, orderByTaskExecInfo));
+                queryParameters);
+
+        if (orderByTaskExecInfo) {
+            // UNION with tasks without executions...
+            queryString.insert(0, "SELECT T.id FROM ((").append(") UNION ALL (").
+                    append(buildFindAllQuery(
+                            type,
+                            resource,
+                            notification,
+                            anyTypeKind,
+                            entityKey,
+                            false,
+                            queryParameters)).
+                    append(" AND id NOT IN ").
+                    append("(SELECT task_id AS id FROM ").append(JPATaskExec.TABLE).append(")").
+                    append(")) T");
+        } else {
+            queryString.insert(0, "SELECT T.id FROM (").append(") T");
+        }
+
+        queryString.append(toOrderByStatement(getEntityReference(type), orderByClauses));
 
         Query query = entityManager().createNativeQuery(queryString.toString());
 
@@ -423,7 +423,7 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
 
         Query query = entityManager().createNativeQuery(StringUtils.replaceOnce(
                 queryString.toString(),
-                "SELECT " + AbstractTask.TABLE + ".id",
+                "SELECT " + AbstractTask.TABLE + ".*, null AS startDate, null AS endDate, null AS status",
                 "SELECT COUNT(" + AbstractTask.TABLE + ".id)"));
 
         for (int i = 1; i <= queryParameters.size(); i++) {
diff --git a/fit/core-reference/src/main/resources/mariadb/domains/Master.properties b/fit/core-reference/src/main/resources/mariadb/domains/Master.properties
index 5d3e2d3..c0dd90a 100644
--- a/fit/core-reference/src/main/resources/mariadb/domains/Master.properties
+++ b/fit/core-reference/src/main/resources/mariadb/domains/Master.properties
@@ -19,7 +19,7 @@ Master.url=jdbc:mariadb://localhost:3306/syncope?characterEncoding=UTF-8
 Master.schema=
 Master.username=syncope
 Master.password=syncope
-Master.databasePlatform=org.apache.openjpa.jdbc.sql.MariaDBDictionary(blobTypeName=LONGBLOB)
+Master.databasePlatform=org.apache.openjpa.jdbc.sql.MariaDBDictionary(blobTypeName=LONGBLOB,timestampTypeName=DATETIME(3))
 Master.orm=META-INF/spring-orm.xml
 
 Master.pool.maxActive=10
diff --git a/fit/core-reference/src/main/resources/mysql/domains/Master.properties b/fit/core-reference/src/main/resources/mysql/domains/Master.properties
index ce09eec..a4abb99 100644
--- a/fit/core-reference/src/main/resources/mysql/domains/Master.properties
+++ b/fit/core-reference/src/main/resources/mysql/domains/Master.properties
@@ -19,7 +19,7 @@ Master.url=jdbc:mysql://localhost:3306/syncope?characterEncoding=UTF-8&relaxAuto
 Master.schema=
 Master.username=syncope
 Master.password=syncope
-Master.databasePlatform=org.apache.openjpa.jdbc.sql.MySQLDictionary(blobTypeName=LONGBLOB)
+Master.databasePlatform=org.apache.openjpa.jdbc.sql.MySQLDictionary(blobTypeName=LONGBLOB,timestampTypeName=DATETIME(3))
 Master.orm=META-INF/spring-orm.xml
 
 Master.pool.maxActive=10
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
index 82ee31b..abadc0b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
@@ -215,13 +215,15 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
 
         // check list
         PagedResult<TaskTO> tasks = taskService.search(
-                new TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(2).details(false).build());
+                new TaskQuery.Builder(TaskType.PROPAGATION).
+                        page(1).size(2).orderBy("operation DESC").details(false).build());
         for (TaskTO item : tasks.getResult()) {
             assertTrue(item.getExecutions().isEmpty());
         }
 
         tasks = taskService.search(
-                new TaskQuery.Builder(TaskType.PROPAGATION).page(1).size(2).details(true).build());
+                new TaskQuery.Builder(TaskType.PROPAGATION).
+                        page(1).size(2).orderBy("operation DESC").details(true).build());
         for (TaskTO item : tasks.getResult()) {
             assertFalse(item.getExecutions().isEmpty());
         }
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 692971f..5275206 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -92,6 +92,7 @@ import org.apache.syncope.common.rest.api.beans.RemediationQuery;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
 import org.apache.syncope.common.rest.api.service.ConnectorService;
 import org.apache.syncope.common.rest.api.service.TaskService;
+import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;
 import org.apache.syncope.core.provisioning.java.pushpull.DBPasswordPullActions;
 import org.apache.syncope.core.provisioning.java.pushpull.LDAPPasswordPullActions;
 import org.apache.syncope.core.spring.security.Encryptor;
@@ -874,7 +875,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // 1. populate the external table
         jdbcTemplate.execute("INSERT INTO testpull VALUES"
-                + "('" + id + "', 'issuesyncope230', 'Surname', false, 'syncope230@syncope.apache.org', NULL)");
+                + "('" + id + "', 'issuesyncope230', 'Surname230', false, 'syncope230@syncope.apache.org', NULL)");
 
         // 2. execute PullTask for resource-db-pull (table TESTPULL on external H2)
         execProvisioningTask(taskService, TaskType.PULL, "7c2242f4-14af-4ab5-af31-cdae23783655", 50, false);