Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,12 @@ public ResponseEntity<Void> unregisterAsInterest(Principal principal,

@GetMapping("/popular")
public ResponseEntity<PopularNovelsGetResponse> getTodayPopularNovels(Principal principal) {
//TODO 차단 관계에 있는 유저의 피드글 처리
User user = principal == null
? null
: userService.getUserOrException(Long.valueOf(principal.getName()));
return ResponseEntity
.status(OK)
.body(novelService.getTodayPopularNovels());
.body(novelService.getTodayPopularNovels(user));
}

@GetMapping("/taste")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.websoso.WSSServer.repository;

import java.util.List;
import java.util.Map;
import org.websoso.WSSServer.domain.Feed;
import org.websoso.WSSServer.domain.User;

public interface FeedCustomRepository {

List<Feed> findPopularFeedsByNovelIds(List<Long> novelIds);
Map<Long, Feed> findPopularFeedsByNovelIds(User user, List<Long> novelIds);

List<Feed> findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.websoso.WSSServer.repository;


import static org.websoso.WSSServer.domain.QBlock.block;
import static org.websoso.WSSServer.domain.QFeed.feed;
import static org.websoso.WSSServer.domain.QLike.like;

import com.querydsl.core.Tuple;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -21,17 +24,31 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository {
private final JPAQueryFactory jpaQueryFactory;

@Override
public List<Feed> findPopularFeedsByNovelIds(List<Long> novelIds) {
return novelIds.stream()
.map(novelId -> jpaQueryFactory
.selectFrom(feed)
.leftJoin(feed.likes, like)
.where(feed.novelId.eq(novelId))
.groupBy(feed.feedId)
.orderBy(like.count().desc())
.fetchFirst())
Comment on lines -26 to -32
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기존에는 novelId마다 쿼리가 발생함

.filter(Objects::nonNull)
.collect(Collectors.toList());
public Map<Long, Feed> findPopularFeedsByNovelIds(User user, List<Long> novelIds) {
if (novelIds.isEmpty()) {
return Collections.emptyMap();
}

List<Long> blockedUserIds = (user != null) ? jpaQueryFactory.select(block.blockedId).from(block)
.where(block.blockingId.eq(user.getUserId())).fetch() : Collections.emptyList();

List<Tuple> results = jpaQueryFactory
.select(feed, like.count())
.from(feed)
.leftJoin(feed.likes, like)
.where(feed.novelId.in(novelIds).and(feed.user.userId.notIn(blockedUserIds)))
.groupBy(feed.feedId)
.orderBy(like.count().desc())
.fetch();

return results
.stream()
.map(tuple -> tuple.get(feed))
.collect(Collectors.toMap(
Feed::getNovelId,
Function.identity(),
(existing, replacement) -> existing
));
}

@Override
Expand Down
15 changes: 4 additions & 11 deletions src/main/java/org/websoso/WSSServer/service/NovelService.java
Original file line number Diff line number Diff line change
Expand Up @@ -352,13 +352,11 @@ private NovelGetResponsePreview convertToDTO(Novel novel) {
}

@Transactional(readOnly = true)
public PopularNovelsGetResponse getTodayPopularNovels() {
public PopularNovelsGetResponse getTodayPopularNovels(User user) {
List<Long> novelIdsFromPopularNovel = getNovelIdsFromPopularNovel();
List<Long> selectedNovelIdsFromPopularNovel = getSelectedNovelIdsFromPopularNovel(novelIdsFromPopularNovel);
List<Novel> popularNovels = getSelectedPopularNovels(selectedNovelIdsFromPopularNovel);
List<Feed> popularFeedsFromPopularNovels = getPopularFeedsFromPopularNovels(selectedNovelIdsFromPopularNovel);

Map<Long, Feed> feedMap = createFeedMap(popularFeedsFromPopularNovels);
Map<Long, Feed> feedMap = getPopularFeedsFromPopularNovels(user, selectedNovelIdsFromPopularNovel);
Map<Byte, Avatar> avatarMap = createAvatarMap(feedMap);

return createPopularNovelsGetResponse(popularNovels, feedMap, avatarMap);
Expand All @@ -382,13 +380,8 @@ private List<Novel> getSelectedPopularNovels(List<Long> selectedPopularNovelIds)
return novelRepository.findAllById(selectedPopularNovelIds);
}

private List<Feed> getPopularFeedsFromPopularNovels(List<Long> selectedPopularNovelIds) {
return feedRepository.findPopularFeedsByNovelIds(selectedPopularNovelIds);
}

private static Map<Long, Feed> createFeedMap(List<Feed> popularFeedsFromPopularNovels) {
return popularFeedsFromPopularNovels.stream()
.collect(Collectors.toMap(Feed::getNovelId, feed -> feed));
private Map<Long, Feed> getPopularFeedsFromPopularNovels(User user, List<Long> selectedPopularNovelIds) {
return feedRepository.findPopularFeedsByNovelIds(user, selectedPopularNovelIds);
}

private Map<Byte, Avatar> createAvatarMap(Map<Long, Feed> feedMap) {
Expand Down
Loading