Repository: syncope
Updated Branches:
  refs/heads/master d701a03fb -> ec7612419


implements paged searchs to retrieve members of dynamic group in order to avoid 
trobles with memory usage


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/ec761241
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/ec761241
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/ec761241

Branch: refs/heads/master
Commit: ec7612419c3ed3f2bd582c67fd5cb5e617fd898f
Parents: d701a03
Author: fmartelli <[email protected]>
Authored: Tue Dec 19 16:43:51 2017 +0100
Committer: fmartelli <[email protected]>
Committed: Tue Dec 19 16:43:51 2017 +0100

----------------------------------------------------------------------
 .../core/persistence/api/dao/AnyDAO.java        |  2 +-
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 75 ++++++++++++--------
 2 files changed, 46 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/ec761241/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AnyDAO.java
----------------------------------------------------------------------
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 d0bd1e0..658a32b 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
@@ -29,7 +29,7 @@ import org.apache.syncope.core.persistence.api.entity.Schema;
 
 public interface AnyDAO<A extends Any<?>> extends DAO<A> {
 
-    int DEFAULT_PAGE_SIZE = 10;
+    int DEFAULT_PAGE_SIZE = 500;
 
     String findKey(String name);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/ec761241/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
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 9778307..f0ca2da 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
@@ -39,6 +39,7 @@ import 
org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -47,6 +48,7 @@ import 
org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
 import org.apache.syncope.core.persistence.api.dao.search.AssignableCond;
+import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
@@ -285,37 +287,50 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> 
implements GroupDAO {
 
         // refresh dynamic memberships
         if (merged.getUDynMembership() != null) {
-            List<User> matching = searchDAO().search(
-                    
buildDynMembershipCond(merged.getUDynMembership().getFIQLCond(), 
merged.getRealm()),
-                    AnyTypeKind.USER);
-
-            clearUDynMembers(merged);
-
-            matching.forEach(user -> {
-                Query insert = entityManager().createNativeQuery("INSERT INTO 
" + UDYNMEMB_TABLE + " VALUES(?, ?)");
-                insert.setParameter(1, user.getKey());
-                insert.setParameter(2, merged.getKey());
-                insert.executeUpdate();
-
-                publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, 
user, AuthContextUtils.getDomain()));
-            });
+            for (int page = 1; page <= (countUDynMembers(group) / 
AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+                List<User> matching = searchDAO().search(
+                        
Collections.<String>singleton(merged.getRealm().getFullPath()),
+                        
buildDynMembershipCond(merged.getUDynMembership().getFIQLCond(), 
merged.getRealm()),
+                        page,
+                        AnyDAO.DEFAULT_PAGE_SIZE,
+                        Collections.<OrderByClause>emptyList(),
+                        AnyTypeKind.USER);
+
+                clearUDynMembers(merged);
+
+                matching.forEach(user -> {
+                    Query insert = entityManager().createNativeQuery("INSERT 
INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
+                    insert.setParameter(1, user.getKey());
+                    insert.setParameter(2, merged.getKey());
+                    insert.executeUpdate();
+
+                    publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, 
user, AuthContextUtils.getDomain()));
+                });
+            }
         }
-        merged.getADynMemberships().stream().map(memb -> searchDAO().search(
-                buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm()),
-                AnyTypeKind.ANY_OBJECT)).forEachOrdered(matching -> {
-            clearADynMembers(merged);
-
-            matching.forEach(anyObject -> {
-                Query insert = entityManager().createNativeQuery("INSERT INTO 
" + ADYNMEMB_TABLE
-                        + " VALUES(?, ?, ?)");
-                insert.setParameter(1, anyObject.getType().getKey());
-                insert.setParameter(2, anyObject.getKey());
-                insert.setParameter(3, merged.getKey());
-                insert.executeUpdate();
-
-                publisher.publishEvent(
-                        new AnyCreatedUpdatedEvent<>(this, anyObject, 
AuthContextUtils.getDomain()));
-            });
+        merged.getADynMemberships().stream().forEach(memb -> {
+            for (int page = 1; page <= (countUDynMembers(group) / 
AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
+                List<AnyObject> matching = searchDAO().search(
+                        
Collections.<String>singleton(merged.getRealm().getFullPath()),
+                        buildDynMembershipCond(memb.getFIQLCond(), 
merged.getRealm()),
+                        page,
+                        AnyDAO.DEFAULT_PAGE_SIZE,
+                        Collections.<OrderByClause>emptyList(),
+                        AnyTypeKind.ANY_OBJECT);
+
+                clearADynMembers(merged);
+
+                matching.forEach(anyObject -> {
+                    Query insert = entityManager().createNativeQuery(
+                            "INSERT INTO " + ADYNMEMB_TABLE + " VALUES(?, ?, 
?)");
+                    insert.setParameter(1, anyObject.getType().getKey());
+                    insert.setParameter(2, anyObject.getKey());
+                    insert.setParameter(3, merged.getKey());
+                    insert.executeUpdate();
+
+                    publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, 
anyObject, AuthContextUtils.getDomain()));
+                });
+            }
         });
 
         dynRealmDAO().refreshDynMemberships(merged);

Reply via email to