Skip to content

[warehouse][models] 분석 모델·뷰를 선언하고 고정 입력 snapshot으로 재계산·게시한다 #2868

Description

@kang-heewon

Priority / baseline

P2. 2026-09-22, trunk@7dc3a10fb4bea30b667275e316b6e79971dde6c8.

Purpose / evidence

원시 fact에서 일별 현금 수납/검색 지표 같은 재사용 가능한 분석 모델을 만들되 query-time metric 정의와 물리 집계를 혼동하지 않는다.
현재 metrics 계산기, #2856 모델·#2862 연산/지표·#2859 graph를 확장한다. DB-native view/materialization은 provider가 실행한다. 새 dbt/SQL optimizer·scheduler를 만들지 않는다.

Scope / declaration

defineModel은 id/version, input dataset/column refs, output schema/grain, query expression 또는 등록 native SQL, materialization=view|table|partition-replace, source/quality/retention policy를 선언한다.

  1. 기본 표현식은 [metrics][warehouse] 지표·등록 조회·검증 보고서의 공통 읽기 서비스를 제공하고 고정 snapshot에서 계산한다 #2862 검증된 연산을 재사용한다. 모델 output은 실제 validator·row codec·warehouse table과 일치한다. 타입 AST와 실행 SQL을 두 군데서 수동 관리하지 않는다.
  2. SQL escape hatch는 code-reviewed dialect·parameter schema·declared dependencies·output/grain/권한을 필수로 갖는다. 문자열 정규식으로 SELECT처럼 보이면 안전하다고 하지 않는다. 신뢰된 executor+read-only role/제한된 write target을 사용하고 브라우저/LLM SQL 등록은 거절한다.
  3. view가 참조하는 input SnapshotSet을 query context에서 고정하거나 generation별 native view로 묶는다. 그냥 current view를 읽으면서 pinned report라고 하지 않는다. 실제 snapshot 보장 불가면 capability unavailable이다.
  4. materialized 모델은 고정 input snapshots에서 별도 candidate를 만들고 검증 후 publish한다. pipeline/definition·input revision이 바뀌면 invalidated/stale이다. execution completed만으로 ready가 되지 않는다.
  5. partition-replace는 변경된 입력이 영향을 주는 partition mapping을 명시한다. dependency를 알 수 없는 변환은 전체 refresh 또는 수동 승인 필요로 표시하며 임의 부분 재계산을 하지 않는다. daily distinct/ratio/percentile를 잘못 합해 상위 집계를 만들지 않는다.
  6. incremental view는 첫 기본값이 아니다. 원천 replay·정정·삭제·dimension 오른쪽 변경이 재계산되지 않는 경로는 불완전 상태로 남기고 기존 적재 순간 합산을 정답으로 고정하지 않는다.
  7. many-to-one dimension join은 #2865의 cardinality 검증을 재사용한다. cross-fact/cross-provider 자동 join은 지원하지 않고 같은 grain의 중간 모델이나 명시한 bounded 결합을 요구한다.
  8. 기존 dbt/external model은 read-only ref로 등록하며 Croco가 schema/migration owner를 빼앗지 않는다. Inspector에 dependencies/input revisions/materialization status·오류·마지막 성공을 제공한다. 삭제/권한 epoch를 파생 결과/캐시에 전파한다.

Acceptance criteria

  • capture→통화별 일간 합계 모델→metric이 실제 PG에서 원시 기준과 일치한다.
  • 입력 정정/재전송/삭제와 transform 변경이 새 revision/재계산으로 반영되고 구 snapshot을 몰래 바꾸지 않는다.
  • DAG cycle·missing field·unsupported SQL dialect·wrong output grain·join fan-out을 거절한다.
  • view/table 두 경로의 snapshot semantics와 stale 상태를 실제 query에서 검증한다.
  • 외부 소유 모델에 DDL을 실행하지 않고 임의 SQL/tool·credential 반출을 차단한다.

Dependencies / validation / completion

#2856/#2845/#2857/#2859/#2862가 선행, temporal relation 사용 시 #2865가 선행이다. CH native materialization은 #2864 지원 이후 동일 conformance를 붙인다. 아직 없는 provider를 mock 지원으로 선언하지 않는다.
AGENTS.md 확인 후 별도 브랜치를 만든다. 실제 PG view/table/partition generation·input revision/fault injection·reference aggregate·negative type/보안·Inspector/API 테스트·관련 test/typecheck/build·docs/public API/catalog·pnpm check를 수행한다. changeset·실제 예제·갱신/정정 한계를 포함해 커밋하고 브랜치/커밋·검증 결과를 보고한다. trunk 직접 push·수동 bump·publish·운영 materialization/유료 scan/evidence 수집 금지.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Priority 2 issuefeatureProduct feature or roadmap capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions