20260722_105_data_research_elements.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Add versioned data-element governance and candidate decisions."""
  2. from alembic import op
  3. revision = "20260722_105"
  4. down_revision = "20260722_100"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE IF NOT EXISTS public.data_elements (
  11. uid UUID PRIMARY KEY,
  12. code VARCHAR(120) NOT NULL UNIQUE,
  13. current_version INTEGER NOT NULL DEFAULT 1,
  14. status VARCHAR(20) NOT NULL DEFAULT 'draft'
  15. CHECK (
  16. status IN (
  17. 'draft','in_review','published','deprecated','retired'
  18. )
  19. ),
  20. business_domain_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  21. created_by VARCHAR(100),
  22. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  23. updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
  24. );
  25. CREATE TABLE IF NOT EXISTS public.data_element_versions (
  26. uid UUID PRIMARY KEY,
  27. data_element_uid UUID NOT NULL
  28. REFERENCES public.data_elements(uid),
  29. version INTEGER NOT NULL,
  30. status VARCHAR(20) NOT NULL,
  31. snapshot JSONB NOT NULL,
  32. evidence_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  33. created_by VARCHAR(100),
  34. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  35. UNIQUE (data_element_uid, version)
  36. );
  37. CREATE TABLE IF NOT EXISTS public.candidate_decisions (
  38. uid UUID PRIMARY KEY,
  39. candidate_uid UUID NOT NULL
  40. REFERENCES public.extraction_candidates(uid),
  41. action VARCHAR(20) NOT NULL
  42. CHECK (action IN ('reuse','create','map','ignore')),
  43. data_element_uid UUID
  44. REFERENCES public.data_elements(uid),
  45. evidence_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  46. payload JSONB NOT NULL DEFAULT '{}'::jsonb,
  47. actor_uid VARCHAR(100),
  48. reason VARCHAR(1000),
  49. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  50. UNIQUE (candidate_uid)
  51. );
  52. CREATE INDEX IF NOT EXISTS idx_data_elements_status
  53. ON public.data_elements(status, updated_at);
  54. CREATE INDEX IF NOT EXISTS idx_data_element_versions_element
  55. ON public.data_element_versions(data_element_uid, version DESC);
  56. """
  57. )
  58. def downgrade() -> None:
  59. # Governance history is preserved during application rollback.
  60. pass