From dd9de6739caf986a980f4adcb044776ebc9c4921 Mon Sep 17 00:00:00 2001 From: htlee Date: Mon, 6 Apr 2026 07:08:54 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20parent=5Fresolution=20JOIN=20=ED=83=80?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EA=B0=AD=20=ED=97=88=EC=9A=A9=20=E2=80=94?= =?UTF-8?q?=20snapshot=5Ftime=20-=2010=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5분 사이클에서 폴리곤 저장 → inference 실행 순서로 인해 latest snapshot_time > last_evaluated_at이 될 수 있음. JOIN 조건에 10분 여유를 두어 이전 사이클 결과도 매칭되도록 수정. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../kcg/domain/fleet/GroupPolygonService.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 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 4140333..41db13f 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 @@ -51,7 +51,7 @@ public class GroupPolygonService { JOIN latest_groups lg ON lg.group_key = c.group_key AND lg.sub_cluster_id = c.sub_cluster_id - AND c.observed_at >= lg.snapshot_time + AND c.observed_at >= lg.snapshot_time - INTERVAL '10 minutes' GROUP BY c.group_key, c.sub_cluster_id ), candidate_counts AS ( @@ -79,7 +79,7 @@ public class GroupPolygonService { LEFT JOIN %s r ON r.group_key = lg.group_key AND r.sub_cluster_id = lg.sub_cluster_id - AND r.last_evaluated_at >= lg.snapshot_time + AND r.last_evaluated_at >= lg.snapshot_time - INTERVAL '10 minutes' LEFT JOIN candidate_counts cc ON cc.group_key = lg.group_key AND cc.sub_cluster_id = lg.sub_cluster_id @@ -105,7 +105,7 @@ public class GroupPolygonService { LEFT JOIN %s r ON r.group_key = g.group_key AND r.sub_cluster_id = g.sub_cluster_id - AND r.last_evaluated_at >= g.snapshot_time + AND r.last_evaluated_at >= g.snapshot_time - INTERVAL '10 minutes' WHERE g.group_key = ? ORDER BY g.snapshot_time DESC LIMIT 1 @@ -130,7 +130,7 @@ public class GroupPolygonService { LEFT JOIN %s r ON r.group_key = g.group_key AND r.sub_cluster_id = g.sub_cluster_id - AND r.last_evaluated_at >= g.snapshot_time + AND r.last_evaluated_at >= g.snapshot_time - INTERVAL '10 minutes' WHERE g.group_key = ? AND g.snapshot_time > NOW() - CAST(? || ' hours' AS INTERVAL) ORDER BY g.snapshot_time DESC """; @@ -186,7 +186,7 @@ public class GroupPolygonService { JOIN latest_groups lg ON lg.group_key = c.group_key AND lg.sub_cluster_id = c.sub_cluster_id - AND c.observed_at >= lg.snapshot_time + AND c.observed_at >= lg.snapshot_time - INTERVAL '10 minutes' GROUP BY c.group_key, c.sub_cluster_id ), candidate_counts AS ( @@ -215,7 +215,7 @@ public class GroupPolygonService { JOIN %s r ON r.group_key = lg.group_key AND r.sub_cluster_id = lg.sub_cluster_id - AND r.last_evaluated_at >= lg.snapshot_time + AND r.last_evaluated_at >= lg.snapshot_time - INTERVAL '10 minutes' LEFT JOIN candidate_counts cc ON cc.group_key = lg.group_key AND cc.sub_cluster_id = lg.sub_cluster_id @@ -247,7 +247,7 @@ public class GroupPolygonService { JOIN latest_groups lg ON lg.group_key = c.group_key AND lg.sub_cluster_id = c.sub_cluster_id - AND c.observed_at >= lg.snapshot_time + AND c.observed_at >= lg.snapshot_time - INTERVAL '10 minutes' WHERE c.group_key = ? GROUP BY c.group_key, c.sub_cluster_id ), @@ -277,7 +277,7 @@ public class GroupPolygonService { LEFT JOIN %s r ON r.group_key = lg.group_key AND r.sub_cluster_id = lg.sub_cluster_id - AND r.last_evaluated_at >= lg.snapshot_time + AND r.last_evaluated_at >= lg.snapshot_time - INTERVAL '10 minutes' LEFT JOIN candidate_counts cc ON cc.group_key = lg.group_key AND cc.sub_cluster_id = lg.sub_cluster_id @@ -301,7 +301,7 @@ public class GroupPolygonService { JOIN latest_groups lg ON lg.group_key = c.group_key AND lg.sub_cluster_id = c.sub_cluster_id - AND c.observed_at >= lg.snapshot_time + AND c.observed_at >= lg.snapshot_time - INTERVAL '10 minutes' GROUP BY c.group_key, c.sub_cluster_id ) SELECT c.group_key, c.sub_cluster_id, c.candidate_mmsi, c.candidate_name,