-- 初选矩阵提速：把「这条依据能推出哪几个潜在治疗标签」预先算好落库。
--
-- 此前矩阵每次开页面都现推：plan_reasons → 展开 evidence.factIds → 回查 patient_facts
-- （1567 万行 / 18 GB）。最忙的诊所一次摊三万多次随机查、372 MB I/O，
-- 而这一切的唯一产出就是这个字符串。
-- 本地实测（15,884 条 plan）：958 ms → 110 ms，磁盘读 119,861 → 0，24 格的数逐字未变。
--
-- ⚠️ **刻意可空**，三态有别：
--   NULL  = 还没算过（回填 / 新写入的行会被刷新任务捞走）
--   '{}'  = 算过了，这条依据推不出任何标签（K 码不在规则表里 / 年龄不落区间）
--   非空  = 标签集合
-- ⛔ 别加 NOT NULL DEFAULT '{}' —— 那样「没算过」和「算过是空」就分不开，
--    刷新任务再也找不到漏网的行，而漏了不会有任何报错。
-- AlterTable
ALTER TABLE "plan_reasons" ADD COLUMN "potential_labels" TEXT[];

-- 矩阵只关心「推得出标签」的那些依据；推不出的占比不低，跳过它们能少扫一截。
-- ⚠️ 用 IS NOT NULL 而不是 <> '{}'：后者会把「还没算过(NULL)」也排除在外，
--    而回填期间正需要能看见它们。
CREATE INDEX "plan_reasons_plan_id_potential_labels_idx"
  ON "plan_reasons" ("plan_id")
  WHERE "potential_labels" IS NOT NULL AND array_length("potential_labels", 1) > 0;
