From e7ca85d25e57cbc99be3b3bd58cb07538c08a1f6 Mon Sep 17 00:00:00 2001 From: xuejmnet <326308290@qq.com> Date: Sun, 31 Oct 2021 16:11:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShardingCoreConfigEndBuilder.cs | 14 ++++++++ .../ShardingDataBaseOrTableBuilder.cs | 5 +++ .../ShardingDataSourceRouteBuilder.cs | 5 +++ .../ShardingReadWriteSeparationBuilder.cs | 5 +++ .../DIExtensions/ShardingTableBuilder.cs | 5 +++ .../Extensions/ComparableExtension.cs | 34 +++++++++++++++++++ .../Abstractions/IShardingComparer.cs | 22 ++++++++++++ .../CSharpLanguageShardingComparer.cs | 21 ++++++++++++ .../OrderStreamMergeAsyncEnumerator.cs | 2 +- .../Sharding/StreamMergeContext.cs | 32 ++++++++++------- src/ShardingCore/ShardingConfigOption.cs | 10 ++++++ 11 files changed, 142 insertions(+), 13 deletions(-) create mode 100644 src/ShardingCore/Extensions/ComparableExtension.cs create mode 100644 src/ShardingCore/Sharding/Abstractions/IShardingComparer.cs create mode 100644 src/ShardingCore/Sharding/CSharpLanguageShardingComparer.cs diff --git a/src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs b/src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs index d28f2463..58e9b212 100644 --- a/src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs +++ b/src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs @@ -30,6 +30,11 @@ namespace ShardingCore.DIExtensions _shardingCoreConfigBuilder = shardingCoreConfigBuilder; } + public ShardingCoreConfigEndBuilder ReplaceShardingComparer(Func> newShardingComparerFactory) + { + _shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory); + return this; + } public IServiceCollection End() { var services = _shardingCoreConfigBuilder.Services; @@ -50,6 +55,14 @@ namespace ShardingCore.DIExtensions .AddSingleton>(sp => new DefaultShardingDbContextCreatorConfig()); + if (_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory != null) + { + services.AddSingleton>(_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory); + } + else + { + services.AddSingleton, CSharpLanguageShardingComparer>(); + } if (!_shardingCoreConfigBuilder.ShardingConfigOption.UseReadWrite) { @@ -94,6 +107,7 @@ namespace ShardingCore.DIExtensions services.TryAddSingleton(); services.AddSingleton>(); + //foreach (var dataSourceKv in dataSources) //{ // if (dataSourceKv.Key == _shardingCoreConfigBuilder.DefaultDataSourceName) diff --git a/src/ShardingCore/DIExtensions/ShardingDataBaseOrTableBuilder.cs b/src/ShardingCore/DIExtensions/ShardingDataBaseOrTableBuilder.cs index f0e96de8..aa4386c4 100644 --- a/src/ShardingCore/DIExtensions/ShardingDataBaseOrTableBuilder.cs +++ b/src/ShardingCore/DIExtensions/ShardingDataBaseOrTableBuilder.cs @@ -40,5 +40,10 @@ namespace ShardingCore.DIExtensions } return new ShardingReadWriteSeparationBuilder(_shardingCoreConfigBuilder); } + public ShardingDataBaseOrTableBuilder ReplaceShardingComparer(Func> newShardingComparerFactory) + { + _shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory); + return this; + } } } diff --git a/src/ShardingCore/DIExtensions/ShardingDataSourceRouteBuilder.cs b/src/ShardingCore/DIExtensions/ShardingDataSourceRouteBuilder.cs index ad99c49b..b662f2df 100644 --- a/src/ShardingCore/DIExtensions/ShardingDataSourceRouteBuilder.cs +++ b/src/ShardingCore/DIExtensions/ShardingDataSourceRouteBuilder.cs @@ -36,5 +36,10 @@ namespace ShardingCore.DIExtensions return new ShardingTableBuilder(_shardingCoreConfigBuilder); } + public ShardingDataSourceRouteBuilder ReplaceShardingComparer(Func> newShardingComparerFactory) + { + _shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory); + return this; + } } } diff --git a/src/ShardingCore/DIExtensions/ShardingReadWriteSeparationBuilder.cs b/src/ShardingCore/DIExtensions/ShardingReadWriteSeparationBuilder.cs index 16311c64..6c612a05 100644 --- a/src/ShardingCore/DIExtensions/ShardingReadWriteSeparationBuilder.cs +++ b/src/ShardingCore/DIExtensions/ShardingReadWriteSeparationBuilder.cs @@ -34,5 +34,10 @@ namespace ShardingCore.DIExtensions _shardingCoreConfigBuilder.ShardingConfigOption.UseReadWriteConfiguration(readWriteSeparationConfigure,readStrategyEnum, defaultEnable,defaultPriority); return new ShardingCoreConfigEndBuilder(_shardingCoreConfigBuilder); } + public ShardingReadWriteSeparationBuilder ReplaceShardingComparer(Func> newShardingComparerFactory) + { + _shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory); + return this; + } } } diff --git a/src/ShardingCore/DIExtensions/ShardingTableBuilder.cs b/src/ShardingCore/DIExtensions/ShardingTableBuilder.cs index 5c43a00f..1013d2da 100644 --- a/src/ShardingCore/DIExtensions/ShardingTableBuilder.cs +++ b/src/ShardingCore/DIExtensions/ShardingTableBuilder.cs @@ -35,5 +35,10 @@ namespace ShardingCore.DIExtensions } return new ShardingReadWriteSeparationBuilder(_shardingCoreConfigBuilder); } + public ShardingTableBuilder ReplaceShardingComparer(Func> newShardingComparerFactory) + { + _shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory); + return this; + } } } diff --git a/src/ShardingCore/Extensions/ComparableExtension.cs b/src/ShardingCore/Extensions/ComparableExtension.cs new file mode 100644 index 00000000..74713fe1 --- /dev/null +++ b/src/ShardingCore/Extensions/ComparableExtension.cs @@ -0,0 +1,34 @@ +锘縰sing System; + +namespace ShardingCore.Extensions +{ +/* +* @Author: xjm +* @Description: +* @Date: Sunday, 31 October 2021 15:41:12 +* @Email: 326308290@qq.com +*/ + public static class ComparableExtension + { + public static int SafeCompareToWith(this IComparable value, IComparable other, bool asc) + { + if (asc) + return SafeCompareTo(value, other); + return SafeCompareTo(other, value); + } + public static int SafeCompareTo(IComparable value, IComparable other) + { + if (null == value && null == other) { + return 0; + } + if (null == value) + { + return -1; + } + if (null == other) { + return 1; + } + return value.CompareTo(other); + } + } +} \ No newline at end of file diff --git a/src/ShardingCore/Sharding/Abstractions/IShardingComparer.cs b/src/ShardingCore/Sharding/Abstractions/IShardingComparer.cs new file mode 100644 index 00000000..cc3d5d3d --- /dev/null +++ b/src/ShardingCore/Sharding/Abstractions/IShardingComparer.cs @@ -0,0 +1,22 @@ +锘縰sing System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; + +namespace ShardingCore.Sharding.Abstractions +{ +/* +* @Author: xjm +* @Description: +* @Date: Sunday, 31 October 2021 15:07:52 +* @Email: 326308290@qq.com +*/ + public interface IShardingComparer + { + int Compare(IComparable a, IComparable b,bool asc); + } + + public interface IShardingComparer : IShardingComparer where TShardingDbContext:DbContext,IShardingDbContext + { + + } +} \ No newline at end of file diff --git a/src/ShardingCore/Sharding/CSharpLanguageShardingComparer.cs b/src/ShardingCore/Sharding/CSharpLanguageShardingComparer.cs new file mode 100644 index 00000000..c713a0bf --- /dev/null +++ b/src/ShardingCore/Sharding/CSharpLanguageShardingComparer.cs @@ -0,0 +1,21 @@ +锘縰sing System; +using Microsoft.EntityFrameworkCore; +using ShardingCore.Extensions; +using ShardingCore.Sharding.Abstractions; + +namespace ShardingCore.Sharding +{ +/* +* @Author: xjm +* @Description: +* @Date: Sunday, 31 October 2021 15:39:46 +* @Email: 326308290@qq.com +*/ + public class CSharpLanguageShardingComparer:IShardingComparer where TShardingDbContext:DbContext,IShardingDbContext + { + public int Compare(IComparable a, IComparable b, bool asc) + { + return a.SafeCompareToWith(b, asc); + } + } +} \ No newline at end of file diff --git a/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/OrderStreamMergeAsyncEnumerator.cs b/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/OrderStreamMergeAsyncEnumerator.cs index 9a3010d9..d51fe24b 100644 --- a/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/OrderStreamMergeAsyncEnumerator.cs +++ b/src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/OrderStreamMergeAsyncEnumerator.cs @@ -115,7 +115,7 @@ namespace ShardingCore.Sharding.Enumerators int i = 0; foreach (var order in _mergeContext.Orders) { - int result = CompareHelper.CompareToWith(_orderValues[i], other.GetCompares()[i], order.IsAsc); + int result = _mergeContext.GetShardingComparer().Compare(_orderValues[i], other.GetCompares()[i], order.IsAsc); if (0 != result) { return result; diff --git a/src/ShardingCore/Sharding/StreamMergeContext.cs b/src/ShardingCore/Sharding/StreamMergeContext.cs index 9af90c79..6b4ddc52 100644 --- a/src/ShardingCore/Sharding/StreamMergeContext.cs +++ b/src/ShardingCore/Sharding/StreamMergeContext.cs @@ -47,26 +47,28 @@ namespace ShardingCore.Sharding public IEnumerable TableRouteResults { get; } public DataSourceRouteResult DataSourceRouteResult { get; } /// - /// 本次查询涉及的对象 + /// 鏈鏌ヨ娑夊強鐨勫璞 /// public ISet QueryEntities { get; } /// - /// 本次查询是否包含notracking + /// 鏈鏌ヨ鏄惁鍖呭惈notracking /// public bool? IsNoTracking { get; } /// - /// 本次查询跨库 + /// 鏈鏌ヨ璺ㄥ簱 /// public bool IsCrossDataSource { get; } /// - /// 本次查询跨表 + /// 鏈鏌ヨ璺ㄨ〃 /// public bool IsCrossTable { get; } private readonly ITrackerManager _trackerManager; private readonly IShardingConfigOption _shardingConfigOption; - private readonly ConcurrentDictionary _parallelDbContexts; + private readonly ConcurrentDictionary _parallelDbContexts; + + private readonly IShardingComparer _shardingComparer; public StreamMergeContext(IQueryable source, IShardingDbContext shardingDbContext, DataSourceRouteResult dataSourceRouteResult, @@ -93,6 +95,8 @@ namespace ShardingCore.Sharding _trackerManager = (ITrackerManager)ShardingContainer.GetService( typeof(ITrackerManager<>).GetGenericType0(shardingDbContext.GetType())); + _shardingComparer = (IShardingComparer)ShardingContainer.GetService(typeof(IShardingComparer<>).GetGenericType0(_shardingDbContext.GetType())); + _shardingConfigOption = ShardingContainer.GetServices() .FirstOrDefault(o => o.ShardingDbContextType == shardingDbContext.GetType()); _parallelDbContexts = new ConcurrentDictionary(); @@ -123,7 +127,7 @@ namespace ShardingCore.Sharding Skip = skip; } /// - /// 创建对应的dbcontext + /// 鍒涘缓瀵瑰簲鐨刣bcontext /// /// data source name /// @@ -131,7 +135,7 @@ namespace ShardingCore.Sharding public DbContext CreateDbContext(string dataSourceName, TableRouteResult tableRouteResult) { var routeTail = _routeTailFactory.Create(tableRouteResult); - //如果开启了读写分离或者本次查询是跨表或者跨库的表示本次查询的dbcontext是不存储的用完后就直接dispose + //濡傛灉寮鍚簡璇诲啓鍒嗙鎴栬呮湰娆℃煡璇㈡槸璺ㄨ〃鎴栬呰法搴撶殑琛ㄧず鏈鏌ヨ鐨刣bcontext鏄笉瀛樺偍鐨勭敤瀹屽悗灏辩洿鎺ispose var parallelQuery = IsParallelQuery(); var dbContext = _shardingDbContext.GetDbContext(dataSourceName, parallelQuery, routeTail); if (parallelQuery) @@ -190,7 +194,7 @@ namespace ShardingCore.Sharding return _shardingConfigOption.ParallelQueryTimeOut; } /// - /// 是否是跨资源查询 + /// 鏄惁鏄法璧勬簮鏌ヨ /// /// private bool IsCrossQuery() @@ -198,7 +202,7 @@ namespace ShardingCore.Sharding return IsCrossDataSource || IsCrossTable; } /// - /// 是否启用读写分离 + /// 鏄惁鍚敤璇诲啓鍒嗙 /// /// private bool IsUseReadWriteSeparation() @@ -207,7 +211,7 @@ namespace ShardingCore.Sharding } /// - /// 是否使用并行查询 + /// 鏄惁浣跨敤骞惰鏌ヨ /// /// private bool IsParallelQuery() @@ -216,12 +220,12 @@ namespace ShardingCore.Sharding } /// - /// 是否使用sharding track + /// 鏄惁浣跨敤sharding track /// /// public bool IsUseShardingTrack(Type entityType) { - //没有跨dbcontext查询并且不是读写分离才可以那么是否追踪之类的由查询的dbcontext自行处理 + //娌℃湁璺╠bcontext鏌ヨ骞朵笖涓嶆槸璇诲啓鍒嗙鎵嶅彲浠ラ偅涔堟槸鍚﹁拷韪箣绫荤殑鐢辨煡璇㈢殑dbcontext鑷澶勭悊 if (!IsParallelQuery()) return false; return QueryTrack() && _trackerManager.EntityUseTrack(entityType); @@ -242,6 +246,10 @@ namespace ShardingCore.Sharding } } + public IShardingComparer GetShardingComparer() + { + return _shardingComparer; + } public void Dispose() { foreach (var dbContext in _parallelDbContexts.Keys) diff --git a/src/ShardingCore/ShardingConfigOption.cs b/src/ShardingCore/ShardingConfigOption.cs index fa7cb9ed..44637f6a 100644 --- a/src/ShardingCore/ShardingConfigOption.cs +++ b/src/ShardingCore/ShardingConfigOption.cs @@ -43,6 +43,16 @@ namespace ShardingCore { DataSourcesConfigure = dataSourcesConfigure ?? throw new ArgumentNullException(nameof(dataSourcesConfigure)); } + public Func> ReplaceShardingComparerFactory { get; private set; } + /// + /// 鏇挎崲榛樿鐨勬瘮杈冨櫒 + /// + /// + /// + public void ReplaceShardingComparer(Func> newShardingComparerFactory) + { + ReplaceShardingComparerFactory=newShardingComparerFactory ?? throw new ArgumentNullException(nameof(newShardingComparerFactory)); + } /////