namespace Application.Helpers; /// /// 다중 엔드포인트 → 단일 테이블 백필 배치의 날짜별 적재 완전성 판정 (순수 로직, DB 비의존 — 테스트 가능). /// 기존의 "그 날짜에 아무 행이나 있으면 skip" 판정은 3개 유형(EtpType/BondMarket 등) 중 일부만 성공해도 /// 그 날짜를 영구 skip → 나머지 유형이 영구 결손되는 문제가 있었다. 대신 "그 날짜에 기대되는 유형이 전부 /// 존재해야 완전(=skip)" 으로 판정한다. 유형별 데이터 시작일(docs/KRX/readme.md) 이전 날짜는 해당 유형이 /// 원천에 존재하지 않는 것이 정상이므로 기대 목록에서 제외한다 (과잉 재fetch 방지). /// public static class BackfillCompleteness { /// 해당 날짜에 이미 적재되어 있는 유형들 (DISTINCT) /// 배치가 수집하는 (유형, 데이터 시작일) 목록 /// 판정 대상 날짜 /// day 기준 기대되는 모든 유형이 적재되어 있으면 true (= 백필 skip 가능) public static bool IsComplete(IReadOnlyCollection presentKinds, IReadOnlyList<(TKind Kind, DateOnly DataStartDate)> expected, DateOnly day) where TKind : struct { var required = expected.Where(c => day >= c.DataStartDate).Select(c => c.Kind).ToList(); if (required.Count == 0) { // 모든 유형의 데이터 시작일 이전 — 수집할 것이 없으므로 완전 취급 (fetch 낭비 방지) return true; } return required.All(presentKinds.Contains); } }