/* * backfill 이 읽을 저널 구간을 정하는 판정. * * 조회 코드(`fill-dedupe.ts`)와 나눠 둔다 — 그쪽은 TypeORM entity 를 물어서 테스트 프로세스가 * 적재할 수 없다. 판정만 따로 두면 테스트가 가벼운 import 로 확인할 수 있다. */ import { factEventTime } from '../../engine/event-time.js' /** * 이 레코드들이 덮는 시각 구간 — 하나도 시각을 말하지 않으면 `undefined`. * * **구간을 못 정하면 채우지 않는다.** 저널 전체를 읽는 쪽으로 넓히지 않는다 — 그것이 필요한 * 상황이면 조회가 아니라 unique index 로 풀어야 한다. */ export function spanOf(records: readonly unknown[]): { from: Date; to: Date } | undefined { let lo = Number.POSITIVE_INFINITY let hi = Number.NEGATIVE_INFINITY for (const r of records) { const t = Date.parse(String(factEventTime(r) ?? '')) if (!Number.isFinite(t)) continue if (t < lo) lo = t if (t > hi) hi = t } if (!Number.isFinite(lo)) return undefined /* * 양쪽을 1초씩 넓힌다. 저장된 시각은 밀리초까지 있고 경계에서 같은 값이 부동소수로 갈릴 수 있다 — * 넓게 읽는 것은 기억이 조금 더 차는 것뿐이라 손해가 없고, 좁게 읽으면 그 사실이 다시 앉는다. */ return { from: new Date(lo - 1000), to: new Date(hi + 1000) } }