20260722_105_data_research_elements.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 (status IN ('draft','in_review','published','deprecated','retired')),
  16. business_domain_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  17. created_by VARCHAR(100),
  18. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  19. updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
  20. );
  21. CREATE TABLE IF NOT EXISTS public.data_element_versions (
  22. uid UUID PRIMARY KEY,
  23. data_element_uid UUID NOT NULL
  24. REFERENCES public.data_elements(uid),
  25. version INTEGER NOT NULL,
  26. status VARCHAR(20) NOT NULL,
  27. snapshot JSONB NOT NULL,
  28. evidence_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  29. created_by VARCHAR(100),
  30. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  31. UNIQUE (data_element_uid, version)
  32. );
  33. CREATE TABLE IF NOT EXISTS public.candidate_decisions (
  34. uid UUID PRIMARY KEY,
  35. candidate_uid UUID NOT NULL
  36. REFERENCES public.extraction_candidates(uid),
  37. action VARCHAR(20) NOT NULL
  38. CHECK (action IN ('reuse','create','map','ignore')),
  39. data_element_uid UUID
  40. REFERENCES public.data_elements(uid),
  41. evidence_uids JSONB NOT NULL DEFAULT '[]'::jsonb,
  42. payload JSONB NOT NULL DEFAULT '{}'::jsonb,
  43. actor_uid VARCHAR(100),
  44. reason VARCHAR(1000),
  45. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  46. UNIQUE (candidate_uid)
  47. );
  48. CREATE INDEX IF NOT EXISTS idx_data_elements_status
  49. ON public.data_elements(status, updated_at);
  50. CREATE INDEX IF NOT EXISTS idx_data_element_versions_element
  51. ON public.data_element_versions(data_element_uid, version DESC);
  52. """
  53. )
  54. def downgrade() -> None:
  55. # Governance history is preserved during application rollback.
  56. pass