Here is the Code below You have to call GetRoleVsUSerMap Method it will return all Users Id under each Group id existing in your Org.
public class AllPublicGroupQuery {
public static Set<Id> grpids = new Set<Id>();
public static Set<Id> Roleids = new Set<Id>();
public static Map<String,Set<String>> finalmap = new Map<String,Set<String>>();
Public static Map<String,Set<String>> mapParentToChild = new Map<String,Set<String>>();
public static Map<String,Set<String>> grpidTomemberid = new Map<String,Set<String>>();
public static Map<String,Set<String>> MapgrpToRole = new Map<String,Set<String>>();
public static Map<String,Set<String>> MapgrpToRoleSub = new Map<String,Set<String>>();
public static Map<String,Set<String>> MapgrpToUser = new Map<String,Set<String>>();
public static Map<String,Set<String>> GetRoleVsUSerMap(){
Map<String,String> mapGrpRelatedids = new Map<String,String>();
Map<Id,string> mapgrpType = new Map<Id,String>();
Set<Id> userOrGrpids = new Set<Id>();
Set<String> grpparentids = new Set<String>();
for(GroupMember gpmem : [SELECT GroupId,Id,UserOrGroupId FROM GroupMember]){
if(gpmem.UserOrGroupId != null)
userOrGrpids.add(gpmem.UserOrGroupId);
}
for(Group gp:[SELECT Id,Type,RelatedId FROM Group where Id In:userOrGrpids ]){
grpids.add(gp.Id);
if(gp.Type != NULL)
mapgrpType.put(gp.Id,gp.type);
if(gp.RelatedId != NULL && (gp.Type == 'Role' || gp.Type == 'RoleAndSubordinates'))
mapGrpRelatedids.put(gp.Id, gp.RelatedId);
}
for(GroupMember grpmem : [SELECT GroupId,UserOrGroupId FROM GroupMember ORDER BY GroupId DESC NULLS LAST]){
if(grpidTomemberid.get(grpmem.GroupId) == NULL){
Set<String> ids = new Set<String>();
ids.add(grpmem.UserOrGroupId);
grpidTomemberid.put(grpmem.GroupId,ids);
}
else{
grpidTomemberid.get(grpmem.GroupId).add(grpmem.UserOrGroupId);
}
}
for(String mapkey : grpidTomemberid.keySet()){
for(String keyval : grpidTomemberid.get(mapkey)){
if(mapgrpType.get(keyval) == 'Role'){
if(MapgrpToRole.get(mapkey) == NULL){
Set<String> ids = new Set<String>();
ids.add(mapGrpRelatedids.get(keyval));
MapgrpToRole.put(mapkey,ids);
}
else{
MapgrpToRole.get(mapkey).add(mapGrpRelatedids.get(keyval));
}
}
else if(mapgrpType.get(keyval) == 'RoleAndSubordinates'){
if(MapgrpToRoleSub.get(mapkey) == NULL){
Set<String> ids = new Set<String>();
ids.add(mapGrpRelatedids.get(keyval));
MapgrpToRoleSub.put(mapkey,ids);
}
else{
MapgrpToRoleSub.get(mapkey).add(mapGrpRelatedids.get(keyval));
}
}
else if(mapgrpType.get(keyval) == 'Regular'){
if(mapParentToChild.get(mapkey) == NULL){
Set<String> ids = new Set<String>();
ids.add(keyval);
mapParentToChild.put(mapkey,ids);
}
else{
mapParentToChild.get(mapkey).add(keyval);
}
}
else{
if(MapgrpToUser.get(mapkey) == NULL){
Set<String> ids = new Set<String>();
ids.add(keyval);
MapgrpToUser.put(mapkey,ids);
}
else{
MapgrpToUser.get(mapkey).add(keyval);
}
}
}
}
/***************Here we iterate Group under group ***********************/
if(mapParentToChild != NULL && mapParentToChild.keySet().size()>0 ){
for(String parentid : mapParentToChild.keySet()){
for(String childid : mapParentToChild.get(parentid)){
if( MapgrpToRoleSub.get(childid).size()>0 && MapgrpToRole.get(childid) !=NULL){
if(MapgrpToRole.get(parentid) == NULL){
Set<String> ids = new Set<String>();
ids.addAll(MapgrpToRole.get(childid));
MapgrpToRole.put(parentid,ids);
}
else
MapgrpToRole.get(parentid).addAll(MapgrpToRole.get(childid));
}
if(MapgrpToRoleSub.get(childid).size()>0 && MapgrpToRoleSub.get(childid) !=NULL){
if(MapgrpToRoleSub.get(parentid) == NULL){
Set<String> ids = new Set<String>();
ids.addAll(MapgrpToRoleSub.get(childid));
MapgrpToRoleSub.put(parentid,ids);
}
else
MapgrpToRoleSub.get(parentid).addAll(MapgrpToRoleSub.get(childid));
}
if(MapgrpToUser.get(childid).size()>0 && MapgrpToUser.get(childid) != NULL){
if(MapgrpToUser.get(parentid) == NULL){
Set<String> ids = new Set<String>();
ids.addAll(MapgrpToUser.get(childid));
MapgrpToUser.put(parentid,ids);
}
else
MapgrpToUser.get(parentid).addAll(MapgrpToUser.get(childid));
}
}
}
queryGroupuser(MapgrpToRole,MapgrpToRoleSub,MapgrpToUser);
}
system.debug('----finalmap---->'+finalmap);
return finalmap;
}
public Static void queryGroupuser(Map<String,Set<String>> rolemap,Map<String,Set<String>> rolesubmap,Map<String,Set<String>> usrmap){
Map<String,List<String>> maproleAndUsr = new Map<String,List<String>>();
Map<Id,List<Id>> copymaproleAndUsr = new Map<Id,List<Id>>();
Map<String,Set<String>> mapSubandUsr = new Map<String,Set<String>>();
if(rolemap.keySet().size() > 0){
for(User usr: [SELECT UserRoleId,Id FROM User where Name != 'Chatter Expert']){
if(maproleAndUsr.get(usr.UserRoleId) == null && usr.UserRoleId !=Null){
List<String> ids= new List<String>();
ids.add(usr.Id);
maproleAndUsr.put(usr.UserRoleId,ids);
}else if(usr.UserRoleId !=Null)
maproleAndUsr.get(usr.UserRoleId).add(usr.Id);
}
for(String rolekey : rolemap.keySet()){
for(String rolevalue : rolemap.get(rolekey)){
if(finalmap.get(rolekey) == NULL){
Set<String> ids = new Set<String>();
if(maproleAndUsr.get(rolevalue) != NULL && maproleAndUsr.get(rolevalue).size() > 0)
ids.addAll(maproleAndUsr.get(rolevalue));
finalmap.put(rolekey,ids);
}
else if(maproleAndUsr.get(rolevalue) != NULL && maproleAndUsr.get(rolevalue).size() > 0)
finalmap.get(rolekey).addAll(maproleAndUsr.get(rolevalue));
}
}
}
if(rolesubmap.keySet().size() > 0){
for(UserRole usr: [SELECT Id FROM UserRole order by Name]){
RoleIds.add(Usr.Id);
}
copymaproleAndUsr = AllUserRoleQuery.GetRoleVsUSerMap(RoleIds);
for(Id key : copymaproleAndUsr.keySet()){
Set<String> ids = new Set<String>();
for(Id value : copymaproleAndUsr.get(key)){
ids.add((String)value);
}
mapSubandUsr.put((String)key,ids);
}
for(String subrolekey : rolesubmap.keySet()){
for(String subrolevalue : rolesubmap.get(subrolekey)){
if(finalmap.get(subrolekey) == NULL){
Set<String> ids = new Set<String>();
if(mapSubandUsr.get(subrolevalue) != NULL)
ids.addAll(mapSubandUsr.get(subrolevalue));
finalmap.put(subrolekey,ids);
}
else if(mapSubandUsr.get(subrolevalue) != NULL)
finalmap.get(subrolekey).addAll(mapSubandUsr.get(subrolevalue));
}
}
}
if(usrmap.keySet().size() > 0){
for(String usrkey : usrmap.keySet()){
if(finalmap.get(usrkey) == NULL){
Set<String> ids = new Set<String>();
if(usrmap.get(usrkey) != NULL)
ids.addAll(usrmap.get(usrkey));
finalmap.put(usrkey,ids);
}
else if(usrmap.get(usrkey) != NULL)
finalmap.get(usrkey).addAll(usrmap.get(usrkey));
}
}
}
}