diff --git a/modules/GuildManager/pom.xml b/modules/GuildManager/pom.xml
index 4f5f6c8..831c7ba 100644
--- a/modules/GuildManager/pom.xml
+++ b/modules/GuildManager/pom.xml
@@ -109,8 +109,8 @@
provided
- me.clip
- placeholderapi
+ com.github.PlaceholderAPI
+ PlaceholderAPI
2.11.1
provided
@@ -120,6 +120,18 @@
5.6.0-SNAPSHOT
provided
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+ org.mockito
+ mockito-core
+ 4.5.1
+ test
+
diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java
index c57fbbe..1d1f1cb 100644
--- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java
+++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/command/GuildCommandS.java
@@ -1,5 +1,6 @@
package com.mcatk.guildmanager.command;
+import com.mcatk.guildmanager.GuildManager;
import com.mcatk.guildmanager.GuildItem;
import com.mcatk.guildmanager.Msg;
import com.mcatk.guildmanager.exceptions.ParaLengthException;
diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java
index abbc2be..5618cc7 100644
--- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java
+++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepository.java
@@ -181,12 +181,29 @@ public HashMap getAllGuilds() {
g.setCash(rs.getInt("guild_cash"));
g.setResidenceFLag(rs.getBoolean("guild_has_residence"));
g.setHasChangedName(rs.getBoolean("guild_has_changed_name"));
- g.setMembers(getMembersFromSQL(g.getId()));
guilds.put(g.getId(), g);
}
} catch (SQLException e) {
e.printStackTrace();
}
+
+ try (PreparedStatement ps = getConnection().prepareStatement(SqlCommand.GET_ALL_MEMBERS.toString())) {
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ Member m = new Member(
+ rs.getString("player_id"),
+ rs.getString("guild_id"),
+ rs.getInt("player_contribution"),
+ rs.getBoolean("player_is_advanced")
+ );
+ Guild g = guilds.get(m.getGuildID());
+ if (g != null) {
+ g.getMembers().add(m);
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
return guilds;
}
diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java
index ab26869..b6301d5 100644
--- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java
+++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/core/repository/jdbc/SqlCommand.java
@@ -38,6 +38,9 @@ public enum SqlCommand {
GET_PLAYER(
"SELECT * FROM player_guild WHERE player_id = ?"
),
+ GET_ALL_MEMBERS(
+ "SELECT * FROM player_guild"
+ ),
GET_ALL_GUILDS(
"SELECT * FROM guild"
),
diff --git a/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java
new file mode 100644
index 0000000..1de7994
--- /dev/null
+++ b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/core/repository/jdbc/JdbcGuildRepositoryTest.java
@@ -0,0 +1,88 @@
+package com.mcatk.guildmanager.core.repository.jdbc;
+
+import com.mcatk.guildmanager.core.config.DbConfig;
+import com.mcatk.guildmanager.models.Guild;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.contains;
+import static org.mockito.Mockito.*;
+
+public class JdbcGuildRepositoryTest {
+
+ private JdbcGuildRepository repository;
+ private Connection mockConnection;
+ private ResultSet mockResultSetGuilds;
+ private ResultSet mockResultSetMembers;
+
+ @Before
+ public void setUp() throws Exception {
+ DbConfig config = new DbConfig("localhost", 3306, "test", "user", "pass");
+ repository = new JdbcGuildRepository(config);
+
+ mockConnection = mock(Connection.class);
+ mockResultSetGuilds = mock(ResultSet.class);
+ mockResultSetMembers = mock(ResultSet.class);
+
+ // Inject mock connection
+ Field connectionField = JdbcGuildRepository.class.getDeclaredField("connection");
+ connectionField.setAccessible(true);
+ connectionField.set(repository, mockConnection);
+
+ when(mockConnection.isClosed()).thenReturn(false);
+ }
+
+ @Test
+ public void testGetAllGuilds_Optimization() throws SQLException {
+ PreparedStatement psGuilds = mock(PreparedStatement.class);
+ PreparedStatement psMembers = mock(PreparedStatement.class);
+
+ // Setup mock calls for prepareStatement
+ when(mockConnection.prepareStatement(contains("FROM guild"))).thenReturn(psGuilds);
+ // The optimized code fetches all members at once
+ when(mockConnection.prepareStatement(contains("SELECT * FROM player_guild"))).thenReturn(psMembers);
+
+ when(psGuilds.executeQuery()).thenReturn(mockResultSetGuilds);
+ when(psMembers.executeQuery()).thenReturn(mockResultSetMembers);
+
+ // Setup 5 guilds
+ when(mockResultSetGuilds.next()).thenReturn(true, true, true, true, true, false);
+ when(mockResultSetGuilds.getString("guild_id")).thenReturn("g1", "g2", "g3", "g4", "g5");
+
+ // Members return nothing for now
+ when(mockResultSetMembers.next()).thenReturn(true, true, false);
+ when(mockResultSetMembers.getString("player_id")).thenReturn("player1", "player2");
+ when(mockResultSetMembers.getString("guild_id")).thenReturn("g1", "g2");
+ when(mockResultSetMembers.getInt("player_contribution")).thenReturn(100, 200);
+ when(mockResultSetMembers.getBoolean("player_is_advanced")).thenReturn(true, false);
+
+ HashMap result = repository.getAllGuilds();
+
+ assertEquals(5, result.size());
+
+ // Verify optimization:
+ // 1 call for guilds
+ // 1 call for all members
+ // Total 2 calls to prepareStatement
+ verify(mockConnection, times(2)).prepareStatement(anyString());
+
+ // Verify Data Mapping
+ assertEquals(1, result.get("g1").getMembers().size());
+ assertEquals("player1", result.get("g1").getMembers().get(0).getId());
+
+ assertEquals(1, result.get("g2").getMembers().size());
+ assertEquals("player2", result.get("g2").getMembers().get(0).getId());
+
+ assertEquals(0, result.get("g3").getMembers().size());
+ }
+}