From 9aca4866ce7540ee624716db76f3c0644f22f36f Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Sat, 2 Jul 2022 21:43:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=89=80=E6=9C=89=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E7=9A=84=E7=BC=96=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- samples/Sample.MySql/Startup.cs | 2 +- .../Bootstrappers/IShardingBootstrapper.cs | 2 +- .../Bootstrappers/ShardingBootstrapper.cs | 2 +- .../IShardingRuntimeContext.cs | 9 +- .../RuntimeContexts/ShardingRuntimeContext.cs | 23 +- .../EFCores/IShardingDbContextAvailable.cs | 11 + .../EFCores/ShardingQueryCompiler.cs | 7 +- .../ShardingPageExtension.cs | 172 ++++++---- src/ShardingCore/ShardingCoreExtension.cs | 19 +- .../Domain/Entities/Order.cs | 2 - test/ShardingCore.Test/ShardingTest.cs | 87 ++--- test/ShardingCore.Test/ShardingTestSync.cs | 80 ++--- .../Shardings/LogDayLongVirtualRoute.cs | 2 +- .../Shardings/LogDayVirtualTableRoute.cs | 2 +- .../Shardings/LogYearLongVirtualRoute.cs | 2 - ...OrderAreaShardingVirtualDataSourceRoute.cs | 2 +- .../OrderCreateTimeVirtualTableRoute.cs | 6 +- .../SysUserSalaryVirtualTableRoute.cs | 3 +- test/ShardingCore.Test/Startup.cs | 18 +- .../Domain/Entities/Order.cs | 2 - .../Domain/Entities/SysUserMod.cs | 10 +- test/ShardingCore.Test2x/ShardingTest.cs | 320 ++++++++++++----- test/ShardingCore.Test2x/ShardingTestSync.cs | 129 ++++--- .../Shardings/LogDayLongVirtualRoute.cs | 4 +- .../Shardings/LogDayVirtualTableRoute.cs | 2 +- ...OrderAreaShardingVirtualDataSourceRoute.cs | 2 +- .../OrderCreateTimeVirtualTableRoute.cs | 5 +- .../SysUserSalaryVirtualTableRoute.cs | 2 +- test/ShardingCore.Test2x/Startup.cs | 19 +- .../Domain/Entities/Order.cs | 2 - .../Domain/Entities/SysUserMod.cs | 10 +- test/ShardingCore.Test3x/ShardingTest.cs | 322 ++++++++++++----- test/ShardingCore.Test3x/ShardingTestSync.cs | 129 ++++--- .../Shardings/LogDayLongVirtualRoute.cs | 2 +- .../Shardings/LogDayVirtualTableRoute.cs | 2 +- ...OrderAreaShardingVirtualDataSourceRoute.cs | 2 +- .../OrderCreateTimeVirtualTableRoute.cs | 6 +- .../SysUserSalaryVirtualTableRoute.cs | 2 +- test/ShardingCore.Test3x/Startup.cs | 16 +- .../Domain/Entities/Order.cs | 2 - .../Domain/Entities/SysUserMod.cs | 10 +- test/ShardingCore.Test5x/ShardingTest.cs | 324 +++++++++++++----- test/ShardingCore.Test5x/ShardingTestSync.cs | 139 ++++---- .../Shardings/LogDayLongVirtualRoute.cs | 2 +- .../Shardings/LogDayVirtualTableRoute.cs | 2 +- ...OrderAreaShardingVirtualDataSourceRoute.cs | 2 +- .../OrderCreateTimeVirtualTableRoute.cs | 6 +- .../SysUserSalaryVirtualTableRoute.cs | 2 +- test/ShardingCore.Test5x/Startup.cs | 18 +- 49 files changed, 1194 insertions(+), 752 deletions(-) create mode 100644 src/ShardingCore/EFCores/IShardingDbContextAvailable.cs diff --git a/samples/Sample.MySql/Startup.cs b/samples/Sample.MySql/Startup.cs index 38d420ea..4920bbcf 100644 --- a/samples/Sample.MySql/Startup.cs +++ b/samples/Sample.MySql/Startup.cs @@ -110,7 +110,7 @@ namespace Sample.MySql { app.UseDeveloperExceptionPage(); } - app.ApplicationServices.UseAutoShardingCore(); + app.ApplicationServices.UseAutoShardingCreate(); app.UseRouting(); app.UseAuthorization(); diff --git a/src/ShardingCore/Bootstrappers/IShardingBootstrapper.cs b/src/ShardingCore/Bootstrappers/IShardingBootstrapper.cs index f7089aed..5f1642d6 100644 --- a/src/ShardingCore/Bootstrappers/IShardingBootstrapper.cs +++ b/src/ShardingCore/Bootstrappers/IShardingBootstrapper.cs @@ -11,6 +11,6 @@ namespace ShardingCore.Bootstrappers /// public interface IShardingBootstrapper { - void AutoShardingTable(); + void AutoShardingCreate(); } } \ No newline at end of file diff --git a/src/ShardingCore/Bootstrappers/ShardingBootstrapper.cs b/src/ShardingCore/Bootstrappers/ShardingBootstrapper.cs index ece0771d..507a7dde 100644 --- a/src/ShardingCore/Bootstrappers/ShardingBootstrapper.cs +++ b/src/ShardingCore/Bootstrappers/ShardingBootstrapper.cs @@ -35,7 +35,7 @@ namespace ShardingCore.Bootstrappers _shardingProvider = shardingProvider; _dbContextCreator = dbContextCreator; } - public void AutoShardingTable() + public void AutoShardingCreate() { CheckRequirement(); StartAutoShardingJob(); diff --git a/src/ShardingCore/Core/RuntimeContexts/IShardingRuntimeContext.cs b/src/ShardingCore/Core/RuntimeContexts/IShardingRuntimeContext.cs index e2dce003..361d6d30 100644 --- a/src/ShardingCore/Core/RuntimeContexts/IShardingRuntimeContext.cs +++ b/src/ShardingCore/Core/RuntimeContexts/IShardingRuntimeContext.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using ShardingCore.Core.DbContextCreator; using ShardingCore.Core.EntityMetadatas; +using ShardingCore.Core.QueryRouteManagers.Abstractions; using ShardingCore.Core.QueryTrackers; using ShardingCore.Core.ShardingPage.Abstractions; using ShardingCore.Core.TrackerManagers; @@ -14,14 +15,18 @@ using ShardingCore.DynamicDataSources; using ShardingCore.Sharding.Abstractions; using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; +using ShardingCore.TableCreator; namespace ShardingCore.Core.RuntimeContexts { public interface IShardingRuntimeContext { + IShardingComparer GetShardingComparer(); IShardingCompilerExecutor GetShardingCompilerExecutor(); IShardingReadWriteManager GetShardingReadWriteManager(); + IShardingRouteManager GetShardingRouteManager(); ITrackerManager GetTrackerManager(); IParallelTableManager GetParallelTableManager(); IDbContextCreator GetDbContextCreator(); @@ -29,7 +34,9 @@ namespace ShardingCore.Core.RuntimeContexts // IVirtualDataSourceManager GetVirtualDataSourceManager(); IVirtualDataSource GetVirtualDataSource(); ITableRouteManager GetTableRouteManager(); + IShardingTableCreator GetShardingTableCreator(); IRouteTailFactory GetRouteTailFactory(); + IReadWriteConnectorFactory GetReadWriteConnectorFactory(); IQueryTracker GetQueryTracker(); IUnionAllMergeManager GetUnionAllMergeManager(); IShardingPageManager GetShardingPageManager(); @@ -41,7 +48,7 @@ namespace ShardingCore.Core.RuntimeContexts void UseApplicationServiceProvider(IServiceProvider applicationServiceProvider); void Initialize(); - void AutoShardingTable(); + void AutoShardingCreate(); object GetService(Type serviceType); TService GetService(); object GetRequiredService(Type serviceType); diff --git a/src/ShardingCore/Core/RuntimeContexts/ShardingRuntimeContext.cs b/src/ShardingCore/Core/RuntimeContexts/ShardingRuntimeContext.cs index b557d84a..3a9f8f80 100644 --- a/src/ShardingCore/Core/RuntimeContexts/ShardingRuntimeContext.cs +++ b/src/ShardingCore/Core/RuntimeContexts/ShardingRuntimeContext.cs @@ -19,6 +19,8 @@ using ShardingCore.Logger; using ShardingCore.Sharding.Abstractions; using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; +using ShardingCore.TableCreator; namespace ShardingCore.Core.RuntimeContexts { @@ -51,13 +53,17 @@ namespace ShardingCore.Core.RuntimeContexts isInited = true; _serviceProvider = _serviceMap.BuildServiceProvider(); _serviceProvider.GetRequiredService().Initialize(); - } } - public void AutoShardingTable() + public void AutoShardingCreate() { - GetRequiredService().AutoShardingTable(); + GetRequiredService().AutoShardingCreate(); + } + + public IShardingComparer GetShardingComparer() + { + return GetRequiredService(); } public IShardingCompilerExecutor GetShardingCompilerExecutor() @@ -69,6 +75,7 @@ namespace ShardingCore.Core.RuntimeContexts { return GetRequiredService(); } + public ITrackerManager GetTrackerManager() { @@ -100,6 +107,16 @@ namespace ShardingCore.Core.RuntimeContexts return GetRequiredService(); } + public IReadWriteConnectorFactory GetReadWriteConnectorFactory() + { + return GetRequiredService(); + } + + public IShardingTableCreator GetShardingTableCreator() + { + return GetRequiredService(); + } + public IRouteTailFactory GetRouteTailFactory() { return GetRequiredService(); diff --git a/src/ShardingCore/EFCores/IShardingDbContextAvailable.cs b/src/ShardingCore/EFCores/IShardingDbContextAvailable.cs new file mode 100644 index 00000000..69e6ee95 --- /dev/null +++ b/src/ShardingCore/EFCores/IShardingDbContextAvailable.cs @@ -0,0 +1,11 @@ +using Microsoft.EntityFrameworkCore; +using ShardingCore.Sharding.Abstractions; + +namespace ShardingCore.EFCores +{ + + public interface IShardingDbContextAvailable + { + IShardingDbContext GetShardingDbContext(); + } +} diff --git a/src/ShardingCore/EFCores/ShardingQueryCompiler.cs b/src/ShardingCore/EFCores/ShardingQueryCompiler.cs index a397aff2..abfacb80 100644 --- a/src/ShardingCore/EFCores/ShardingQueryCompiler.cs +++ b/src/ShardingCore/EFCores/ShardingQueryCompiler.cs @@ -10,6 +10,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using ShardingCore.Core; using ShardingCore.Core.RuntimeContexts; @@ -19,7 +20,7 @@ namespace ShardingCore.EFCores /// /// 当前查询编译拦截 /// - public class ShardingQueryCompiler : IQueryCompiler + public class ShardingQueryCompiler : IQueryCompiler,IShardingDbContextAvailable { private readonly IShardingDbContext _shardingDbContext; private readonly IShardingCompilerExecutor _shardingCompilerExecutor; @@ -87,5 +88,9 @@ namespace ShardingCore.EFCores throw new NotImplementedException(); } #endif + public IShardingDbContext GetShardingDbContext() + { + return _shardingDbContext; + } } } \ No newline at end of file diff --git a/src/ShardingCore/Extensions/ShardingPageExtensions/ShardingPageExtension.cs b/src/ShardingCore/Extensions/ShardingPageExtensions/ShardingPageExtension.cs index d05e2a3c..8d68fdac 100644 --- a/src/ShardingCore/Extensions/ShardingPageExtensions/ShardingPageExtension.cs +++ b/src/ShardingCore/Extensions/ShardingPageExtensions/ShardingPageExtension.cs @@ -1,66 +1,106 @@ -// using System.Collections.Generic; -// using System.Linq; -// using System.Threading.Tasks; -// using Microsoft.EntityFrameworkCore; -// using ShardingCore.Core.ShardingPage.Abstractions; -// -// namespace ShardingCore.Extensions.ShardingPageExtensions -// { -// /* -// * @Author: xjm -// * @Description: -// * @Date: 2021/9/3 10:36:51 -// * @Ver: 1.0 -// * @Email: 326308290@qq.com -// */ -// public static class ShardingPageExtension -// { -// public static async Task> ToShardingPageAsync(this IQueryable source, int pageIndex, int pageSize) -// { -// //设置每次获取多少页 -// var take = pageSize <= 0 ? 1 : pageSize; -// //设置当前页码最小1 -// var index = pageIndex <= 0 ? 1 : pageIndex; -// //需要跳过多少页 -// var skip = (index - 1) * take; -// var shardingPageManager = ShardingContainer.GetService(); -// using (shardingPageManager.CreateScope()) -// { -// //获取每次总记录数 -// var count = await source.CountAsync(); -// if (count <= skip) -// return new ShardingPagedResult(new List(0), count); -// //获取剩余条数 -// var remainingCount = count - skip; -// //当剩余条数小于take数就取remainingCount -// var realTake = remainingCount < take ? remainingCount : take; -// var data = await source.Skip(skip).Take(realTake).ToListAsync(); -// return new ShardingPagedResult(data, count); -// } -// } -// public static ShardingPagedResult ToShardingPage(this IQueryable source, int pageIndex, int pageSize) -// { -// //设置每次获取多少页 -// var take = pageSize <= 0 ? 1 : pageSize; -// //设置当前页码最小1 -// var index = pageIndex <= 0 ? 1 : pageIndex; -// //需要跳过多少页 -// var skip = (index - 1) * take; -// -// var shardingPageManager = ShardingContainer.GetService(); -// using (shardingPageManager.CreateScope()) -// { -// //获取每次总记录数 -// var count = source.Count(); -// if (count <= skip) -// return new ShardingPagedResult(new List(0), count); -// //获取剩余条数 -// var remainingCount = count - skip; -// //当剩余条数小于take数就取remainingCount -// var realTake = remainingCount < take ? remainingCount : take; -// var data = source.Skip(skip).Take(realTake).ToList(); -// return new ShardingPagedResult(data, count); -// } -// } -// } -// } +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Query.Internal; +using ShardingCore.EFCores; +using ShardingCore.Exceptions; +using ShardingCore.Sharding.Abstractions; + +namespace ShardingCore.Extensions.ShardingPageExtensions +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/3 10:36:51 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public static class ShardingPageExtension + { + private static IShardingDbContext GetShardingDbContext(IQueryable source) + { + + var entityQueryProvider = source.Provider as EntityQueryProvider??throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(IQueryable)} provider not {nameof(EntityQueryProvider)}"); + + var shardingQueryCompiler = entityQueryProvider.GetFieldValue("_queryCompiler") as ShardingQueryCompiler??throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(EntityQueryProvider)} not contains {nameof(ShardingQueryCompiler)} filed named _queryCompiler"); + var dbContextAvailable = shardingQueryCompiler as IShardingDbContextAvailable; + if (dbContextAvailable == null) + { + throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(ShardingQueryCompiler)} not impl {nameof(IShardingDbContextAvailable)}"); + } + + return dbContextAvailable.GetShardingDbContext(); + } + /// + /// 配置了分页configuration + /// count+list的分页list会根据count进行优化 + /// + /// + /// + /// + /// + /// + public static async Task> ToShardingPageAsync(this IQueryable source, int pageIndex, int pageSize) + { + var shardingDbContext = GetShardingDbContext(source); + var shardingRuntimeContext = shardingDbContext.GetShardingRuntimeContext(); + + //设置每次获取多少页 + var take = pageSize <= 0 ? 1 : pageSize; + //设置当前页码最小1 + var index = pageIndex <= 0 ? 1 : pageIndex; + //需要跳过多少页 + var skip = (index - 1) * take; + var shardingPageManager = shardingRuntimeContext.GetShardingPageManager(); + using (shardingPageManager.CreateScope()) + { + //获取每次总记录数 + var count = await source.CountAsync(); + if (count <= skip) + return new ShardingPagedResult(new List(0), count); + //获取剩余条数 + var remainingCount = count - skip; + //当剩余条数小于take数就取remainingCount + var realTake = remainingCount < take ? remainingCount : take; + var data = await source.Skip(skip).Take(realTake).ToListAsync(); + return new ShardingPagedResult(data, count); + } + } + /// + /// 配置了分页configuration + /// count+list的分页list会根据count进行优化 + /// + /// + /// + /// + /// + /// + public static ShardingPagedResult ToShardingPage(this IQueryable source, int pageIndex, int pageSize) + { + var shardingDbContext = GetShardingDbContext(source); + var shardingRuntimeContext = shardingDbContext.GetShardingRuntimeContext(); + //设置每次获取多少页 + var take = pageSize <= 0 ? 1 : pageSize; + //设置当前页码最小1 + var index = pageIndex <= 0 ? 1 : pageIndex; + //需要跳过多少页 + var skip = (index - 1) * take; + + var shardingPageManager = shardingRuntimeContext.GetShardingPageManager(); + using (shardingPageManager.CreateScope()) + { + //获取每次总记录数 + var count = source.Count(); + if (count <= skip) + return new ShardingPagedResult(new List(0), count); + //获取剩余条数 + var remainingCount = count - skip; + //当剩余条数小于take数就取remainingCount + var realTake = remainingCount < take ? remainingCount : take; + var data = source.Skip(skip).Take(realTake).ToList(); + return new ShardingPagedResult(data, count); + } + } + } +} diff --git a/src/ShardingCore/ShardingCoreExtension.cs b/src/ShardingCore/ShardingCoreExtension.cs index 6fb3aea8..2b2053de 100644 --- a/src/ShardingCore/ShardingCoreExtension.cs +++ b/src/ShardingCore/ShardingCoreExtension.cs @@ -216,10 +216,25 @@ namespace ShardingCore /// 使用自动创建表 /// /// - public static void UseAutoShardingCore(this IServiceProvider serviceProvider) + public static void UseAutoShardingCreate(this IServiceProvider serviceProvider) { var shardingRuntimeContext = serviceProvider.GetRequiredService(); - shardingRuntimeContext.AutoShardingTable(); + shardingRuntimeContext.AutoShardingCreate(); + } + /// + /// 自动尝试补偿表 + /// + /// + public static void UseAutoTryCompensateTable(this IServiceProvider serviceProvider) + { + var shardingRuntimeContext = serviceProvider.GetRequiredService(); + var virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + var dataSourceInitializer = shardingRuntimeContext.GetDataSourceInitializer(); + var allDataSourceNames = virtualDataSource.GetAllDataSourceNames(); + foreach (var dataSourceName in allDataSourceNames) + { + dataSourceInitializer.InitConfigure(dataSourceName,true,true); + } } diff --git a/test/ShardingCore.Test/Domain/Entities/Order.cs b/test/ShardingCore.Test/Domain/Entities/Order.cs index 220dd839..a471c4ee 100644 --- a/test/ShardingCore.Test/Domain/Entities/Order.cs +++ b/test/ShardingCore.Test/Domain/Entities/Order.cs @@ -6,10 +6,8 @@ namespace ShardingCore.Test.Domain.Entities public class Order { public Guid Id { get; set; } - [ShardingDataSourceKey] public string Area { get; set; } public long Money { get; set; } - [ShardingTableKey] public DateTime CreateTime { get; set; } } } diff --git a/test/ShardingCore.Test/ShardingTest.cs b/test/ShardingCore.Test/ShardingTest.cs index 4b903855..b5968777 100644 --- a/test/ShardingCore.Test/ShardingTest.cs +++ b/test/ShardingCore.Test/ShardingTest.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Reflection; using System.Threading.Tasks; @@ -8,15 +7,12 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; +using ShardingCore.Core.RuntimeContexts; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +using ShardingCore.Core.VirtualRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; -using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Extensions.ShardingPageExtensions; @@ -36,50 +32,39 @@ using Xunit; namespace ShardingCore.Test { - /* - * @Author: xjm - * @Description: - * @Date: Friday, 15 January 2021 17:22:10 - * @Email: 326308290@qq.com - */ + public class ShardingTest { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; - private readonly ITableRouteRuleEngineFactory _tableRouteRuleEngineFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory, ITableRouteRuleEngineFactory tableRouteRuleEngineFactory) + public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - _tableRouteRuleEngineFactory = tableRouteRuleEngineFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -129,8 +114,8 @@ namespace ShardingCore.Test var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(), null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(), null); + var x = new EntityMetadata(typeof(LogDay)); + var y = new EntityMetadata(typeof(LogDay)); Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); @@ -204,8 +189,6 @@ namespace ShardingCore.Test Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var emptyTailIdentity = new SingleQueryRouteTail(string.Empty).GetRouteTailIdentity(); var aTailIdentity = new SingleQueryRouteTail("a").GetRouteTailIdentity(); var bTailIdentity = new SingleQueryRouteTail("b").GetRouteTailIdentity(); @@ -287,7 +270,7 @@ namespace ShardingCore.Test var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(tableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -1184,9 +1161,9 @@ namespace ShardingCore.Test } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -1194,9 +1171,9 @@ namespace ShardingCore.Test Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { diff --git a/test/ShardingCore.Test/ShardingTestSync.cs b/test/ShardingCore.Test/ShardingTestSync.cs index 7c41f25d..dc03548c 100644 --- a/test/ShardingCore.Test/ShardingTestSync.cs +++ b/test/ShardingCore.Test/ShardingTestSync.cs @@ -3,10 +3,7 @@ using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; using ShardingCore.Extensions; @@ -18,13 +15,15 @@ using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; using ShardingCore.TableCreator; using ShardingCore.Test.Domain.Entities; -using ShardingCore.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; +using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Core.VirtualRoutes.Abstractions; using ShardingCore.Extensions.ShardingQueryableExtensions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; using Xunit; namespace ShardingCore.Test @@ -35,38 +34,34 @@ namespace ShardingCore.Test { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -116,8 +111,10 @@ namespace ShardingCore.Test var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + //, "aa", typeof(ShardingDefaultDbContext), new List(),null + var y = new EntityMetadata(typeof(LogDay)); + //, "aa1", typeof(ShardingDefaultDbContext), new List(),null Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); @@ -185,8 +182,6 @@ namespace ShardingCore.Test Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var x1x1 = new ParallelTableGroupNode(new HashSet() { new ParallelTableComparerType(typeof(SysUserMod)), new ParallelTableComparerType(typeof(SysUserSalary)) }); @@ -246,7 +241,7 @@ namespace ShardingCore.Test var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(virtualTableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -964,9 +952,9 @@ namespace ShardingCore.Test Assert.NotNull(areaB); } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -974,9 +962,9 @@ namespace ShardingCore.Test Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { diff --git a/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs index 9feadc6d..6c299aae 100644 --- a/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogDayLongVirtualRoute.cs @@ -30,7 +30,7 @@ namespace ShardingCore.Test.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs index 9c7cd93f..6e6b6b2c 100644 --- a/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogDayVirtualTableRoute.cs @@ -35,7 +35,7 @@ namespace ShardingCore.Test.Shardings return true; } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs b/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs index aff7a5a4..0d02cf32 100644 --- a/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs +++ b/test/ShardingCore.Test/Shardings/LogYearLongVirtualRoute.cs @@ -4,8 +4,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using ShardingCore.Core.EntityMetadatas; -using ShardingCore.Core.PhysicTables; -using ShardingCore.Extensions; using ShardingCore.Test.Domain.Entities; using ShardingCore.VirtualRoutes.Years; diff --git a/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 4021baca..26f28170 100644 --- a/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -39,7 +39,7 @@ namespace ShardingCore.Test.Shardings public override void Configure(EntityMetadataDataSourceBuilder builder) { - + builder.ShardingProperty(o => o.Area); } public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) diff --git a/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs index 655caf85..2ab38dd0 100644 --- a/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -15,16 +15,16 @@ namespace ShardingCore.Test.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { - var allTails = base.GetAllTails(); + var allTails = base.CalcTailsOnStart(); allTails.Add("202112"); return allTails; } public override void Configure(EntityMetadataTableBuilder builder) { - + builder.ShardingProperty(o => o.CreateTime); } public override IPaginationConfiguration CreatePaginationConfiguration() diff --git a/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs index 94196038..d2c437ce 100644 --- a/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -24,8 +24,7 @@ namespace ShardingCore.Test.Shardings return TimeFormatToTail(time); } - - public override List GetAllTails() + public override List GetTails() { var beginTime = new DateTime(2020, 1, 1); var endTime = new DateTime(2021, 12, 1); diff --git a/test/ShardingCore.Test/Startup.cs b/test/ShardingCore.Test/Startup.cs index fd1ae42c..f7a14bef 100644 --- a/test/ShardingCore.Test/Startup.cs +++ b/test/ShardingCore.Test/Startup.cs @@ -10,6 +10,7 @@ using ShardingCore.Bootstrappers; using ShardingCore.Helpers; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.TableExists; +using ShardingCore.TableExists.Abstractions; using ShardingCore.Test.Domain.Entities; using ShardingCore.Test.Shardings; @@ -35,12 +36,8 @@ namespace ShardingCore.Test public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) { services.AddShardingDbContext() - .AddEntityConfig(op => + .UseRouteConfig(op => { - //如果您使用code-first建议选择false - op.CreateShardingTableOnStart = true; - //如果您使用code-first建议修改为fsle - op.EnsureCreatedWithOutShardingTable = true; //当无法获取路由时会返回默认值而不是报错 op.ThrowIfQueryRouteNotMatch = false; @@ -59,10 +56,8 @@ namespace ShardingCore.Test op.AddShardingTableRoute(); }) - .AddConfig(op => + .UseConfig(op => { - op.ConfigId="c1"; - op.Priority = 1; op.UseShardingQuery((conStr, builder) => { builder.UseSqlServer(conStr).UseLoggerFactory(efLogger); @@ -94,15 +89,14 @@ namespace ShardingCore.Test } }; }, ReadStrategyEnum.Loop, defaultEnable: false, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime); - op.ReplaceTableEnsureManager(sp => new SqlServerTableEnsureManager()); - }).EnsureConfig(); + }).ReplaceService(ServiceLifetime.Singleton).AddShardingCore(); } // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 public void Configure(IServiceProvider serviceProvider) { - var shardingBootstrapper = serviceProvider.GetService(); - shardingBootstrapper.Start(); + var shardingBootstrapper = serviceProvider.GetRequiredService(); + shardingBootstrapper.AutoShardingCreate(); // 有一些测试数据要初始化可以放在这里 InitData(serviceProvider).GetAwaiter().GetResult(); } diff --git a/test/ShardingCore.Test2x/Domain/Entities/Order.cs b/test/ShardingCore.Test2x/Domain/Entities/Order.cs index e39b8efd..483a34ad 100644 --- a/test/ShardingCore.Test2x/Domain/Entities/Order.cs +++ b/test/ShardingCore.Test2x/Domain/Entities/Order.cs @@ -6,10 +6,8 @@ namespace ShardingCore.Test2x.Domain.Entities public class Order { public Guid Id { get; set; } - [ShardingDataSourceKey] public string Area { get; set; } public long Money { get; set; } - [ShardingTableKey] public DateTime CreateTime { get; set; } } } diff --git a/test/ShardingCore.Test2x/Domain/Entities/SysUserMod.cs b/test/ShardingCore.Test2x/Domain/Entities/SysUserMod.cs index 1981beb4..5f9d7338 100644 --- a/test/ShardingCore.Test2x/Domain/Entities/SysUserMod.cs +++ b/test/ShardingCore.Test2x/Domain/Entities/SysUserMod.cs @@ -6,7 +6,7 @@ namespace ShardingCore.Test2x.Domain.Entities * @Date: Thursday, 14 January 2021 15:36:43 * @Email: 326308290@qq.com */ - public class SysUserMod + public class SysUserMod: IId { /// /// 用户Id用于分表 @@ -21,6 +21,12 @@ namespace ShardingCore.Test2x.Domain.Entities /// public int Age { get; set; } public int AgeGroup { get; set; } - + } + + public interface IId + { + string Id { get; set; } + } + } \ No newline at end of file diff --git a/test/ShardingCore.Test2x/ShardingTest.cs b/test/ShardingCore.Test2x/ShardingTest.cs index 1aeb644c..f311087d 100644 --- a/test/ShardingCore.Test2x/ShardingTest.cs +++ b/test/ShardingCore.Test2x/ShardingTest.cs @@ -7,11 +7,10 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; +using ShardingCore.Core.RuntimeContexts; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +using ShardingCore.Core.VirtualRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; @@ -25,6 +24,7 @@ using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.Sharding.ShardingDbContextExecutors; +using ShardingCore.Sharding.StreamMergeEngines; using ShardingCore.TableCreator; using ShardingCore.Test2x.Domain.Entities; using ShardingCore.Utils; @@ -32,48 +32,39 @@ using Xunit; namespace ShardingCore.Test2x { - /* - * @Author: xjm - * @Description: - * @Date: Friday, 15 January 2021 17:22:10 - * @Email: 326308290@qq.com - */ + public class ShardingTest { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -81,32 +72,32 @@ namespace ShardingCore.Test2x // var expressionEqualityComparer = new RouteParseExpressionEqualityComparer(); // var virtualTable = _virtualTableManager.GetVirtualTable(); // var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute)virtualTable.GetVirtualRoute(); - // + // var xxxx = "202102"; // var queryable1 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102); // var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable2 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102); // var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var xxxx1 = 202102; // var queryable3 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1); // var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable4 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101); // var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable5 = _virtualDbContext.Set().Where(o => o.DateOfMonth > 202101); // var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable6 = _virtualDbContext.Set().Where(o => o.DateOfMonth == 202101); // var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable7 = _virtualDbContext.Set().Where(o => 202101 <= o.DateOfMonth); // var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable8 = _virtualDbContext.Set().Where(o => 202101 == o.DateOfMonth); // var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); // Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); @@ -123,12 +114,14 @@ namespace ShardingCore.Test2x var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + var y = new EntityMetadata(typeof(LogDay)); Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); + var bulkShardingTableEnumerable = _virtualDbContext.BulkShardingTableEnumerable(logDays); + Assert.Equal(100, bulkShardingTableEnumerable.Count); var bulkShardingEnumerable = _virtualDbContext.BulkShardingEnumerable(logDays); Assert.Equal(1, bulkShardingEnumerable.Count); @@ -182,12 +175,12 @@ namespace ShardingCore.Test2x Assert.True(bulkShardingExpression.ContainsKey("B")); var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression(o => o.Id == Guid.NewGuid().ToString()); + Assert.Equal(1, bulkShardingTableExpression.Count()); var noShardingExpression = _virtualDbContext.BulkShardingExpression(o => o.Id == "123"); Assert.Equal(1, noShardingExpression.Count()); - var isShardingDbContext = _virtualDbContext.IsShardingDbContext(); Assert.True(isShardingDbContext); var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext(); @@ -196,9 +189,6 @@ namespace ShardingCore.Test2x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); - var emptyTailIdentity = new SingleQueryRouteTail(string.Empty).GetRouteTailIdentity(); var aTailIdentity = new SingleQueryRouteTail("a").GetRouteTailIdentity(); var bTailIdentity = new SingleQueryRouteTail("b").GetRouteTailIdentity(); @@ -221,6 +211,10 @@ namespace ShardingCore.Test2x { new ParallelTableComparerType(typeof(SysUserSalary)),new ParallelTableComparerType(typeof(SysUserMod)), }); Assert.Equal(x1x1, x2x2); Assert.Equal(x1x1.GetHashCode(), x2x2.GetHashCode()); + var succeedAddConnectionString = _shardingConnectionStringResolver.AddConnectionString("X", "Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;",null); + Assert.True(succeedAddConnectionString); + var connectionString = _shardingConnectionStringResolver.GetConnectionString("X", null); + Assert.Equal("Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;", connectionString); } public class SequenceClass @@ -235,9 +229,13 @@ namespace ShardingCore.Test2x var multiOrder = await _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefaultAsync(); Assert.NotNull(multiOrder); + var allMultiOrders = await _virtualDbContext.Set().ToListAsync(); + Assert.Equal(8, allMultiOrders.Count); var longs = new[] { 232398109278351360, 255197859283087360 }; var multiOrders = await _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToListAsync(); Assert.Equal(2, multiOrders.Count); + var multinNotOrders = await _virtualDbContext.Set().Where(o => !longs.Contains(o.Id)).ToListAsync(); + Assert.Equal(6, multinNotOrders.Count); var dateTime = new DateTime(2021, 11, 1); var multiOrder404 = await _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefaultAsync(); Assert.Null(multiOrder404); @@ -272,7 +270,7 @@ namespace ShardingCore.Test2x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x() + join salary in _virtualDbContext.Set() + on u.Id equals salary.UserId + select new + { + u.Id, + u.Age, + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }).CountAsync(); var list = await (from u in _virtualDbContext.Set() join salary in _virtualDbContext.Set() on u.Id equals salary.UserId @@ -399,18 +408,18 @@ namespace ShardingCore.Test2x Assert.DoesNotContain(list1, o => o.Name != "name_300"); var queryable1 = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") - join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) - on u.Id equals salary.UserId - select new - { - Salary = salary.Salary, - DateOfMonth = salary.DateOfMonth, - Name = u.Name - }); + join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) + on u.Id equals salary.UserId + select new + { + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }); var list3 = await queryable1.ToListAsync(); Assert.Equal(1, list3.Count()); Assert.Contains(list3, o => o.Name == "name_300"); - var firstOrDefaultAsync = await queryable1.OrderBy(o=>o.DateOfMonth).FirstOrDefaultAsync(); + var firstOrDefaultAsync = await queryable1.OrderBy(o => o.DateOfMonth).FirstOrDefaultAsync(); Assert.NotNull(firstOrDefaultAsync); var firstOrDefault = queryable1.OrderBy(o => o.DateOfMonth).FirstOrDefault(); Assert.NotNull(firstOrDefault); @@ -466,10 +475,25 @@ namespace ShardingCore.Test2x [Fact] public async Task ToList_Id_Not_Eq_Test() { + var methodValue = new MethodValue() { AA = "7" }; + var mods123 = await _virtualDbContext.Set().Where(o => o.Id == methodValue.GetAa()).FirstOrDefaultAsync(); + Assert.NotNull(mods123); + Assert.Equal(mods123.Id, "7"); + var mods12 = await _virtualDbContext.Set().Where(o => new List { "3", "4" }.Contains(o.Id)).ToListAsync(); + Assert.Contains(mods12, o => o.Id == "3" || o.Id == "4"); var mods = await _virtualDbContext.Set().Where(o => o.Id != "3").ToListAsync(); Assert.Equal(999, mods.Count); Assert.DoesNotContain(mods, o => o.Id == "3"); } + public class MethodValue + { + public string AA { get; set; } + + public string GetAa() + { + return AA; + } + } [Fact] public async Task ToList_Id_Not_Eq_Skip_Test() @@ -498,6 +522,10 @@ namespace ShardingCore.Test2x [Fact] public async Task ToList_Id_Eq_Not_In_Db_Test() { + var mod1s = await _virtualDbContext.Set().Where(o =>string.Compare(((IId)o).Id,"1001") ==0).ToListAsync(); + var mod2s = await _virtualDbContext.Set().Where(o => string.Compare("1001", o.Id) == 0).ToListAsync(); + var mod3s = await _virtualDbContext.Set().Where(o => "1001".CompareTo(o.Id)==0).ToListAsync(); + var mod4s = await _virtualDbContext.Set().Where(o => o.Id.CompareTo("1001") == 0).ToListAsync(); var mods = await _virtualDbContext.Set().Where(o => o.Id == "1001").ToListAsync(); Assert.Empty(mods); } @@ -524,9 +552,23 @@ namespace ShardingCore.Test2x } + [Fact] public async Task FirstOrDefault2() { + var sysUserModabxxxxx1 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx71 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var xxxx1 = 202102; + var sysUserModabxxxxx72 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1).FirstOrDefaultAsync(); + var sysUserModabxxxxx2 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101).FirstOrDefaultAsync(); + var sysUserModabxxxxx3 = await _virtualDbContext.Set().Where(o => o.DateOfMonth > 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx4 = await _virtualDbContext.Set().Where(o => o.DateOfMonth == 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx5 = await _virtualDbContext.Set().Where(o => o.DateOfMonth < 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx6 = await _virtualDbContext.Set().Where(o => o.DateOfMonth <= 202102).FirstOrDefaultAsync(); + var next = "1"; + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Id == next).FirstOrDefaultAsync(); + var sysUserModabxxx = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); + var sysUserModabxxx11 = await _virtualDbContext.Set().Where(o => o.Name == "name_2" || o.Name == "name_3").FirstOrDefaultAsync(); var x = new Object[] { "1", "2" }; var sysUserModab = await _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefaultAsync(); Assert.NotNull(sysUserModab); @@ -557,8 +599,26 @@ namespace ShardingCore.Test2x var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + var sysUserMod2 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new + { + Name=o.Name + }).FirstOrDefaultAsync(); + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new TestClass(o.Name,""){Id = o.Id}).FirstOrDefaultAsync(); + Assert.NotNull(sysUserMod1); } + public class TestClass + { + public string Name { get; } + public string Aa { get; } + public string Id { get; set; } + + public TestClass(string name,string aa) + { + Name = name; + Aa = aa; + } + } [Fact] public async Task FirstOrDefault4() @@ -575,6 +635,7 @@ namespace ShardingCore.Test2x Assert.Null(sysUserMod); } + [Fact] public async Task Count_Test() { @@ -685,6 +746,90 @@ namespace ShardingCore.Test2x Assert.Equal(1140000, group[0].MaxSalary); } + [Fact] + public async Task Group_Test1() + { + var ids = new[] { "200", "300" }; + var dateOfMonths = new[] { 202111, 202110 }; + var dateTime = DateTime.Now; + + var sql = from u in _virtualDbContext.Set() + group u by u.UserId + into g + select new + { + UI = g.Key, + x=g.Sum(o=>o.SalaryDecimal), + Now = dateTime + }; + var listAsync = await sql.ToListAsync(); + var group = await (from u in _virtualDbContext.Set() + .Where(o => ids.Contains(o.UserId) && dateOfMonths.Contains(o.DateOfMonth)) + group u by new + { + UId = u.UserId + } + into g + select new + { + GroupUserId = g.Key.UId, + Count = g.Count(), + TotalSalary = g.Sum(o => o.Salary), + AvgSalary = g.Average(o => o.Salary), + AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), + MinSalary = g.Min(o => o.Salary), + MaxSalary = g.Max(o => o.Salary) + }).ToListAsync(); + Assert.Equal(2, group.Count); + Assert.Equal(2, group[0].Count); + Assert.Equal(2260000, group[0].TotalSalary); + Assert.Equal(1130000, group[0].AvgSalary); + Assert.Equal(11300, group[0].AvgSalaryDecimal); + Assert.Equal(1120000, group[0].MinSalary); + Assert.Equal(1140000, group[0].MaxSalary); + } + //[Fact] + //public async Task Group_Recently_Test() + //{ + // //var list =(from us in _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // // group us by new + // // { + // // UserId=us.UserId + // // } + // // into g + // // select new + // // { + // // UserId=g.Key.UserId, + // // DateOfMonth = g.Max(o=>o.DateOfMonth) + // // }).ToList(); + // //var y = list; + + // var ids = new List(){ "200", "300" }; + // List result = new List(ids.Count); + // var routeFilter = new List().AsQueryable().Where(o => ids.Contains(o.UserId)); + // //��ȡ��·��ʱ�䵹�� + // var tableRouteResults = _tableRouteRuleEngineFactory.Route(routeFilter) + // .Select(o => o.ReplaceTables.First().Tail).OrderByDescending(o => o).ToList(); + // foreach (var tableRouteResult in tableRouteResults) + // { + // if(ids.IsEmpty()) + // break; + // using (_shardingRouteManager.CreateScope()) + // { + // _shardingRouteManager.Current.TryCreateOrAddMustTail(tableRouteResult); + // var queryable = _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // .GroupBy(o => new { o.UserId }, i => i, + // (i, u) => new { + // Data = u.OrderByDescending(o => o.DateOfMonth).FirstOrDefault() + // }); + // var r =await queryable.ToListAsync(); + // result.AddRange(r.Select(o=>o.Data)); + // var removeUserIds = result.Select(u => u.UserId).ToHashSet(); + // ids.RemoveAll(o => removeUserIds.Contains(o)); + // } + // } + //} + [Fact] public async Task OrderCountTest() { @@ -776,17 +921,11 @@ namespace ShardingCore.Test2x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var tableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName =tableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(tableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -820,7 +959,7 @@ namespace ShardingCore.Test2x var fourBegin = new DateTime(2021, 4, 1).Date; var fiveBegin = new DateTime(2021, 5, 1).Date; var moneyAverage = await _virtualDbContext.Set() - .Where(o => o.CreateTime >= fourBegin && o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); + .Where(o => o.CreateTime >= fourBegin&& o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); Assert.Equal(105, moneyAverage); using (_shardingRouteManager.CreateScope()) @@ -1022,9 +1161,9 @@ namespace ShardingCore.Test2x } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -1032,9 +1171,9 @@ namespace ShardingCore.Test2x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1224,6 +1363,7 @@ namespace ShardingCore.Test2x Assert.Equal(300, countAsync1); } Assert.Null(_shardingRouteManager.Current); + } [Fact] public async Task LogYearLongShardingPage() @@ -1307,29 +1447,29 @@ namespace ShardingCore.Test2x tran.Rollback(); } } - logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Update(logNoSharding); + logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Update(logNoSharding); - logNoShardings.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.UpdateRange(logNoShardings); + logNoShardings.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.UpdateRange(logNoShardings); - logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Set().Update(logNoSharding1); + logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Set().Update(logNoSharding1); - logNoSharding1s.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().UpdateRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().UpdateRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); - _virtualDbContext.Remove(logNoSharding); + _virtualDbContext.Remove(logNoSharding); - _virtualDbContext.RemoveRange(logNoShardings); + _virtualDbContext.RemoveRange(logNoShardings); - _virtualDbContext.Set().Remove(logNoSharding1); + _virtualDbContext.Set().Remove(logNoSharding1); - logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().RemoveRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().RemoveRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); } [Fact] public async Task CrudTest1() @@ -1363,7 +1503,7 @@ namespace ShardingCore.Test2x { await _virtualDbContext.AddAsync((object)logNoSharding); - await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o=>(object)o).ToArray()); + await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o => (object)o).ToArray()); await _virtualDbContext.SaveChangesAsync(); tran.Commit(); @@ -1496,6 +1636,7 @@ namespace ShardingCore.Test2x Assert.Equal(10, page1.Data.Count); Assert.Equal(300, page1.Total); } + [Fact] public async Task AsRouteTest() { @@ -1531,12 +1672,11 @@ namespace ShardingCore.Test2x .Where(o => o.CreateTime == fiveBegin).Select(o => o.Money).SumAsync(); Assert.Equal(0, sum); } - [Fact] public async Task QueryInner_Test() { - var sysUserMods = _virtualDbContext.Set().Select(o => o); - var sysUserModInts = await _virtualDbContext.Set().Where(o => sysUserMods.Select(i => i.Age).Any(i => i == o.Age)).ToListAsync(); + var sysUserMods = _virtualDbContext.Set().Select(o=>o); + var sysUserModInts = await _virtualDbContext.Set().Where(o=>sysUserMods.Select(i=>i.Age).Any(i=>i==o.Age)).ToListAsync(); Assert.Equal(1000, sysUserModInts.Count); } // [Fact] diff --git a/test/ShardingCore.Test2x/ShardingTestSync.cs b/test/ShardingCore.Test2x/ShardingTestSync.cs index d948971a..1cf3977a 100644 --- a/test/ShardingCore.Test2x/ShardingTestSync.cs +++ b/test/ShardingCore.Test2x/ShardingTestSync.cs @@ -1,30 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Extensions.ShardingPageExtensions; -using ShardingCore.Extensions.ShardingQueryableExtensions; using ShardingCore.Helpers; using ShardingCore.Sharding; using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; -using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.TableCreator; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Core.VirtualRoutes.Abstractions; +using ShardingCore.Extensions.ShardingQueryableExtensions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.Test2x.Domain.Entities; -using ShardingCore.Utils; using Xunit; namespace ShardingCore.Test2x @@ -35,38 +34,34 @@ namespace ShardingCore.Test2x { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -116,8 +111,10 @@ namespace ShardingCore.Test2x var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + //, "aa", typeof(ShardingDefaultDbContext), new List(),null + var y = new EntityMetadata(typeof(LogDay)); + //, "aa1", typeof(ShardingDefaultDbContext), new List(),null Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); @@ -167,6 +164,7 @@ namespace ShardingCore.Test2x Assert.False(isKey3); var isKey4 = userModMetadata.ShardingTableFieldIsKey(); Assert.True(isKey4); + _virtualDbContext.AddRange(logDays); var bulkShardingExpression = _virtualDbContext.BulkShardingExpression(o => new[] { "A", "B" }.Contains(o.Area)); Assert.Equal(2, bulkShardingExpression.Count); @@ -184,8 +182,6 @@ namespace ShardingCore.Test2x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var x1x1 = new ParallelTableGroupNode(new HashSet() { new ParallelTableComparerType(typeof(SysUserMod)), new ParallelTableComparerType(typeof(SysUserSalary)) }); @@ -201,17 +197,18 @@ namespace ShardingCore.Test2x public string Id { get; set; } public string T { get; set; } } + [Fact] public void TestMultiShardingProperty() { - var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); + var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); Assert.NotNull(multiOrder); var longs = new[] { 232398109278351360, 255197859283087360 }; - var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); + var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); Assert.Equal(2, multiOrders.Count); var dateTime = new DateTime(2021, 11, 1); - var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); + var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); Assert.Null(multiOrder404); } [Fact] @@ -244,7 +241,7 @@ namespace ShardingCore.Test2x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x().Where(o => o.Id.Equals("1")).FirstOrDefault(); + var sysUserModab = _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefault(); Assert.NotNull(sysUserModab); Assert.True(sysUserModab.Id == "1"); - var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); + var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModaa); Assert.True(sysUserModaa.Id == "1"); - var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); + var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); Assert.NotNull(sysUserMod); Assert.True(sysUserMod.Id == "1"); - Assert.Equal(sysUserModaa, sysUserMod); - var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); + var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModxx); + Assert.Equal(sysUserModaa, sysUserMod); Assert.True(x.Contains(sysUserModxx.Id)); Assert.NotNull(sysUserMod); var userMod = _virtualDbContext.Set().Find("1"); Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); - var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); + var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); Assert.True(user198.Id == "198"); - var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); + var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); Assert.Equal(userId198, "198"); + } [Fact] @@ -722,17 +720,10 @@ namespace ShardingCore.Test2x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var virtualTableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName = virtualTableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(virtualTableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -865,7 +856,7 @@ namespace ShardingCore.Test2x catch (Exception e) { Assert.True(typeof(InvalidOperationException) == e.GetType() || typeof(TargetInvocationException) == e.GetType()); - Assert.True(e.Message.Contains("contains") || e.InnerException.Message.Contains("contains")); + Assert.True(e.Message.Contains("contains")|| e.InnerException.Message.Contains("contains")); } } } @@ -961,9 +952,9 @@ namespace ShardingCore.Test2x Assert.NotNull(areaB); } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -971,9 +962,9 @@ namespace ShardingCore.Test2x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1422,24 +1413,24 @@ namespace ShardingCore.Test2x [Fact] public void AsRouteTest() { - var countAsync3 = _virtualDbContext.Set().AsRoute(o => + var countAsync3 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("202104"); }).Count(); Assert.Equal(30, countAsync3); - var countAsync2 = _virtualDbContext.Set().AsRoute(o => + var countAsync2 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("2021"); }).Count(); Assert.Equal(300, countAsync2); - var countAsync4 = _virtualDbContext.Set().AsRoute(o => + var countAsync4 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("20210419_25"); }).Count(); Assert.Equal(7, countAsync4); - var countAsync5 = _virtualDbContext.Set().AsRoute(o => + var countAsync5 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintTail("20210419_25", "20210426_02"); }).Count(); @@ -1447,7 +1438,7 @@ namespace ShardingCore.Test2x var fiveBegin = new DateTime(2021, 5, 1).Date; - var sum = _virtualDbContext.Set().AsRoute(o => + var sum = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintDataSource("C"); }) diff --git a/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs index b9cfcc30..ac023119 100644 --- a/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogDayLongVirtualRoute.cs @@ -26,7 +26,8 @@ namespace ShardingCore.Test2x.Shardings { return new DateTime(2021, 1, 1); } - public override List GetAllTails() + + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; @@ -45,5 +46,6 @@ namespace ShardingCore.Test2x.Shardings } return tails; } + } } diff --git a/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs index c7b0ea03..81b6b96f 100644 --- a/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/LogDayVirtualTableRoute.cs @@ -34,7 +34,7 @@ namespace ShardingCore.Test2x.Shardings { return true; } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index 78d07d82..f7391d05 100644 --- a/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -39,7 +39,7 @@ namespace ShardingCore.Test2x.Shardings public override void Configure(EntityMetadataDataSourceBuilder builder) { - + builder.ShardingProperty(o => o.Area); } public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) diff --git a/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs index 1f4bc877..4f3fdd00 100644 --- a/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -15,13 +15,12 @@ namespace ShardingCore.Test2x.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { - var allTails = base.GetAllTails(); + var allTails = base.CalcTailsOnStart(); allTails.Add("202112"); return allTails; } - public override void Configure(EntityMetadataTableBuilder builder) { diff --git a/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs index 03962638..97110df3 100644 --- a/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test2x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -24,7 +24,7 @@ namespace ShardingCore.Test2x.Shardings } - public override List GetAllTails() + public override List GetTails() { var beginTime = new DateTime(2020, 1, 1); var endTime = new DateTime(2021, 12, 1); diff --git a/test/ShardingCore.Test2x/Startup.cs b/test/ShardingCore.Test2x/Startup.cs index 00d67ab1..ab261809 100644 --- a/test/ShardingCore.Test2x/Startup.cs +++ b/test/ShardingCore.Test2x/Startup.cs @@ -10,6 +10,7 @@ using ShardingCore.Bootstrappers; using ShardingCore.Helpers; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.TableExists; +using ShardingCore.TableExists.Abstractions; using ShardingCore.Test2x.Domain.Entities; using ShardingCore.Test2x.Shardings; @@ -35,12 +36,8 @@ namespace ShardingCore.Test2x public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) { services.AddShardingDbContext() - .AddEntityConfig(op => + .UseRouteConfig(op => { - //如果您使用code-first建议选择false - op.CreateShardingTableOnStart = true; - //如果您使用code-first建议修改为fsle - op.EnsureCreatedWithOutShardingTable = true; //当无法获取路由时会返回默认值而不是报错 op.ThrowIfQueryRouteNotMatch = false; op.AddShardingDataSourceRoute(); @@ -58,9 +55,8 @@ namespace ShardingCore.Test2x op.AddShardingTableRoute(); }) - .AddConfig(op => + .UseConfig(op => { - op.ConfigId = "c1"; op.UseShardingQuery((conStr, builder) => { @@ -93,8 +89,9 @@ namespace ShardingCore.Test2x } }; }, ReadStrategyEnum.Loop, defaultEnable: false, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime); - op.ReplaceTableEnsureManager(sp => new SqlServerTableEnsureManager()); - }).EnsureConfig(); + }) + .ReplaceService(ServiceLifetime.Singleton) + .AddShardingCore(); // services.AddShardingDbContext(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15")) // ,op => // { @@ -110,8 +107,8 @@ namespace ShardingCore.Test2x // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 public void Configure(IServiceProvider serviceProvider) { - var shardingBootstrapper = serviceProvider.GetService(); - shardingBootstrapper.Start(); + var shardingBootstrapper = serviceProvider.GetRequiredService(); + shardingBootstrapper.AutoShardingCreate(); // 有一些测试数据要初始化可以放在这里 InitData(serviceProvider).GetAwaiter().GetResult(); } diff --git a/test/ShardingCore.Test3x/Domain/Entities/Order.cs b/test/ShardingCore.Test3x/Domain/Entities/Order.cs index f9967c82..fac63e35 100644 --- a/test/ShardingCore.Test3x/Domain/Entities/Order.cs +++ b/test/ShardingCore.Test3x/Domain/Entities/Order.cs @@ -6,10 +6,8 @@ namespace ShardingCore.Test3x.Domain.Entities public class Order { public Guid Id { get; set; } - [ShardingDataSourceKey] public string Area { get; set; } public long Money { get; set; } - [ShardingTableKey] public DateTime CreateTime { get; set; } } } diff --git a/test/ShardingCore.Test3x/Domain/Entities/SysUserMod.cs b/test/ShardingCore.Test3x/Domain/Entities/SysUserMod.cs index 00ab3038..77a39f44 100644 --- a/test/ShardingCore.Test3x/Domain/Entities/SysUserMod.cs +++ b/test/ShardingCore.Test3x/Domain/Entities/SysUserMod.cs @@ -6,7 +6,7 @@ namespace ShardingCore.Test3x.Domain.Entities * @Date: Thursday, 14 January 2021 15:36:43 * @Email: 326308290@qq.com */ - public class SysUserMod + public class SysUserMod: IId { /// /// 用户Id用于分表 @@ -21,6 +21,12 @@ namespace ShardingCore.Test3x.Domain.Entities /// public int Age { get; set; } public int AgeGroup { get; set; } - + } + + public interface IId + { + string Id { get; set; } + } + } \ No newline at end of file diff --git a/test/ShardingCore.Test3x/ShardingTest.cs b/test/ShardingCore.Test3x/ShardingTest.cs index 03865917..135fa645 100644 --- a/test/ShardingCore.Test3x/ShardingTest.cs +++ b/test/ShardingCore.Test3x/ShardingTest.cs @@ -7,11 +7,10 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; +using ShardingCore.Core.RuntimeContexts; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +using ShardingCore.Core.VirtualRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; @@ -25,6 +24,7 @@ using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.Sharding.ShardingDbContextExecutors; +using ShardingCore.Sharding.StreamMergeEngines; using ShardingCore.TableCreator; using ShardingCore.Test3x.Domain.Entities; using ShardingCore.Utils; @@ -32,48 +32,39 @@ using Xunit; namespace ShardingCore.Test3x { - /* - * @Author: xjm - * @Description: - * @Date: Friday, 15 January 2021 17:22:10 - * @Email: 326308290@qq.com - */ + public class ShardingTest { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -81,32 +72,32 @@ namespace ShardingCore.Test3x // var expressionEqualityComparer = new RouteParseExpressionEqualityComparer(); // var virtualTable = _virtualTableManager.GetVirtualTable(); // var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute)virtualTable.GetVirtualRoute(); - // + // var xxxx = "202102"; // var queryable1 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102); // var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable2 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102); // var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var xxxx1 = 202102; // var queryable3 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1); // var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable4 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101); // var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable5 = _virtualDbContext.Set().Where(o => o.DateOfMonth > 202101); // var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable6 = _virtualDbContext.Set().Where(o => o.DateOfMonth == 202101); // var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable7 = _virtualDbContext.Set().Where(o => 202101 <= o.DateOfMonth); // var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable8 = _virtualDbContext.Set().Where(o => 202101 == o.DateOfMonth); // var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); // Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); @@ -123,12 +114,14 @@ namespace ShardingCore.Test3x var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + var y = new EntityMetadata(typeof(LogDay)); Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); + var bulkShardingTableEnumerable = _virtualDbContext.BulkShardingTableEnumerable(logDays); + Assert.Equal(100, bulkShardingTableEnumerable.Count); var bulkShardingEnumerable = _virtualDbContext.BulkShardingEnumerable(logDays); Assert.Equal(1, bulkShardingEnumerable.Count); @@ -182,12 +175,12 @@ namespace ShardingCore.Test3x Assert.True(bulkShardingExpression.ContainsKey("B")); var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression(o => o.Id == Guid.NewGuid().ToString()); + Assert.Equal(1, bulkShardingTableExpression.Count()); var noShardingExpression = _virtualDbContext.BulkShardingExpression(o => o.Id == "123"); Assert.Equal(1, noShardingExpression.Count()); - var isShardingDbContext = _virtualDbContext.IsShardingDbContext(); Assert.True(isShardingDbContext); var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext(); @@ -196,17 +189,15 @@ namespace ShardingCore.Test3x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var emptyTailIdentity = new SingleQueryRouteTail(string.Empty).GetRouteTailIdentity(); var aTailIdentity = new SingleQueryRouteTail("a").GetRouteTailIdentity(); var bTailIdentity = new SingleQueryRouteTail("b").GetRouteTailIdentity(); - var dics=new SortedDictionary(new NoShardingFirstComparer()); - var dicTails=new List() { emptyTailIdentity, aTailIdentity, bTailIdentity }; + var dics = new SortedDictionary(new NoShardingFirstComparer()); + var dicTails = new List() { emptyTailIdentity, aTailIdentity, bTailIdentity }; for (int i = 0; i < 10; i++) { dics.Clear(); - var reOrderList=dicTails.OrderBy(o => Guid.NewGuid()).ToList(); + var reOrderList = dicTails.OrderBy(o => Guid.NewGuid()).ToList(); foreach (var tail in reOrderList) { dics.Add(tail, null); @@ -220,6 +211,10 @@ namespace ShardingCore.Test3x { new ParallelTableComparerType(typeof(SysUserSalary)),new ParallelTableComparerType(typeof(SysUserMod)), }); Assert.Equal(x1x1, x2x2); Assert.Equal(x1x1.GetHashCode(), x2x2.GetHashCode()); + var succeedAddConnectionString = _shardingConnectionStringResolver.AddConnectionString("X", "Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;",null); + Assert.True(succeedAddConnectionString); + var connectionString = _shardingConnectionStringResolver.GetConnectionString("X", null); + Assert.Equal("Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;", connectionString); } public class SequenceClass @@ -234,9 +229,13 @@ namespace ShardingCore.Test3x var multiOrder = await _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefaultAsync(); Assert.NotNull(multiOrder); + var allMultiOrders = await _virtualDbContext.Set().ToListAsync(); + Assert.Equal(8, allMultiOrders.Count); var longs = new[] { 232398109278351360, 255197859283087360 }; var multiOrders = await _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToListAsync(); Assert.Equal(2, multiOrders.Count); + var multinNotOrders = await _virtualDbContext.Set().Where(o => !longs.Contains(o.Id)).ToListAsync(); + Assert.Equal(6, multinNotOrders.Count); var dateTime = new DateTime(2021, 11, 1); var multiOrder404 = await _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefaultAsync(); Assert.Null(multiOrder404); @@ -271,7 +270,7 @@ namespace ShardingCore.Test3x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x() + join salary in _virtualDbContext.Set() + on u.Id equals salary.UserId + select new + { + u.Id, + u.Age, + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }).CountAsync(); var list = await (from u in _virtualDbContext.Set() join salary in _virtualDbContext.Set() on u.Id equals salary.UserId @@ -398,14 +408,14 @@ namespace ShardingCore.Test3x Assert.DoesNotContain(list1, o => o.Name != "name_300"); var queryable1 = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") - join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) - on u.Id equals salary.UserId - select new - { - Salary = salary.Salary, - DateOfMonth = salary.DateOfMonth, - Name = u.Name - }); + join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) + on u.Id equals salary.UserId + select new + { + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }); var list3 = await queryable1.ToListAsync(); Assert.Equal(1, list3.Count()); Assert.Contains(list3, o => o.Name == "name_300"); @@ -465,10 +475,25 @@ namespace ShardingCore.Test3x [Fact] public async Task ToList_Id_Not_Eq_Test() { + var methodValue = new MethodValue() { AA = "7" }; + var mods123 = await _virtualDbContext.Set().Where(o => o.Id == methodValue.GetAa()).FirstOrDefaultAsync(); + Assert.NotNull(mods123); + Assert.Equal(mods123.Id, "7"); + var mods12 = await _virtualDbContext.Set().Where(o => new List { "3", "4" }.Contains(o.Id)).ToListAsync(); + Assert.Contains(mods12, o => o.Id == "3" || o.Id == "4"); var mods = await _virtualDbContext.Set().Where(o => o.Id != "3").ToListAsync(); Assert.Equal(999, mods.Count); Assert.DoesNotContain(mods, o => o.Id == "3"); } + public class MethodValue + { + public string AA { get; set; } + + public string GetAa() + { + return AA; + } + } [Fact] public async Task ToList_Id_Not_Eq_Skip_Test() @@ -497,6 +522,10 @@ namespace ShardingCore.Test3x [Fact] public async Task ToList_Id_Eq_Not_In_Db_Test() { + var mod1s = await _virtualDbContext.Set().Where(o =>string.Compare(((IId)o).Id,"1001") ==0).ToListAsync(); + var mod2s = await _virtualDbContext.Set().Where(o => string.Compare("1001", o.Id) == 0).ToListAsync(); + var mod3s = await _virtualDbContext.Set().Where(o => "1001".CompareTo(o.Id)==0).ToListAsync(); + var mod4s = await _virtualDbContext.Set().Where(o => o.Id.CompareTo("1001") == 0).ToListAsync(); var mods = await _virtualDbContext.Set().Where(o => o.Id == "1001").ToListAsync(); Assert.Empty(mods); } @@ -523,9 +552,23 @@ namespace ShardingCore.Test3x } + [Fact] public async Task FirstOrDefault2() { + var sysUserModabxxxxx1 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx71 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var xxxx1 = 202102; + var sysUserModabxxxxx72 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1).FirstOrDefaultAsync(); + var sysUserModabxxxxx2 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101).FirstOrDefaultAsync(); + var sysUserModabxxxxx3 = await _virtualDbContext.Set().Where(o => o.DateOfMonth > 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx4 = await _virtualDbContext.Set().Where(o => o.DateOfMonth == 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx5 = await _virtualDbContext.Set().Where(o => o.DateOfMonth < 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx6 = await _virtualDbContext.Set().Where(o => o.DateOfMonth <= 202102).FirstOrDefaultAsync(); + var next = "1"; + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Id == next).FirstOrDefaultAsync(); + var sysUserModabxxx = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); + var sysUserModabxxx11 = await _virtualDbContext.Set().Where(o => o.Name == "name_2" || o.Name == "name_3").FirstOrDefaultAsync(); var x = new Object[] { "1", "2" }; var sysUserModab = await _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefaultAsync(); Assert.NotNull(sysUserModab); @@ -556,8 +599,26 @@ namespace ShardingCore.Test3x var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + var sysUserMod2 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new + { + Name=o.Name + }).FirstOrDefaultAsync(); + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new TestClass(o.Name,""){Id = o.Id}).FirstOrDefaultAsync(); + Assert.NotNull(sysUserMod1); } + public class TestClass + { + public string Name { get; } + public string Aa { get; } + public string Id { get; set; } + + public TestClass(string name,string aa) + { + Name = name; + Aa = aa; + } + } [Fact] public async Task FirstOrDefault4() @@ -574,6 +635,7 @@ namespace ShardingCore.Test3x Assert.Null(sysUserMod); } + [Fact] public async Task Count_Test() { @@ -684,6 +746,90 @@ namespace ShardingCore.Test3x Assert.Equal(1140000, group[0].MaxSalary); } + [Fact] + public async Task Group_Test1() + { + var ids = new[] { "200", "300" }; + var dateOfMonths = new[] { 202111, 202110 }; + var dateTime = DateTime.Now; + + var sql = from u in _virtualDbContext.Set() + group u by u.UserId + into g + select new + { + UI = g.Key, + x=g.Sum(o=>o.SalaryDecimal), + Now = dateTime + }; + var listAsync = await sql.ToListAsync(); + var group = await (from u in _virtualDbContext.Set() + .Where(o => ids.Contains(o.UserId) && dateOfMonths.Contains(o.DateOfMonth)) + group u by new + { + UId = u.UserId + } + into g + select new + { + GroupUserId = g.Key.UId, + Count = g.Count(), + TotalSalary = g.Sum(o => o.Salary), + AvgSalary = g.Average(o => o.Salary), + AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), + MinSalary = g.Min(o => o.Salary), + MaxSalary = g.Max(o => o.Salary) + }).ToListAsync(); + Assert.Equal(2, group.Count); + Assert.Equal(2, group[0].Count); + Assert.Equal(2260000, group[0].TotalSalary); + Assert.Equal(1130000, group[0].AvgSalary); + Assert.Equal(11300, group[0].AvgSalaryDecimal); + Assert.Equal(1120000, group[0].MinSalary); + Assert.Equal(1140000, group[0].MaxSalary); + } + //[Fact] + //public async Task Group_Recently_Test() + //{ + // //var list =(from us in _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // // group us by new + // // { + // // UserId=us.UserId + // // } + // // into g + // // select new + // // { + // // UserId=g.Key.UserId, + // // DateOfMonth = g.Max(o=>o.DateOfMonth) + // // }).ToList(); + // //var y = list; + + // var ids = new List(){ "200", "300" }; + // List result = new List(ids.Count); + // var routeFilter = new List().AsQueryable().Where(o => ids.Contains(o.UserId)); + // //��ȡ��·��ʱ�䵹�� + // var tableRouteResults = _tableRouteRuleEngineFactory.Route(routeFilter) + // .Select(o => o.ReplaceTables.First().Tail).OrderByDescending(o => o).ToList(); + // foreach (var tableRouteResult in tableRouteResults) + // { + // if(ids.IsEmpty()) + // break; + // using (_shardingRouteManager.CreateScope()) + // { + // _shardingRouteManager.Current.TryCreateOrAddMustTail(tableRouteResult); + // var queryable = _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // .GroupBy(o => new { o.UserId }, i => i, + // (i, u) => new { + // Data = u.OrderByDescending(o => o.DateOfMonth).FirstOrDefault() + // }); + // var r =await queryable.ToListAsync(); + // result.AddRange(r.Select(o=>o.Data)); + // var removeUserIds = result.Select(u => u.UserId).ToHashSet(); + // ids.RemoveAll(o => removeUserIds.Contains(o)); + // } + // } + //} + [Fact] public async Task OrderCountTest() { @@ -775,17 +921,11 @@ namespace ShardingCore.Test3x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var tableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName =tableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(tableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -819,7 +959,7 @@ namespace ShardingCore.Test3x var fourBegin = new DateTime(2021, 4, 1).Date; var fiveBegin = new DateTime(2021, 5, 1).Date; var moneyAverage = await _virtualDbContext.Set() - .Where(o => o.CreateTime >= fourBegin && o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); + .Where(o => o.CreateTime >= fourBegin&& o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); Assert.Equal(105, moneyAverage); using (_shardingRouteManager.CreateScope()) @@ -1021,9 +1161,9 @@ namespace ShardingCore.Test3x } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -1031,9 +1171,9 @@ namespace ShardingCore.Test3x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1223,6 +1363,7 @@ namespace ShardingCore.Test3x Assert.Equal(300, countAsync1); } Assert.Null(_shardingRouteManager.Current); + } [Fact] public async Task LogYearLongShardingPage() @@ -1306,29 +1447,29 @@ namespace ShardingCore.Test3x await tran.RollbackAsync(); } } - logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Update(logNoSharding); + logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Update(logNoSharding); - logNoShardings.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.UpdateRange(logNoShardings); + logNoShardings.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.UpdateRange(logNoShardings); - logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Set().Update(logNoSharding1); + logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Set().Update(logNoSharding1); - logNoSharding1s.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().UpdateRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().UpdateRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); - _virtualDbContext.Remove(logNoSharding); + _virtualDbContext.Remove(logNoSharding); - _virtualDbContext.RemoveRange(logNoShardings); + _virtualDbContext.RemoveRange(logNoShardings); - _virtualDbContext.Set().Remove(logNoSharding1); + _virtualDbContext.Set().Remove(logNoSharding1); - logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().RemoveRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().RemoveRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); } [Fact] public async Task CrudTest1() @@ -1362,7 +1503,7 @@ namespace ShardingCore.Test3x { await _virtualDbContext.AddAsync((object)logNoSharding); - await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o=>(object)o).ToArray()); + await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o => (object)o).ToArray()); await _virtualDbContext.SaveChangesAsync(); await tran.CommitAsync(); @@ -1495,6 +1636,7 @@ namespace ShardingCore.Test3x Assert.Equal(10, page1.Data.Count); Assert.Equal(300, page1.Total); } + [Fact] public async Task AsRouteTest() { @@ -1533,8 +1675,8 @@ namespace ShardingCore.Test3x [Fact] public async Task QueryInner_Test() { - var sysUserMods = _virtualDbContext.Set().Select(o => o); - var sysUserModInts = await _virtualDbContext.Set().Where(o => sysUserMods.Select(i => i.Age).Any(i => i == o.Age)).ToListAsync(); + var sysUserMods = _virtualDbContext.Set().Select(o=>o); + var sysUserModInts = await _virtualDbContext.Set().Where(o=>sysUserMods.Select(i=>i.Age).Any(i=>i==o.Age)).ToListAsync(); Assert.Equal(1000, sysUserModInts.Count); } // [Fact] diff --git a/test/ShardingCore.Test3x/ShardingTestSync.cs b/test/ShardingCore.Test3x/ShardingTestSync.cs index 12538e29..fbeec8e4 100644 --- a/test/ShardingCore.Test3x/ShardingTestSync.cs +++ b/test/ShardingCore.Test3x/ShardingTestSync.cs @@ -1,31 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Extensions.ShardingPageExtensions; -using ShardingCore.Extensions.ShardingQueryableExtensions; using ShardingCore.Helpers; using ShardingCore.Sharding; using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; -using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.TableCreator; using ShardingCore.Test3x.Domain.Entities; -using ShardingCore.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Core.VirtualRoutes.Abstractions; +using ShardingCore.Extensions.ShardingQueryableExtensions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; using Xunit; namespace ShardingCore.Test3x @@ -36,38 +34,34 @@ namespace ShardingCore.Test3x { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -117,8 +111,10 @@ namespace ShardingCore.Test3x var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + //, "aa", typeof(ShardingDefaultDbContext), new List(),null + var y = new EntityMetadata(typeof(LogDay)); + //, "aa1", typeof(ShardingDefaultDbContext), new List(),null Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); @@ -186,8 +182,6 @@ namespace ShardingCore.Test3x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var x1x1 = new ParallelTableGroupNode(new HashSet() { new ParallelTableComparerType(typeof(SysUserMod)), new ParallelTableComparerType(typeof(SysUserSalary)) }); @@ -203,17 +197,18 @@ namespace ShardingCore.Test3x public string Id { get; set; } public string T { get; set; } } + [Fact] public void TestMultiShardingProperty() { - var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); + var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); Assert.NotNull(multiOrder); var longs = new[] { 232398109278351360, 255197859283087360 }; - var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); + var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); Assert.Equal(2, multiOrders.Count); var dateTime = new DateTime(2021, 11, 1); - var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); + var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); Assert.Null(multiOrder404); } [Fact] @@ -246,7 +241,7 @@ namespace ShardingCore.Test3x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x().Where(o => o.Id.Equals("1")).FirstOrDefault(); + var sysUserModab = _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefault(); Assert.NotNull(sysUserModab); Assert.True(sysUserModab.Id == "1"); - var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); + var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModaa); Assert.True(sysUserModaa.Id == "1"); - var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); + var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); Assert.NotNull(sysUserMod); Assert.True(sysUserMod.Id == "1"); - Assert.Equal(sysUserModaa, sysUserMod); - var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); + var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModxx); + Assert.Equal(sysUserModaa, sysUserMod); Assert.True(x.Contains(sysUserModxx.Id)); Assert.NotNull(sysUserMod); var userMod = _virtualDbContext.Set().Find("1"); Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); - var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); + var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); Assert.True(user198.Id == "198"); - var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); + var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); Assert.Equal(userId198, "198"); + } [Fact] @@ -724,17 +720,10 @@ namespace ShardingCore.Test3x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var virtualTableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName = virtualTableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(virtualTableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -867,7 +856,7 @@ namespace ShardingCore.Test3x catch (Exception e) { Assert.True(typeof(InvalidOperationException) == e.GetType() || typeof(TargetInvocationException) == e.GetType()); - Assert.True(e.Message.Contains("contains") || e.InnerException.Message.Contains("contains")); + Assert.True(e.Message.Contains("contains")|| e.InnerException.Message.Contains("contains")); } } } @@ -963,9 +952,9 @@ namespace ShardingCore.Test3x Assert.NotNull(areaB); } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -973,9 +962,9 @@ namespace ShardingCore.Test3x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1424,24 +1413,24 @@ namespace ShardingCore.Test3x [Fact] public void AsRouteTest() { - var countAsync3 = _virtualDbContext.Set().AsRoute(o => + var countAsync3 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("202104"); }).Count(); Assert.Equal(30, countAsync3); - var countAsync2 = _virtualDbContext.Set().AsRoute(o => + var countAsync2 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("2021"); }).Count(); Assert.Equal(300, countAsync2); - var countAsync4 = _virtualDbContext.Set().AsRoute(o => + var countAsync4 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("20210419_25"); }).Count(); Assert.Equal(7, countAsync4); - var countAsync5 = _virtualDbContext.Set().AsRoute(o => + var countAsync5 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintTail("20210419_25", "20210426_02"); }).Count(); @@ -1449,7 +1438,7 @@ namespace ShardingCore.Test3x var fiveBegin = new DateTime(2021, 5, 1).Date; - var sum = _virtualDbContext.Set().AsRoute(o => + var sum = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintDataSource("C"); }) diff --git a/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs index 5438279b..15a2e9fb 100644 --- a/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogDayLongVirtualRoute.cs @@ -30,7 +30,7 @@ namespace ShardingCore.Test3x.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs index 42e221c3..db5551d2 100644 --- a/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/LogDayVirtualTableRoute.cs @@ -35,7 +35,7 @@ namespace ShardingCore.Test3x.Shardings return true; } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index f0e560bc..ed50ddc0 100644 --- a/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -39,7 +39,7 @@ namespace ShardingCore.Test3x.Shardings public override void Configure(EntityMetadataDataSourceBuilder builder) { - + builder.ShardingProperty(o => o.Area); } public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) diff --git a/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs index 10bdc974..18b06dc0 100644 --- a/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -15,16 +15,16 @@ namespace ShardingCore.Test3x.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { - var allTails = base.GetAllTails(); + var allTails = base.CalcTailsOnStart(); allTails.Add("202112"); return allTails; } public override void Configure(EntityMetadataTableBuilder builder) { - + builder.ShardingProperty(o => o.CreateTime); } public override IPaginationConfiguration CreatePaginationConfiguration() diff --git a/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs index 78701f2a..b113a3c3 100644 --- a/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test3x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -25,7 +25,7 @@ namespace ShardingCore.Test3x.Shardings } - public override List GetAllTails() + public override List GetTails() { var beginTime = new DateTime(2020, 1, 1); var endTime = new DateTime(2021, 12, 1); diff --git a/test/ShardingCore.Test3x/Startup.cs b/test/ShardingCore.Test3x/Startup.cs index 043c3b3b..e700c487 100644 --- a/test/ShardingCore.Test3x/Startup.cs +++ b/test/ShardingCore.Test3x/Startup.cs @@ -10,6 +10,7 @@ using ShardingCore.Bootstrappers; using ShardingCore.Helpers; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.TableExists; +using ShardingCore.TableExists.Abstractions; using ShardingCore.Test3x.Domain.Entities; using ShardingCore.Test3x.Shardings; @@ -35,12 +36,8 @@ namespace ShardingCore.Test3x public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) { services.AddShardingDbContext() - .AddEntityConfig(op => + .UseRouteConfig(op => { - //如果您使用code-first建议选择false - op.CreateShardingTableOnStart = true; - //如果您使用code-first建议修改为fsle - op.EnsureCreatedWithOutShardingTable = true; //当无法获取路由时会返回默认值而不是报错 op.ThrowIfQueryRouteNotMatch = false; op.AddShardingDataSourceRoute(); @@ -58,10 +55,8 @@ namespace ShardingCore.Test3x op.AddShardingTableRoute(); }) - .AddConfig(op => + .UseConfig(op => { - op.ConfigId = "c1"; - op.UseShardingQuery((conStr, builder) => { builder.UseSqlServer(conStr).UseLoggerFactory(efLogger); @@ -93,15 +88,14 @@ namespace ShardingCore.Test3x } }; }, ReadStrategyEnum.Loop, defaultEnable: false, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime); - op.ReplaceTableEnsureManager(sp => new SqlServerTableEnsureManager()); - }).EnsureConfig(); + }).ReplaceService(ServiceLifetime.Singleton).AddShardingCore(); } // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 public void Configure(IServiceProvider serviceProvider) { var shardingBootstrapper = serviceProvider.GetService(); - shardingBootstrapper.Start(); + shardingBootstrapper.AutoShardingCreate(); // 有一些测试数据要初始化可以放在这里 InitData(serviceProvider).GetAwaiter().GetResult(); } diff --git a/test/ShardingCore.Test5x/Domain/Entities/Order.cs b/test/ShardingCore.Test5x/Domain/Entities/Order.cs index 01faa08d..76989d4c 100644 --- a/test/ShardingCore.Test5x/Domain/Entities/Order.cs +++ b/test/ShardingCore.Test5x/Domain/Entities/Order.cs @@ -6,10 +6,8 @@ namespace ShardingCore.Test5x.Domain.Entities public class Order { public Guid Id { get; set; } - [ShardingDataSourceKey] public string Area { get; set; } public long Money { get; set; } - [ShardingTableKey] public DateTime CreateTime { get; set; } } } diff --git a/test/ShardingCore.Test5x/Domain/Entities/SysUserMod.cs b/test/ShardingCore.Test5x/Domain/Entities/SysUserMod.cs index 841afaa4..89d20daa 100644 --- a/test/ShardingCore.Test5x/Domain/Entities/SysUserMod.cs +++ b/test/ShardingCore.Test5x/Domain/Entities/SysUserMod.cs @@ -6,7 +6,7 @@ namespace ShardingCore.Test5x.Domain.Entities * @Date: Thursday, 14 January 2021 15:36:43 * @Email: 326308290@qq.com */ - public class SysUserMod + public class SysUserMod: IId { /// /// 用户Id用于分表 @@ -21,6 +21,12 @@ namespace ShardingCore.Test5x.Domain.Entities /// public int Age { get; set; } public int AgeGroup { get; set; } - + } + + public interface IId + { + string Id { get; set; } + } + } \ No newline at end of file diff --git a/test/ShardingCore.Test5x/ShardingTest.cs b/test/ShardingCore.Test5x/ShardingTest.cs index a855b811..6cc2125b 100644 --- a/test/ShardingCore.Test5x/ShardingTest.cs +++ b/test/ShardingCore.Test5x/ShardingTest.cs @@ -7,11 +7,10 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; +using ShardingCore.Core.RuntimeContexts; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; +using ShardingCore.Core.VirtualRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; @@ -25,6 +24,7 @@ using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.Sharding.ShardingDbContextExecutors; +using ShardingCore.Sharding.StreamMergeEngines; using ShardingCore.TableCreator; using ShardingCore.Test5x.Domain.Entities; using ShardingCore.Utils; @@ -32,48 +32,39 @@ using Xunit; namespace ShardingCore.Test5x { - /* - * @Author: xjm - * @Description: - * @Date: Friday, 15 January 2021 17:22:10 - * @Email: 326308290@qq.com - */ + public class ShardingTest { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } // [Fact] // public void RouteParseCompileCacheTest() @@ -81,32 +72,32 @@ namespace ShardingCore.Test5x // var expressionEqualityComparer = new RouteParseExpressionEqualityComparer(); // var virtualTable = _virtualTableManager.GetVirtualTable(); // var virtualTableRoute = (AbstractShardingOperatorVirtualTableRoute)virtualTable.GetVirtualRoute(); - // + // var xxxx = "202102"; // var queryable1 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102); // var routeParseExpression1 = ShardingUtil.GetRouteParseExpression(queryable1, virtualTableRoute.EntityMetadata, - // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable2 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102); // var routeParseExpression2 = ShardingUtil.GetRouteParseExpression(queryable2, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var xxxx1 = 202102; // var queryable3 = _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1); // var routeParseExpression3 = ShardingUtil.GetRouteParseExpression(queryable3, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable4 = _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101); // var routeParseExpression4 = ShardingUtil.GetRouteParseExpression(queryable4, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable5 = _virtualDbContext.Set().Where(o => o.DateOfMonth > 202101); // var routeParseExpression5 = ShardingUtil.GetRouteParseExpression(queryable5, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable6 = _virtualDbContext.Set().Where(o => o.DateOfMonth == 202101); // var routeParseExpression6 = ShardingUtil.GetRouteParseExpression(queryable6, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable7 = _virtualDbContext.Set().Where(o => 202101 <= o.DateOfMonth); // var routeParseExpression7 = ShardingUtil.GetRouteParseExpression(queryable7, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // var queryable8 = _virtualDbContext.Set().Where(o => 202101 == o.DateOfMonth); // var routeParseExpression8 = ShardingUtil.GetRouteParseExpression(queryable8, virtualTableRoute.EntityMetadata, - // (i, op,propertyName) => virtualTableRoute.GetRouteFilter(i, op,propertyName), true); + // (i, op, propertyName) => virtualTableRoute.GetRouteFilter(i, op, propertyName), true); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression2)); // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression3)); // Assert.NotEqual(expressionEqualityComparer.GetHashCode(routeParseExpression1), expressionEqualityComparer.GetHashCode(routeParseExpression4)); @@ -123,12 +114,14 @@ namespace ShardingCore.Test5x var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + var y = new EntityMetadata(typeof(LogDay)); Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); + var bulkShardingTableEnumerable = _virtualDbContext.BulkShardingTableEnumerable(logDays); + Assert.Equal(100, bulkShardingTableEnumerable.Count); var bulkShardingEnumerable = _virtualDbContext.BulkShardingEnumerable(logDays); Assert.Equal(1, bulkShardingEnumerable.Count); @@ -182,12 +175,12 @@ namespace ShardingCore.Test5x Assert.True(bulkShardingExpression.ContainsKey("B")); var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression(o => o.Id == Guid.NewGuid().ToString()); + Assert.Equal(1, bulkShardingTableExpression.Count()); var noShardingExpression = _virtualDbContext.BulkShardingExpression(o => o.Id == "123"); Assert.Equal(1, noShardingExpression.Count()); - var isShardingDbContext = _virtualDbContext.IsShardingDbContext(); Assert.True(isShardingDbContext); var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext(); @@ -196,17 +189,15 @@ namespace ShardingCore.Test5x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var emptyTailIdentity = new SingleQueryRouteTail(string.Empty).GetRouteTailIdentity(); var aTailIdentity = new SingleQueryRouteTail("a").GetRouteTailIdentity(); var bTailIdentity = new SingleQueryRouteTail("b").GetRouteTailIdentity(); - var dics=new SortedDictionary(new NoShardingFirstComparer()); - var dicTails=new List() { emptyTailIdentity, aTailIdentity, bTailIdentity }; + var dics = new SortedDictionary(new NoShardingFirstComparer()); + var dicTails = new List() { emptyTailIdentity, aTailIdentity, bTailIdentity }; for (int i = 0; i < 10; i++) { dics.Clear(); - var reOrderList=dicTails.OrderBy(o => Guid.NewGuid()).ToList(); + var reOrderList = dicTails.OrderBy(o => Guid.NewGuid()).ToList(); foreach (var tail in reOrderList) { dics.Add(tail, null); @@ -220,6 +211,10 @@ namespace ShardingCore.Test5x { new ParallelTableComparerType(typeof(SysUserSalary)),new ParallelTableComparerType(typeof(SysUserMod)), }); Assert.Equal(x1x1, x2x2); Assert.Equal(x1x1.GetHashCode(), x2x2.GetHashCode()); + var succeedAddConnectionString = _shardingConnectionStringResolver.AddConnectionString("X", "Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;",null); + Assert.True(succeedAddConnectionString); + var connectionString = _shardingConnectionStringResolver.GetConnectionString("X", null); + Assert.Equal("Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;", connectionString); } public class SequenceClass @@ -234,9 +229,13 @@ namespace ShardingCore.Test5x var multiOrder = await _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefaultAsync(); Assert.NotNull(multiOrder); + var allMultiOrders = await _virtualDbContext.Set().ToListAsync(); + Assert.Equal(8, allMultiOrders.Count); var longs = new[] { 232398109278351360, 255197859283087360 }; var multiOrders = await _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToListAsync(); Assert.Equal(2, multiOrders.Count); + var multinNotOrders = await _virtualDbContext.Set().Where(o => !longs.Contains(o.Id)).ToListAsync(); + Assert.Equal(6, multinNotOrders.Count); var dateTime = new DateTime(2021, 11, 1); var multiOrder404 = await _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefaultAsync(); Assert.Null(multiOrder404); @@ -271,7 +270,7 @@ namespace ShardingCore.Test5x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x() + join salary in _virtualDbContext.Set() + on u.Id equals salary.UserId + select new + { + u.Id, + u.Age, + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }).CountAsync(); var list = await (from u in _virtualDbContext.Set() join salary in _virtualDbContext.Set() on u.Id equals salary.UserId @@ -398,20 +408,20 @@ namespace ShardingCore.Test5x Assert.DoesNotContain(list1, o => o.Name != "name_300"); var queryable1 = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") - join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) - on u.Id equals salary.UserId - select new - { - Salary = salary.Salary, - DateOfMonth = salary.DateOfMonth, - Name = u.Name - }); + join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) + on u.Id equals salary.UserId + select new + { + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }); var list3 = await queryable1.ToListAsync(); Assert.Equal(1, list3.Count()); Assert.Contains(list3, o => o.Name == "name_300"); var firstOrDefaultAsync = await queryable1.OrderBy(o => o.DateOfMonth).FirstOrDefaultAsync(); Assert.NotNull(firstOrDefaultAsync); - var firstOrDefault = queryable1.OrderBy(o=>o.DateOfMonth).FirstOrDefault(); + var firstOrDefault = queryable1.OrderBy(o => o.DateOfMonth).FirstOrDefault(); Assert.NotNull(firstOrDefault); Assert.Equal(firstOrDefaultAsync, firstOrDefault); } @@ -465,10 +475,25 @@ namespace ShardingCore.Test5x [Fact] public async Task ToList_Id_Not_Eq_Test() { + var methodValue = new MethodValue() { AA = "7" }; + var mods123 = await _virtualDbContext.Set().Where(o => o.Id == methodValue.GetAa()).FirstOrDefaultAsync(); + Assert.NotNull(mods123); + Assert.Equal(mods123.Id, "7"); + var mods12 = await _virtualDbContext.Set().Where(o => new List { "3", "4" }.Contains(o.Id)).ToListAsync(); + Assert.Contains(mods12, o => o.Id == "3" || o.Id == "4"); var mods = await _virtualDbContext.Set().Where(o => o.Id != "3").ToListAsync(); Assert.Equal(999, mods.Count); Assert.DoesNotContain(mods, o => o.Id == "3"); } + public class MethodValue + { + public string AA { get; set; } + + public string GetAa() + { + return AA; + } + } [Fact] public async Task ToList_Id_Not_Eq_Skip_Test() @@ -497,6 +522,10 @@ namespace ShardingCore.Test5x [Fact] public async Task ToList_Id_Eq_Not_In_Db_Test() { + var mod1s = await _virtualDbContext.Set().Where(o =>string.Compare(((IId)o).Id,"1001") ==0).ToListAsync(); + var mod2s = await _virtualDbContext.Set().Where(o => string.Compare("1001", o.Id) == 0).ToListAsync(); + var mod3s = await _virtualDbContext.Set().Where(o => "1001".CompareTo(o.Id)==0).ToListAsync(); + var mod4s = await _virtualDbContext.Set().Where(o => o.Id.CompareTo("1001") == 0).ToListAsync(); var mods = await _virtualDbContext.Set().Where(o => o.Id == "1001").ToListAsync(); Assert.Empty(mods); } @@ -523,9 +552,23 @@ namespace ShardingCore.Test5x } + [Fact] public async Task FirstOrDefault2() { + var sysUserModabxxxxx1 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx71 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= 202102).FirstOrDefaultAsync(); + var xxxx1 = 202102; + var sysUserModabxxxxx72 = await _virtualDbContext.Set().Where(ox => ox.DateOfMonth >= xxxx1).FirstOrDefaultAsync(); + var sysUserModabxxxxx2 = await _virtualDbContext.Set().Where(o => o.DateOfMonth >= 202101).FirstOrDefaultAsync(); + var sysUserModabxxxxx3 = await _virtualDbContext.Set().Where(o => o.DateOfMonth > 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx4 = await _virtualDbContext.Set().Where(o => o.DateOfMonth == 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx5 = await _virtualDbContext.Set().Where(o => o.DateOfMonth < 202102).FirstOrDefaultAsync(); + var sysUserModabxxxxx6 = await _virtualDbContext.Set().Where(o => o.DateOfMonth <= 202102).FirstOrDefaultAsync(); + var next = "1"; + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Id == next).FirstOrDefaultAsync(); + var sysUserModabxxx = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); + var sysUserModabxxx11 = await _virtualDbContext.Set().Where(o => o.Name == "name_2" || o.Name == "name_3").FirstOrDefaultAsync(); var x = new Object[] { "1", "2" }; var sysUserModab = await _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefaultAsync(); Assert.NotNull(sysUserModab); @@ -556,8 +599,26 @@ namespace ShardingCore.Test5x var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + var sysUserMod2 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new + { + Name=o.Name + }).FirstOrDefaultAsync(); + var sysUserMod1 = await _virtualDbContext.Set().Where(o => o.Name == "name_2").Select(o => new TestClass(o.Name,""){Id = o.Id}).FirstOrDefaultAsync(); + Assert.NotNull(sysUserMod1); } + public class TestClass + { + public string Name { get; } + public string Aa { get; } + public string Id { get; set; } + + public TestClass(string name,string aa) + { + Name = name; + Aa = aa; + } + } [Fact] public async Task FirstOrDefault4() @@ -574,6 +635,7 @@ namespace ShardingCore.Test5x Assert.Null(sysUserMod); } + [Fact] public async Task Count_Test() { @@ -684,6 +746,90 @@ namespace ShardingCore.Test5x Assert.Equal(1140000, group[0].MaxSalary); } + [Fact] + public async Task Group_Test1() + { + var ids = new[] { "200", "300" }; + var dateOfMonths = new[] { 202111, 202110 }; + var dateTime = DateTime.Now; + + var sql = from u in _virtualDbContext.Set() + group u by u.UserId + into g + select new + { + UI = g.Key, + x=g.Sum(o=>o.SalaryDecimal), + Now = dateTime + }; + var listAsync = await sql.ToListAsync(); + var group = await (from u in _virtualDbContext.Set() + .Where(o => ids.Contains(o.UserId) && dateOfMonths.Contains(o.DateOfMonth)) + group u by new + { + UId = u.UserId + } + into g + select new + { + GroupUserId = g.Key.UId, + Count = g.Count(), + TotalSalary = g.Sum(o => o.Salary), + AvgSalary = g.Average(o => o.Salary), + AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), + MinSalary = g.Min(o => o.Salary), + MaxSalary = g.Max(o => o.Salary) + }).ToListAsync(); + Assert.Equal(2, group.Count); + Assert.Equal(2, group[0].Count); + Assert.Equal(2260000, group[0].TotalSalary); + Assert.Equal(1130000, group[0].AvgSalary); + Assert.Equal(11300, group[0].AvgSalaryDecimal); + Assert.Equal(1120000, group[0].MinSalary); + Assert.Equal(1140000, group[0].MaxSalary); + } + //[Fact] + //public async Task Group_Recently_Test() + //{ + // //var list =(from us in _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // // group us by new + // // { + // // UserId=us.UserId + // // } + // // into g + // // select new + // // { + // // UserId=g.Key.UserId, + // // DateOfMonth = g.Max(o=>o.DateOfMonth) + // // }).ToList(); + // //var y = list; + + // var ids = new List(){ "200", "300" }; + // List result = new List(ids.Count); + // var routeFilter = new List().AsQueryable().Where(o => ids.Contains(o.UserId)); + // //��ȡ��·��ʱ�䵹�� + // var tableRouteResults = _tableRouteRuleEngineFactory.Route(routeFilter) + // .Select(o => o.ReplaceTables.First().Tail).OrderByDescending(o => o).ToList(); + // foreach (var tableRouteResult in tableRouteResults) + // { + // if(ids.IsEmpty()) + // break; + // using (_shardingRouteManager.CreateScope()) + // { + // _shardingRouteManager.Current.TryCreateOrAddMustTail(tableRouteResult); + // var queryable = _virtualDbContext.Set().Where(o => ids.Contains(o.UserId)) + // .GroupBy(o => new { o.UserId }, i => i, + // (i, u) => new { + // Data = u.OrderByDescending(o => o.DateOfMonth).FirstOrDefault() + // }); + // var r =await queryable.ToListAsync(); + // result.AddRange(r.Select(o=>o.Data)); + // var removeUserIds = result.Select(u => u.UserId).ToHashSet(); + // ids.RemoveAll(o => removeUserIds.Contains(o)); + // } + // } + //} + [Fact] public async Task OrderCountTest() { @@ -775,17 +921,11 @@ namespace ShardingCore.Test5x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var tableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName =tableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(tableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -819,7 +959,7 @@ namespace ShardingCore.Test5x var fourBegin = new DateTime(2021, 4, 1).Date; var fiveBegin = new DateTime(2021, 5, 1).Date; var moneyAverage = await _virtualDbContext.Set() - .Where(o => o.CreateTime >= fourBegin && o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); + .Where(o => o.CreateTime >= fourBegin&& o.CreateTime <= fiveBegin).Select(o => o.Money).AverageAsync(); Assert.Equal(105, moneyAverage); using (_shardingRouteManager.CreateScope()) @@ -1021,9 +1161,9 @@ namespace ShardingCore.Test5x } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -1031,9 +1171,9 @@ namespace ShardingCore.Test5x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1223,6 +1363,7 @@ namespace ShardingCore.Test5x Assert.Equal(300, countAsync1); } Assert.Null(_shardingRouteManager.Current); + } [Fact] public async Task LogYearLongShardingPage() @@ -1306,29 +1447,29 @@ namespace ShardingCore.Test5x await tran.RollbackAsync(); } } - logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Update(logNoSharding); + logNoSharding.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Update(logNoSharding); - logNoShardings.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.UpdateRange(logNoShardings); + logNoShardings.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.UpdateRange(logNoShardings); - logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); - _virtualDbContext.Set().Update(logNoSharding1); + logNoSharding1.Body = DateTime.Now.ToString("yyyyMMdd"); + _virtualDbContext.Set().Update(logNoSharding1); - logNoSharding1s.ForEach(o=>o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().UpdateRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().UpdateRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); - _virtualDbContext.Remove(logNoSharding); + _virtualDbContext.Remove(logNoSharding); - _virtualDbContext.RemoveRange(logNoShardings); + _virtualDbContext.RemoveRange(logNoShardings); - _virtualDbContext.Set().Remove(logNoSharding1); + _virtualDbContext.Set().Remove(logNoSharding1); - logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); - _virtualDbContext.Set().RemoveRange(logNoSharding1s); - await _virtualDbContext.SaveChangesAsync(); + logNoSharding1s.ForEach(o => o.Body = DateTime.Now.ToString("yyyyMMdd")); + _virtualDbContext.Set().RemoveRange(logNoSharding1s); + await _virtualDbContext.SaveChangesAsync(); } [Fact] public async Task CrudTest1() @@ -1362,7 +1503,7 @@ namespace ShardingCore.Test5x { await _virtualDbContext.AddAsync((object)logNoSharding); - await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o=>(object)o).ToArray()); + await _virtualDbContext.AddRangeAsync(logNoShardings.Select(o => (object)o).ToArray()); await _virtualDbContext.SaveChangesAsync(); await tran.CommitAsync(); @@ -1495,6 +1636,7 @@ namespace ShardingCore.Test5x Assert.Equal(10, page1.Data.Count); Assert.Equal(300, page1.Total); } + [Fact] public async Task AsRouteTest() { @@ -1533,8 +1675,8 @@ namespace ShardingCore.Test5x [Fact] public async Task QueryInner_Test() { - var sysUserMods = _virtualDbContext.Set().Select(o => o); - var sysUserModInts = await _virtualDbContext.Set().Where(o => sysUserMods.Select(i => i.Age).Any(i => i == o.Age)).ToListAsync(); + var sysUserMods = _virtualDbContext.Set().Select(o=>o); + var sysUserModInts = await _virtualDbContext.Set().Where(o=>sysUserMods.Select(i=>i.Age).Any(i=>i==o.Age)).ToListAsync(); Assert.Equal(1000, sysUserModInts.Count); } // [Fact] diff --git a/test/ShardingCore.Test5x/ShardingTestSync.cs b/test/ShardingCore.Test5x/ShardingTestSync.cs index f814889c..85eeb8a2 100644 --- a/test/ShardingCore.Test5x/ShardingTestSync.cs +++ b/test/ShardingCore.Test5x/ShardingTestSync.cs @@ -1,31 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using ShardingCore.Core.EntityMetadatas; using ShardingCore.Core.QueryRouteManagers.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.Abstractions; using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualTables; -using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Extensions.ShardingPageExtensions; -using ShardingCore.Extensions.ShardingQueryableExtensions; using ShardingCore.Helpers; using ShardingCore.Sharding; using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions; -using ShardingCore.Sharding.ShardingComparision.Abstractions; using ShardingCore.TableCreator; using ShardingCore.Test5x.Domain.Entities; -using ShardingCore.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Core.VirtualRoutes.Abstractions; +using ShardingCore.Extensions.ShardingQueryableExtensions; +using ShardingCore.Sharding.ShardingComparision.Abstractions; using Xunit; namespace ShardingCore.Test5x @@ -36,40 +34,35 @@ namespace ShardingCore.Test5x { private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - private readonly ActualConnectionStringManager _connectionStringManager; + private readonly ActualConnectionStringManager _connectionStringManager; private readonly IConfiguration _configuration; - private readonly IEntityMetadataManager _entityMetadataManager; - private readonly IVirtualDataSource _virtualDataSource; - private readonly IVirtualTableManager _virtualTableManager; - private readonly IShardingTableCreator _shardingTableCreator; + private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IVirtualDataSource _virtualDataSource; + private readonly ITableRouteManager _tableRouteManager; + private readonly IShardingTableCreator _shardingTableCreator; private readonly IShardingReadWriteManager _shardingReadWriteManager; private readonly IRouteTailFactory _routeTailFactory; private readonly IReadWriteConnectorFactory _readWriteConnectorFactory; private readonly IShardingConnectionStringResolver _shardingConnectionStringResolver; + private readonly IShardingComparer _shardingComparer; - public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration, - IEntityMetadataManager entityMetadataManager, - IVirtualDataSourceManager virtualDataSourceManager, - IVirtualTableManager virtualTableManager, - IShardingTableCreator shardingTableCreator, - IShardingReadWriteManager shardingReadWriteManager, IRouteTailFactory routeTailFactory, - IReadWriteConnectorFactory readWriteConnectorFactory) + public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRuntimeContext shardingRuntimeContext, IConfiguration configuration) { _virtualDbContext = virtualDbContext; - _shardingRouteManager = shardingRouteManager; - _virtualDataSource = virtualDataSourceManager.GetCurrentVirtualDataSource(); - _connectionStringManager = new ActualConnectionStringManager(_virtualDataSource); + _shardingRouteManager = shardingRuntimeContext.GetShardingRouteManager(); + _shardingReadWriteManager = shardingRuntimeContext.GetShardingReadWriteManager(); + _virtualDataSource = shardingRuntimeContext.GetVirtualDataSource(); + _connectionStringManager = new ActualConnectionStringManager(_shardingReadWriteManager,_virtualDataSource); _configuration = configuration; - this._entityMetadataManager = entityMetadataManager; - _virtualTableManager = virtualTableManager; - _shardingTableCreator = shardingTableCreator; - _shardingReadWriteManager = shardingReadWriteManager; - _routeTailFactory = routeTailFactory; - _readWriteConnectorFactory = readWriteConnectorFactory; - var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); - _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault()); + _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + _tableRouteManager = shardingRuntimeContext.GetTableRouteManager(); + _shardingTableCreator = shardingRuntimeContext.GetShardingTableCreator(); + _routeTailFactory = shardingRuntimeContext.GetRouteTailFactory(); + _shardingComparer = shardingRuntimeContext.GetShardingComparer(); + _readWriteConnectorFactory = shardingRuntimeContext.GetReadWriteConnectorFactory(); + var readWriteConnectors = _virtualDataSource.ConfigurationParams.ReadWriteNodeSeparationConfigs.Select(o => _readWriteConnectorFactory.CreateConnector(_virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(), o.Key, o.Value)); + _shardingConnectionStringResolver = new ReadWriteShardingConnectionStringResolver(readWriteConnectors, _virtualDataSource.ConfigurationParams.ReadStrategy.GetValueOrDefault(),_readWriteConnectorFactory); } - // [Fact] // public void RouteParseCompileCacheTest() // { @@ -111,14 +104,17 @@ namespace ShardingCore.Test5x // Assert.Equal(expressionEqualityComparer.GetHashCode(routeParseExpression6), expressionEqualityComparer.GetHashCode(routeParseExpression8)); // // } + [Fact] public void GenericTest() { var a = new DefaultPhysicDataSource("aaa", "aaa", true); var b = new DefaultPhysicDataSource("aaa", "aaa1", false); Assert.Equal(a, b); - var x = new EntityMetadata(typeof(LogDay), "aa", typeof(ShardingDefaultDbContext), new List(),null); - var y = new EntityMetadata(typeof(LogDay), "aa1", typeof(ShardingDefaultDbContext), new List(),null); + var x = new EntityMetadata(typeof(LogDay)); + //, "aa", typeof(ShardingDefaultDbContext), new List(),null + var y = new EntityMetadata(typeof(LogDay)); + //, "aa1", typeof(ShardingDefaultDbContext), new List(),null Assert.Equal(x, y); var dateTime = new DateTime(2021, 1, 1); var logDays = Enumerable.Range(0, 100).Select(o => new LogDay() { Id = Guid.NewGuid(), LogLevel = "info", LogBody = o.ToString(), LogTime = dateTime.AddDays(o) }).ToList(); @@ -186,8 +182,6 @@ namespace ShardingCore.Test5x Assert.True(shardingDbContext); var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext(); Assert.True(shardingTableDbContext); - var virtualTable = _virtualTableManager.GetVirtualTable(); - Assert.NotNull(virtualTable); var x1x1 = new ParallelTableGroupNode(new HashSet() { new ParallelTableComparerType(typeof(SysUserMod)), new ParallelTableComparerType(typeof(SysUserSalary)) }); @@ -203,17 +197,18 @@ namespace ShardingCore.Test5x public string Id { get; set; } public string T { get; set; } } + [Fact] public void TestMultiShardingProperty() { - var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); + var multiOrder = _virtualDbContext.Set().Where(o => o.Id == 232398109278351360).FirstOrDefault(); Assert.NotNull(multiOrder); var longs = new[] { 232398109278351360, 255197859283087360 }; - var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); + var multiOrders = _virtualDbContext.Set().Where(o => longs.Contains(o.Id)).ToList(); Assert.Equal(2, multiOrders.Count); var dateTime = new DateTime(2021, 11, 1); - var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); + var multiOrder404 = _virtualDbContext.Set().Where(o => o.Id == 250345338962063360 && o.CreateTime < dateTime).FirstOrDefault(); Assert.Null(multiOrder404); } [Fact] @@ -246,7 +241,7 @@ namespace ShardingCore.Test5x var compare0 = x.CompareTo(y); Assert.True(compare0 > 0); //asc x o.Name != "name_300"); - var queryable1 = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") join salary in _virtualDbContext.Set().Where(o => o.DateOfMonth == 202005) on u.Id equals salary.UserId @@ -374,7 +368,7 @@ namespace ShardingCore.Test5x DateOfMonth = salary.DateOfMonth, Name = u.Name }); - var list3 = queryable1.ToList(); + var list3 = queryable1.ToList(); Assert.Equal(1, list3.Count()); Assert.Contains(list3, o => o.Name == "name_300"); } @@ -489,28 +483,30 @@ namespace ShardingCore.Test5x [Fact] public void FirstOrDefault2() { + var x = new Object[] { "1", "2" }; - var sysUserModab = _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefault(); + var sysUserModab = _virtualDbContext.Set().Where(o => o.Id.Equals("1")).FirstOrDefault(); Assert.NotNull(sysUserModab); Assert.True(sysUserModab.Id == "1"); - var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); + var sysUserModaa = _virtualDbContext.Set().Where(o => "1".Equals(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModaa); Assert.True(sysUserModaa.Id == "1"); - var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); + var sysUserMod = _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefault(); Assert.NotNull(sysUserMod); Assert.True(sysUserMod.Id == "1"); - Assert.Equal(sysUserModaa, sysUserMod); - var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); + var sysUserModxx = _virtualDbContext.Set().Where(o => x.Contains(o.Id)).FirstOrDefault(); Assert.NotNull(sysUserModxx); + Assert.Equal(sysUserModaa, sysUserMod); Assert.True(x.Contains(sysUserModxx.Id)); Assert.NotNull(sysUserMod); var userMod = _virtualDbContext.Set().Find("1"); Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); - var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); + var user198 = _virtualDbContext.Set().FirstOrDefault(o => o.Id == "198"); Assert.True(user198.Id == "198"); - var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); + var userId198 = _virtualDbContext.Set().Where(o => o.Id == "198").Select(o => o.Id).FirstOrDefault(); Assert.Equal(userId198, "198"); + } [Fact] @@ -724,17 +720,10 @@ namespace ShardingCore.Test5x [Fact] public void LogDayTableSeparatorTest() { - var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay)); - var virtualTableName = virtualTable.GetVirtualTableName(); + var virtualTableRoute = _tableRouteManager.GetRoute(typeof(LogDay)); + var virtualTableName = virtualTableRoute.EntityMetadata.LogicTableName; Assert.Equal(nameof(LogDay), virtualTableName); - var table = _virtualTableManager.GetVirtualTable(virtualTableName); - var tryGetVirtualTable = _virtualTableManager.TryGetVirtualTable(typeof(LogDay)); - Assert.NotNull(tryGetVirtualTable); - var tryGetVirtualTable1 = _virtualTableManager.TryGetVirtualTable(virtualTableName); - Assert.NotNull(tryGetVirtualTable1); - - var all = virtualTable.GetAllPhysicTables().All(o => string.IsNullOrWhiteSpace(o.TableSeparator)); - Assert.True(all); + Assert.True(string.IsNullOrWhiteSpace(virtualTableRoute.EntityMetadata.TableSeparator)); var entityMetadata = _entityMetadataManager.TryGet(); Assert.NotNull(entityMetadata); var isShardingTable = entityMetadata.IsShardingTable(); @@ -867,7 +856,7 @@ namespace ShardingCore.Test5x catch (Exception e) { Assert.True(typeof(InvalidOperationException) == e.GetType() || typeof(TargetInvocationException) == e.GetType()); - Assert.True(e.Message.Contains("contains") || e.InnerException.Message.Contains("contains")); + Assert.True(e.Message.Contains("contains")|| e.InnerException.Message.Contains("contains")); } } } @@ -963,9 +952,9 @@ namespace ShardingCore.Test5x Assert.NotNull(areaB); } _virtualDbContext.ReadWriteSeparationWriteOnly(); - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); using (_shardingRouteManager.CreateScope()) { _shardingRouteManager.Current.TryCreateOrAddMustDataSource("A"); @@ -973,9 +962,9 @@ namespace ShardingCore.Test5x Assert.NotNull(areaB); } } - using (_shardingReadWriteManager.CreateScope()) + using (_shardingReadWriteManager.CreateScope()) { - _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); + _shardingReadWriteManager.GetCurrent().SetReadWriteSeparation(100, true); _virtualDbContext.ReadWriteSeparationWriteOnly(); using (_shardingRouteManager.CreateScope()) { @@ -1424,24 +1413,24 @@ namespace ShardingCore.Test5x [Fact] public void AsRouteTest() { - var countAsync3 = _virtualDbContext.Set().AsRoute(o => + var countAsync3 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("202104"); }).Count(); Assert.Equal(30, countAsync3); - var countAsync2 = _virtualDbContext.Set().AsRoute(o => + var countAsync2 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("2021"); }).Count(); Assert.Equal(300, countAsync2); - var countAsync4 = _virtualDbContext.Set().AsRoute(o => + var countAsync4 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddMustTail("20210419_25"); }).Count(); Assert.Equal(7, countAsync4); - var countAsync5 = _virtualDbContext.Set().AsRoute(o => + var countAsync5 = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintTail("20210419_25", "20210426_02"); }).Count(); @@ -1449,7 +1438,7 @@ namespace ShardingCore.Test5x var fiveBegin = new DateTime(2021, 5, 1).Date; - var sum = _virtualDbContext.Set().AsRoute(o => + var sum = _virtualDbContext.Set().AsRoute(o => { o.TryCreateOrAddHintDataSource("C"); }) @@ -1457,10 +1446,10 @@ namespace ShardingCore.Test5x Assert.Equal(0, sum); } [Fact] - public void QueryInner_Test() + public void QueryInner_Test() { var sysUserMods = _virtualDbContext.Set().Select(o => o); - var sysUserModInts = _virtualDbContext.Set().Where(o => sysUserMods.Select(i => i.Age).Any(i => i == o.Age)).ToList(); + var sysUserModInts = _virtualDbContext.Set().Where(o => sysUserMods.Select(i => i.Age).Any(i => i == o.Age)).ToList(); Assert.Equal(1000, sysUserModInts.Count); } // [Fact] diff --git a/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs b/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs index 017053f7..6fe14c8f 100644 --- a/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogDayLongVirtualRoute.cs @@ -30,7 +30,7 @@ namespace ShardingCore.Test5x.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs index 675751d0..3c8d41e5 100644 --- a/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/LogDayVirtualTableRoute.cs @@ -35,7 +35,7 @@ namespace ShardingCore.Test5x.Shardings return true; } - public override List GetAllTails() + protected override List CalcTailsOnStart() { var beginTime = GetBeginTime().Date; diff --git a/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs b/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs index abf4b50c..3859c49f 100644 --- a/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/OrderAreaShardingVirtualDataSourceRoute.cs @@ -39,7 +39,7 @@ namespace ShardingCore.Test5x.Shardings public override void Configure(EntityMetadataDataSourceBuilder builder) { - + builder.ShardingProperty(o => o.Area); } public override Func GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator) diff --git a/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs index f8a9d6ba..9a613326 100644 --- a/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/OrderCreateTimeVirtualTableRoute.cs @@ -15,16 +15,16 @@ namespace ShardingCore.Test5x.Shardings return new DateTime(2021, 1, 1); } - public override List GetAllTails() + protected override List CalcTailsOnStart() { - var allTails = base.GetAllTails(); + var allTails = base.CalcTailsOnStart(); allTails.Add("202112"); return allTails; } public override void Configure(EntityMetadataTableBuilder builder) { - + builder.ShardingProperty(o => o.CreateTime); } public override IPaginationConfiguration CreatePaginationConfiguration() diff --git a/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs b/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs index 65be5cee..6b88d80f 100644 --- a/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs +++ b/test/ShardingCore.Test5x/Shardings/SysUserSalaryVirtualTableRoute.cs @@ -24,7 +24,7 @@ namespace ShardingCore.Test5x.Shardings } - public override List GetAllTails() + public override List GetTails() { var beginTime = new DateTime(2020, 1, 1); var endTime = new DateTime(2021, 12, 1); diff --git a/test/ShardingCore.Test5x/Startup.cs b/test/ShardingCore.Test5x/Startup.cs index dba519c8..9d376ab3 100644 --- a/test/ShardingCore.Test5x/Startup.cs +++ b/test/ShardingCore.Test5x/Startup.cs @@ -10,6 +10,7 @@ using ShardingCore.Bootstrappers; using ShardingCore.Helpers; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.TableExists; +using ShardingCore.TableExists.Abstractions; using ShardingCore.Test5x.Domain.Entities; using ShardingCore.Test5x.Shardings; @@ -35,12 +36,8 @@ namespace ShardingCore.Test5x public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) { services.AddShardingDbContext() - .AddEntityConfig(op => + .UseRouteConfig(op => { - //如果您使用code-first建议选择false - op.CreateShardingTableOnStart = true; - //如果您使用code-first建议修改为fsle - op.EnsureCreatedWithOutShardingTable = true; //当无法获取路由时会返回默认值而不是报错 op.ThrowIfQueryRouteNotMatch = false; op.AddShardingDataSourceRoute(); @@ -58,9 +55,8 @@ namespace ShardingCore.Test5x op.AddShardingTableRoute(); }) - .AddConfig(op => + .UseConfig(op => { - op.ConfigId = "c1"; op.UseShardingQuery((conStr, builder) => { @@ -93,8 +89,7 @@ namespace ShardingCore.Test5x } }; }, ReadStrategyEnum.Loop, defaultEnable: false, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime); - op.ReplaceTableEnsureManager(sp => new SqlServerTableEnsureManager()); - }).EnsureConfig(); + }).ReplaceService(ServiceLifetime.Singleton).AddShardingCore(); // services.AddShardingDbContext(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15")) // ,op => // { @@ -110,8 +105,9 @@ namespace ShardingCore.Test5x // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 public void Configure(IServiceProvider serviceProvider) { - var shardingBootstrapper = serviceProvider.GetService(); - shardingBootstrapper.Start(); + serviceProvider.UseAutoShardingCreate(); + serviceProvider.UseAutoTryCompensateTable(); + // 有一些测试数据要初始化可以放在这里 InitData(serviceProvider).GetAwaiter().GetResult(); }