From 82fb6fbfff89523d79bc801e5fbeefd72971f92e Mon Sep 17 00:00:00 2001 From: htlee Date: Mon, 30 Mar 2026 11:56:07 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20correlations=20API=20SQL=20=E2=80=94=20r?= =?UTF-8?q?aw=5Fmetrics=20LATERAL=20JOIN=EC=9C=BC=EB=A1=9C=20=EC=84=B8?= =?UTF-8?q?=EB=B6=80=20=EB=A9=94=ED=8A=B8=EB=A6=AD=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scores 테이블에는 composite 점수만, 세부 메트릭(proximity/visit/heading)은 raw_metrics에 있으므로 LATERAL JOIN으로 최신 raw 메트릭 결합 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gc/mda/kcg/domain/fleet/GroupPolygonService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/gc/mda/kcg/domain/fleet/GroupPolygonService.java b/backend/src/main/java/gc/mda/kcg/domain/fleet/GroupPolygonService.java index d232a21..ccd496d 100644 --- a/backend/src/main/java/gc/mda/kcg/domain/fleet/GroupPolygonService.java +++ b/backend/src/main/java/gc/mda/kcg/domain/fleet/GroupPolygonService.java @@ -61,11 +61,17 @@ public class GroupPolygonService { private static final String GROUP_CORRELATIONS_SQL = """ SELECT s.target_mmsi, s.target_type, s.target_name, s.current_score, s.streak_count, s.observation_count, - s.freeze_state, - s.proximity_ratio, s.visit_score, s.heading_coherence, + s.freeze_state, s.shadow_bonus_total, + r.proximity_ratio, r.visit_score, r.heading_coherence, m.id AS model_id, m.name AS model_name, m.is_default FROM kcg.gear_correlation_scores s JOIN kcg.correlation_param_models m ON s.model_id = m.id + LEFT JOIN LATERAL ( + SELECT proximity_ratio, visit_score, heading_coherence + FROM kcg.gear_correlation_raw_metrics + WHERE group_key = s.group_key AND target_mmsi = s.target_mmsi + ORDER BY observed_at DESC LIMIT 1 + ) r ON TRUE WHERE s.group_key = ? AND s.current_score >= ? AND m.is_active = TRUE ORDER BY m.is_default DESC, s.current_score DESC """; @@ -107,6 +113,7 @@ public class GroupPolygonService { row.put("streak", rs.getInt("streak_count")); row.put("observations", rs.getInt("observation_count")); row.put("freezeState", rs.getString("freeze_state")); + row.put("shadowBonus", rs.getDouble("shadow_bonus_total")); row.put("proximityRatio", rs.getObject("proximity_ratio")); row.put("visitScore", rs.getObject("visit_score")); row.put("headingCoherence", rs.getObject("heading_coherence"));