diff --git a/README.md b/README.md index 2927d43..f71ac52 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Luban适合有以下需求的开发者: - 支持数据标签。 可以选择导出符合要求的数据,发布正式数据时策划不必手动注释掉那些测试或者非正式数据了。 - 强大的数据校验能力。支持内建数据格式检查;支持ref表引用检查(策划不用担心填错id);支持path资源检查(策划不用担心填错资源路径)。 - 支持常量别名。策划不必再为诸如 升级丹 这样的道具手写具体道具id了。 -- 支持多种常见数据表模式。 one(单例表)、map(常规key-value表)、bmap(双键表) +- 支持多种常见数据表模式。 one(单例表)、map(常规key-value表) - 支持emmylua anntations。生成的lua包含符合emmylua 格式anntations信息。配合emmylua有良好的配置代码提示能力。 - 支持res资源标记。可以一键导出配置中引用的所有资源列表(icon,ui,assetbundle等等) - 生成代码良好模块化。 @@ -311,20 +311,6 @@ Luban适合有以下需求的开发者: ![multi_data](docs/images/examples/multi_02.png) -### 双主键表 -两个主键的表,以key1,key2为主键。 - -```xml - - - - - - - -``` - -![ex_91](docs/images/examples/ex_91.png) ### 单例表 @@ -713,8 +699,6 @@ return print(require("TbGlobal").name) -- 访问普通的 key-value 表 print(require("TbItem")[12].x1) - -- 访问 双键表 - print(require("TbTwoKey")[1][10].x8) ``` - C# 使用示例 @@ -726,11 +710,8 @@ return Console.WriteLine(tables.TbGlobal.Name); // 访问普通的 key-value 表 Console.WriteLine(tables.TbItem.Get(12).X1); - // 访问 双键表 - Console.WriteLine(tables.TbTwoKey.Get(1, 10).X8); // 支持 operator []用法 Console.WriteLine(tables.TbMail[1001].X2); - Console.WriteLine(tables.TbTwoKey[100, 1].X8); ``` - typescript 使用示例 @@ -742,8 +723,6 @@ return console.log(tables.TbGlobal.name) // 访问普通的 key-value 表 console.log(tables.TbItem.get(12).x1) - // 访问 双键表 - console.log(tables.TbTwoKey.get(1,10).x8) ``` - go 使用示例 @@ -757,8 +736,6 @@ return println(tables.TbGlobal.Name) // 访问普通的 key-value 表 println(tables.TbItem.Get(12).X1) - // 访问 双键表 - println(tables.TbTwoKey.Get(1, 10).X8) ``` - [更多语言的例子](docs/samples.md) diff --git a/config/Defines/test.xml b/config/Defines/test.xml index e77324e..812bbb3 100644 --- a/config/Defines/test.xml +++ b/config/Defines/test.xml @@ -100,9 +100,6 @@
普通表,不过数据从tbrole_datas目录递归读入,每个文件是一个记录 -
- - diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/LuaExportor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/LuaExportor.cs index dedab22..bab2c0e 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/LuaExportor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/LuaExportor.cs @@ -37,34 +37,6 @@ namespace Luban.Job.Cfg.DataVisitors result.Add("}"); } - public void ExportTableTwoKeyMap(DefTable t, List records, List result) - { - result.Add("return "); - result.Add("{"); - - var s = new StringBuilder(); - var ks = new StringBuilder(); - foreach (var g in records.GroupBy(r => r.Data.GetField(t.Index1))) - { - result.Add($"[{ToLuaCodeString(g.Key, t.Assembly, ks)}] ="); - result.Add("{"); - - foreach (Record r in g) - { - DBean d = r.Data; - s.Clear(); - s.Append($"[{ToLuaCodeString(d.GetField(t.Index2), t.Assembly, ks)}] = "); - Accept(d, t.Assembly, s); - s.Append(','); - result.Add(s.ToString()); - } - - result.Add("},"); - } - - result.Add("}"); - } - private string ToLuaCodeString(DType data, DefAssembly ass, StringBuilder b) { b.Clear(); diff --git a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs index a838d3a..8ef1d2a 100644 --- a/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs +++ b/src/Luban.Job.Cfg/Source/DataVisitors/ValidatorVisitor.cs @@ -37,11 +37,6 @@ namespace Luban.Job.Cfg.DataVisitors { _path.Push(data.Fields[keyIndex]); } - else if (table.IsTwoKeyMapTable) - { - _path.Push(data.Fields[keyIndex]); - _path.Push(data.Fields[table.IndexFieldIdIndex2]); - } Accept(data, ass); } } diff --git a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs index b15695d..6a9ecf5 100644 --- a/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs +++ b/src/Luban.Job.Cfg/Source/Defs/CfgDefLoader.cs @@ -200,28 +200,9 @@ namespace Luban.Job.Cfg.Defs mode = ETableMode.MAP; break; } - case "bmap": - { - if ((string.IsNullOrWhiteSpace(indexStr) || indexStr.Split(',').Length != 2)) - { - throw new Exception($"定义文件:{CurImportFile} table:{tableName} 是双键表,必须在index属性里指定2个key"); - } - mode = ETableMode.BMAP; - break; - } case "": { - // 当 mode 属性为空时, 智能根据 index 值推测表类型 - // 如果index为空或一个键,则为 MAP类型 - // 如果index为2个键,则为 BMAP类型 - var indexs = indexStr.Split(',').Select(s => s.Trim()).ToList(); - switch (indexs.Count) - { - case 0: - case 1: mode = ETableMode.MAP; break; - case 2: mode = ETableMode.BMAP; break; - default: throw new Exception($"定义文件:{CurImportFile} table:{tableName} 最多只能有两个 index"); - } + mode = ETableMode.MAP; break; } default: diff --git a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs index 54234ae..3acad01 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefAssembly.cs @@ -114,11 +114,6 @@ namespace Luban.Job.Cfg.Defs _recordsByTables[table.FullName] = new TableDataInfo(mainRecords, branchRecords); } - //public void SetDataTableMap(DefTable table, Dictionary recordMap) - //{ - // _recordsByTables[table.FullName].FinalRecordMap = recordMap; - //} - public List GetTableAllDataList(DefTable table) { return _recordsByTables[table.FullName].FinalRecords; diff --git a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs index 58ebba3..87e0de9 100644 --- a/src/Luban.Job.Cfg/Source/Defs/DefTable.cs +++ b/src/Luban.Job.Cfg/Source/Defs/DefTable.cs @@ -33,8 +33,6 @@ namespace Luban.Job.Cfg.Defs public bool IsOneValueTable => Mode == ETableMode.ONE; - public bool IsTwoKeyMapTable => Mode == ETableMode.BMAP; - public List InputFiles { get; } private readonly Dictionary> _branchInputFiles; @@ -49,16 +47,6 @@ namespace Luban.Job.Cfg.Defs public int IndexFieldIdIndex { get; private set; } - public string Index1 { get; private set; } - public TType KeyTType1 { get; private set; } - public DefField IndexField1 { get; private set; } - public int IndexFieldIdIndex1 { get; private set; } - - public string Index2 { get; private set; } - public TType KeyTType2 { get; private set; } - public DefField IndexField2 { get; private set; } - public int IndexFieldIdIndex2 { get; private set; } - public bool NeedExport => Assembly.NeedExport(this.Groups); public string OutputDataFile => $"{FullName}.bin"; @@ -91,7 +79,7 @@ namespace Luban.Job.Cfg.Defs { case ETableMode.ONE: { - KeyTType = KeyTType2 = null; + KeyTType = null; break; } case ETableMode.MAP: @@ -121,43 +109,6 @@ namespace Luban.Job.Cfg.Defs KeyTType = IndexField.CType; break; } - case ETableMode.BMAP: - { - string[] indexs = Index.Split(',').Where(k => !string.IsNullOrWhiteSpace(k)).ToArray(); - - if (indexs.Length != 2) - { - throw new Exception($"table:{FullName}是双键表,index 必须指定两个key"); - } - - { - Index1 = indexs[0]; - if (ValueTType.GetBeanAs().TryGetField(Index1, out var f, out var i)) - { - IndexField1 = f; - KeyTType = KeyTType1 = IndexField1.CType; - IndexFieldIdIndex1 = i; - } - else - { - throw new Exception($"table:{FullName} index:{Index} 字段不存在"); - } - } - { - Index2 = indexs[1]; - if (ValueTType.Bean.TryGetField(Index2, out var f, out var i)) - { - IndexField2 = (DefField)f; - KeyTType2 = IndexField2.CType; - IndexFieldIdIndex2 = i; - } - else - { - throw new Exception($"table:{FullName} index:{indexs[1]} 字段不存在"); - } - } - break; - } default: throw new Exception($"unknown mode:{Mode}"); } } diff --git a/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs index 97d7a46..172f904 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CppBinCodeRender.cs @@ -104,46 +104,7 @@ class {{name}} : public {{if parent_def_type}} {{parent_def_type.cpp_full_name}} class {{name}} { - {{~ if x.is_two_key_map_table ~}} - private: - std::unordered_map<{{cpp_define_type key_type1}}, std::vector<{{cpp_define_type value_type}}>> _dataListMap; - std::unordered_map<{{cpp_define_type key_type1}}, std::unordered_map<{{cpp_define_type key_type2}}, {{cpp_define_type value_type}}>> _dataMapMap; - std::vector<{{cpp_define_type value_type}}> _dataList; - - public: - - bool load(ByteBuf& _buf) - { - int n; - if (!_buf.readSize(n)) return false; - for(; n > 0 ; --n) - { - {{cpp_define_type value_type}} _v; - {{cpp_deserialize '_buf' '_v' value_type}} - _dataList.push_back(_v); - auto _key = _v->{{x.index_field1.cpp_style_name}}; - auto& list = _dataListMap[_key]; - list.push_back(_v); - auto& map = _dataMapMap[_key]; - map[_v->{{x.index_field2.cpp_style_name}}] = _v; - } - return true; - } - - const std::unordered_map<{{cpp_define_type key_type1}},std::vector<{{cpp_define_type value_type}}>>& getDataListMap() const { return _dataListMap; } - const std::unordered_map<{{cpp_define_type key_type1}}, std::unordered_map<{{cpp_define_type key_type2}}, {{cpp_define_type value_type}}>>& getDataMapMap() const {return _dataMapMap;} - const std::vector<{{cpp_define_type value_type}}>& getDataList() const { return _dataList; } - - const {{cpp_define_type value_type}} get({{cpp_define_type key_type1}} key1, {{cpp_define_type key_type2}} key2) const - { - auto it1 = _dataMapMap.find(key1); - if (it1 == _dataMapMap.end()) { return nullptr; } - auto it2 = it1->second.find(key2); - return it2 != it1->second.end() ? it2->second : nullptr; - } - - - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private: std::unordered_map<{{cpp_define_type key_type}}, {{cpp_define_type value_type}}> _dataMap; std::vector<{{cpp_define_type value_type}}> _dataList; diff --git a/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs index 7bbfd70..855f2b3 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsBinCodeRender.cs @@ -137,58 +137,7 @@ namespace {{x.namespace_with_top_module}} }} public sealed partial class {{name}} { - {{~ if x.is_two_key_map_table ~}} - private readonly Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>> _dataListMap; - private readonly Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>> _dataMapMap; - private readonly List<{{cs_define_type value_type}}> _dataList; - public {{name}}(ByteBuf _buf) - { - _dataListMap = new Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>>(); - _dataMapMap = new Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>>(); - _dataList = new List<{{cs_define_type value_type}}>(); - - for(int n = _buf.ReadSize() ; n > 0 ; --n) - { - {{cs_define_type value_type}} _v; - {{cs_deserialize '_buf' '_v' value_type}} - _dataList.Add(_v); - var _key = _v.{{x.index_field1.cs_style_name}}; - if (!_dataListMap.TryGetValue(_key, out var list)) - { - list = new List<{{cs_define_type value_type}}>(); - _dataListMap.Add(_key, list); - } - list.Add(_v); - if (!_dataMapMap.TryGetValue(_key, out var map)) - { - map = new Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>(); - _dataMapMap.Add(_key, map); - } - map.Add(_v.{{x.index_field2.cs_style_name}}, _v); - } - } - - public Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>> DataListMap => _dataListMap; - public Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>> DataMapMap => _dataMapMap; - public List<{{cs_define_type value_type}}> DataList => _dataList; - - {{if value_type.is_dynamic}} - public T GetOrDefaultAs({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) where T : {{cs_define_type value_type}} => _dataMapMap.TryGetValue(key1, out var m) && m.TryGetValue(key2, out var v) ? (T)v : null; - public T GetAs({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) where T : {{cs_define_type value_type}} => (T)_dataMapMap[key1][key2]; - {{end}} - public {{cs_define_type value_type}} GetOrDefault({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) => _dataMapMap.TryGetValue(key1, out var m) && m.TryGetValue(key2, out var v) ? v : null; - public {{cs_define_type value_type}} Get({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) => _dataMapMap[key1][key2]; - public {{cs_define_type value_type}} this[{{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2] => _dataMapMap[key1][key2]; - - public void Resolve(Dictionary _tables) - { - foreach(var v in _dataList) - { - v.Resolve(_tables); - } - OnResolveFinish(_tables); - } - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private readonly Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> _dataMap; private readonly List<{{cs_define_type value_type}}> _dataList; diff --git a/src/Luban.Job.Cfg/Source/Generate/CsJsonCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/CsJsonCodeRender.cs index 8ebd99c..3376c7f 100644 --- a/src/Luban.Job.Cfg/Source/Generate/CsJsonCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/CsJsonCodeRender.cs @@ -133,57 +133,7 @@ namespace {{x.namespace_with_top_module}} { public sealed partial class {{name}} { - {{~ if x.is_two_key_map_table ~}} - private readonly Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>> _dataListMap; - private readonly Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>> _dataMapMap; - private readonly List<{{cs_define_type value_type}}> _dataList; - public {{name}}(JsonElement _buf) - { - _dataListMap = new Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>>(); - _dataMapMap = new Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>>(); - _dataList = new List<{{cs_define_type value_type}}>(); - - foreach(JsonElement _row in _buf.EnumerateArray()) - { - var _v = {{cs_define_type value_type}}.Deserialize{{value_type.bean.name}}(_row); - _dataList.Add(_v); - var _key = _v.{{x.index_field1.cs_style_name}}; - if (!_dataListMap.TryGetValue(_key, out var list)) - { - list = new List<{{cs_define_type value_type}}>(); - _dataListMap.Add(_key, list); - } - list.Add(_v); - if (!_dataMapMap.TryGetValue(_key, out var map)) - { - map = new Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>(); - _dataMapMap.Add(_key, map); - } - map.Add(_v.{{x.index_field2.cs_style_name}}, _v); - } - } - - public Dictionary<{{cs_define_type key_type1}}, List<{{cs_define_type value_type}}>> DataListMap => _dataListMap; - public Dictionary<{{cs_define_type key_type1}}, Dictionary<{{cs_define_type key_type2}}, {{cs_define_type value_type}}>> DataMapMap => _dataMapMap; - public List<{{cs_define_type value_type}}> DataList => _dataList; - - {{if value_type.is_dynamic}} - public T GetOrDefaultAs({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) where T : {{cs_define_type value_type}} => _dataMapMap.TryGetValue(key1, out var m) && m.TryGetValue(key2, out var v) ? (T)v : null; - public T GetAs({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) where T : {{cs_define_type value_type}} => (T)_dataMapMap[key1][key2]; - {{end}} - public {{cs_define_type value_type}} GetOrDefault({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) => _dataMapMap.TryGetValue(key1, out var m) && m.TryGetValue(key2, out var v) ? v : null; - public {{cs_define_type value_type}} Get({{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2) => _dataMapMap[key1][key2]; - public {{cs_define_type value_type}} this[{{cs_define_type key_type1}} key1, {{cs_define_type key_type2}} key2] => _dataMapMap[key1][key2]; - - public void Resolve(Dictionary _tables) - { - foreach(var v in _dataList) - { - v.Resolve(_tables); - } - OnResolveFinish(_tables); - } - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private readonly Dictionary<{{cs_define_type key_type}}, {{cs_define_type value_type}}> _dataMap; private readonly List<{{cs_define_type value_type}}> _dataList; diff --git a/src/Luban.Job.Cfg/Source/Generate/GoCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/GoCodeRender.cs index 5d6fa5f..6d0b868 100644 --- a/src/Luban.Job.Cfg/Source/Generate/GoCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/GoCodeRender.cs @@ -153,70 +153,7 @@ package {{package}} import ""bright/serialization"" -{{if x.is_two_key_map_table}} - -type {{go_full_name}} struct { - _dataListMap map[{{go_define_type key_type1}}][]{{go_define_type value_type}} - _dataMapMap map[{{go_define_type key_type1}}]map[{{go_define_type key_type2}}]{{go_define_type value_type}} - _dataList []{{go_define_type value_type}} -} - -func New{{go_full_name}}(_buf *serialization.ByteBuf) (*{{go_full_name}}, error) { - if size, err := _buf.ReadSize() ; err != nil { - return nil, err - } else { - _dataList := make([]{{go_define_type value_type}}, 0, size) - _dataListMap := make(map[{{go_define_type key_type1}}][]{{go_define_type value_type}}) - _dataMapMap := make(map[{{go_define_type key_type1}}]map[{{go_define_type key_type2}}]{{go_define_type value_type}}) - - for i := 0 ; i < size ; i++ { - if _v, err2 := {{go_deserialize_type value_type '_buf'}}; err2 != nil { - return nil, err2 - } else { - _dataList = append(_dataList, _v) - - _dataMap := _dataMapMap[_v.{{index_field1.cs_style_name}}] - if _dataMap == nil { - _dataMap = make(map[{{go_define_type key_type2}}]{{go_define_type value_type}}) - _dataMapMap[_v.{{index_field1.cs_style_name}}] = _dataMap - } - _dataMap[_v.{{index_field2.cs_style_name}}] = _v - - - _dataList := _dataListMap[_v.{{index_field1.cs_style_name}}] - if _dataList == nil { - _dataList = make([]{{go_define_type value_type}}, 0) - } - _dataList = append(_dataList, _v) - _dataListMap[_v.{{index_field1.cs_style_name}}] = _dataList - } - } - return &{{go_full_name}}{_dataList:_dataList, _dataMapMap:_dataMapMap, _dataListMap:_dataListMap}, nil - } -} - -func (table *{{go_full_name}}) GetDataMapMap() map[{{go_define_type key_type1}}]map[{{go_define_type key_type2}}]{{go_define_type value_type}} { - return table._dataMapMap -} - -func (table *{{go_full_name}}) GetDataListMap() map[{{go_define_type key_type1}}][]{{go_define_type value_type}} { - return table._dataListMap -} - -func (table *{{go_full_name}}) GetDataList() []{{go_define_type value_type}} { - return table._dataList -} - -func (table *{{go_full_name}}) Get(key1 {{go_define_type key_type1}}, key2 {{go_define_type key_type2}}) {{go_define_type value_type}} { - if v , ok := table._dataMapMap[key1] ; ok { - return v[key2] - } else { - return nil - } -} - - -{{else if x.is_map_table }} +{{~if x.is_map_table~}} type {{go_full_name}} struct { _dataMap map[{{go_define_type key_type}}]{{go_define_type value_type}} _dataList []{{go_define_type value_type}} diff --git a/src/Luban.Job.Cfg/Source/Generate/JavaBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/JavaBinCodeRender.cs index b2dc26a..2575495 100644 --- a/src/Luban.Job.Cfg/Source/Generate/JavaBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/JavaBinCodeRender.cs @@ -163,48 +163,7 @@ import bright.serialization.*; public final class {{name}} { - {{~ if x.is_two_key_map_table ~}} - private final java.util.HashMap<{{java_box_define_type key_type1}},java.util.ArrayList<{{java_box_define_type value_type}}>> _dataListMap; - private final java.util.HashMap<{{java_box_define_type key_type1}}, java.util.HashMap<{{java_box_define_type key_type2}}, {{java_box_define_type value_type}}>> _dataMapMap; - private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; - - public {{name}}(ByteBuf _buf) - { - _dataListMap = new java.util.HashMap<{{java_box_define_type key_type1}},java.util.ArrayList<{{java_box_define_type value_type}}>>(); - _dataMapMap = new java.util.HashMap<{{java_box_define_type key_type1}}, java.util.HashMap<{{java_box_define_type key_type2}}, {{java_box_define_type value_type}}>>(); - _dataList = new java.util.ArrayList<{{java_box_define_type value_type}}>(); - - for(int n = _buf.readSize() ; n > 0 ; --n) - { - {{java_box_define_type value_type}} _v; - {{java_deserialize '_buf' '_v' value_type}} - _dataList.add(_v); - var _key = _v.{{x.index_field1.java_style_name}}; - var list = _dataListMap.computeIfAbsent(_key, k -> new java.util.ArrayList<>()); - list.add(_v); - var map = _dataMapMap.computeIfAbsent(_key, k -> new java.util.HashMap<>()); - map.put(_v.{{x.index_field2.java_style_name}}, _v); - } - } - - public java.util.HashMap<{{java_box_define_type key_type1}},java.util.ArrayList<{{java_box_define_type value_type}}>> getDataListMap() { return _dataListMap; } - public java.util.HashMap<{{java_box_define_type key_type1}}, java.util.HashMap<{{java_box_define_type key_type2}}, {{java_box_define_type value_type}}>> getDataMapMap() {return _dataMapMap;} - public java.util.ArrayList<{{java_box_define_type value_type}}> getDataList() { return _dataList; } - - {{if value_type.is_dynamic}} - @SuppressWarnings(""unchecked"") - public T getAs({{java_define_type key_type1}} key1, {{java_define_type key_type2}} key2) { return (T)_dataMapMap.get(key1).get(key2); } - {{end}} - public {{java_box_define_type value_type}} get({{java_define_type key_type1}} key1, {{java_define_type key_type2}} key2) { return _dataMapMap.get(key1).get(key2);} - - public void resolve(java.util.HashMap _tables) - { - for({{java_box_define_type value_type}} v : _dataList) - { - v.resolve(_tables); - } - } - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private final java.util.HashMap<{{java_box_define_type key_type}}, {{java_box_define_type value_type}}> _dataMap; private final java.util.ArrayList<{{java_box_define_type value_type}}> _dataList; diff --git a/src/Luban.Job.Cfg/Source/Generate/LuaRender.cs b/src/Luban.Job.Cfg/Source/Generate/LuaRender.cs index 16792f0..dc879f9 100644 --- a/src/Luban.Job.Cfg/Source/Generate/LuaRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/LuaRender.cs @@ -172,9 +172,7 @@ local function InitTypes(methods) local tables = { {{~for table in tables ~}} - {{~if table.is_two_key_map_table~}} - { name='{{table.name}}', file='{{table.output_data_file}}', mode='bmap', index1='{{table.index1}}', index2='{{table.index2}}', value_type='{{table.value_ttype.bean.full_name}}' }, - {{~else if table.is_map_table ~}} + {{~if table.is_map_table ~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.bean.full_name}}' }, {{~else~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.bean.full_name}}'}, @@ -245,9 +243,7 @@ beans['{{bean.full_name}}'] = local tables = { {{~for table in tables ~}} - {{~if table.is_two_key_map_table~}} - { name='{{table.name}}', file='{{table.output_data_file}}', mode='bmap', index1='{{table.index1}}', index2='{{table.index2}}', value_type='{{table.value_ttype.bean.full_name}}' }, - {{~else if table.is_map_table ~}} + {{~if table.is_map_table ~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='map', index='{{table.index}}', value_type='{{table.value_ttype.bean.full_name}}' }, {{~else~}} { name='{{table.name}}', file='{{table.output_data_file}}', mode='one', value_type='{{table.value_ttype.bean.full_name}}'}, diff --git a/src/Luban.Job.Cfg/Source/Generate/Python27JsonCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/Python27JsonCodeRender.cs index cd1bde2..7fc7503 100644 --- a/src/Luban.Job.Cfg/Source/Generate/Python27JsonCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/Python27JsonCodeRender.cs @@ -125,37 +125,7 @@ class {{name}} {{if parent_def_type}}({{parent_def_type.py_full_name}}){{end}}: }} class {{name}}: - {{~ if x.is_two_key_map_table ~}} - def __init__(self, _json_): - self._dataListMap = {} - self._dataMapMap = {} - self._dataList = [] - - for _json2_ in _json_: - {{py27_deserialize '_v' '_json2_' value_type}} - self._dataList.append(_v) - _key = _v.{{x.index_field1.py_style_name}} - list = self._dataListMap.get(_key) - if not list: - list = [] - self._dataListMap[_key] = list - list.append(_v) - - map = self._dataMapMap.get(_key) - if not map: - map = {} - self._dataMapMap[_key] = map - map[_v.{{x.index_field2.py_style_name}}] = _v - - def getDataListMap(self) : return self._dataListMap - def getDataMapMap(self) : return self._dataMapMap - def getDataList(self) : return self._dataList - - def get(self, key1, key2) : - m1 = self._dataMapMap.get(key1) - return m1.get(key2) if m1 else None - - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} def __init__(self, _json_ ): self._dataMap = {} diff --git a/src/Luban.Job.Cfg/Source/Generate/Python3JsonCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/Python3JsonCodeRender.cs index 4acc180..7d9da23 100644 --- a/src/Luban.Job.Cfg/Source/Generate/Python3JsonCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/Python3JsonCodeRender.cs @@ -125,37 +125,7 @@ class {{name}} {{if parent_def_type}}({{parent_def_type.py_full_name}}){{else if }} class {{name}}: - {{~ if x.is_two_key_map_table ~}} - def __init__(self, _json_): - self._dataListMap = {} - self._dataMapMap = {} - self._dataList = [] - - for _json2_ in _json_: - {{py3_deserialize '_v' '_json2_' value_type}} - self._dataList.append(_v) - _key = _v.{{x.index_field1.py_style_name}} - list = self._dataListMap.get(_key) - if not list: - list = [] - self._dataListMap[_key] = list - list.append(_v) - - map = self._dataMapMap.get(_key) - if not map: - map = {} - self._dataMapMap[_key] = map - map[_v.{{x.index_field2.py_style_name}}] = _v - - def getDataListMap(self) : return self._dataListMap - def getDataMapMap(self) : return self._dataMapMap - def getDataList(self) : return self._dataList - - def get(self, key1, key2) : - m1 = self._dataMapMap.get(key1) - return m1.get(key2) if m1 else None - - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} def __init__(self, _json_ ): self._dataMap = {} diff --git a/src/Luban.Job.Cfg/Source/Generate/TypeScriptBinCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/TypeScriptBinCodeRender.cs index 1712586..4b3c800 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TypeScriptBinCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TypeScriptBinCodeRender.cs @@ -99,49 +99,7 @@ export {{if x.is_abstract_type}} abstract {{end}} class {{name}} {{if parent_def }} {{x.typescript_namespace_begin}} export class {{name}}{ - {{~ if x.is_two_key_map_table ~}} - private _dataListMap: Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]> - private _dataMapMap: Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>> - private _dataList: {{ts_define_type value_type}}[] - - constructor(_buf_: Bright.Serialization.ByteBuf) { - this._dataListMap = new Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]>() - this._dataMapMap = new Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>>() - this._dataList = [] - - for(let n = _buf_.ReadInt(); n > 0 ; n--) { - let _v: {{ts_define_type value_type}} - {{ts_bin_constructor '_v' '_buf_' value_type}} - this._dataList.push(_v) - var _key = _v.{{x.index_field1.ts_style_name}} - let list: {{ts_define_type value_type}}[] = this._dataListMap.get(_key) - if (list == null) { - list = [] - this._dataListMap.set(_key, list) - } - list.push(_v) - - let map: Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}> = this._dataMapMap.get(_key) - if (map == null) { - map = new Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>() - this._dataMapMap.set(_key, map) - } - map.set(_v.{{x.index_field2.ts_style_name}}, _v) - } - } - - getDataListMap(): Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]> { return this._dataListMap } - getDataMapMap(): Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>> { return this._dataMapMap } - getDataList(): {{ts_define_type value_type}}[] { return this._dataList } - - get(key1: {{ts_define_type key_type1}}, key2: {{ts_define_type key_type2}}): {{ts_define_type value_type}} { return this._dataMapMap.get(key1).get(key2) } - - resolve(_tables: Map) { - for(var v of this._dataList) { - v.resolve(_tables) - } - } - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private _dataMap: Map<{{ts_define_type key_type}}, {{ts_define_type value_type}}> private _dataList: {{ts_define_type value_type}}[] diff --git a/src/Luban.Job.Cfg/Source/Generate/TypeScriptJsonCodeRender.cs b/src/Luban.Job.Cfg/Source/Generate/TypeScriptJsonCodeRender.cs index 4d61b96..26284f5 100644 --- a/src/Luban.Job.Cfg/Source/Generate/TypeScriptJsonCodeRender.cs +++ b/src/Luban.Job.Cfg/Source/Generate/TypeScriptJsonCodeRender.cs @@ -101,46 +101,7 @@ export {{if x.is_abstract_type}} abstract {{end}} class {{name}} {{if parent_def }} {{x.typescript_namespace_begin}} export class {{name}}{ - {{~ if x.is_two_key_map_table ~}} - private _dataListMap: Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]> - private _dataMapMap: Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>> - private _dataList: {{ts_define_type value_type}}[] - constructor(_json_: any) { - this._dataListMap = new Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]>() - this._dataMapMap = new Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>>() - this._dataList = [] - for(var _json2_ of _json_) { - let _v: {{ts_define_type value_type}} - {{ts_json_constructor '_v' '_json2_' value_type}} - this._dataList.push(_v) - var _key = _v.{{x.index_field1.ts_style_name}} - let list: {{ts_define_type value_type}}[] = this._dataListMap.get(_key) - if (list == null) { - list = [] - this._dataListMap.set(_key, list) - } - list.push(_v) - let map: Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}> = this._dataMapMap.get(_key) - if (map == null) { - map = new Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>() - this._dataMapMap.set(_key, map) - } - map.set(_v.{{x.index_field2.ts_style_name}}, _v) - } - } - - getDataListMap(): Map<{{ts_define_type key_type1}}, {{ts_define_type value_type}}[]> { return this._dataListMap; } - getDataMapMap(): Map<{{ts_define_type key_type1}}, Map<{{ts_define_type key_type2}}, {{ts_define_type value_type}}>> { return this._dataMapMap; } - getDataList(): {{ts_define_type value_type}}[] { return this._dataList; } - - get(key1: {{ts_define_type key_type1}}, key2: {{ts_define_type key_type2}}): {{ts_define_type value_type}} { return this._dataMapMap.get(key1).get(key2); } - - resolve(_tables: Map) { - for(var v of this._dataList) { - v.resolve(_tables) - } - } - {{~else if x.is_map_table ~}} + {{~if x.is_map_table ~}} private _dataMap: Map<{{ts_define_type key_type}}, {{ts_define_type value_type}}> private _dataList: {{ts_define_type value_type}}[] constructor(_json_: any) { diff --git a/src/Luban.Job.Cfg/Source/RawDefs/Table.cs b/src/Luban.Job.Cfg/Source/RawDefs/Table.cs index fe7ef88..9420e34 100644 --- a/src/Luban.Job.Cfg/Source/RawDefs/Table.cs +++ b/src/Luban.Job.Cfg/Source/RawDefs/Table.cs @@ -6,7 +6,6 @@ namespace Luban.Job.Cfg.RawDefs { ONE, MAP, - BMAP, //双主键 map } public class CfgInputFile diff --git a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs index 3b91cb5..7148c79 100644 --- a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs +++ b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs @@ -57,11 +57,6 @@ namespace Luban.Job.Cfg.Utils LuaExportor.Ins.ExportTableOneKeyMap(table, records, content); break; } - case ETableMode.BMAP: - { - LuaExportor.Ins.ExportTableTwoKeyMap(table, records, content); - break; - } default: { throw new NotSupportedException(); diff --git a/src/Luban.Job.Cfg/Source/ValidatorContext.cs b/src/Luban.Job.Cfg/Source/ValidatorContext.cs index 047ff06..d6140ea 100644 --- a/src/Luban.Job.Cfg/Source/ValidatorContext.cs +++ b/src/Luban.Job.Cfg/Source/ValidatorContext.cs @@ -247,54 +247,6 @@ namespace Luban.Job.Cfg mainRecordMap[key] = r; } } - break; - } - case ETableMode.BMAP: - { - var mainTwoKeyMap = new Dictionary<(DType, DType), Record>(); - foreach (Record r in mainRecords) - { - DType key1 = r.Data.Fields[table.IndexFieldIdIndex1]; - DType key2 = r.Data.Fields[table.IndexFieldIdIndex2]; - if (!mainTwoKeyMap.TryAdd((key1, key2), r)) - { - throw new Exception($@"配置表 {table.FullName} 主文件 主键字段:{table.Index} 主键值:({key1},{key2})重复. - 记录1 来自文件:{r.Source} - 记录2 来自文件:{mainTwoKeyMap[(key1, key2)].Source} -"); - } - // 目前不支持 双key索引检查,但支持主key索引检查. - // 所以至少塞入一个,让ref检查能通过 - mainRecordMap[key1] = r; - } - - if (branchRecords != null) - { - var branchTwoKeyMap = new Dictionary<(DType, DType), Record>(); - foreach (Record r in branchRecords) - { - DType key1 = r.Data.Fields[table.IndexFieldIdIndex1]; - DType key2 = r.Data.Fields[table.IndexFieldIdIndex2]; - if (!branchTwoKeyMap.TryAdd((key1, key2), r)) - { - throw new Exception($@"配置表 {table.FullName} 分支文件 主键字段:{table.Index} 主键值:({key1},{key2})重复. - 记录1 来自文件:{r.Source} - 记录2 来自文件:{branchTwoKeyMap[(key1, key2)].Source} -"); - } - if (mainTwoKeyMap.TryGetValue((key1, key2), out var old)) - { - s_logger.Debug("配置表 {} 分支文件 主键:({},{}) 覆盖 主文件记录", table.FullName, key1, key2); - mainRecords[old.Index] = r; - } - mainTwoKeyMap[(key1, key2)] = r; - // 目前不支持 双key索引检查,但支持主key索引检查. - // 所以至少塞入一个,让ref检查能通过 - mainRecordMap[key1] = r; - } - } - - break; } }