Skip to content

Commit

Permalink
fix: 아이템 목록 조회 다중 조건 정렬 버그 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
Curry4182 committed Apr 12, 2024
1 parent 4fc555b commit 658a45a
Showing 1 changed file with 46 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.core.types.dsl.StringExpressions;
import com.querydsl.core.types.dsl.StringTemplate;
import com.querydsl.jpa.impl.JPAQueryFactory;

import lombok.RequiredArgsConstructor;
Expand All @@ -48,15 +49,17 @@ public List<ItemCursorIdInfo> getItemIdsByCursor(
Projections.constructor(
ItemCursorIdInfo.class,
item.id,
generateItemCursorId()
generateCursorId(itemSortCondition)
)
).from(item)
.where(
cursorIdCondition(cursorId),
eqKeyword(keyword),
hobbyCondition(hobby)
).orderBy(orderBySortCondition(itemSortCondition), item.id.desc())
.groupBy(item.id)
.having(
cursorIdCondition(cursorId, itemSortCondition)
)
.leftJoin(review).on(item.id.eq(review.itemId))
.limit(pageSize)
.fetch();
Expand Down Expand Up @@ -126,7 +129,7 @@ public List<InventoryReviewItemSummary> findReviewedItemByCursor(
return jpaQueryFactory
.selectFrom(item)
.where(
cursorIdCondition(cursorId),
cursorIdCondition(cursorId, null),
item.id.in(itemIdsFromReview),
hobbyCondition(hobby)
)
Expand Down Expand Up @@ -158,9 +161,12 @@ private Expression<Boolean> isSelected(final List<Long> itemIdsFromInventory) {
.otherwise(false);
}

private OrderSpecifier<?> orderBySortCondition(ItemSortCondition itemSortCondition) {
private OrderSpecifier<?> orderBySortCondition(
final ItemSortCondition itemSortCondition
) {

if (itemSortCondition == null) return new OrderSpecifier<>(Order.DESC, item.createdAt);
if (itemSortCondition == null)
return new OrderSpecifier<>(Order.DESC, item.createdAt);

return switch (itemSortCondition) {
case REVIEW_COUNT_DESC -> new OrderSpecifier<>(Order.DESC, review.count());
Expand All @@ -183,12 +189,15 @@ private BooleanExpression hobbyCondition(final Hobby hobby) {
return item.hobby.eq(hobby);
}

private BooleanExpression cursorIdCondition(final String cursorId) {
private BooleanExpression cursorIdCondition(
final String cursorId,
final ItemSortCondition itemSortCondition
) {
if (cursorId == null) {
return null;
}

return generateItemCursorId()
return generateCursorId(itemSortCondition)
.lt(cursorId);
}

Expand All @@ -201,4 +210,34 @@ private StringExpression generateItemCursorId() {
item.id.stringValue(), 8, '0'
));
}

public StringExpression generateCursorId(
final ItemSortCondition itemSortCondition
) {
ItemSortCondition defaultSortCondition = itemSortCondition;
if (itemSortCondition == null) {
defaultSortCondition = ItemSortCondition.NEWEST;
}

return switch (defaultSortCondition) {
case REVIEW_RATING_DESC -> concatWithLpadZero(review.rating.avg().stringValue(), item.id.stringValue());
case REVIEW_COUNT_DESC -> concatWithLpadZero(review.count().stringValue(), item.id.stringValue());
case PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW ->
concatWithLpadZero(item.price.stringValue(), item.id.stringValue());
case NEWEST -> concatWithLpadZero(item.createdAt.stringValue(), item.id.stringValue());
};
}

public StringExpression concatWithLpadZero(final StringExpression str1, final StringExpression str2) {
return lpadWithZero(str1).concat(lpadWithZero(str2));
}

public StringExpression lpadWithZero(final StringExpression str) {
StringTemplate stringTemplate = Expressions.stringTemplate("replace({0}, {1}, {2})", str,
Expressions.constant("."), Expressions.constant(""));
StringExpression defaultStr = Expressions.stringTemplate("coalesce({0}, '00000000')", stringTemplate);
return StringExpressions.lpad(
defaultStr, 8, '0'
);
}
}

0 comments on commit 658a45a

Please sign in to comment.