-- ============================================================================
-- astock-kg 因子插槽接口：只读视图（供 akg-factor-bridge 消费）
-- ----------------------------------------------------------------------------
-- 应用到 astock-kg 的 PostgreSQL（akg 库）：  psql "$AKG_PG_DSN" -f astock_kg_slot_views.sql
-- 只读投影、零新增计算；基座内部表可自由重构，只要这四个视图的列不变，桥不受影响。
-- 幂等：CREATE OR REPLACE。列/JSON 键均已从 astock-kg 代码核准（见每条注释出处）。
-- ============================================================================

-- 0) 覆盖池 universe = 全部 industry_pools 成员 ts_code 并集
--    （对齐 market_snapshot._pool_ts_codes；members 为 JSONB 数组，元素含 ts_code/name）
CREATE OR REPLACE VIEW v_factor_universe AS
SELECT DISTINCT m->>'ts_code' AS ts_code
FROM industry_pools p
CROSS JOIN LATERAL jsonb_array_elements(COALESCE(p.members, '[]'::jsonb)) AS m
WHERE m->>'ts_code' IS NOT NULL AND m->>'ts_code' <> '';

-- 1) 一致预期（供 upside）：consensus_daily 全 asof 行投影，桥按 trade_date 做 as-of。
--    列源：market_snapshot._CONSENSUS_DDL。
CREATE OR REPLACE VIEW v_factor_consensus AS
SELECT ts_code,
       asof_date,
       target_mid_avg,
       eps_med,
       np_med,
       n_orgs,
       n_reports_90d
FROM consensus_daily
WHERE target_mid_avg IS NOT NULL;

-- 2) 利好利空事件（供 event）：EVENT 断言投影。
--    ts_code 取【文档锚】documents.meta->>'company_ts_code'（公告单公司、100% 可靠；
--    claim_store 多处以此为公司锚），不用 claims.subject_id（抽取原始名/码、未解析）。
--    event_type / direction / scope 从 qualifiers 取，键名核自 pipeline._event_to_claim：
--      qualifiers.event_type（EVENT_TYPES 或 other）
--      qualifiers.direction  = 预增/预减（业绩预告必填；其余多为空）
--      qualifiers.scope      = 累计/单次（回购、增减持）
CREATE OR REPLACE VIEW v_factor_events AS
SELECT d.meta->>'company_ts_code'   AS ts_code,
       c.disclosure_date,
       c.qualifiers->>'event_type'  AS event_type,
       c.qualifiers->>'direction'   AS direction,
       c.qualifiers->>'scope'       AS scope,
       c.confidence,
       c.dedup_key
FROM claims c
JOIN documents d ON d.doc_id = c.doc_id
WHERE c.predicate = 'EVENT'
  AND d.meta->>'company_ts_code' IS NOT NULL;

-- 3) 板块传导（供 transmission）：transmission_candidates 的未动成员(quiet)摊平成每股一行。
--    一只股当日可能出现在多个候选（属多个目标环节）→ 多行，桥侧聚合（取最大 n_paths）。
--    列源：transmission._DDL（paths/quiet 均 JSONB，moved_ratio NUMERIC）。
CREATE OR REPLACE VIEW v_factor_transmission AS
SELECT t.scan_date,
       q->>'ts_code'                                    AS ts_code,
       jsonb_array_length(COALESCE(t.paths, '[]'::jsonb)) AS n_paths,   -- 指向该环节的传导路径数
       t.moved_ratio                                                     -- 该环节已动成员比例
FROM transmission_candidates t
CROSS JOIN LATERAL jsonb_array_elements(COALESCE(t.quiet, '[]'::jsonb)) AS q
WHERE q->>'ts_code' IS NOT NULL AND q->>'ts_code' <> '';
