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())); + } } }
