diff --git a/scripts/calibrate_ask.py b/scripts/calibrate_ask.py index 6ca8582..dba167a 100644 --- a/scripts/calibrate_ask.py +++ b/scripts/calibrate_ask.py @@ -104,21 +104,23 @@ def build_filters(args: argparse.Namespace) -> tuple[str, dict[str, Any]]: """공통 WHERE 절 SQL + 바인딩 파라미터. 조건 4가지: source, prompt_version, since, until. - None 인 항목은 IS NULL 로 무력화 (SQL CASE 회피, 단순 OR 패턴). + None 인 항목은 WHERE 에 포함하지 않음 (asyncpg 이 None param 의 타입 추론 실패 회피). """ - clauses = [ - "(:source IS NULL OR source = :source)", - "(:prompt_version IS NULL OR prompt_version = :prompt_version)", - "(:since IS NULL OR created_at >= CAST(:since AS TIMESTAMPTZ))", - "(:until IS NULL OR created_at < CAST(:until AS TIMESTAMPTZ))", - ] - params: dict[str, Any] = { - "source": args.source, - "prompt_version": args.prompt_version, - "since": args.since, - "until": args.until, - } - return " AND ".join(clauses), params + clauses: list[str] = [] + params: dict[str, Any] = {} + if args.source is not None: + clauses.append("source = :source") + params["source"] = args.source + if args.prompt_version is not None: + clauses.append("prompt_version = :prompt_version") + params["prompt_version"] = args.prompt_version + if args.since is not None: + clauses.append("created_at >= CAST(:since AS TIMESTAMPTZ)") + params["since"] = args.since + if args.until is not None: + clauses.append("created_at < CAST(:until AS TIMESTAMPTZ)") + params["until"] = args.until + return (" AND ".join(clauses) if clauses else "TRUE"), params # ─── eval split (id 해시) ────────────────────────────────