From 658a45ae58654bd2455afdf91004be15438dadf4 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Fri, 12 Apr 2024 15:36:47 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EB=8B=A4=EC=A4=91=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=A0=95=EB=A0=AC=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ItemRepositoryForCursorImpl.java | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/lime-domain/src/main/java/com/programmers/lime/domains/item/repository/ItemRepositoryForCursorImpl.java b/lime-domain/src/main/java/com/programmers/lime/domains/item/repository/ItemRepositoryForCursorImpl.java index c48912acf..055c24bf6 100644 --- a/lime-domain/src/main/java/com/programmers/lime/domains/item/repository/ItemRepositoryForCursorImpl.java +++ b/lime-domain/src/main/java/com/programmers/lime/domains/item/repository/ItemRepositoryForCursorImpl.java @@ -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; @@ -48,15 +49,17 @@ public List 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(); @@ -126,7 +129,7 @@ public List findReviewedItemByCursor( return jpaQueryFactory .selectFrom(item) .where( - cursorIdCondition(cursorId), + cursorIdCondition(cursorId, null), item.id.in(itemIdsFromReview), hobbyCondition(hobby) ) @@ -158,9 +161,12 @@ private Expression isSelected(final List 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()); @@ -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); } @@ -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' + ); + } }