diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java index 58ccb59e100cd08db65b517a6b53d6cf951e1906..2826474c3c99eb9ea75de382ec62dae5a69383b6 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java @@ -886,7 +886,7 @@ public class BusinessGroupDAO { } loadOfferAccess(resourceKeyToGroup); - loadRelations(keyToGroup, null, null); + loadRelations(keyToGroup, params, identity); return groups; } @@ -930,7 +930,7 @@ public class BusinessGroupDAO { } } - loadRelations(keyToGroup, null, null); + loadRelations(keyToGroup, params, identity); loadOfferAccess(resourceKeyToGroup); loadMemberships(identity, keyToGroup); return groups; @@ -1129,15 +1129,15 @@ public class BusinessGroupDAO { if(params.getResources() != null && params.getResources().booleanValue()) { sb.append(" exists (select resourceRel.key from repoentrytogroup as resourceRel where bgi.baseGroup.key=resourceRel.group.key )"); } else { - sb.append(" bgi.baseGroup.key not in (select resourceRel.group.key from repoentrytogroup as resourceRel)"); + sb.append(" not exists (select resourceRel.key from repoentrytogroup as resourceRel where resourceRel.group.key=bGroup.key)"); } } // orphans if(params.isHeadless()) { where = PersistenceHelper.appendAnd(sb, where); - sb.append(" bgi.baseGroup.key not in (select headMembership.group.key from bgroupmember as headMembership") - .append(" where headMembership.role in ('").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("')") + sb.append(" not exists (select headMembership.key from bgroupmember as headMembership") + .append(" where bGroup.key=headMembership.group.key and headMembership.role in ('").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("')") .append(" )"); } } @@ -1164,6 +1164,8 @@ public class BusinessGroupDAO { private void loadRelations(Map<Long, ? extends BusinessGroupRow> keyToGroup, BusinessGroupQueryParams params, IdentityRef identity) { if(keyToGroup.isEmpty()) return; + if(params.getResources() != null && !params.getResources().booleanValue()) return;//no resources, no relations + if(params.isHeadless()) return; //headless don't have relations final int RELATIONS_IN_LIMIT = 64; final boolean restrictToMembership = params != null && identity != null @@ -1180,18 +1182,33 @@ public class BusinessGroupDAO { .append(" inner join bGroup.members as membership on membership.identity.key=:identityKey"); } else if(keyToGroup.size() < RELATIONS_IN_LIMIT) { sr.append(" where bgi.key in (:businessGroupKeys)"); + } else if(params.getPublicGroups() != null && params.getPublicGroups().booleanValue()) { + sr.append(" inner join acoffer as offer on (bgi.resource.key = offer.resource.key)"); + } else if(params.getRepositoryEntry() != null) { + sr.append(" inner join repoentrytobusinessgroup as refBgiToGroup") + .append(" on (refBgiToGroup.entry.key=:repositoryEntryKey and bgi.baseGroup.key=refBgiToGroup.businessGroup.key)"); + } else { + sr.append(" inner join bgi.resource as bgResource ") + .append(" inner join bgi.baseGroup as bGroup "); + filterBusinessGroupToSearch(sr, params, false); } TypedQuery<Object[]> resourcesQuery = dbInstance.getCurrentEntityManager() .createQuery(sr.toString(), Object[].class); if(restrictToMembership) { resourcesQuery.setParameter("identityKey", identity.getKey()); - } else if(keyToGroup.size() < RELATIONS_IN_LIMIT) { + } else if(keyToGroup.size() < RELATIONS_IN_LIMIT) { List<Long> businessGroupKeys = new ArrayList<>(keyToGroup.size()); for(Long businessGroupKey:keyToGroup.keySet()) { businessGroupKeys.add(businessGroupKey); } resourcesQuery.setParameter("businessGroupKeys", businessGroupKeys); + } else if(params.getPublicGroups() != null && params.getPublicGroups().booleanValue()) { + //no parameters to add + } else if(params.getRepositoryEntry() != null) { + resourcesQuery.setParameter("repositoryEntryKey", params.getRepositoryEntry().getKey()); + } else { + filterBusinessGroupToSearchParameters(resourcesQuery, params, identity, false); } List<Object[]> resources = resourcesQuery.getResultList();