S0DimResults.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. namespace Admin.NET.Plugin.AiDOP.DataPlatform.S0Dim;
  2. /// <summary>业务键集合三层等价的差集计数。全部为 0 才算通过。</summary>
  3. public sealed class S0DimBizKeyDiff
  4. {
  5. /// <summary>source 有而 stg 没有。</summary>
  6. public int SourceMinusStaging { get; set; }
  7. /// <summary>stg 有而 source 没有。</summary>
  8. public int StagingMinusSource { get; set; }
  9. /// <summary>stg 有而 dim 没有。</summary>
  10. public int StagingMinusDim { get; set; }
  11. /// <summary>dim 有而 stg 没有。</summary>
  12. public int DimMinusStaging { get; set; }
  13. /// <summary>四个方向是否全为 0。</summary>
  14. public bool IsEqual => SourceMinusStaging == 0 && StagingMinusSource == 0
  15. && StagingMinusDim == 0 && DimMinusStaging == 0;
  16. }
  17. /// <summary>某一层业务键的质量(重复 / 空值)。</summary>
  18. public sealed class S0DimBizKeyQuality
  19. {
  20. /// <summary>层名:source / staging / dim。</summary>
  21. public string Layer { get; set; } = "";
  22. /// <summary>总行数。</summary>
  23. public int Total { get; set; }
  24. /// <summary>去重后行数。</summary>
  25. public int Distinct { get; set; }
  26. /// <summary>空业务键行数(stg 侧出现即意味着 biz_key_expr 回落到了 source_row_id)。</summary>
  27. public int Blank { get; set; }
  28. /// <summary>无重复且无空值。</summary>
  29. public bool IsClean => Total == Distinct && Blank == 0;
  30. }
  31. /// <summary>单个维度的对账结果。</summary>
  32. public sealed class S0DimReconcileResult
  33. {
  34. /// <summary>维度 Key。</summary>
  35. public string Key { get; set; } = "";
  36. /// <summary>租户。</summary>
  37. public long TenantId { get; set; }
  38. /// <summary>本轮批次(只读对账时可能为 null)。</summary>
  39. public string? BatchId { get; set; }
  40. /// <summary>源表行数(按租户)。</summary>
  41. public int SourceCount { get; set; }
  42. /// <summary>staging 行数(四段谓词)。</summary>
  43. public int StagingCount { get; set; }
  44. /// <summary>dim 行数(按租户)。</summary>
  45. public int DimCount { get; set; }
  46. /// <summary>源表中无法归属租户的行(整条链路不可见,WARN)。</summary>
  47. public int SourceUntenanted { get; set; }
  48. /// <summary>dim 中不属于本批的残留行(FULL Replace 后必须为 0)。</summary>
  49. public int DimBatchImpurity { get; set; }
  50. /// <summary>业务键集合差集。</summary>
  51. public S0DimBizKeyDiff BizKeyDiff { get; set; } = new();
  52. /// <summary>三层业务键质量。</summary>
  53. public List<S0DimBizKeyQuality> BizKeyQuality { get; set; } = [];
  54. /// <summary>源侧属性校验和。</summary>
  55. public string SourceChecksum { get; set; } = "0";
  56. /// <summary>dim 侧属性校验和。</summary>
  57. public string DimChecksum { get; set; } = "0";
  58. /// <summary>dim 业务键重复组数。</summary>
  59. public int DimDuplicateBizKeys { get; set; }
  60. /// <summary>镜像唯一性违例组数(未声明时为 -1 表示不适用)。</summary>
  61. public int MirrorUniqueViolations { get; set; } = -1;
  62. /// <summary>
  63. /// 孤儿子行**真实总数**(WARN,不阻断;未声明父维度时为 0)。
  64. /// 与 <see cref="OrphanChildren"/> 不同:后者受 <c>OrphanSampleLimit</c> 截断,只是样本。
  65. /// </summary>
  66. public int OrphanChildCount { get; set; }
  67. /// <summary>孤儿子行业务键**样本**(最多 <c>OrphanSampleLimit</c> 条)。总数看 <see cref="OrphanChildCount"/>。</summary>
  68. public List<string> OrphanChildren { get; set; } = [];
  69. /// <summary>阻断级失败原因(为空表示通过)。</summary>
  70. public List<string> Failures { get; set; } = [];
  71. /// <summary>告警(不阻断)。</summary>
  72. public List<string> Warnings { get; set; } = [];
  73. /// <summary>无阻断级失败。</summary>
  74. public bool IsPass => Failures.Count == 0;
  75. }
  76. /// <summary>单个维度的物化结果。</summary>
  77. public sealed class S0DimMaterializeResult
  78. {
  79. /// <summary>维度 Key。</summary>
  80. public string Key { get; set; } = "";
  81. /// <summary>租户。</summary>
  82. public long TenantId { get; set; }
  83. /// <summary>批次。</summary>
  84. public string BatchId { get; set; } = "";
  85. /// <summary>purge 掉的 staging 行数。</summary>
  86. public int StagingPurged { get; set; }
  87. /// <summary>本批拉取到的源行数。</summary>
  88. public int SourcePulled { get; set; }
  89. /// <summary>本批写入 staging 的行数。</summary>
  90. public int StagingWritten { get; set; }
  91. /// <summary>写入 dim 的行数。</summary>
  92. public int DimRows { get; set; }
  93. /// <summary>对账结果。</summary>
  94. public S0DimReconcileResult? Reconcile { get; set; }
  95. /// <summary>SUCCESS / FAILED。</summary>
  96. public string Status { get; set; } = "SUCCESS";
  97. /// <summary>失败信息。</summary>
  98. public string? Error { get; set; }
  99. }
  100. /// <summary>一次刷新(可含多个维度)的整体结果。</summary>
  101. public sealed class S0DimRefreshResult
  102. {
  103. /// <summary>批次(同时是 stg/dim 的 sync_batch_id 与 run log 的 batch_id)。</summary>
  104. public string BatchId { get; set; } = "";
  105. /// <summary>租户。</summary>
  106. public long TenantId { get; set; }
  107. /// <summary>SUCCESS / SUCCESS_WITH_WARNING / FAILED。</summary>
  108. public string Status { get; set; } = "SUCCESS";
  109. /// <summary>逐维度结果。</summary>
  110. public List<S0DimMaterializeResult> Items { get; set; } = [];
  111. /// <summary>耗时(毫秒)。</summary>
  112. public int DurationMs { get; set; }
  113. /// <summary>run log 主键。</summary>
  114. public long RunLogId { get; set; }
  115. }