"""안전 자료실 B-4 — licensed_restricted 단일 술어 (a안 U-2①, 모든 경로 공유 정의).

색인은 허용하되 restricted=true(구매 전자책·유료자료)의 verbatim span 이 RAG 증거·발행물
(검색/ask·digest·morning_briefing·study 풀이)에 들어가는 모든 경로를 구조적으로 차단.
경로마다 술어를 복붙하지 않고 이 한 정의를 공유 — 가드 누락/드리프트 방지
([[feedback_structural_integrity_over_path_discipline]]).
개인 파일 열람(GET /documents/{id}?download)은 a안상 허용 = 미적용.

두 표현(raw SQL / ORM)은 의미 동일: restricted 부재·false·extract_meta NULL = COALESCE 로
미제외(redistribute=false 여도 restricted 부재면 미제외 — redistribute≠restricted 가 핵심).
"""


def restricted_exclude_sql(alias: str = "") -> str:
    """raw text() 쿼리용 bare 술어('AND' 미포함). alias='' = 컬럼 직접 참조."""
    p = (alias + ".") if alias else ""
    return f"COALESCE({p}extract_meta -> 'license' ->> 'restricted', 'false') <> 'true'"


def restricted_exclude_orm():
    """SQLAlchemy ORM .where() 절 — restricted_exclude_sql 과 동일 의미(JSONB extract_meta)."""
    from sqlalchemy import func

    from models.document import Document

    return func.coalesce(
        Document.extract_meta["license"]["restricted"].astext, "false"
    ) != "true"
