From 7503df6d6256946a6755b5a4b949834444429a8b Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 16:58:54 +0200 Subject: [PATCH] Fix: Refined methods to prevent N+1 loops query for shorter prosessing --- .../team6/database/DatabaseManager.java | 189 +++++++++++++----- 1 file changed, 143 insertions(+), 46 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index b158b39..b414fde 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -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 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(); @@ -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(); @@ -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(); @@ -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()) { @@ -613,7 +700,7 @@ public DonationRegistry getDonationFromDB() { return registry; } - public ArrayList getFeedbackforChairtyUUID(String charity_uuid) { + public ArrayList getFeedbackforCharityUUID(String charity_uuid) { ArrayList Feedbacks = new ArrayList<>(); Connection conn = null; try { @@ -621,21 +708,31 @@ public ArrayList getFeedbackforChairtyUUID(String charity_uuid) { 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();