You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/09/04 12:35:23 UTC

[syncope] branch 2_0_X updated: [SYNCOPE-1485] Reduce temporary result cache

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

ilgrosso pushed a commit to branch 2_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_0_X by this push:
     new 21d4e85  [SYNCOPE-1485] Reduce temporary result cache
21d4e85 is described below

commit 21d4e85697ae25dc801ef1055e9dd79f1dd446d4
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Sep 4 14:05:57 2019 +0200

    [SYNCOPE-1485] Reduce temporary result cache
---
 .../syncope/core/persistence/api/dao/AnyDAO.java    |  9 +++++++++
 .../core/persistence/jpa/dao/AbstractAnyDAO.java    | 17 +++++++++++++++++
 .../core/persistence/jpa/dao/JPAAnyObjectDAO.java   |  5 +++++
 .../core/persistence/jpa/dao/JPAGroupDAO.java       |  5 +++++
 .../core/persistence/jpa/dao/JPAUserDAO.java        |  5 +++++
 .../core/persistence/jpa/inner/AnyObjectTest.java   | 13 +++++++++++++
 .../core/persistence/jpa/inner/GroupTest.java       |  9 +++++++--
 .../core/persistence/jpa/inner/UserTest.java        |  9 +++++++--
 .../provisioning/java/job/ElasticsearchReindex.java | 21 +++++++++------------
 9 files changed, 77 insertions(+), 16 deletions(-)

diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
index 41e81a9..b0c1d55 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
@@ -80,6 +80,15 @@ public interface AnyDAO<A extends Any<?>> extends DAO<A> {
      */
     List<A> findAll(int page, int itemsPerPage);
 
+    /**
+     * Find any objects' keys without any limitation, according to given page and items per page.
+     *
+     * @param page search result page
+     * @param itemsPerPage items per search result page
+     * @return any objects' keys matching the provided conditions
+     */
+    List<String> findAllKeys(int page, int itemsPerPage);
+
     <S extends Schema> AllowedSchemas<S> findAllowedSchemas(A any, Class<S> reference);
 
     A save(A any);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index a509d05..e3ab5e7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -125,6 +125,23 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         return key;
     }
 
+    protected List<String> findAllKeys(final String table, final int page, final int itemsPerPage) {
+        Query query = entityManager().createNativeQuery(
+                "SELECT id FROM " + table + " ORDER BY id", String.class);
+        query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
+        query.setMaxResults(itemsPerPage);
+
+        List<String> result = new ArrayList<>();
+        for (Object key : query.getResultList()) {
+            String actualKey = key instanceof Object[]
+                    ? (String) ((Object[]) key)[0]
+                    : ((String) key);
+
+            result.add(actualKey.toString());
+        }
+        return result;
+    }
+
     protected Date findLastChange(final String key, final String table) {
         Query query = entityManager().createNativeQuery(
                 "SELECT creationDate, lastChangeDate FROM " + table + " WHERE id=?");
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index b95dae5..d8c549b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -218,6 +218,11 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
         return query.getResultList();
     }
 
+    @Override
+    public List<String> findAllKeys(final int page, final int itemsPerPage) {
+        return findAllKeys(JPAAnyObject.TABLE, page, itemsPerPage);
+    }
+
     private Pair<AnyObject, Pair<Set<String>, Set<String>>> doSave(final AnyObject anyObject) {
         AnyObject merged = super.save(anyObject);
         publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged, AuthContextUtils.getDomain()));
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index ae02ed2..0a0ebbd 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -269,6 +269,11 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         return query.getResultList();
     }
 
+    @Override
+    public List<String> findAllKeys(final int page, final int itemsPerPage) {
+        return findAllKeys(JPAGroup.TABLE, page, itemsPerPage);
+    }
+
     private SearchCond buildDynMembershipCond(final String baseCondFIQL, final Realm groupRealm) {
         AssignableCond cond = new AssignableCond();
         cond.setRealmFullPath(groupRealm.getFullPath());
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
index d664e78..6282297 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
@@ -282,6 +282,11 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
         return query.getResultList();
     }
 
+    @Override
+    public List<String> findAllKeys(final int page, final int itemsPerPage) {
+        return findAllKeys(JPAUser.TABLE, page, itemsPerPage);
+    }
+
     private List<AccountPolicy> getAccountPolicies(final User user) {
         List<AccountPolicy> policies = new ArrayList<>();
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
index 18172c5..e9787ee 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyObjectTest.java
@@ -18,10 +18,12 @@
  */
 package org.apache.syncope.core.persistence.jpa.inner;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
+import java.util.List;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -53,6 +55,17 @@ public class AnyObjectTest extends AbstractTest {
     }
 
     @Test
+    public void findAll() {
+        List<AnyObject> anyObjects = anyObjectDAO.findAll(1, 100);
+        assertNotNull(anyObjects);
+
+        List<String> anyObjectKeys = anyObjectDAO.findAllKeys(1, 100);
+        assertNotNull(anyObjectKeys);
+
+        assertEquals(anyObjects.size(), anyObjectKeys.size());
+    }
+
+    @Test
     public void save() {
         AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
         anyObject.setName("a name");
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
index c3ef956..7ffa140 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
@@ -47,8 +47,13 @@ public class GroupTest extends AbstractTest {
 
     @Test
     public void findAll() {
-        List<Group> list = groupDAO.findAll(1, 100);
-        assertEquals("did not get expected number of groups ", 16, list.size());
+        List<Group> groups = groupDAO.findAll(1, 100);
+        assertEquals("did not get expected number of groups ", 16, groups.size());
+
+        List<String> groupKeys = groupDAO.findAllKeys(1, 100);
+        assertNotNull(groupKeys);
+
+        assertEquals(groups.size(), groupKeys.size());
     }
 
     @Test
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
index d46f270..4beec57 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/UserTest.java
@@ -65,8 +65,13 @@ public class UserTest extends AbstractTest {
 
     @Test
     public void findAll() {
-        List<User> list = userDAO.findAll(1, 100);
-        assertEquals("did not get expected number of users", 5, list.size());
+        List<User> users = userDAO.findAll(1, 100);
+        assertEquals("did not get expected number of users", 5, users.size());
+
+        List<String> userKeys = userDAO.findAllKeys(1, 100);
+        assertNotNull(userKeys);
+
+        assertEquals(users.size(), userKeys.size());
     }
 
     @Test
diff --git a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
index d098a99..bc03bd4 100644
--- a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
+++ b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
@@ -23,10 +23,7 @@ import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
-import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.ext.elasticsearch.client.ElasticsearchUtils;
 import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
@@ -120,36 +117,36 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate {
 
                 LOG.debug("Indexing users...");
                 for (int page = 1; page <= (userDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                    for (User user : userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
+                    for (String user : userDAO.findAllKeys(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
                         IndexResponse response = client.prepareIndex(
                                 AuthContextUtils.getDomain().toLowerCase(),
                                 AnyTypeKind.USER.name(),
-                                user.getKey()).
-                                setSource(elasticsearchUtils.builder(user)).
+                                user).
+                                setSource(elasticsearchUtils.builder(userDAO.find(user))).
                                 get();
                         LOG.debug("Index successfully created for {}: {}", user, response);
                     }
                 }
                 LOG.debug("Indexing groups...");
                 for (int page = 1; page <= (groupDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                    for (Group group : groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
+                    for (String group : groupDAO.findAllKeys(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
                         IndexResponse response = client.prepareIndex(
                                 AuthContextUtils.getDomain().toLowerCase(),
                                 AnyTypeKind.GROUP.name(),
-                                group.getKey()).
-                                setSource(elasticsearchUtils.builder(group)).
+                                group).
+                                setSource(elasticsearchUtils.builder(groupDAO.find(group))).
                                 get();
                         LOG.debug("Index successfully created for {}: {}", group, response);
                     }
                 }
                 LOG.debug("Indexing any objects...");
                 for (int page = 1; page <= (anyObjectDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                    for (AnyObject anyObject : anyObjectDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
+                    for (String anyObject : anyObjectDAO.findAllKeys(page, AnyDAO.DEFAULT_PAGE_SIZE)) {
                         IndexResponse response = client.prepareIndex(
                                 AuthContextUtils.getDomain().toLowerCase(),
                                 AnyTypeKind.ANY_OBJECT.name(),
-                                anyObject.getKey()).
-                                setSource(elasticsearchUtils.builder(anyObject)).
+                                anyObject).
+                                setSource(elasticsearchUtils.builder(anyObjectDAO.find(anyObject))).
                                 get();
                         LOG.debug("Index successfully created for {}: {}", anyObject, response);
                     }