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);
