From fdd2ca28ca5507800b606aa1c5fb4ec4cd42a2a9 Mon Sep 17 00:00:00 2001 From: yemobai <546307885@qq.com> Date: Wed, 4 Nov 2020 23:56:06 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=A7=A3=E5=86=B3DataBase=E5=8F=AA?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E4=B8=AARead=E8=8A=82=E7=82=B9=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=94=E6=B2=A1=E6=9C=89=E5=86=99weight?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=9D=83=E9=87=8D?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=87=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E5=90=8C=E6=97=B6=E5=9C=A8build=20xmlConfig?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=BC=BA=E5=88=B6=E9=AA=8C=E8=AF=81Read?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E6=98=AF=E5=90=A6=E5=86=99=E4=BA=86Weight?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=BD=93Read=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=A4=A7=E4=BA=8E2=E6=97=B6=EF=BC=8C=E5=85=B6=E4=B8=AD?= =?UTF-8?q?=E4=B8=80=E4=B8=AAread=E8=8A=82=E7=82=B9=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=86=99weight=E5=B1=9E=E6=80=A7=EF=BC=8C=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=8A=9B=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigBuilder/XmlConfigLoaderTest.cs | 14 ++++ src/SmartSql.Test.Unit/SmartSqlMapConfig.xml | 2 +- .../ConfigBuilder/XmlConfigBuilder.cs | 78 ++++++++++--------- src/SmartSql/Utils/DictionaryExtensions.cs | 7 ++ src/SmartSql/Utils/WeightFilter.cs | 12 ++- 5 files changed, 76 insertions(+), 37 deletions(-) diff --git a/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs b/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs index 8059b757..447020ff 100644 --- a/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs +++ b/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using SmartSql.ConfigBuilder; +using SmartSql.Exceptions; using Xunit; namespace SmartSql.Test.Unit.ConfigBuilder @@ -14,5 +15,18 @@ public void Load() var configLoader = new XmlConfigBuilder(ResourceType.File, "SmartSqlMapConfig.xml"); var config = configLoader.Build(); } + [Fact] + public void LoadFailTest() + { + try + { + var configLoader = new XmlConfigBuilder(ResourceType.File, "SmartSqlMapConfig.xml"); + var config = configLoader.Build(); + } + catch (SmartSqlException ex) + { + Assert.StartsWith( "Read Nodes must have Weight attribute",ex.Message); + } + } } } diff --git a/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml b/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml index bb0f6cad..558de765 100644 --- a/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml +++ b/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml @@ -53,7 +53,7 @@ - + diff --git a/src/SmartSql/ConfigBuilder/XmlConfigBuilder.cs b/src/SmartSql/ConfigBuilder/XmlConfigBuilder.cs index 605c0fc5..156bffe2 100644 --- a/src/SmartSql/ConfigBuilder/XmlConfigBuilder.cs +++ b/src/SmartSql/ConfigBuilder/XmlConfigBuilder.cs @@ -28,7 +28,7 @@ public class XmlConfigBuilder : AbstractConfigBuilder private readonly IWordsConverterBuilder _wordsConverterBuilder = new WordsConverterBuilder(); private readonly ITokenizerBuilder _tokenizerBuilder = new TokenizerBuilder(); - + public XmlConfigBuilder(ResourceType resourceType, string resourcePath, ILoggerFactory loggerFactory = null) { _resourceType = resourceType; @@ -153,12 +153,8 @@ protected override void BuildDatabase() database.Write.DbProvider = database.DbProvider; var readDataSourceNodes = databaseNode.SelectNodes($"{CONFIG_PREFIX}:Read", XmlNsManager); if (readDataSourceNodes == null) return; - foreach (XmlNode readNode in readDataSourceNodes) - { - var readDb = ParseReadDataSource(readNode); - readDb.DbProvider = database.DbProvider; - database.Reads.Add(readDb.Name, readDb); - } + var readDataSources = this.ParseReadDataSource(readDataSourceNodes, database.DbProvider); + database.Reads.AddRange(readDataSources); } private DbProvider ParseDbProvider(XmlNode dbProviderNode) @@ -226,34 +222,46 @@ private WriteDataSource ParseWriteDataSource(XmlNode writeDataSourceNode) { writeDataSource.ConnectionString = connectionString; } - + return writeDataSource; } - private ReadDataSource ParseReadDataSource(XmlNode readDataSourceNode) + private IDictionary ParseReadDataSource(XmlNodeList readDataSourceNodes, DbProvider dbProvider) { - if (readDataSourceNode == null) - { - throw new SmartSqlException("ReadDataSource can not be null."); - } - var readDataSource = new ReadDataSource(); - if (readDataSourceNode.Attributes.TryGetValueAsString(nameof(ReadDataSource.Name), out string name, SmartSqlConfig.Properties) - ) - { - readDataSource.Name = name; - } - if (readDataSourceNode.Attributes.TryGetValueAsString(nameof(ReadDataSource.ConnectionString), out string connectionString, SmartSqlConfig.Properties) - ) - { - readDataSource.ConnectionString = connectionString; - } - if (readDataSourceNode.Attributes.TryGetValueAsInt32(nameof(ReadDataSource.Weight), out int weight, SmartSqlConfig.Properties) - ) - { - readDataSource.Weight = weight; + var readDataSources = new Dictionary(); + var s = new List(); + foreach (XmlNode readDataSourceNode in readDataSourceNodes) + { + + var readDataSource = new ReadDataSource(); + if (readDataSourceNode.Attributes.TryGetValueAsString(nameof(ReadDataSource.Name), out string name, SmartSqlConfig.Properties) ) + { + readDataSource.Name = name; + } + else + { + throw new SmartSqlException($"Read Nodes must have Name attribute"); + } + if (readDataSourceNode.Attributes.TryGetValueAsString(nameof(ReadDataSource.ConnectionString), out string connectionString, SmartSqlConfig.Properties) ) + { + readDataSource.ConnectionString = connectionString; + } + if (readDataSourceNode.Attributes.TryGetValueAsInt32(nameof(ReadDataSource.Weight), out int weight, SmartSqlConfig.Properties) ) + { + readDataSource.Weight = weight; + } + else + { + if (readDataSourceNodes.Count > 1) + { + throw new SmartSqlException($"Read Nodes must have Weight attribute,Name is {readDataSource.Name}"); + } + } + readDataSource.DbProvider = dbProvider; + readDataSources.Add(readDataSource.Name, readDataSource); } - - return readDataSource; + return readDataSources; } + #endregion #region 3. TypeHandlers protected override void BuildTypeHandlers() @@ -414,7 +422,7 @@ private void BuildAutoConverter(XmlNode autoConverterNode) var wordsConverter = BuildWordsConverter(wordsConverterNode); var autoConverter = new AutoConverter.AutoConverter(converterName, tokenizer, wordsConverter); - + SmartSqlConfig.AutoConverters.Add(autoConverter.Name, autoConverter); if (isDefault) { @@ -431,7 +439,7 @@ private ITokenizer BuildTokenizer(XmlNode tokenizerNode) var properties = ParseProperties(tokenizerNode); return _tokenizerBuilder.Build(tokenizerName, properties); } - + private IWordsConverter BuildWordsConverter(XmlNode wordsConverterNode) { if (!wordsConverterNode.Attributes.TryGetValueAsString("Name", out String wordsConverterName, SmartSqlConfig.Properties)) @@ -441,10 +449,10 @@ private IWordsConverter BuildWordsConverter(XmlNode wordsConverterNode) var properties = ParseProperties(wordsConverterNode); return _wordsConverterBuilder.Build(wordsConverterName, properties); } - + #endregion - - + + private IDictionary ParseProperties(XmlNode parentNode) { var parametersNode = parentNode.SelectSingleNode($"{CONFIG_PREFIX}:Properties", XmlNsManager); diff --git a/src/SmartSql/Utils/DictionaryExtensions.cs b/src/SmartSql/Utils/DictionaryExtensions.cs index db33da1e..3409930e 100644 --- a/src/SmartSql/Utils/DictionaryExtensions.cs +++ b/src/SmartSql/Utils/DictionaryExtensions.cs @@ -39,6 +39,13 @@ public static void EnsureValue(this IDictionary(this IDictionary dic, IDictionary collection) + { + foreach(var item in collection) + { + dic.Add(item); + } + } } } diff --git a/src/SmartSql/Utils/WeightFilter.cs b/src/SmartSql/Utils/WeightFilter.cs index 94d0e048..ad543ac9 100644 --- a/src/SmartSql/Utils/WeightFilter.cs +++ b/src/SmartSql/Utils/WeightFilter.cs @@ -11,6 +11,7 @@ namespace SmartSql.Utils /// public class WeightFilter { + /// /// 选举权重源 /// @@ -20,7 +21,16 @@ public WeightSource Elect(IEnumerable inWeightSources) { var random = new Random((int)Stopwatch.GetTimestamp()); var weightSources = inWeightSources.ToList(); - int totalWeight = weightSources.Sum(source => source.Weight); + int totalWeight = 0; + if (weightSources.Count ==1) + { + return weightSources[0]; + } + else + { + totalWeight=weightSources.Sum(source => source.Weight); + } + int position = random.Next(1, totalWeight); return FindByPosition(weightSources, position); } From 37288164a2f08f5fc13655f923072b89bcc45d66 Mon Sep 17 00:00:00 2001 From: yemobai <546307885@qq.com> Date: Mon, 16 Nov 2020 22:43:56 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=B8=93=E9=97=A8=E7=94=A8=E4=BA=8E=E5=BC=82=E5=B8=B8=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=9A=84sqlmapConfig=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigBuilder/XmlConfigLoaderTest.cs | 2 +- .../SmartSql.Test.Unit.csproj | 3 + src/SmartSql.Test.Unit/SmartSqlMapConfig.xml | 2 +- src/SmartSql.Test.Unit/SmartSqlMapConfig2.xml | 99 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/SmartSql.Test.Unit/SmartSqlMapConfig2.xml diff --git a/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs b/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs index 447020ff..0221b5bb 100644 --- a/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs +++ b/src/SmartSql.Test.Unit/ConfigBuilder/XmlConfigLoaderTest.cs @@ -20,7 +20,7 @@ public void LoadFailTest() { try { - var configLoader = new XmlConfigBuilder(ResourceType.File, "SmartSqlMapConfig.xml"); + var configLoader = new XmlConfigBuilder(ResourceType.File, "SmartSqlMapConfig2.xml"); var config = configLoader.Build(); } catch (SmartSqlException ex) diff --git a/src/SmartSql.Test.Unit/SmartSql.Test.Unit.csproj b/src/SmartSql.Test.Unit/SmartSql.Test.Unit.csproj index e6ad8ed5..4b44f819 100644 --- a/src/SmartSql.Test.Unit/SmartSql.Test.Unit.csproj +++ b/src/SmartSql.Test.Unit/SmartSql.Test.Unit.csproj @@ -131,6 +131,9 @@ Always + + Always + Always diff --git a/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml b/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml index 558de765..80881bff 100644 --- a/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml +++ b/src/SmartSql.Test.Unit/SmartSqlMapConfig.xml @@ -53,7 +53,7 @@ - + diff --git a/src/SmartSql.Test.Unit/SmartSqlMapConfig2.xml b/src/SmartSql.Test.Unit/SmartSqlMapConfig2.xml new file mode 100644 index 00000000..558de765 --- /dev/null +++ b/src/SmartSql.Test.Unit/SmartSqlMapConfig2.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +