| 123456789101112131415161718192021222324252627 |
- namespace Application.Helpers;
- /// <summary>
- /// 다중 엔드포인트 → 단일 테이블 백필 배치의 날짜별 적재 완전성 판정 (순수 로직, DB 비의존 — 테스트 가능).
- /// 기존의 "그 날짜에 아무 행이나 있으면 skip" 판정은 3개 유형(EtpType/BondMarket 등) 중 일부만 성공해도
- /// 그 날짜를 영구 skip → 나머지 유형이 영구 결손되는 문제가 있었다. 대신 "그 날짜에 기대되는 유형이 전부
- /// 존재해야 완전(=skip)" 으로 판정한다. 유형별 데이터 시작일(docs/KRX/readme.md) 이전 날짜는 해당 유형이
- /// 원천에 존재하지 않는 것이 정상이므로 기대 목록에서 제외한다 (과잉 재fetch 방지).
- /// </summary>
- public static class BackfillCompleteness
- {
- /// <param name="presentKinds">해당 날짜에 이미 적재되어 있는 유형들 (DISTINCT)</param>
- /// <param name="expected">배치가 수집하는 (유형, 데이터 시작일) 목록</param>
- /// <param name="day">판정 대상 날짜</param>
- /// <returns>day 기준 기대되는 모든 유형이 적재되어 있으면 true (= 백필 skip 가능)</returns>
- public static bool IsComplete<TKind>(IReadOnlyCollection<TKind> 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);
- }
- }
|