namespace etoy
{
///
/// KeyValue表特殊,单独处理一套
///
class JsonKeyValueGenerater : IGenerater
{
private JsonWriter _writer;
private Dictionary _fieldmap;
///
/// KeyValue 字段数量
///
private const int KV_FIELDS_COUNT = 4;
private string[] _kv_keys =
{
RuleCenterJsonStructureDefine.KVTable_Key,
RuleCenterJsonStructureDefine.KVTable_Value,
RuleCenterJsonStructureDefine.KVTable_Type,
RuleCenterJsonStructureDefine.KVTable_Description
};
private string[] _kv_values = new string[KV_FIELDS_COUNT];
private int GetKeyValueMaxLength(string key, string msg)
{
var msglen = RuleCenterUtil.GetJsonStringLength(msg);
return Math.Max(_fieldmap[key].len, msglen);
}
///
/// 初始化KeyValue表字段
///
private void InitKeyValueFieldsMap()
{
for (int i = 0, len = _kv_keys.Length; i < len; i++)
{
var key = _kv_keys[i];
_fieldmap.Add(key, new RuleCenterField { name = key, type = RuleCenterTypeDefine.Varchar });
}
}
private void KeyValueRowsJsonGenerater(KeyValueRow row)
{
if (!row.IsServerField)
return;
_kv_values[0] = row.Key;
_kv_values[1] = row.Value.ToInlayString();
_kv_values[2] = RuleCenterUtil.ToRuleCenterType(row.Type, false);
_kv_values[3] = row.Description.ToInlayString();
_writer.Bracket();
{
_writer.EnumeratorToJson(_kv_keys, _kv_keys.Length, (index, _) =>
{
var key = _kv_keys[index];
var value = _kv_values[index];
_fieldmap[key].len = GetKeyValueMaxLength(key, value);
_writer.AppendKey(key).Append(value);
});
}
_writer.EndBracket();
}
private void KeyValueTalbeRowsGenerate(KeyValueTable table)
{
_writer.AppendKey(RuleCenterJsonStructureDefine.Table_Rows).NewLine().ArrayBracket().Indent();
{
var rows = table.Rows;
InitKeyValueFieldsMap();
_writer.EnumeratorToJson(rows, rows.Length, (_, row) =>
{
_writer.NewLine();
KeyValueRowsJsonGenerater(row);
});
}
_writer.Dedent().NewLine().EndArrayBracket();
}
private void TableGenerate(KeyValueTable table)
{
_fieldmap.Clear();
_writer.Bracket().Indent().NewLine();
{
_writer.AppendKey(RuleCenterJsonStructureDefine.Table_Name).Append(table.Name);
_writer.Dot().NewLine();
KeyValueTalbeRowsGenerate(table);
_writer.Dot().NewLine();
_writer.OnFields(_fieldmap);
}
_writer.Dedent().NewLine().EndBracket();
}
public void Generate(Context context)
{
_fieldmap = new Dictionary();
var kvtables = context.Blackboard.KeyValueTables;
_writer.EnumeratorToJson(kvtables, kvtables.Count, (_, table) =>
{
_writer.NewLine();
TableGenerate(table);
});
}
public JsonKeyValueGenerater(JsonWriter writer)
{
this._writer = writer;
}
}
}