Files
windmill/backend/migrations/20260619170118_add_materialized_partition.up.sql

30 lines
1.5 KiB
SQL

-- Per-partition materialization state for managed `// materialize` assets.
-- One row per (asset, partition): the latest materialization of that slice.
-- Drives: the partition-status grid (CE observability), run-stale/gap
-- detection, and the EE backfill worklist (missing/failed partitions). The
-- `partition` column uses '' as the sentinel for an unpartitioned (whole-table)
-- materialization, since partition is part of the primary key and cannot be
-- NULL.
CREATE TYPE MATERIALIZATION_STATUS AS ENUM ('running', 'materialized', 'failed');
CREATE TABLE IF NOT EXISTS materialized_partition (
workspace_id VARCHAR(50) NOT NULL REFERENCES workspace(id) ON DELETE CASCADE ON UPDATE CASCADE,
asset_kind ASSET_KIND NOT NULL,
asset_path VARCHAR(255) NOT NULL,
partition TEXT NOT NULL DEFAULT '',
status MATERIALIZATION_STATUS NOT NULL,
-- DuckLake snapshot id produced by the write; NULL while running / on
-- failure. The pin that makes downstream reads reproducible.
snapshot_id BIGINT,
row_count BIGINT,
job_id UUID,
materialized_at TIMESTAMPTZ NOT NULL DEFAULT now(),
error TEXT,
PRIMARY KEY (workspace_id, asset_kind, asset_path, partition)
);
-- Backfill enumeration / grid "show only gaps": filter an asset's partitions
-- by status without scanning the whole table.
CREATE INDEX IF NOT EXISTS idx_materialized_partition_asset_status
ON materialized_partition (workspace_id, asset_kind, asset_path, status);