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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+