BackfillCompleteness.cs 1.7 KB

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