JsonKeyValueGenerater.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. namespace etoy
  2. {
  3. /// <summary>
  4. /// KeyValue表特殊,单独处理一套
  5. /// </summary>
  6. class JsonKeyValueGenerater : IGenerater
  7. {
  8. private JsonWriter _writer;
  9. private Dictionary<string, RuleCenterField> _fieldmap;
  10. /// <summary>
  11. /// KeyValue 字段数量
  12. /// </summary>
  13. private const int KV_FIELDS_COUNT = 4;
  14. private string[] _kv_keys =
  15. {
  16. RuleCenterJsonStructureDefine.KVTable_Key,
  17. RuleCenterJsonStructureDefine.KVTable_Value,
  18. RuleCenterJsonStructureDefine.KVTable_Type,
  19. RuleCenterJsonStructureDefine.KVTable_Description
  20. };
  21. private string[] _kv_values = new string[KV_FIELDS_COUNT];
  22. private int GetKeyValueMaxLength(string key, string msg)
  23. {
  24. var msglen = RuleCenterUtil.GetJsonStringLength(msg);
  25. return Math.Max(_fieldmap[key].len, msglen);
  26. }
  27. /// <summary>
  28. /// 初始化KeyValue表字段
  29. /// </summary>
  30. private void InitKeyValueFieldsMap()
  31. {
  32. for (int i = 0, len = _kv_keys.Length; i < len; i++)
  33. {
  34. var key = _kv_keys[i];
  35. _fieldmap.Add(key, new RuleCenterField { name = key, type = RuleCenterTypeDefine.Varchar });
  36. }
  37. }
  38. private void KeyValueRowsJsonGenerater(KeyValueRow row)
  39. {
  40. if (!row.IsServerField)
  41. return;
  42. _kv_values[0] = row.Key;
  43. _kv_values[1] = row.Value.ToInlayString();
  44. _kv_values[2] = RuleCenterUtil.ToRuleCenterType(row.Type, false);
  45. _kv_values[3] = row.Description.ToInlayString();
  46. _writer.Bracket();
  47. {
  48. _writer.EnumeratorToJson(_kv_keys, _kv_keys.Length, (index, _) =>
  49. {
  50. var key = _kv_keys[index];
  51. var value = _kv_values[index];
  52. _fieldmap[key].len = GetKeyValueMaxLength(key, value);
  53. _writer.AppendKey(key).Append(value);
  54. });
  55. }
  56. _writer.EndBracket();
  57. }
  58. private void KeyValueTalbeRowsGenerate(KeyValueTable table)
  59. {
  60. _writer.AppendKey(RuleCenterJsonStructureDefine.Table_Rows).NewLine().ArrayBracket().Indent();
  61. {
  62. var rows = table.Rows;
  63. InitKeyValueFieldsMap();
  64. _writer.EnumeratorToJson(rows, rows.Length, (_, row) =>
  65. {
  66. _writer.NewLine();
  67. KeyValueRowsJsonGenerater(row);
  68. });
  69. }
  70. _writer.Dedent().NewLine().EndArrayBracket();
  71. }
  72. private void TableGenerate(KeyValueTable table)
  73. {
  74. _fieldmap.Clear();
  75. _writer.Bracket().Indent().NewLine();
  76. {
  77. _writer.AppendKey(RuleCenterJsonStructureDefine.Table_Name).Append(table.Name);
  78. _writer.Dot().NewLine();
  79. KeyValueTalbeRowsGenerate(table);
  80. _writer.Dot().NewLine();
  81. _writer.OnFields(_fieldmap);
  82. }
  83. _writer.Dedent().NewLine().EndBracket();
  84. }
  85. public void Generate(Context context)
  86. {
  87. _fieldmap = new Dictionary<string, RuleCenterField>();
  88. var kvtables = context.Blackboard.KeyValueTables;
  89. _writer.EnumeratorToJson(kvtables, kvtables.Count, (_, table) =>
  90. {
  91. _writer.NewLine();
  92. TableGenerate(table);
  93. });
  94. }
  95. public JsonKeyValueGenerater(JsonWriter writer)
  96. {
  97. this._writer = writer;
  98. }
  99. }
  100. }