添加对象属性.equals未走索引的bug,添加更多单元测试
This commit is contained in:
parent
8d20fe2b0a
commit
fa84d756cd
|
@ -63,6 +63,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.MultiConfig", "sampl
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.AutoCreateIfPresent", "samples\Sample.AutoCreateIfPresent\Sample.AutoCreateIfPresent.csproj", "{40C83D48-0614-4651-98C6-2ABBE857D83D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.AutoCreateIfPresent", "samples\Sample.AutoCreateIfPresent\Sample.AutoCreateIfPresent.csproj", "{40C83D48-0614-4651-98C6-2ABBE857D83D}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShardingCore.CommonTest", "test\ShardingCore.CommonTest\ShardingCore.CommonTest.csproj", "{3E895438-E609-4860-8391-6897ED55DA06}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -161,6 +163,10 @@ Global
|
||||||
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Release|Any CPU.Build.0 = Release|Any CPU
|
{40C83D48-0614-4651-98C6-2ABBE857D83D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{3E895438-E609-4860-8391-6897ED55DA06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3E895438-E609-4860-8391-6897ED55DA06}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3E895438-E609-4860-8391-6897ED55DA06}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3E895438-E609-4860-8391-6897ED55DA06}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -189,6 +195,7 @@ Global
|
||||||
{DCEBAC86-E62B-4B6C-A352-B8C1C2C6F734} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
{DCEBAC86-E62B-4B6C-A352-B8C1C2C6F734} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
||||||
{D839D632-4AE4-4F75-8A2C-49EE029B0787} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
{D839D632-4AE4-4F75-8A2C-49EE029B0787} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
||||||
{40C83D48-0614-4651-98C6-2ABBE857D83D} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
{40C83D48-0614-4651-98C6-2ABBE857D83D} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73}
|
||||||
|
{3E895438-E609-4860-8391-6897ED55DA06} = {CC2C88C0-65F2-445D-BE78-973B840FE281}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {8C07A667-E8B4-43C7-8053-721584BAD291}
|
SolutionGuid = {8C07A667-E8B4-43C7-8053-721584BAD291}
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Sample.SqlServer.Domain.Entities
|
||||||
/// 每月的金额
|
/// 每月的金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ShardingTableKey]
|
[ShardingTableKey]
|
||||||
public int? DateOfMonth { get; set; }
|
public int DateOfMonth { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 工资
|
/// 工资
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Sample.SqlServer.Shardings
|
||||||
* @Date: Monday, 01 February 2021 15:54:55
|
* @Date: Monday, 01 February 2021 15:54:55
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute<SysUserSalary,int?>
|
public class SysUserSalaryVirtualTableRoute:AbstractShardingOperatorVirtualTableRoute<SysUserSalary,int>
|
||||||
{
|
{
|
||||||
|
|
||||||
public override string ShardingKeyToTail(object shardingKey)
|
public override string ShardingKeyToTail(object shardingKey)
|
||||||
|
@ -46,13 +46,13 @@ namespace Sample.SqlServer.Shardings
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string TimeFormatToTail(int? time)
|
protected string TimeFormatToTail(int time)
|
||||||
{
|
{
|
||||||
var dateOfMonth=DateTime.ParseExact($"{time}","yyyyMM",System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.AdjustToUniversal);
|
var dateOfMonth=DateTime.ParseExact($"{time}","yyyyMM",System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.AdjustToUniversal);
|
||||||
return $"{dateOfMonth:yyyyMM}";
|
return $"{dateOfMonth:yyyyMM}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Func<string, bool> GetRouteToFilter(int? shardingKey, ShardingOperatorEnum shardingOperator)
|
public override Func<string, bool> GetRouteToFilter(int shardingKey, ShardingOperatorEnum shardingOperator)
|
||||||
{
|
{
|
||||||
var t = TimeFormatToTail(shardingKey);
|
var t = TimeFormatToTail(shardingKey);
|
||||||
switch (shardingOperator)
|
switch (shardingOperator)
|
||||||
|
|
|
@ -24,6 +24,12 @@ namespace ShardingCore.Core.VirtualRoutes
|
||||||
Equal,
|
Equal,
|
||||||
[Description("!=")]
|
[Description("!=")]
|
||||||
NotEqual,
|
NotEqual,
|
||||||
|
// [Description("%w%")]
|
||||||
|
// AllLike,
|
||||||
|
// [Description("%w")]
|
||||||
|
// StartLike,
|
||||||
|
// [Description("w%")]
|
||||||
|
// EndLike
|
||||||
// [Description("Contains")]
|
// [Description("Contains")]
|
||||||
// BeContains
|
// BeContains
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,9 +274,9 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
|
var shardingPredicateResult = IsMethodWrapShardingKey(methodCallExpression);
|
||||||
if (shardingPredicateResult.IsShardingKey)
|
if (shardingPredicateResult.IsShardingKey)
|
||||||
{
|
{
|
||||||
if (methodCallExpression.Object is ConstantExpression constantExpression)
|
var shardingValue = GetExpressionValue(methodCallExpression.Object);
|
||||||
|
if (shardingValue != null)
|
||||||
{
|
{
|
||||||
var shardingValue = constantExpression.Value;
|
|
||||||
var keyToTailWithFilter = _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
|
var keyToTailWithFilter = _keyToTailWithFilter(shardingValue, ShardingOperatorEnum.Equal, shardingPredicateResult.ShardingPropertyName);
|
||||||
return new RoutePredicateExpression(keyToTailWithFilter);
|
return new RoutePredicateExpression(keyToTailWithFilter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||||
|
<PackageReference Include="xunit" Version="2.4.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\ShardingCore\ShardingCore.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,113 @@
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Reflection;
|
||||||
|
using ShardingCore.Core.EntityMetadatas;
|
||||||
|
using ShardingCore.Core.VirtualRoutes;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
|
using ShardingCore.Utils;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace ShardingCore.CommonTest
|
||||||
|
{
|
||||||
|
public class ShardingDataSource
|
||||||
|
{
|
||||||
|
private readonly EntityMetadata _testEntityMetadata;
|
||||||
|
private readonly List<string> _allDataSources;
|
||||||
|
public ShardingDataSource()
|
||||||
|
{
|
||||||
|
var entityMetadata = new EntityMetadata(typeof(TestEntity), nameof(TestEntity), typeof(ShardingDataSource),
|
||||||
|
new ReadOnlyCollection<PropertyInfo>(typeof(TestEntity).GetProperties().ToList()), null);
|
||||||
|
var entityMetadataDataSourceBuilder = EntityMetadataDataSourceBuilder<TestEntity>.CreateEntityMetadataDataSourceBuilder(entityMetadata);
|
||||||
|
entityMetadataDataSourceBuilder.ShardingProperty(o => o.Id);
|
||||||
|
entityMetadata.CheckShardingDataSourceMetadata();
|
||||||
|
_testEntityMetadata = entityMetadata;
|
||||||
|
_allDataSources = Enumerable.Range(0,10).Select(o=>o.ToString()).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Func<string, bool> GetRouteFilter(object shardingValue, ShardingOperatorEnum shardingOperator,
|
||||||
|
string propertyName)
|
||||||
|
{
|
||||||
|
if (propertyName != nameof(TestEntity.Id))
|
||||||
|
{
|
||||||
|
throw new Exception($"{nameof(propertyName)}:[{propertyName}] error");
|
||||||
|
}
|
||||||
|
|
||||||
|
var stringHashCode = ShardingCoreHelper.GetStringHashCode(shardingValue.ToString());
|
||||||
|
var dataSourceName = (stringHashCode%10).ToString();
|
||||||
|
switch (shardingOperator)
|
||||||
|
{
|
||||||
|
case ShardingOperatorEnum.Equal: return t => t == dataSourceName;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return t => true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TestId1(IQueryable<TestEntity> queryable)
|
||||||
|
{
|
||||||
|
var routePredicateExpression = ShardingUtil.GetRouteParseExpression(queryable,_testEntityMetadata,GetRouteFilter,false);
|
||||||
|
Assert.NotNull(routePredicateExpression);
|
||||||
|
var routePredicate = routePredicateExpression.GetRoutePredicate();
|
||||||
|
|
||||||
|
var list = _allDataSources.Where(routePredicate).ToList();
|
||||||
|
Assert.NotNull(list);
|
||||||
|
Assert.Equal(1,list.Count);
|
||||||
|
var stringHashCode = ShardingCoreHelper.GetStringHashCode("1");
|
||||||
|
var dataSourceName = (stringHashCode%10).ToString();
|
||||||
|
Assert.Equal(dataSourceName,list[0]);
|
||||||
|
}
|
||||||
|
[Fact]
|
||||||
|
public void TestSingleDataSource()
|
||||||
|
{
|
||||||
|
var constantQueryable1 = new List<TestEntity>().AsQueryable().Where(o=>o.Id=="1");
|
||||||
|
TestId1(constantQueryable1);
|
||||||
|
var constantQueryable2 = new List<TestEntity>().AsQueryable().Where(o=>"1"==o.Id);
|
||||||
|
TestId1(constantQueryable2);
|
||||||
|
var id = "1";
|
||||||
|
var constantQueryable3 = new List<TestEntity>().AsQueryable().Where(o=>o.Id==id);
|
||||||
|
TestId1(constantQueryable3);
|
||||||
|
var constantQueryable4 = new List<TestEntity>().AsQueryable().Where(o=>id==o.Id);
|
||||||
|
TestId1(constantQueryable4);
|
||||||
|
var constantQueryable5 = new List<TestEntity>().AsQueryable().Where(o=>o.Id.Equals("1"));
|
||||||
|
TestId1(constantQueryable5);
|
||||||
|
var constantQueryable6 = new List<TestEntity>().AsQueryable().Where(o=>"1".Equals(o.Id));
|
||||||
|
TestId1(constantQueryable6);
|
||||||
|
var constantQueryable7 = new List<TestEntity>().AsQueryable().Where(o=>o.Id.Equals(id));
|
||||||
|
TestId1(constantQueryable7);
|
||||||
|
var constantQueryable8 = new List<TestEntity>().AsQueryable().Where(o=>o.Id.Equals(id));
|
||||||
|
TestId1(constantQueryable8);
|
||||||
|
var ids = new []{"1"};
|
||||||
|
var constantQueryable9 = new List<TestEntity>().AsQueryable().Where(o=>ids.Contains(o.Id));
|
||||||
|
TestId1(constantQueryable9);
|
||||||
|
var constantQueryable10 = new List<TestEntity>().AsQueryable().Where(o=>new []{"1"}.Contains(o.Id));
|
||||||
|
TestId1(constantQueryable10);
|
||||||
|
var ids1 = new List<string>(){"1"};
|
||||||
|
var constantQueryable11 = new List<TestEntity>().AsQueryable().Where(o=>ids1.Contains(o.Id));
|
||||||
|
TestId1(constantQueryable11);
|
||||||
|
var constantQueryable12 = new List<TestEntity>().AsQueryable().Where(o=>new List<string>(){"1"}.Contains(o.Id));
|
||||||
|
TestId1(constantQueryable12);
|
||||||
|
var obj1 = new {Id="1"};
|
||||||
|
var constantQueryable13 = new List<TestEntity>().AsQueryable().Where(o=>o.Id==obj1.Id);
|
||||||
|
TestId1(constantQueryable13);
|
||||||
|
var constantQueryable14 = new List<TestEntity>().AsQueryable().Where(o=>obj1.Id==o.Id);
|
||||||
|
TestId1(constantQueryable14);
|
||||||
|
var constantQueryable15 = new List<TestEntity>().AsQueryable().Where(o=>o.Id.Equals(obj1.Id));
|
||||||
|
TestId1(constantQueryable15);
|
||||||
|
var constantQueryable16 = new List<TestEntity>().AsQueryable().Where(o=>obj1.Id.Equals(o.Id));
|
||||||
|
TestId1(constantQueryable16);
|
||||||
|
var constantQueryable17 = new List<TestEntity>().AsQueryable().Where(o=>new []{obj1.Id}.Contains(o.Id));
|
||||||
|
TestId1(constantQueryable17);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestTwoDataSource()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestEntity
|
||||||
|
{
|
||||||
|
public string Id { get; set; }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue