Repository: syncope
Updated Branches:
  refs/heads/2_0_X 708c83161 -> 845f25146


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/845f2514
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/845f2514
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/845f2514

Branch: refs/heads/2_0_X
Commit: 845f251462aedc74df6b663070e22b0007436b77
Parents: 708c831
Author: fmartelli <[email protected]>
Authored: Tue Dec 19 15:37:32 2017 +0100
Committer: fmartelli <[email protected]>
Committed: Tue Dec 19 15:37:32 2017 +0100

----------------------------------------------------------------------
 .../core/persistence/api/dao/AnyDAO.java        |  2 +-
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 69 ++++++++++++--------
 2 files changed, 43 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/845f2514/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/845f2514/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 898a4ae..03c1219 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
@@ -43,6 +43,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;
@@ -51,6 +52,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;
@@ -296,36 +298,49 @@ 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);
-
-            for (User user : matching) {
-                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);
+
+                for (User user : matching) {
+                    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 (ADynGroupMembership memb : merged.getADynMemberships()) {
-            List<AnyObject> matching = searchDAO().search(
-                    buildDynMembershipCond(memb.getFIQLCond(), 
merged.getRealm()),
-                    AnyTypeKind.ANY_OBJECT);
-
-            clearADynMembers(merged);
-
-            for (AnyObject anyObject : matching) {
-                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()));
+            for (int page = 1; page <= (countADynMembers(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);
+
+                for (AnyObject anyObject : matching) {
+                    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()));
+                }
             }
         }
 

Reply via email to