From 134f25955c4f009a093738973a1b0335459e4e3f Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Wed, 24 Mar 2021 20:11:32 +0100 Subject: [PATCH] [AB-210] improving performance of star stats --- .../StarboardPostReactionRepository.java | 2 ++ .../repository/StarboardPostRepository.java | 12 ++++++++++++ .../service/StarboardServiceBean.java | 8 ++++---- .../StarboardPostManagementServiceBean.java | 10 ++++------ ...rboardPostReactorManagementServiceBean.java | 5 +++++ .../migrations/1.2.3-starboard/collection.xml | 10 ++++++++++ .../starboard-tables/starboard_post.xml | 15 +++++++++++++++ .../starboard_post_reaction.xml | 18 ++++++++++++++++++ .../starboard-tables/tables.xml | 11 +++++++++++ .../migrations/starboard-changeLog.xml | 1 + .../service/StarboardServiceBeanTest.java | 2 +- ...StarboardPostManagementServiceBeanTest.java | 2 +- .../model/template/GuildStarStatsModel.java | 2 +- .../model/template/StarStatsPost.java | 2 +- .../StarboardPostManagementService.java | 2 +- .../StarboardPostReactorManagementService.java | 1 + 16 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/collection.xml create mode 100644 abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post.xml create mode 100644 abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post_reaction.xml create mode 100644 abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/tables.xml diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/repository/StarboardPostReactionRepository.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/repository/StarboardPostReactionRepository.java index 463406aad..40f49026f 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/repository/StarboardPostReactionRepository.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/repository/StarboardPostReactionRepository.java @@ -15,6 +15,8 @@ public interface StarboardPostReactionRepository extends JpaRepository findByServer_Id(Long serverId); + Long countByServer_Id(Long serverId); + @Query(value = "SELECT p.id, COUNT(*) AS starCount \n" + " FROM starboard_post p \n" + " INNER JOIN starboard_post_reaction r ON p.id = r.post_id\n" + @@ -30,6 +32,16 @@ public interface StarboardPostRepository extends JpaRepository getTopStarboardPostsForUser(Long serverId, Long userId, Integer count); + @Query(value = "SELECT p.id, COUNT(*) AS starCount \n" + + " FROM starboard_post p \n" + + " INNER JOIN starboard_post_reaction r ON p.id = r.post_id\n" + + " WHERE p.server_id = :serverId\n" + + " AND p.ignored = false\n" + + " GROUP BY p.id \n" + + " ORDER BY starCount DESC \n" + + " LIMIT :count", nativeQuery = true) + List getTopStarboardPostsForServer(Long serverId, Integer count); + @Query(value = "SELECT COUNT(*) AS starCount\n" + "FROM starboard_post_reaction r \n" + " INNER JOIN starboard_post p ON p.id = r.post_id \n" + diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java index a92d2c289..985066275 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBean.java @@ -196,8 +196,8 @@ public class StarboardServiceBean implements StarboardService { allFutures.addAll(topStarReceiverFutures); return FutureUtils.toSingleFuture(allFutures).thenApply(aVoid -> { List starboardPosts = starboardPostManagementService.retrieveTopPosts(serverId, count); - List starStatsPosts = starboardPosts.stream().map(this::fromStarboardPost).collect(Collectors.toList()); - Integer postCount = starboardPostManagementService.getPostCount(serverId); + List starStatsPosts = starboardPosts.stream().map(this::fromStarboardPost).sorted(Comparator.comparingLong(StarStatsPost::getStarCount).reversed()).collect(Collectors.toList()); + Long postCount = starboardPostManagementService.getPostCount(serverId); Integer reactionCount = starboardPostReactorManagementService.getStarCount(serverId); List emotes = new ArrayList<>(); for (int i = 1; i < count + 1; i++) { @@ -224,7 +224,7 @@ public class StarboardServiceBean implements StarboardService { Long receivedStars = starboardPostManagementService.retrieveReceivedStarsOfUserInServer(member.getGuild().getIdLong(), member.getIdLong()); Long givenStars = starboardPostManagementService.retrieveGivenStarsOfUserInServer(member.getGuild().getIdLong(), member.getIdLong()); List topPosts = starboardPostManagementService.retrieveTopPostsForUserInServer(member.getGuild().getIdLong(), member.getIdLong(), count); - List starStatsPosts = topPosts.stream().map(this::fromStarboardPost).sorted(Comparator.comparingInt(StarStatsPost::getStarCount).reversed()).collect(Collectors.toList()); + List starStatsPosts = topPosts.stream().map(this::fromStarboardPost).sorted(Comparator.comparingLong(StarStatsPost::getStarCount).reversed()).collect(Collectors.toList()); List emotes = new ArrayList<>(); for (int i = 1; i < count + 1; i++) { emotes.add(getStarboardRankingEmote(member.getGuild().getIdLong(), i)); @@ -246,7 +246,7 @@ public class StarboardServiceBean implements StarboardService { .serverId(starboardPost.getServer().getId()) .channelId(channel.getId()) .messageId(starboardPost.getPostMessageId()) - .starCount(starboardPost.getReactions().size()) + .starCount(starboardPostReactorManagementService.getReactorCountOfPost(starboardPost)) .build(); } diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBean.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBean.java index 4e01cdfa4..cab01aef7 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBean.java @@ -58,10 +58,8 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme @Override public List retrieveTopPosts(Long serverId, Integer count) { - List posts = retrieveAllPosts(serverId); - posts.sort(Comparator.comparingInt(o -> o.getReactions().size())); - Collections.reverse(posts); - return posts.subList(0, Math.min(count, posts.size())); + List topPostIds = repository.getTopStarboardPostsForServer(serverId, count); + return repository.findAllById(topPostIds); } @Override @@ -86,8 +84,8 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme } @Override - public Integer getPostCount(Long serverId) { - return retrieveAllPosts(serverId).size(); + public Long getPostCount(Long serverId) { + return repository.countByServer_Id(serverId); } @Override diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementServiceBean.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementServiceBean.java index 973642cc1..f1c7c6689 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementServiceBean.java @@ -65,4 +65,9 @@ public class StarboardPostReactorManagementServiceBean implements StarboardPostR return converter.convertToStarStatsUser(starReceivers, serverId); } + @Override + public Long getReactorCountOfPost(StarboardPost starboardPost) { + return repository.countByStarboardPost(starboardPost); + } + } diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/collection.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/collection.xml new file mode 100644 index 000000000..9e6fcc03f --- /dev/null +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/collection.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post.xml new file mode 100644 index 000000000..d44486b06 --- /dev/null +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post_reaction.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post_reaction.xml new file mode 100644 index 000000000..ecd310cd7 --- /dev/null +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/starboard_post_reaction.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/tables.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/tables.xml new file mode 100644 index 000000000..33da9c388 --- /dev/null +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/1.2.3-starboard/starboard-tables/tables.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/starboard-changeLog.xml b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/starboard-changeLog.xml index 6228c616e..86db4ab14 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/starboard-changeLog.xml +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/main/resources/migrations/starboard-changeLog.xml @@ -7,4 +7,5 @@ http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog-3.8.xsd http://www.liquibase.org/xml/ns/pro dbchangelog-3.8.xsd" > + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java index 8102e78ae..35ee35f61 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/StarboardServiceBeanTest.java @@ -298,7 +298,7 @@ public class StarboardServiceBeanTest { List> topGiver = Arrays.asList(statsUser, statsUser2); when(starboardPostReactorManagementService.retrieveTopStarGiver(SERVER_ID, limit)).thenReturn(topGiver); when(starboardPostReactorManagementService.retrieveTopStarReceiver(SERVER_ID, limit)).thenReturn(topGiver); - when(starboardPostManagementService.getPostCount(SERVER_ID)).thenReturn(50); + when(starboardPostManagementService.getPostCount(SERVER_ID)).thenReturn(50L); when(starboardPostReactorManagementService.getStarCount(SERVER_ID)).thenReturn(500); when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "starboardBadge1")).thenReturn("1"); when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "starboardBadge2")).thenReturn("2"); diff --git a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBeanTest.java b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBeanTest.java index 2140e0b26..b463ed786 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBeanTest.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-impl/src/test/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementServiceBeanTest.java @@ -198,7 +198,7 @@ public class StarboardPostManagementServiceBeanTest { StarboardPost starboardPost2 = Mockito.mock(StarboardPost.class); List posts = Arrays.asList(starboardPost1, starboardPost2); when(repository.findByServer_Id(SERVER_ID)).thenReturn(posts); - Integer retrievedPostCount = testUnit.getPostCount(SERVER_ID); + Long retrievedPostCount = testUnit.getPostCount(SERVER_ID); Assert.assertEquals(posts.size(), retrievedPostCount.intValue()); } } diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/GuildStarStatsModel.java b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/GuildStarStatsModel.java index 20ef89baa..53b920369 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/GuildStarStatsModel.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/GuildStarStatsModel.java @@ -15,5 +15,5 @@ public class GuildStarStatsModel { private List starGiver; private Integer totalStars; private List badgeEmotes; - private Integer starredMessages; + private Long starredMessages; } diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarStatsPost.java b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarStatsPost.java index 540211178..c4973489e 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarStatsPost.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/model/template/StarStatsPost.java @@ -12,7 +12,7 @@ public class StarStatsPost { private Long serverId; private Long channelId; private Long messageId; - private Integer starCount; + private Long starCount; public String getMessageUrl() { return MessageUtils.buildMessageUrl(serverId ,channelId, messageId); diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementService.java b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementService.java index 68a20d838..c427c0fae 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementService.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostManagementService.java @@ -17,7 +17,7 @@ public interface StarboardPostManagementService { Long retrieveGivenStarsOfUserInServer(Long serverId, Long userId); Long retrieveReceivedStarsOfUserInServer(Long serverId, Long userId); List retrieveAllPosts(Long serverId); - Integer getPostCount(Long serverId); + Long getPostCount(Long serverId); Optional findByMessageId(Long messageId); Optional findByStarboardPostId(Long postId); Optional findByStarboardPostMessageId(Long postId); diff --git a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementService.java b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementService.java index 3d4dc5f07..9ef21871a 100644 --- a/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementService.java +++ b/abstracto-application/abstracto-modules/starboard/starboard-int/src/main/java/dev/sheldan/abstracto/starboard/service/management/StarboardPostReactorManagementService.java @@ -15,4 +15,5 @@ public interface StarboardPostReactorManagementService { Integer getStarCount(Long serverId); List> retrieveTopStarGiver(Long serverId, Integer count); List> retrieveTopStarReceiver(Long serverId, Integer count); + Long getReactorCountOfPost(StarboardPost starboardPost); }