003_action_item_insight_source.sql 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. ALTER TABLE voc.analysis_run
  2. DROP CONSTRAINT IF EXISTS analysis_run_analysis_type_check;
  3. ALTER TABLE voc.analysis_run
  4. ADD CONSTRAINT analysis_run_analysis_type_check
  5. CHECK (analysis_type IN ('voice', 'pain_point', 'feature', 'scenario', 'risk', 'report', 'voc_insight'));
  6. ALTER TABLE voc.action_item
  7. ADD COLUMN IF NOT EXISTS source_insight_id text,
  8. ADD COLUMN IF NOT EXISTS evidence_ids jsonb NOT NULL DEFAULT '[]'::jsonb,
  9. ADD COLUMN IF NOT EXISTS validation_metric text NOT NULL DEFAULT '';
  10. ALTER TABLE voc.action_item
  11. DROP CONSTRAINT IF EXISTS action_item_evidence_ids_check;
  12. ALTER TABLE voc.action_item
  13. ADD CONSTRAINT action_item_evidence_ids_check
  14. CHECK (jsonb_typeof(evidence_ids) = 'array' AND jsonb_array_length(evidence_ids) <= 100);
  15. CREATE INDEX IF NOT EXISTS action_item_workspace_source_insight_idx
  16. ON voc.action_item (workspace_id, source_insight_id, id DESC)
  17. WHERE source_insight_id IS NOT NULL;
  18. CREATE OR REPLACE FUNCTION voc.validate_action_item_source_analysis()
  19. RETURNS trigger
  20. LANGUAGE plpgsql
  21. AS $$
  22. BEGIN
  23. IF NEW.source_analysis_id IS NULL THEN
  24. RETURN NEW;
  25. END IF;
  26. PERFORM 1
  27. FROM voc.analysis_run analysis
  28. WHERE analysis.id = NEW.source_analysis_id
  29. AND analysis.workspace_id = NEW.workspace_id
  30. AND analysis.analysis_type = 'voc_insight'
  31. AND analysis.status IN ('completed', 'partial');
  32. IF NOT FOUND THEN
  33. RAISE EXCEPTION USING
  34. ERRCODE = '23514',
  35. MESSAGE = 'action source analysis must be a completed or partial voc_insight run in the same workspace';
  36. END IF;
  37. RETURN NEW;
  38. END;
  39. $$;
  40. DROP TRIGGER IF EXISTS action_item_source_analysis_guard ON voc.action_item;
  41. CREATE TRIGGER action_item_source_analysis_guard
  42. BEFORE INSERT OR UPDATE OF source_analysis_id, workspace_id ON voc.action_item
  43. FOR EACH ROW
  44. EXECUTE FUNCTION voc.validate_action_item_source_analysis();