From ba0ceb77b40b64c9192fef768cae84eee04b9a35 Mon Sep 17 00:00:00 2001 From: Milan Tyagi Date: Fri, 5 Jun 2026 19:39:28 +0530 Subject: [PATCH] OF-2710: Replace two group-member queries with one in DefaultGroupProvider Optimize DefaultGroupProvider by replacing two separate SQL lookups (one for standard members and one for administrators) with a single combined query. - Remove LOAD_ADMINS and LOAD_MEMBERS SQL constants. - Add LOAD_MEMBERS_AND_ADMINS SQL constant. - Replace getMembers helper method with loadMembersAndAdmins to retrieve all users for a group and categorize them in memory by administrator status. - Update createGroup and getGroup call sites to use the new loadMembersAndAdmins helper. --- .../openfire/group/DefaultGroupProvider.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/xmppserver/src/main/java/org/jivesoftware/openfire/group/DefaultGroupProvider.java b/xmppserver/src/main/java/org/jivesoftware/openfire/group/DefaultGroupProvider.java index 96d7e7f19e..bb18baa00b 100644 --- a/xmppserver/src/main/java/org/jivesoftware/openfire/group/DefaultGroupProvider.java +++ b/xmppserver/src/main/java/org/jivesoftware/openfire/group/DefaultGroupProvider.java @@ -57,10 +57,8 @@ public class DefaultGroupProvider extends AbstractGroupProvider { private static final String DELETE_GROUP = "DELETE FROM ofGroup WHERE groupName=?"; private static final String GROUP_COUNT = "SELECT count(*) FROM ofGroup"; - private static final String LOAD_ADMINS = - "SELECT username FROM ofGroupUser WHERE administrator=1 AND groupName=? ORDER BY username"; - private static final String LOAD_MEMBERS = - "SELECT username FROM ofGroupUser WHERE administrator=0 AND groupName=? ORDER BY username"; + private static final String LOAD_MEMBERS_AND_ADMINS = + "SELECT username, administrator FROM ofGroupUser WHERE groupName=? ORDER BY username"; private static final String LOAD_GROUP = "SELECT description FROM ofGroup WHERE groupName=?"; private static final String REMOVE_USER = @@ -105,9 +103,9 @@ public Group createGroup(String name) throws GroupNameInvalidException, GroupAlr DbConnectionManager.closeConnection(pstmt, con); } - // TODO Replace these two database queries with one. OF-2710 - Collection members = getMembers(name, false); - Collection administrators = getMembers(name, true); + List members = new ArrayList<>(); + List administrators = new ArrayList<>(); + loadMembersAndAdmins(name, members, administrators); return new Group(name, "", members, administrators); } @@ -137,9 +135,9 @@ public Group getGroup(String name) throws GroupNotFoundException { DbConnectionManager.closeConnection(rs, pstmt, con); } - // TODO Replace these two database queries with one. OF-2710 - Collection members = getMembers(name, false); - Collection administrators = getMembers(name, true); + List members = new ArrayList<>(); + List administrators = new ArrayList<>(); + loadMembersAndAdmins(name, members, administrators); return new Group(name, description, members, administrators); } @@ -507,23 +505,18 @@ public boolean isSharingSupported() { return true; } - private Collection getMembers(String groupName, boolean adminsOnly) { - List members = new ArrayList<>(); + private void loadMembersAndAdmins(String groupName, Collection members, Collection administrators) { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; try { con = DbConnectionManager.getConnection(); - if (adminsOnly) { - pstmt = con.prepareStatement(LOAD_ADMINS); - } - else { - pstmt = con.prepareStatement(LOAD_MEMBERS); - } + pstmt = con.prepareStatement(LOAD_MEMBERS_AND_ADMINS); pstmt.setString(1, groupName); rs = pstmt.executeQuery(); while (rs.next()) { String user = rs.getString(1); + boolean isAdmin = rs.getInt(2) == 1; JID userJID = null; if (user.indexOf('@') == -1) { // Create JID of local user if JID does not match a component's JID @@ -541,7 +534,14 @@ private Collection getMembers(String groupName, boolean adminsOnly) { Log.warn("Group '{}' has a member that is persisted using its full JID, instead of a bare JID: '{}'. This is unexpected, and possibly a data consistency error. Groups should only contain bare JIDs.", groupName, userJID); userJID = userJID.asBareJID(); } - members.add(userJID); + + if (userJID != null) { + if (isAdmin) { + administrators.add(userJID); + } else { + members.add(userJID); + } + } } } catch (SQLException e) { @@ -550,6 +550,5 @@ private Collection getMembers(String groupName, boolean adminsOnly) { finally { DbConnectionManager.closeConnection(rs, pstmt, con); } - return members; } }