Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REFACT] Achievement 도메인 관련 쿼리에 대해 인덱스 적용 및 쿼리 최적화 수행 #370

Merged
merged 1 commit into from
May 9, 2024
Merged
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 @@ -203,8 +203,7 @@ public void executeEvent(final SequenceAchievementUpdateEvent event) {
// -- 'SEQUENCE' 타입 업적에 한해, 달성 조건을 위해 사용된 히스토리 soft delete 처리
Achievement achievement = getById(event.getAchievementId());
List<UserActivity> history = userActivityRepository.getActivityHistoryByActivityType(
event.getUserId(), achievement.getActivityType(),
achievement.getRequirementValue());
event.getUserId(), achievement.getActivityType(), achievement.getRequirementValue());
history.forEach(UserActivity::delete);

log.info("call socket for event {} completion", event.getAchievementId());
Expand Down Expand Up @@ -264,7 +263,7 @@ public Achievement getById(Long achievementId) {
}

public Integer getProgressLevelSize(ActivityType activityType) {
return achievementRepository.findByActivityType(activityType).size();
return achievementRepository.findMaxProgressLevelByActivityType(activityType);
}

public UserAchievement getByUserAndAchievementId(final AchievementEvent event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@ public interface AchievementJpaRepository extends JpaRepository<Achievement, Lon
@Query("select ac from Achievement ac where ac.id = :id")
Optional<Achievement> findById(Long id);

@Query("select ac from Achievement ac where ac.activityType = :activityType")
List<Achievement> findByActivityType(ActivityType activityType);

@Query("select max(ac.progressLevel) from Achievement ac where ac.activityType = :activityType group by ac.activityType")
Integer findMaxProgressLevelByActivityType(ActivityType activityType);

@Query("""
select ac.activityType from Achievement ac join UserAchievement ua
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public class UserAchievementRepositoryCustomImpl implements UserAchievementRepos
@Override
public List<UserAchievementDetailInfoRes> getAchievementInfoAboutUser(Long userId) {

List<Tuple> sql1 = jpaQueryFactory.select(
List<Tuple> sql1 = jpaQueryFactory
.select(
achievement.id,
Expressions.numberPath(Long.class, String.valueOf(userId)),
achievement.title,
Expand All @@ -56,7 +57,8 @@ public List<UserAchievementDetailInfoRes> getAchievementInfoAboutUser(Long userI
)
.fetch();

List<Tuple> sql2 = jpaQueryFactory.select(
List<Tuple> sql2 = jpaQueryFactory
.select(
userAchievement.achievement.id,
userAchievement.user.id,
userAchievement.achievement.title,
Expand Down Expand Up @@ -138,17 +140,17 @@ public Long getAvailableAchievementWithoutNull(Long userId, ActivityType activit

private Tuple findAvailableAchievementByActivityType(Long userId, ActivityType activityType) {

return jpaQueryFactory.select(
userAchievement.achievement.id.max(),
return jpaQueryFactory
.select(
userAchievement.achievement.id,
userAchievement.completed,
findAvailableNextStep(userAchievement.achievement.id.max(), activityType)
findAvailableNextStep(userAchievement.achievement.id, activityType)
)
.from(userAchievement)
.innerJoin(userActivity).on(userAchievement.user.id.eq(userActivity.user.id))
.innerJoin(userAchievement.achievement).on(userActivity.activityType.eq(userAchievement.achievement.activityType))
.where(
userAchievement.user.id.eq(userId),
userAchievement.achievement.activityType.eq(activityType)
userActivity.activityType.eq(activityType)
)
.groupBy(userActivity.activityType)
.fetchOne();
Expand All @@ -157,18 +159,14 @@ private Tuple findAvailableAchievementByActivityType(Long userId, ActivityType a
// 오늘 날짜를 제외한, Accumulate 타입 업적의 진행 횟수 조회
@Override
public Integer getAccumulatedProgressCountByActivity(Long userId, ActivityType activityType) {
Long result = jpaQueryFactory.select(userActivity.createdAt.count())
.from(achievement)
.innerJoin(userActivity).on(achievement.activityType.eq(userActivity.activityType), userActivity.user.id.eq(userId))
Long result = jpaQueryFactory
.select(userActivity.createdAt.countDistinct())
.from(userActivity)
.innerJoin(achievement).on(userActivity.activityType.eq(achievement.activityType),
userActivity.user.id.eq(userId))
.where(
achievement.id.in(
JPAExpressions.select(achievement1.id.min())
.from(achievement1)
.where(
achievement1.requirementType.eq(RequirementType.ACCUMULATE),
achievement1.activityType.eq(activityType)
)
)
achievement.requirementType.eq(RequirementType.ACCUMULATE),
userActivity.activityType.eq(activityType)
)
.fetchOne();

Expand All @@ -177,7 +175,8 @@ public Integer getAccumulatedProgressCountByActivity(Long userId, ActivityType a

@Override
public Long findMinAchievementIdByActivityType(ActivityType activityType) {
return jpaQueryFactory.select(achievement.id.min())
return jpaQueryFactory
.select(achievement.id.min())
.from(achievement)
.where(achievement.activityType.eq(activityType))
.fetchOne();
Expand All @@ -186,7 +185,8 @@ public Long findMinAchievementIdByActivityType(ActivityType activityType) {
private BooleanExpression findAvailableNextStep(NumberExpression<Long> achievementId,
ActivityType activityType) {

return jpaQueryFactory.selectOne()
return jpaQueryFactory
.selectOne()
.from(achievement)
.where(
achievement.activityType.eq(activityType),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ public interface UserActivityJpaRepository extends JpaRepository<UserActivity, L
UserActivityRepositoryCustom {

@Query("""
select uact from UserActivity uact where uact.user.id = :userId
and uact.activityType = :activityType and uact.deletedAt is null order by uact.createdAt desc
select uat from UserActivity uat where uat.user.id = :userId
and uat.activityType = :activityType and uat.deletedAt is null
""")
List<UserActivity> findByUserIdAndActivityType(Long userId, ActivityType activityType);

@Query("""
select uact from UserActivity uact where uact.user.id = :userId and uact.activityType = :activityType
and FUNCTION('DATE_FORMAT', uact.createdAt, '%Y-%m-%d') = CURRENT_DATE
select uat from UserActivity uat where uat.user.id = :userId and uat.activityType = :activityType
and FUNCTION('DATE_FORMAT', uat.createdAt, '%Y-%m-%d') = CURRENT_DATE
""")
Optional<UserActivity> findByActivityTypeAndCreatedAt(Long userId, ActivityType activityType);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ public class UserActivityRepositoryCustomImpl implements UserActivityRepositoryC

@Override
public List<UserActivity> getActivityHistoryByActivityType(Long userId, ActivityType activityType, Integer limit) {
return jpaQueryFactory.selectFrom(userActivity)
return jpaQueryFactory
.selectFrom(userActivity)
.where(
userActivity.user.id.eq(userId),
userActivity.activityType.eq(activityType),
userActivity.deletedAt.isNull()
)
.orderBy(userActivity.createdAt.desc())
.limit(limit)
.fetch();
}
Expand Down
Loading