From 3e71bc1c9e557446678fe143f266d4ab03b60d23 Mon Sep 17 00:00:00 2001 From: Tom Zhao <tom.zhao@dsv.su.se> Date: Wed, 18 Dec 2024 08:58:41 +0100 Subject: [PATCH] 3470: Use JPA native query to reduce number of calls to database --- .../dsv/scipro/forum/ProjectForumService.java | 2 +- .../scipro/forum/ProjectForumServiceImpl.java | 6 ++++- .../scipro/forum/ProjectThreadRepository.java | 3 +++ .../forum/ProjectThreadRepositoryImpl.java | 24 +++++++++++++++++++ .../forum/panels/NumberOfMessagesPanel.java | 4 ++-- .../panels/SupervisorMyProjectsPanel.java | 4 ++-- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java index 018e4736fa..6220776cec 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java @@ -27,5 +27,5 @@ public interface ProjectForumService { boolean hasUnreadThreads(Project project, User user); - int getUnreadThreadsCount(Project project, User user); + long getUnreadThreadsCount(Project project, User user); } diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java index 2743d0cc3d..467b092b70 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java @@ -107,7 +107,9 @@ public class ProjectForumServiceImpl implements ProjectForumService { } @Override - public int getUnreadThreadsCount(Project project, User user) { + public long getUnreadThreadsCount(Project project, User user) { + return projectThreadRepository.getUnreadThreadsCount(project, user); + /* List<ProjectThread> threads = getThreads(project); int count = 0; for (ProjectThread thread : threads) { @@ -116,6 +118,8 @@ public class ProjectForumServiceImpl implements ProjectForumService { } } return count; + + */ } @Override diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java index cbe28506a1..189ffed09b 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepository.java @@ -5,6 +5,7 @@ import se.su.dsv.scipro.system.JpaRepository; import se.su.dsv.scipro.system.QueryDslPredicateExecutor; import se.su.dsv.scipro.forum.dataobjects.ProjectThread; import se.su.dsv.scipro.project.Project; +import se.su.dsv.scipro.system.User; import java.util.List; @@ -13,4 +14,6 @@ public interface ProjectThreadRepository extends JpaRepository<ProjectThread, Lo List<ProjectThread> findByProject(Project project); + long getUnreadThreadsCount(Project project, User user); + } diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepositoryImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepositoryImpl.java index b278d1d214..26286262e6 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepositoryImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectThreadRepositoryImpl.java @@ -1,5 +1,6 @@ package se.su.dsv.scipro.forum; +import jakarta.persistence.Query; import se.su.dsv.scipro.forum.dataobjects.ProjectThread; import se.su.dsv.scipro.forum.dataobjects.QProjectThread; import se.su.dsv.scipro.project.Project; @@ -8,6 +9,8 @@ import se.su.dsv.scipro.system.GenericRepo; import jakarta.inject.Inject; import jakarta.inject.Provider; import jakarta.persistence.EntityManager; +import se.su.dsv.scipro.system.User; + import java.util.List; public class ProjectThreadRepositoryImpl extends GenericRepo<ProjectThread, Long> implements ProjectThreadRepository { @@ -21,4 +24,25 @@ public class ProjectThreadRepositoryImpl extends GenericRepo<ProjectThread, Long return findAll(QProjectThread.projectThread.project.eq(project)); } + @Override + public long getUnreadThreadsCount(Project project, User user) { + StringBuilder sql = new StringBuilder() + .append("select count(distinct(thread_id)) result ") + .append(" from (select fp.thread_id as thread_id, fp.id as post_id, ") + .append(" exists (select `read` ") + .append(" from forum_post_read_state fprs ") + .append(" where fprs.forum_post_id = fp.id and ") + .append(" fprs.user_id = :uid and ") + .append(" fprs.read = 1) as post_read ") + .append(" from project_thread pt, forum_post fp ") + .append(" where pt.thread_id = fp.thread_id and ") + .append(" pt.project_id = :pid) tbl_ex ") + .append(" where post_read = 0"); + Query query = em().createNativeQuery(sql.toString()); + query.setParameter("uid", user.getId()) + .setParameter("pid", project.getId()); + + return (Long)query.getSingleResult(); + } + } diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/NumberOfMessagesPanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/NumberOfMessagesPanel.java index 932b62f302..115aad83f2 100644 --- a/view/src/main/java/se/su/dsv/scipro/forum/panels/NumberOfMessagesPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/NumberOfMessagesPanel.java @@ -20,12 +20,12 @@ public abstract class NumberOfMessagesPanel extends Panel { protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); - int count = getMessageCount(); + long count = getMessageCount(); if (count > 0) { model.setObject("(" + count + ")"); } } - public abstract int getMessageCount(); + public abstract long getMessageCount(); } diff --git a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java index 53ff74a577..3ac0eb01e8 100755 --- a/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorMyProjectsPanel.java @@ -226,7 +226,7 @@ public class SupervisorMyProjectsPanel extends Panel { //item.add(container); //boolean hasUnreadThreads = projectForumService.hasUnreadThreads(projectModel.getObject(), SciProSession.get().getUser()); - int msgCount = projectForumService.getUnreadThreadsCount(projectModel.getObject(), SciProSession.get().getUser()); + long msgCount = projectForumService.getUnreadThreadsCount(projectModel.getObject(), SciProSession.get().getUser()); // todo: reconsider name of this id, needs to be improved. Fragment fragment = new Fragment(id, "parentMarkupId", SupervisorMyProjectsPanel.this); @@ -246,7 +246,7 @@ public class SupervisorMyProjectsPanel extends Panel { fragment.add(new NumberOfMessagesPanel("counter") { @Override - public int getMessageCount() { + public long getMessageCount() { return msgCount; } });