diff --git a/src/main/java/com/openisle/repository/PostRepository.java b/src/main/java/com/openisle/repository/PostRepository.java index ec2ead647..42d0d6da8 100644 --- a/src/main/java/com/openisle/repository/PostRepository.java +++ b/src/main/java/com/openisle/repository/PostRepository.java @@ -26,6 +26,31 @@ public interface PostRepository extends JpaRepository { List findDistinctByCategoryInAndTagsInAndStatus(List categories, List tags, PostStatus status); List findDistinctByCategoryInAndTagsInAndStatus(List categories, List tags, PostStatus status, Pageable pageable); + // Queries requiring all provided tags to be present + @Query("SELECT p FROM Post p JOIN p.tags t WHERE t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount") + List findByAllTags(@Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount); + + @Query(value = "SELECT p FROM Post p JOIN p.tags t WHERE t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount") + List findByAllTags(@Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount, Pageable pageable); + + @Query("SELECT p FROM Post p JOIN p.tags t WHERE t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount ORDER BY p.views DESC") + List findByAllTagsOrderByViewsDesc(@Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount); + + @Query(value = "SELECT p FROM Post p JOIN p.tags t WHERE t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount ORDER BY p.views DESC") + List findByAllTagsOrderByViewsDesc(@Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount, Pageable pageable); + + @Query("SELECT p FROM Post p JOIN p.tags t WHERE p.category IN :categories AND t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount") + List findByCategoriesAndAllTags(@Param("categories") List categories, @Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount); + + @Query(value = "SELECT p FROM Post p JOIN p.tags t WHERE p.category IN :categories AND t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount") + List findByCategoriesAndAllTags(@Param("categories") List categories, @Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount, Pageable pageable); + + @Query("SELECT p FROM Post p JOIN p.tags t WHERE p.category IN :categories AND t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount ORDER BY p.views DESC") + List findByCategoriesAndAllTagsOrderByViewsDesc(@Param("categories") List categories, @Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount); + + @Query(value = "SELECT p FROM Post p JOIN p.tags t WHERE p.category IN :categories AND t IN :tags AND p.status = :status GROUP BY p.id HAVING COUNT(DISTINCT t.id) = :tagCount ORDER BY p.views DESC") + List findByCategoriesAndAllTagsOrderByViewsDesc(@Param("categories") List categories, @Param("tags") List tags, @Param("status") PostStatus status, @Param("tagCount") long tagCount, Pageable pageable); + List findByCategoryInAndStatusOrderByViewsDesc(List categories, PostStatus status); List findByCategoryInAndStatusOrderByViewsDesc(List categories, PostStatus status, Pageable pageable); List findDistinctByTagsInAndStatusOrderByViewsDesc(List tags, PostStatus status); diff --git a/src/main/java/com/openisle/service/PostService.java b/src/main/java/com/openisle/service/PostService.java index 8408e2e83..5aaac2fcf 100644 --- a/src/main/java/com/openisle/service/PostService.java +++ b/src/main/java/com/openisle/service/PostService.java @@ -141,11 +141,11 @@ public class PostService { return java.util.List.of(); } if (pageable != null) { - return postRepository.findDistinctByCategoryInAndTagsInAndStatusOrderByViewsDesc( - categories, tags, PostStatus.PUBLISHED, pageable); + return postRepository.findByCategoriesAndAllTagsOrderByViewsDesc( + categories, tags, PostStatus.PUBLISHED, tags.size(), pageable); } - return postRepository.findDistinctByCategoryInAndTagsInAndStatusOrderByViewsDesc( - categories, tags, PostStatus.PUBLISHED); + return postRepository.findByCategoriesAndAllTagsOrderByViewsDesc( + categories, tags, PostStatus.PUBLISHED, tags.size()); } if (pageable != null) { return postRepository.findByCategoryInAndStatusOrderByViewsDesc(categories, PostStatus.PUBLISHED, pageable); @@ -158,9 +158,9 @@ public class PostService { return java.util.List.of(); } if (pageable != null) { - return postRepository.findDistinctByTagsInAndStatusOrderByViewsDesc(tags, PostStatus.PUBLISHED, pageable); + return postRepository.findByAllTagsOrderByViewsDesc(tags, PostStatus.PUBLISHED, tags.size(), pageable); } - return postRepository.findDistinctByTagsInAndStatusOrderByViewsDesc(tags, PostStatus.PUBLISHED); + return postRepository.findByAllTagsOrderByViewsDesc(tags, PostStatus.PUBLISHED, tags.size()); } public List listPostsByCategories(java.util.List categoryIds, @@ -219,9 +219,9 @@ public class PostService { } if (pageable != null) { - return postRepository.findDistinctByTagsInAndStatus(tags, PostStatus.PUBLISHED, pageable); + return postRepository.findByAllTags(tags, PostStatus.PUBLISHED, tags.size(), pageable); } - return postRepository.findDistinctByTagsInAndStatus(tags, PostStatus.PUBLISHED); + return postRepository.findByAllTags(tags, PostStatus.PUBLISHED, tags.size()); } public List listPostsByCategoriesAndTags(java.util.List categoryIds, @@ -244,9 +244,9 @@ public class PostService { } if (pageable != null) { - return postRepository.findDistinctByCategoryInAndTagsInAndStatus(categories, tags, PostStatus.PUBLISHED, pageable); + return postRepository.findByCategoriesAndAllTags(categories, tags, PostStatus.PUBLISHED, tags.size(), pageable); } - return postRepository.findDistinctByCategoryInAndTagsInAndStatus(categories, tags, PostStatus.PUBLISHED); + return postRepository.findByCategoriesAndAllTags(categories, tags, PostStatus.PUBLISHED, tags.size()); } public List listPendingPosts() {