修复手动路由下2个以上的tail只生效一个并且发布x.3.1.41

This commit is contained in:
xuejiaming 2021-11-20 22:34:38 +08:00
parent 38ee1a7c18
commit f65e2a7ae3
14 changed files with 183 additions and 86 deletions

View File

@ -1,9 +1,9 @@
:start
::定义版本
set EFCORE2=2.3.1.39
set EFCORE3=3.3.1.39
set EFCORE5=5.3.1.39
set EFCORE6=6.3.1.39
set EFCORE2=2.3.1.41
set EFCORE3=3.3.1.41
set EFCORE5=5.3.1.41
set EFCORE6=6.3.1.41
::删除所有bin与obj下的文件
@echo off

View File

@ -104,7 +104,7 @@ namespace ShardingCore.Core.EntityMetadatas
if (null == EntityType || null == PrimaryKeyProperties || null == VirtualTableName ||
(!IsMultiTableMapping && !IsMultiDataSourceMapping))
{
throw new ShardingCoreException($"no found entity:{EntityType} configure");
throw new ShardingCoreException($"not found entity:{EntityType} configure");
}
}
protected bool Equals(EntityMetadata other)

View File

@ -96,17 +96,7 @@ namespace ShardingCore.Extensions
return ShardingUtil.GetQueryEntitiesFilter(queryable);
}
public static T IfDo<T>(this T t, bool @if,Func<T,T> build)
{
if (@if)
{
return build(t);
}
return t;
}
public static Type GetSequenceType(this Type type)
{
var sequenceType = TryGetSequenceType(type);

View File

@ -1,54 +0,0 @@
using System;
namespace ShardingCore.Extensions
{
/*
* @Author: xjm
* @Description:
* @Date: Saturday, 02 January 2021 13:10:30
* @Email: 326308290@qq.com
*/
public static class DateTimeExtension
{
#region 13
/// <summary>
/// 将DateTime时间格式转换为本地时间戳格式
/// </summary>
/// Author : Napoleon
/// Created : 2018/4/8 14:19
public static long ConvertTimeToLong(this DateTime time)
{
var start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long) (time.AddHours(-8) - start).TotalMilliseconds;
}
/// <summary>
/// 本地时间戳转为C#格式时间
/// </summary>
/// Author : Napoleon
/// Created : 2018/4/8 14:19
public static DateTime ConvertLongToTime(this long timeStamp)
{
var start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return start.AddMilliseconds(timeStamp).AddHours(8);
}
#endregion
/// <summary>
/// 获取周一
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime GetMonday(this DateTime dateTime)
{
DateTime temp = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day);
int count = dateTime.DayOfWeek - DayOfWeek.Monday;
if (count == -1) count = 6;
var monday = temp.AddDays(-count);
return monday;
}
}
}

View File

@ -15,16 +15,6 @@ namespace ShardingCore.Extensions.InternalExtensions
*/
internal static class InternalLinqExtension
{
public static IEnumerable<TShource> OrderByIf<TShource, TKey>(this IEnumerable<TShource> source, Func<TShource, TKey> keySelector, bool condition,
IComparer<TKey>? comparer)
{
return condition ? source.OrderBy(keySelector, comparer) : source;
}
public static IEnumerable<TShource> OrderByDescendingIf<TShource, TKey>(this IEnumerable<TShource> source, Func<TShource, TKey> keySelector, bool condition,
IComparer<TKey>? comparer)
{
return condition ? source.OrderByDescending(keySelector, comparer) : source;
}
public static IOrderedEnumerable<TShource> ThenByIf<TShource, TKey>(this IOrderedEnumerable<TShource> source, Func<TShource, TKey> keySelector, bool condition,
IComparer<TKey>? comparer)
{

View File

@ -51,7 +51,7 @@ namespace ShardingCore.Extensions
shardingRouteContext.MustDataSource.Add(entityType, mustDataSources);
}
return dataSources.Select(o => mustDataSources.Add(o)).Any(o => o);
return dataSources.Select(o => mustDataSources.Add(o)).All(o => o);
}
/// <summary>
/// 创建或者添加提示路由
@ -86,7 +86,7 @@ namespace ShardingCore.Extensions
shardingRouteContext.HintDataSource.Add(entityType, hintDataSources);
}
return dataSources.Select(o => hintDataSources.Add(o)).Any(o => o);
return dataSources.Select(o => hintDataSources.Add(o)).All(o => o);
}
/// <summary>
/// 创建或者添加断言

View File

@ -51,7 +51,7 @@ namespace ShardingCore.Extensions
shardingRouteContext.MustTable.Add(entityType, mustTails);
}
return tails.Select(o => mustTails.Add(o)).Any(o => o);
return tails.Select(o => mustTails.Add(o)).All(o => o);
}
/// <summary>
/// 创建或者添加提示路由
@ -86,7 +86,7 @@ namespace ShardingCore.Extensions
shardingRouteContext.HintTable.Add(entityType, hintTails);
}
return tails.Select(o => hintTails.Add(o)).Any(o => o);
return tails.Select(o => hintTails.Add(o)).All(o => o);
}
/// <summary>
/// 创建或者添加断言

View File

@ -59,7 +59,7 @@ namespace ShardingCore.Extensions
return metadata.IsMultiDataSourceMapping;
}
/// <summary>
/// 是否基继承至IShardingTable
/// 是否是分表
/// </summary>
/// <param name="metadata"></param>
/// <returns></returns>

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShardingCore.Test6x.Domain.Entities
{
public class LogDay
{
public Guid Id { get; set; }
public string LogLevel { get; set; }
public string LogBody { get; set; }
public DateTime LogTime { get; set; }
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using ShardingCore.Test6x.Domain.Entities;
namespace ShardingCore.Test6x.Domain.Maps
{
public class LogDayMap:IEntityTypeConfiguration<LogDay>
{
public void Configure(EntityTypeBuilder<LogDay> builder)
{
builder.HasKey(o => o.Id);
builder.Property(o => o.LogLevel).IsRequired().IsUnicode(false).HasMaxLength(32);
builder.Property(o => o.LogBody).IsRequired().HasMaxLength(256);
builder.ToTable(nameof(LogDay));
}
}
}

View File

@ -25,6 +25,7 @@ namespace ShardingCore.Test6x
modelBuilder.ApplyConfiguration(new SysUserModMap());
modelBuilder.ApplyConfiguration(new SysUserSalaryMap());
modelBuilder.ApplyConfiguration(new OrderMap());
modelBuilder.ApplyConfiguration(new LogDayMap());
}
public IRouteTail RouteTail { get; set; }

View File

@ -1,12 +1,16 @@
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.PhysicTables;
using ShardingCore.Core.QueryRouteManagers.Abstractions;
using ShardingCore.Core.VirtualDatabase.VirtualDataSources;
using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources;
using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding.Abstractions;
@ -31,9 +35,12 @@ namespace ShardingCore.Test6x
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager,IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource)
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
@ -42,6 +49,28 @@ namespace ShardingCore.Test6x
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
}
[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<PropertyInfo>());
var y = new EntityMetadata(typeof(LogDay),"aa1",typeof(ShardingDefaultDbContext),new List<PropertyInfo>());
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);
foreach (var (key, value) in bulkShardingEnumerable)
{
Assert.Equal(100, value.Count);
}
}
[Fact]
public void TestEntityMetadataManager()
@ -503,6 +532,54 @@ namespace ShardingCore.Test6x
j--;
}
}
[Fact]
public async Task LogDayCountTest()
{
var countAsync = await _virtualDbContext.Set<LogDay>().CountAsync();
Assert.Equal(3000,countAsync);
var fourBegin = new DateTime(2021, 4, 1).Date;
var fiveBegin = new DateTime(2021, 5, 1).Date;
var fourCount = await _virtualDbContext.Set<LogDay>().Where(o => o.LogTime >= fourBegin && o.LogTime < fiveBegin).CountAsync();
Assert.Equal(300, fourCount);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustTail<LogDay>("20210102");
var countAsync1 = await _virtualDbContext.Set<LogDay>().CountAsync();
Assert.Equal(10, countAsync1);
}
Assert.Null(_shardingRouteManager.Current);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddHintTail<LogDay>("20210103", "20210104");
var countAsync2 = await _virtualDbContext.Set<LogDay>().CountAsync();
Assert.Equal(20, countAsync2);
}
}
[Fact]
public void LogDayTableSeparatorTest()
{
var virtualTable = _virtualTableManager.GetVirtualTable(typeof(LogDay));
var virtualTableName = virtualTable.GetVirtualTableName();
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);
var entityMetadata = _entityMetadataManager.TryGet<LogDay>();
Assert.NotNull(entityMetadata);
var isShardingTable = entityMetadata.IsShardingTable();
Assert.True(isShardingTable);
var isShardingDataSource = entityMetadata.IsShardingDataSource();
Assert.False(isShardingDataSource);
var emptySeparator = string.IsNullOrWhiteSpace(entityMetadata.TableSeparator);
Assert.True(emptySeparator);
Assert.Null(entityMetadata.AutoCreateDataSourceTable);
}
// [Fact]
// public async Task Group_API_Test()
// {

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Test6x.Domain.Entities;
using ShardingCore.VirtualRoutes.Days;
namespace ShardingCore.Test6x.Shardings
{
public class LogDayVirtualTableRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute<LogDay>
{
protected override bool EnableHintRoute => true;
public override DateTime GetBeginTime()
{
return new DateTime(2021, 1, 1);
}
public override bool StartJob()
{
return true;
}
public override void Configure(EntityMetadataTableBuilder<LogDay> builder)
{
builder.ShardingProperty(o => o.LogTime);
builder.TableSeparator(string.Empty);
}
}
}

View File

@ -71,6 +71,7 @@ namespace ShardingCore.Test6x
op.AddShardingTableRoute<SysUserModVirtualTableRoute>();
op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
op.AddShardingTableRoute<OrderCreateTimeVirtualTableRoute>();
op.AddShardingTableRoute<LogDayVirtualTableRoute>();
}).End();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
// ,op =>
@ -141,7 +142,7 @@ namespace ShardingCore.Test6x
}
var areas = new List<string>(){"A","B","C"};
List<Order> orders = new List<Order>();
List<Order> orders = new List<Order>(360);
var begin = new DateTime(2021, 1, 1);
for (int i = 0; i < 360; i++)
{
@ -155,11 +156,33 @@ namespace ShardingCore.Test6x
begin = begin.AddDays(1);
}
List<LogDay> logDays = new List<LogDay>(3600);
var levels = new List<string>(){"info","warning","error"};
var begin1 = new DateTime(2021, 1, 1);
for (int i = 0; i < 300; i++)
{
var ltime = begin1;
for (int j = 0; j < 10; j++)
{
logDays.Add(new LogDay()
{
Id = Guid.NewGuid(),
LogLevel = levels[j%3],
LogBody = $"{i}_{j}",
LogTime = ltime.AddHours(1)
});
ltime = ltime.AddHours(1);
}
begin1 = begin1.AddDays(1);
}
using (var tran = virtualDbContext.Database.BeginTransaction())
{
await virtualDbContext.AddRangeAsync(userMods);
await virtualDbContext.AddRangeAsync(userSalaries);
await virtualDbContext.AddRangeAsync(orders);
await virtualDbContext.AddRangeAsync(logDays);
await virtualDbContext.SaveChangesAsync();
tran.Commit();