Skip to content

Commit

Permalink
Fix: Refined methods to prevent N+1 loops query for shorter prosessing
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianBalunan committed Apr 12, 2026
1 parent 92ec053 commit 7503df6
Showing 1 changed file with 143 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -406,24 +406,57 @@ public CharityRegistry getCharitiesFromDB() {
try {
conn = connection.getMySqlConnection();
String sql_query =
"SELECT UUID_charities, org_number, charity_name, charity_link, pre_approved, status FROM Charities";
"""
SELECT
c.UUID_charities, c.org_number, c.charity_name, c.charity_link, c.pre_approved, c.status,
f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id,
u.UUID_user, u.user_name, u.user_email, u.user_password, u.role
FROM Charities c
LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities
LEFT JOIN User u ON f.user_id = u.UUID_user
""";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql_query);

Charity currentCharity = null;
String lastCharity = null;

registry = new CharityRegistry();
while (rs.next()) {
Charity charity =
String currentId = rs.getString("UUID_charities");

if (lastCharity == null || !currentId.equals(lastCharity)) {
currentCharity =
new Charity(
rs.getString("UUID_charities"),
rs.getString("org_number"),
rs.getString("charity_link"),
rs.getString("charity_name"),
rs.getBoolean("pre_approved"),
rs.getString("status"));
ArrayList<Feedback> feedbacks = getFeedbackforChairtyUUID(charity.getUUID().toString());
charity.setFeedbacks(feedbacks);

registry.addCharity(charity);
rs.getString("status")
);
registry.addCharity(currentCharity);
lastCharity = currentId;
}
String feedbackId = rs.getString("UUID_feedback");
if (feedbackId != null){
User userWithNoSettingsAndInbox = new User(
rs.getString("UUID_User"),
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);

Feedback feedback = new Feedback(
rs.getString("UUID_feedback"),
userWithNoSettingsAndInbox,
rs.getString("feedback_comment"),
LocalDate.parse(rs.getString("feedback_date"))
);

currentCharity.getFeedbacks().add(feedback);
}
}
} catch (SQLException e) {
e.printStackTrace();
Expand All @@ -432,30 +465,60 @@ public CharityRegistry getCharitiesFromDB() {
return registry;
}
public UserRegistry getUsersFromDB(){
UserRegistry registry = null;
UserRegistry registry = new UserRegistry();
Connection conn = null;
try {
conn = connection.getMySqlConnection();
String sql_query =
"""
SELECT UUID_User, user_name, user_email, user_password, role FROM User
SELECT
u.UUID_User, u.user_name, u.user_email, u.user_password, u.role,
s.User_UUID_User, s.isAnonymous, s.language, s.lightmode,
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id
FROM User u
LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user
LEFT JOIN Messages m ON u.UUID_User = m.user_id
""";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql_query);

while (rs.next()) {
User user = new User(
rs.getString("UUID_User"),
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);
Settings settings = getSettingsForUser(user.getId().toString());
user.setSettings(settings);
User currentUser = null;
String lastUserid = null;

Inbox inbox = getInboxForUser(user.getId().toString());
user.setInbox(inbox);
while (rs.next()) {
String userId = rs.getString("UUID_User");

if (lastUserid == null || !userId.equals(lastUserid)) {
currentUser = new User(
userId,
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);
if (rs.getString("isAnonymous") != null){
Settings settings = new Settings(
rs.getBoolean("isAnonymous"),
Language.valueOf(rs.getString("language").toUpperCase()),
rs.getBoolean("lightmode")
);
currentUser.setSettings(settings);
}
currentUser.setInbox(new Inbox());
registry.addUser(currentUser);
lastUserid = userId;
}
String messageId = rs.getString("UUID_message");
if (messageId != null) {
Message message = new Message(
rs.getString("message_title"),
UUID.fromString(rs.getString("sender_charity_id")),
rs.getString("message_content"),
LocalDate.parse(rs.getString("message_date"))
);

currentUser.getInbox().addMessage(message);
}
}
} catch (SQLException e) {
e.printStackTrace();
Expand All @@ -471,27 +534,52 @@ public User getUserFromDBUuid(String user_id){
conn = connection.getMySqlConnection();
String sql_query =
"""
SELECT UUID_User, user_name, user_email, user_password, role FROM User
WHERE UUID_User = ?;
SELECT
u.UUID_User, u.user_name, u.user_email, u.user_password, u.role,
s.User_UUID_User, s.isAnonymous, s.language, s.lightmode,
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id
FROM User u
LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user
LEFT JOIN Messages m ON u.UUID_User = m.user_id
WHERE u.UUID_User = ?;
""";
PreparedStatement stmt = conn.prepareStatement(sql_query);
stmt.setString(1, user_id);
stmt.setMaxRows(1);
ResultSet rs = stmt.executeQuery();

String lastUserid = null;
while (rs.next()) {
user = new User(
rs.getString("UUID_User"),
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);
Settings settings = getSettingsForUser(user.getId().toString());
user.setSettings(settings);

Inbox inbox = getInboxForUser(user.getId().toString());
user.setInbox(inbox);
String userId = rs.getString("UUID_User");
if (lastUserid == null || !userId.equals(lastUserid)) {
user = new User(
userId,
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);
if (rs.getString("isAnonymous") != null){
Settings settings = new Settings(
rs.getBoolean("isAnonymous"),
Language.valueOf(rs.getString("language").toUpperCase()),
rs.getBoolean("lightmode")
);
user.setSettings(settings);
}
user.setInbox(new Inbox());
lastUserid = userId;
}
String messageId = rs.getString("UUID_message");
if (messageId != null) {
Message message = new Message(
rs.getString("message_title"),
UUID.fromString(rs.getString("sender_charity_id")),
rs.getString("message_content"),
LocalDate.parse(rs.getString("message_date"))
);

user.getInbox().addMessage(message);
}
}
} catch (SQLException e) {
e.printStackTrace();
Expand Down Expand Up @@ -531,18 +619,17 @@ public Settings getSettingsForUser(String user_id){
}

public Inbox getInboxForUser(String user_id){
Inbox inbox = null;
Inbox inbox = new Inbox();
Connection conn = null;
try {
conn = connection.getMySqlConnection();
String sql_query =
"""
SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Settings
WHERE User_UUID_User = ?;
SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages
WHERE user_id = ?;
""";
PreparedStatement stmt = conn.prepareStatement(sql_query);
stmt.setString(1, user_id);
stmt.setMaxRows(1);
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
Expand Down Expand Up @@ -613,29 +700,39 @@ public DonationRegistry getDonationFromDB() {
return registry;
}

public ArrayList<Feedback> getFeedbackforChairtyUUID(String charity_uuid) {
public ArrayList<Feedback> getFeedbackforCharityUUID(String charity_uuid) {
ArrayList<Feedback> Feedbacks = new ArrayList<>();
Connection conn = null;
try {
conn = connection.getMySqlConnection();
String sql_query =
"""
SELECT
UUID_feedback, feedback_comment, feedback_date, isAnonymous, charity_id, user_id
FROM Feedback
f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id,
u.UUID_user, u.user_name, u.user_email, u.user_password, u.role
FROM Feedback f
LEFT JOIN User u ON f.user_id = u.UUID_user
WHERE f.charity_id = ?;
""";
PreparedStatement stmt = conn.prepareStatement(sql_query);
stmt.setString(1, charity_uuid);
ResultSet rs = stmt.executeQuery(sql_query);
ResultSet rs = stmt.executeQuery();

while (rs. next()){
while (rs.next()){
User userWithNoSettingsAndInbox = new User(
rs.getString("UUID_User"),
rs.getString("user_name"),
rs.getString("user_email"),
rs.getString("user_password"),
rs.getString("role")
);
Feedback feedback = new Feedback(
rs.getString("UUID_feedback"),
getUserFromDBUuid(rs.getString("user_id")),
userWithNoSettingsAndInbox,
rs.getString("feedback_comment"),
LocalDate.parse(rs.getString("feedback_date"))
);
Feedbacks.add(feedback);
}
} catch (Exception e) {
e.printStackTrace();
Expand Down

0 comments on commit 7503df6

Please sign in to comment.