diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java index d587750b..bb24fa82 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java @@ -294,8 +294,10 @@ public class InferenceDetailDto { } @Getter + @Setter public static class Geom { + Long geoUid; UUID uuid; String uid; Integer compareYyyy; @@ -314,6 +316,7 @@ public class InferenceDetailDto { String fitState; public Geom( + Long geoUid, UUID uuid, String uid, Integer compareYyyy, @@ -328,6 +331,7 @@ public class InferenceDetailDto { String subUid, String pnu, String fitState) { + this.geoUid = geoUid; this.uuid = uuid; this.uid = uid; this.compareYyyy = compareYyyy; diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index b2c89daa..127ff37e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -30,6 +30,7 @@ import com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity; import com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity; import com.kamco.cd.kamcoback.postgres.entity.QModelMngEntity; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.Tuple; import com.querydsl.core.types.Expression; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; @@ -37,13 +38,10 @@ import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.StringExpression; -import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import java.time.OffsetDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; @@ -448,12 +446,14 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto NumberExpression inkxNoAsLong = Expressions.numberTemplate(Long.class, "cast({0} as long)", mapInkx5kEntity.mapidcdNo); + /* 미사용 StringExpression pnu = Expressions.stringTemplate( "nullif(({0}), '')", JPAExpressions.select(Expressions.stringTemplate("string_agg({0}, ',')", pnuEntity.pnu)) .from(pnuEntity) .where(pnuEntity.geo.geoUid.eq(mapSheetAnalDataInferenceGeomEntity.geoUid))); + */ // 4) content List content = @@ -461,6 +461,7 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto .select( Projections.constructor( Geom.class, + mapSheetAnalDataInferenceGeomEntity.geoUid, mapSheetAnalDataInferenceGeomEntity.uuid, mapSheetAnalDataInferenceGeomEntity.resultUid, mapSheetAnalDataInferenceGeomEntity.compareYyyy, @@ -475,7 +476,7 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto Expressions.stringTemplate( "substring({0} from 1 for 8)", mapSheetAnalDataInferenceGeomEntity.resultUid), - pnu, + Expressions.constant(""), mapSheetAnalDataInferenceGeomEntity.fitState)) .from(mapSheetAnalInferenceEntity) .join(mapSheetAnalDataInferenceEntity) @@ -490,6 +491,33 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto .limit(pageable.getPageSize()) .fetch(); + // 4-1) pnu 를 geoUid 로 검색하기 -> AS-IS 에서는 전체 tb_pnu 를 조회해서 오래 걸렸음 + List geoUids = content.stream().map(Geom::getGeoUid).filter(Objects::nonNull).toList(); + Map pnuMap = new HashMap<>(); + + if (!geoUids.isEmpty()) { + StringExpression pnuAgg = Expressions.stringTemplate("string_agg({0}, ',')", pnuEntity.pnu); + + List pnuRows = + queryFactory + .select( + pnuEntity.geo.geoUid, + Expressions.stringTemplate("string_agg({0}, ',')", pnuEntity.pnu)) + .from(pnuEntity) + .where(pnuEntity.geo.geoUid.in(geoUids)) + .groupBy(pnuEntity.geo.geoUid) + .fetch(); + + pnuMap = + pnuRows.stream() + .collect( + Collectors.toMap(row -> row.get(pnuEntity.geo.geoUid), row -> row.get(pnuAgg))); + } + + for (Geom geom : content) { + geom.setPnu(pnuMap.get(geom.getGeoUid())); + } + // 5) total (조인 최소화 유지) Long total = queryFactory