using System;
using System.Collections.Generic;
using System.Text;
namespace etoy
{
///
/// 规则中心辅助类
///
static class RuleCenterUtil
{
private static string _defatultSqlType = RuleCenterTypeDefine.Varchar;
private static Dictionary _typeMap = new Dictionary
{
{FieldTypeDefine.Boolean, RuleCenterTypeDefine.Tinyint},
{FieldTypeDefine.Int, RuleCenterTypeDefine.Int},
{FieldTypeDefine.Long, RuleCenterTypeDefine.Bigint},
{FieldTypeDefine.Float, RuleCenterTypeDefine.Double},
{FieldTypeDefine.Double, RuleCenterTypeDefine.Double},
{FieldTypeDefine.String, RuleCenterTypeDefine.Varchar},
};
///
/// 将系统类型转换成规则中心类型
///
///
///
public static string ToRuleCenterType(string systemType, bool repeated)
{
if (repeated) return RuleCenterTypeDefine.Longtext;
if (_typeMap.TryGetValue(systemType, out var sqltype))
return sqltype;
return _defatultSqlType;
}
///
/// 获取字符串字节数
///
///
///
public static int GetJsonStringLength(string str)
{
return Encoding.UTF8.GetByteCount(str);
}
///
/// 逐字段写入
///
///
///
public static void OnFields(this JsonWriter writer, Dictionary fieldMap)
{
writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields).NewLine().ArrayBracket().Indent();
{
writer.EnumeratorToJson(fieldMap, fieldMap.Count, (_, field) => {
writer.NewLine();
writer.OnSingleField(field.Value);
});
}
writer.Dedent().NewLine().EndArrayBracket();
}
///
/// 单个字段写入
///
///
public static void OnSingleField(this JsonWriter writer, RuleCenterField field)
{
writer.Bracket();
{
writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Name).Append(field.name).Dot();
writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Type).Append(field.type);
if (field.len >= 0)
{
writer.Dot();
writer.AppendKey(RuleCenterJsonStructureDefine.Table_Fields_Length)
.ArrayBracket().Append(field.len).EndArrayBracket();
}
}
writer.EndBracket();
}
///
/// 逐格写入
///
///
public static void OnCell(this JsonWriter writer, Cell cell, RuleCenterField field)
{
var value = cell.Value;
if (cell.FieldInfo.FieldType == FieldTypeDefine.String)
{
value = cell.Value.ToInlayString();
writer.AppendKey(cell.FieldInfo.FieldName).Append(value);
}
else
{
writer.AppendKey(cell.FieldInfo.FieldName).AppendForce(value);
}
if (field.type == RuleCenterTypeDefine.Varchar)
field.len = Math.Max(field.len, RuleCenterUtil.GetJsonStringLength(value));
}
///
/// 单行写入
///
///
public static void OnSingleRow(this JsonWriter writer, Row row, Dictionary fieldsmap)
{
// 去除对规则中心无用属性
var cells = row.Cells.FindAll((cell) => { return fieldsmap.ContainsKey(cell.FieldInfo.FieldName); });
writer.Bracket();
{
writer.EnumeratorToJson(cells, cells.Count, (_, cell) =>
{
writer.OnCell(cell, fieldsmap[cell.FieldInfo.FieldName]);
});
}
writer.EndBracket();
}
///
/// 逐行写入
///
///
public static void OnRows(this JsonWriter writer, List rows, Dictionary fieldsmap)
{
writer.AppendKey(RuleCenterJsonStructureDefine.Table_Rows).NewLine().ArrayBracket().Indent();
{
// 需上传至服务端属性都为0的话,就不管
if (fieldsmap.Count > 0)
{
writer.EnumeratorToJson(rows, rows.Count, (_, row) =>
{
writer.NewLine();
writer.OnSingleRow(row, fieldsmap);
});
}
}
writer.Dedent().NewLine().EndArrayBracket();
}
}
}