namespace Admin.NET.Plugin.AiDOP.DataPlatform.S0Dim; /// /// dim 列的取值方式,决定 为该列生成哪种 SQL 表达式。 /// 除 外全部作用于 staging 的 raw_data JSON, /// 底层统一走 (已处理 JSON null → 字符串 'null'、ISO-T 时间、STRICT CAST)。 /// public enum S0DimValueKind { /// 取 staging 的物理列 s.tenant_id,不走 raw_data。租户身份的唯一来源。 TenantIdColumn, /// 可空字符串。 Str, /// /// 可空整数(SIGNED)。 /// /// 🔴 源列若是 MySQL 的 bit(1),绝不能用本 Kind(2026-09-07 实测): /// 对账两侧都走 IFNULL(CAST(expr AS CHAR), 哨兵),而 /// CAST(b'1' AS CHAR) 返回的是**裸字节** 0x01, /// dim 侧的 CAST(1 AS CHAR) 是字符 '1' = 0x31 —— 两者不等, /// 于是 source_chk ≠ dim_chk,每一轮刷新都会被阻断对账打回, /// 而数据本身其实是对的,排查时极易怀疑错方向。 /// /// 正确做法:bit(1)(其 Norm 是双层 /// CAST(CAST(… AS UNSIGNED) AS CHAR),能把 bit 正规化成 '1'/'0')。 /// 但要先确认该列**不会为 NULL** —— BoolTrue 的可辨识性守卫要求原值 /// ∈ {1,0,true,false},NULL 会让整行被过滤、行数对账 FAIL。 /// 两个条件都不满足时,本阶段的结论是**不物化该列**。 /// Int, /// 可空 DECIMAL(Precision, Scale)。 Dec, /// 秒级 datetime(源侧微秒被截断,与对账口径一致)。 DateTimeSec, /// /// 布尔判真,产出 1/0。 /// ⚠️ 会把 JSON null / 无法识别的值**静默判为 0**。 /// 为杜绝静默失真, 对本类型**强制追加可辨识性守卫** /// (原始值必须是 1/0/true/false 之一),不满足的行被过滤掉 → /// 触发 dim_count < stg_count → 对账 FAIL,问题被暴露而非被吞掉。 /// BoolTrue }