diff --git a/samples/Sample.MySql/Controllers/WeatherForecastController.cs b/samples/Sample.MySql/Controllers/WeatherForecastController.cs index 6dd9e34f..b4612a59 100644 --- a/samples/Sample.MySql/Controllers/WeatherForecastController.cs +++ b/samples/Sample.MySql/Controllers/WeatherForecastController.cs @@ -6,6 +6,7 @@ using Sample.MySql.Domain.Entities; using Sample.MySql.multi; using Sample.MySql.Shardings; using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; using ShardingCore.Core.VirtualRoutes.TableRoutes; using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions; using ShardingCore.Extensions.ShardingQueryableExtensions; @@ -73,6 +74,13 @@ namespace Sample.MySql.Controllers [HttpGet] public async Task Get() { + var virtualDataSource = _shardingRuntimeContext.GetVirtualDataSource(); + virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource("2023", "xxxxxxxx", false)); + var dataSourceRouteManager = _shardingRuntimeContext.GetDataSourceRouteManager(); + var virtualDataSourceRoute = dataSourceRouteManager.GetRoute(typeof(SysUserMod)); + virtualDataSourceRoute.AddDataSourceName("2023"); + var dataSourceInitializer = _shardingRuntimeContext.GetDataSourceInitializer(); + dataSourceInitializer.InitConfigure("2023",true,true); using (var dbContextTransaction = _defaultTableDbContext.Database.BeginTransaction()) { @@ -224,5 +232,17 @@ namespace Sample.MySql.Controllers // var sysUserMods2 = await _defaultTableDbContext.Set().FromSqlRaw("select * from SysTest where id='2'").ToListAsync(); return Ok(); } + [HttpGet] + public async Task Get4() + { + var sql=from a in _defaultTableDbContext.Set() + join b in _defaultTableDbContext.Set() + on a.Id equals b.MainId + select a; + var xx = await sql.ToListAsync(); + // var sysUserMods1 = await _defaultTableDbContext.Set().FromSqlRaw("select * from SysUserMod where id='2'").ToListAsync(); + // var sysUserMods2 = await _defaultTableDbContext.Set().FromSqlRaw("select * from SysTest where id='2'").ToListAsync(); + return Ok(); + } } } diff --git a/samples/Sample.MySql/DbContexts/DefaultShardingDbContext.cs b/samples/Sample.MySql/DbContexts/DefaultShardingDbContext.cs index 47b89b57..fc5b8d9e 100644 --- a/samples/Sample.MySql/DbContexts/DefaultShardingDbContext.cs +++ b/samples/Sample.MySql/DbContexts/DefaultShardingDbContext.cs @@ -42,6 +42,8 @@ namespace Sample.MySql.DbContexts modelBuilder.Entity().HasData(new SysUserLogByMonth() { Id = "1", Time = DateTime.Now }); modelBuilder.Entity().HasData(new SysTest() { Id = "1", UserId = "123" }); + modelBuilder.Entity().ToTable(nameof(TestMod)); + modelBuilder.Entity().ToTable(nameof(TestModItem)); } diff --git a/samples/Sample.MySql/Domain/Entities/TestMod.cs b/samples/Sample.MySql/Domain/Entities/TestMod.cs new file mode 100644 index 00000000..4dd2cbb9 --- /dev/null +++ b/samples/Sample.MySql/Domain/Entities/TestMod.cs @@ -0,0 +1,6 @@ +namespace Sample.MySql.Domain.Entities; + +public class TestMod +{ + public string Id { get; set; } +} \ No newline at end of file diff --git a/samples/Sample.MySql/Domain/Entities/TestModItem.cs b/samples/Sample.MySql/Domain/Entities/TestModItem.cs new file mode 100644 index 00000000..bfb29656 --- /dev/null +++ b/samples/Sample.MySql/Domain/Entities/TestModItem.cs @@ -0,0 +1,7 @@ +namespace Sample.MySql.Domain.Entities; + +public class TestModItem +{ + public string Id { get; set; } + public string MainId { get; set; } +} \ No newline at end of file diff --git a/samples/Sample.MySql/Shardings/SysUserLogByMonthRoute.cs b/samples/Sample.MySql/Shardings/SysUserLogByMonthRoute.cs index a6958238..b92381ea 100644 --- a/samples/Sample.MySql/Shardings/SysUserLogByMonthRoute.cs +++ b/samples/Sample.MySql/Shardings/SysUserLogByMonthRoute.cs @@ -19,6 +19,13 @@ namespace Sample.MySql.Shardings { _logger = logger; } + + protected override List CalcTailsOnStart() + { + var tails = base.CalcTailsOnStart(); + return tails; + } + public override DateTime GetBeginTime() { return new DateTime(2021, 1, 01); diff --git a/samples/Sample.MySql/Shardings/TestModRoute.cs b/samples/Sample.MySql/Shardings/TestModRoute.cs new file mode 100644 index 00000000..8dab87d9 --- /dev/null +++ b/samples/Sample.MySql/Shardings/TestModRoute.cs @@ -0,0 +1,29 @@ +using Sample.MySql.Domain.Entities; +using ShardingCore.Core.EntityMetadatas; +using ShardingCore.VirtualRoutes.Mods; + +namespace Sample.MySql.Shardings; + +public class TestModRoute:AbstractSimpleShardingModKeyStringVirtualTableRoute +{ + public TestModRoute() : base(2, 3) + { + } + + public override void Configure(EntityMetadataTableBuilder builder) + { + builder.ShardingProperty(o => o.Id); + } +} + +public class TestModItemRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute +{ + public TestModItemRoute() : base(2, 3) + { + } + + public override void Configure(EntityMetadataTableBuilder builder) + { + builder.ShardingProperty(o => o.MainId); + } +} \ No newline at end of file diff --git a/samples/Sample.MySql/Startup.cs b/samples/Sample.MySql/Startup.cs index 7b152b5b..cb1f9c5f 100644 --- a/samples/Sample.MySql/Startup.cs +++ b/samples/Sample.MySql/Startup.cs @@ -15,6 +15,7 @@ using ShardingCore.Core.RuntimeContexts; using ShardingCore.EFCores; using ShardingCore.Extensions; using ShardingCore.Helpers; +using ShardingCore.Sharding.ParallelTables; using ShardingCore.Sharding.ReadWriteConfigurations; using ShardingCore.TableExists; using ShardingCore.TableExists.Abstractions; @@ -76,6 +77,13 @@ namespace Sample.MySql o.AddShardingTableRoute(); // o.AddShardingTableRoute(); o.AddShardingDataSourceRoute(); + o.AddShardingTableRoute(); + o.AddShardingTableRoute(); + o.AddParallelTableGroupNode(new ParallelTableGroupNode(new List() + { + new ParallelTableComparerType(typeof(TestMod)), + new ParallelTableComparerType(typeof(TestModItem)), + })); }).UseConfig((sp,o) => { var memoryCache = sp.ApplicationServiceProvider.GetRequiredService(); diff --git a/src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs b/src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs index 31c34b82..67322c7d 100644 --- a/src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs +++ b/src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs @@ -46,7 +46,9 @@ namespace ShardingCore.Core.EntityMetadatas public bool IsOnlyShardingTable(Type entityType) { - return IsShardingTable(entityType) && !IsShardingDataSource(entityType); + if (!_caches.TryGetValue(entityType, out var entityMetadata)) + return false; + return entityMetadata.IsMultiTableMapping&&!entityMetadata.IsMultiDataSourceMapping; } /// @@ -63,7 +65,9 @@ namespace ShardingCore.Core.EntityMetadatas public bool IsOnlyShardingDataSource(Type entityType) { - return IsShardingDataSource(entityType) && !IsShardingTable(entityType); + if (!_caches.TryGetValue(entityType, out var entityMetadata)) + return false; + return entityMetadata.IsMultiDataSourceMapping&&!entityMetadata.IsMultiTableMapping; } /// diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/RoutingRuleEngine/TableRouteRuleEngine.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/RoutingRuleEngine/TableRouteRuleEngine.cs index f1641d55..ee5ddb08 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/RoutingRuleEngine/TableRouteRuleEngine.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/RoutingRuleEngine/TableRouteRuleEngine.cs @@ -7,6 +7,7 @@ using ShardingCore.Core.VirtualRoutes.DataSourceRoutes.RouteRuleEngine; using ShardingCore.Extensions; using ShardingCore.Sharding.MergeEngines.Common; using ShardingCore.Sharding.MergeEngines.Common.Abstractions; +using ShardingCore.Sharding.ParallelTables; namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine @@ -21,12 +22,14 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine { private readonly ITableRouteManager _tableRouteManager; private readonly IEntityMetadataManager _entityMetadataManager; + private readonly IParallelTableManager _parallelTableManager; public TableRouteRuleEngine(ITableRouteManager tableRouteManager, - IEntityMetadataManager entityMetadataManager) + IEntityMetadataManager entityMetadataManager,IParallelTableManager parallelTableManager) { _tableRouteManager = tableRouteManager; _entityMetadataManager = entityMetadataManager; + _parallelTableManager = parallelTableManager; } private List GetEntityRouteUnit(DataSourceRouteResult dataSourceRouteResult, @@ -108,12 +111,14 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine if (routeMaps.ContainsKey(dataSourceName)) { var routeMap = routeMaps[dataSourceName]; - var tableRouteResults = routeMap.Select(o => o.Value).Cartesian() - .Select(o => new TableRouteResult(o.ToList())).Where(o => !o.IsEmpty).ToList(); + var routeResults = routeMap.Select(o => o.Value).Cartesian() + .Select(o => new TableRouteResult(o.ToList())).Where(o => !o.IsEmpty).ToArray(); + + var tableRouteResults = GetTableRouteResults(tableRouteRuleContext, routeResults); if (tableRouteResults.IsNotEmpty()) { dataSourceCount++; - if (tableRouteResults.Count > 1) + if (tableRouteResults.Length > 1) { isCrossTable = true; } @@ -153,5 +158,18 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine // return sqlRouteUnits; // return routeMaps.Select(o => o.Value).Cartesian().Where(o=>o).Select(o => new TableRouteResult(o,_shardingDatabaseProvider.GetShardingDbContextType())); } + private TableRouteResult[] GetTableRouteResults(TableRouteRuleContext tableRouteRuleContext,TableRouteResult[] routeResults) + { + if (tableRouteRuleContext.QueryEntities.Count > 1&& routeResults.Length>0) + { + var queryShardingTables = tableRouteRuleContext.QueryEntities.Keys.Where(o => _entityMetadataManager.IsShardingTable(o)).ToArray(); + if (queryShardingTables.Length > 1 && _parallelTableManager.IsParallelTableQuery(queryShardingTables)) + { + return routeResults.Where(o => !o.HasDifferentTail).ToArray(); + } + } + return routeResults; + } } + } \ No newline at end of file