Skip to content

Commit e7ca85d

Browse files
committed
添加自定义排序实现
1 parent c1e1042 commit e7ca85d

11 files changed

+142
-13
lines changed

src/ShardingCore/DIExtensions/ShardingCoreConfigEndBuilder.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public ShardingCoreConfigEndBuilder(
3030
_shardingCoreConfigBuilder = shardingCoreConfigBuilder;
3131
}
3232

33+
public ShardingCoreConfigEndBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
34+
{
35+
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
36+
return this;
37+
}
3338
public IServiceCollection End()
3439
{
3540
var services = _shardingCoreConfigBuilder.Services;
@@ -50,6 +55,14 @@ public IServiceCollection End()
5055
.AddSingleton<IShardingDbContextCreatorConfig,
5156
DefaultShardingDbContextCreatorConfig<TShardingDbContext>>(sp =>
5257
new DefaultShardingDbContextCreatorConfig<TShardingDbContext>());
58+
if (_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory != null)
59+
{
60+
services.AddSingleton<IShardingComparer<TShardingDbContext>>(_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory);
61+
}
62+
else
63+
{
64+
services.AddSingleton<IShardingComparer<TShardingDbContext>, CSharpLanguageShardingComparer<TShardingDbContext>>();
65+
}
5366

5467
if (!_shardingCoreConfigBuilder.ShardingConfigOption.UseReadWrite)
5568
{
@@ -94,6 +107,7 @@ public IServiceCollection End()
94107

95108
services.TryAddSingleton<IShardingReadWriteManager, ShardingReadWriteManager>();
96109
services.AddSingleton<IShardingReadWriteAccessor, ShardingReadWriteAccessor<TShardingDbContext>>();
110+
97111
//foreach (var dataSourceKv in dataSources)
98112
//{
99113
// if (dataSourceKv.Key == _shardingCoreConfigBuilder.DefaultDataSourceName)

src/ShardingCore/DIExtensions/ShardingDataBaseOrTableBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,10 @@ public ShardingReadWriteSeparationBuilder<TShardingDbContext> AddShardingTableRo
4040
}
4141
return new ShardingReadWriteSeparationBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
4242
}
43+
public ShardingDataBaseOrTableBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
44+
{
45+
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
46+
return this;
47+
}
4348
}
4449
}

src/ShardingCore/DIExtensions/ShardingDataSourceRouteBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,10 @@ public ShardingTableBuilder<TShardingDbContext> AddShardingDataSourceRoute(Actio
3636

3737
return new ShardingTableBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
3838
}
39+
public ShardingDataSourceRouteBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
40+
{
41+
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
42+
return this;
43+
}
3944
}
4045
}

src/ShardingCore/DIExtensions/ShardingReadWriteSeparationBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,10 @@ public ShardingCoreConfigEndBuilder<TShardingDbContext> AddReadWriteSeparation(
3434
_shardingCoreConfigBuilder.ShardingConfigOption.UseReadWriteConfiguration(readWriteSeparationConfigure,readStrategyEnum, defaultEnable,defaultPriority);
3535
return new ShardingCoreConfigEndBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
3636
}
37+
public ShardingReadWriteSeparationBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
38+
{
39+
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
40+
return this;
41+
}
3742
}
3843
}

src/ShardingCore/DIExtensions/ShardingTableBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,10 @@ public ShardingReadWriteSeparationBuilder<TShardingDbContext> AddShardingTableRo
3535
}
3636
return new ShardingReadWriteSeparationBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
3737
}
38+
public ShardingTableBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
39+
{
40+
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
41+
return this;
42+
}
3843
}
3944
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
3+
namespace ShardingCore.Extensions
4+
{
5+
/*
6+
* @Author: xjm
7+
* @Description:
8+
* @Date: Sunday, 31 October 2021 15:41:12
9+
10+
*/
11+
public static class ComparableExtension
12+
{
13+
public static int SafeCompareToWith(this IComparable value, IComparable other, bool asc)
14+
{
15+
if (asc)
16+
return SafeCompareTo(value, other);
17+
return SafeCompareTo(other, value);
18+
}
19+
public static int SafeCompareTo(IComparable value, IComparable other)
20+
{
21+
if (null == value && null == other) {
22+
return 0;
23+
}
24+
if (null == value)
25+
{
26+
return -1;
27+
}
28+
if (null == other) {
29+
return 1;
30+
}
31+
return value.CompareTo(other);
32+
}
33+
}
34+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Microsoft.EntityFrameworkCore;
4+
5+
namespace ShardingCore.Sharding.Abstractions
6+
{
7+
/*
8+
* @Author: xjm
9+
* @Description:
10+
* @Date: Sunday, 31 October 2021 15:07:52
11+
12+
*/
13+
public interface IShardingComparer
14+
{
15+
int Compare(IComparable a, IComparable b,bool asc);
16+
}
17+
18+
public interface IShardingComparer<TShardingDbContext> : IShardingComparer where TShardingDbContext:DbContext,IShardingDbContext
19+
{
20+
21+
}
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore;
3+
using ShardingCore.Extensions;
4+
using ShardingCore.Sharding.Abstractions;
5+
6+
namespace ShardingCore.Sharding
7+
{
8+
/*
9+
* @Author: xjm
10+
* @Description:
11+
* @Date: Sunday, 31 October 2021 15:39:46
12+
13+
*/
14+
public class CSharpLanguageShardingComparer<TShardingDbContext>:IShardingComparer<TShardingDbContext> where TShardingDbContext:DbContext,IShardingDbContext
15+
{
16+
public int Compare(IComparable a, IComparable b, bool asc)
17+
{
18+
return a.SafeCompareToWith(b, asc);
19+
}
20+
}
21+
}

src/ShardingCore/Sharding/Enumerators/StreamMergeAsync/OrderStreamMergeAsyncEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public int CompareTo(IOrderStreamMergeAsyncEnumerator<T> other)
115115
int i = 0;
116116
foreach (var order in _mergeContext.Orders)
117117
{
118-
int result = CompareHelper.CompareToWith(_orderValues[i], other.GetCompares()[i], order.IsAsc);
118+
int result = _mergeContext.GetShardingComparer().Compare(_orderValues[i], other.GetCompares()[i], order.IsAsc);
119119
if (0 != result)
120120
{
121121
return result;

src/ShardingCore/Sharding/StreamMergeContext.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,28 @@ public class StreamMergeContext<T>:IDisposable
4747
public IEnumerable<TableRouteResult> TableRouteResults { get; }
4848
public DataSourceRouteResult DataSourceRouteResult { get; }
4949
/// <summary>
50-
/// 本次查询涉及的对象
50+
/// 本次查询涉及的对象
5151
/// </summary>
5252
public ISet<Type> QueryEntities { get; }
5353
/// <summary>
54-
/// 本次查询是否包含notracking
54+
/// 本次查询是否包含notracking
5555
/// </summary>
5656
public bool? IsNoTracking { get; }
5757
/// <summary>
58-
/// 本次查询跨库
58+
/// 本次查询跨库
5959
/// </summary>
6060
public bool IsCrossDataSource { get; }
6161
/// <summary>
62-
/// 本次查询跨表
62+
/// 本次查询跨表
6363
/// </summary>
6464
public bool IsCrossTable { get; }
6565

6666
private readonly ITrackerManager _trackerManager;
6767
private readonly IShardingConfigOption _shardingConfigOption;
6868

69-
private readonly ConcurrentDictionary<DbContext, object> _parallelDbContexts;
69+
private readonly ConcurrentDictionary<DbContext, object> _parallelDbContexts;
70+
71+
private readonly IShardingComparer _shardingComparer;
7072

7173
public StreamMergeContext(IQueryable<T> source, IShardingDbContext shardingDbContext,
7274
DataSourceRouteResult dataSourceRouteResult,
@@ -93,6 +95,8 @@ public StreamMergeContext(IQueryable<T> source, IShardingDbContext shardingDbCon
9395
_trackerManager =
9496
(ITrackerManager)ShardingContainer.GetService(
9597
typeof(ITrackerManager<>).GetGenericType0(shardingDbContext.GetType()));
98+
_shardingComparer = (IShardingComparer)ShardingContainer.GetService(typeof(IShardingComparer<>).GetGenericType0(_shardingDbContext.GetType()));
99+
96100
_shardingConfigOption = ShardingContainer.GetServices<IShardingConfigOption>()
97101
.FirstOrDefault(o => o.ShardingDbContextType == shardingDbContext.GetType());
98102
_parallelDbContexts = new ConcurrentDictionary<DbContext, object>();
@@ -123,15 +127,15 @@ public void ReSetSkip(int? skip)
123127
Skip = skip;
124128
}
125129
/// <summary>
126-
/// 创建对应的dbcontext
130+
/// 创建对应的dbcontext
127131
/// </summary>
128132
/// <param name="dataSourceName">data source name</param>
129133
/// <param name="tableRouteResult"></param>
130134
/// <returns></returns>
131135
public DbContext CreateDbContext(string dataSourceName, TableRouteResult tableRouteResult)
132136
{
133137
var routeTail = _routeTailFactory.Create(tableRouteResult);
134-
//如果开启了读写分离或者本次查询是跨表或者跨库的表示本次查询的dbcontext是不存储的用完后就直接dispose
138+
//如果开启了读写分离或者本次查询是跨表或者跨库的表示本次查询的dbcontext是不存储的用完后就直接dispose
135139
var parallelQuery = IsParallelQuery();
136140
var dbContext = _shardingDbContext.GetDbContext(dataSourceName, parallelQuery, routeTail);
137141
if (parallelQuery)
@@ -190,15 +194,15 @@ public TimeSpan GetParallelQueryTimeOut()
190194
return _shardingConfigOption.ParallelQueryTimeOut;
191195
}
192196
/// <summary>
193-
/// 是否是跨资源查询
197+
/// 是否是跨资源查询
194198
/// </summary>
195199
/// <returns></returns>
196200
private bool IsCrossQuery()
197201
{
198202
return IsCrossDataSource || IsCrossTable;
199203
}
200204
/// <summary>
201-
/// 是否启用读写分离
205+
/// 是否启用读写分离
202206
/// </summary>
203207
/// <returns></returns>
204208
private bool IsUseReadWriteSeparation()
@@ -207,7 +211,7 @@ private bool IsUseReadWriteSeparation()
207211
}
208212

209213
/// <summary>
210-
/// 是否使用并行查询
214+
/// 是否使用并行查询
211215
/// </summary>
212216
/// <returns></returns>
213217
private bool IsParallelQuery()
@@ -216,12 +220,12 @@ private bool IsParallelQuery()
216220
}
217221

218222
/// <summary>
219-
/// 是否使用sharding track
223+
/// 是否使用sharding track
220224
/// </summary>
221225
/// <returns></returns>
222226
public bool IsUseShardingTrack(Type entityType)
223227
{
224-
//没有跨dbcontext查询并且不是读写分离才可以那么是否追踪之类的由查询的dbcontext自行处理
228+
//没有跨dbcontext查询并且不是读写分离才可以那么是否追踪之类的由查询的dbcontext自行处理
225229
if (!IsParallelQuery())
226230
return false;
227231
return QueryTrack() && _trackerManager.EntityUseTrack(entityType);
@@ -242,6 +246,10 @@ private bool QueryTrack()
242246
}
243247
}
244248

249+
public IShardingComparer GetShardingComparer()
250+
{
251+
return _shardingComparer;
252+
}
245253
public void Dispose()
246254
{
247255
foreach (var dbContext in _parallelDbContexts.Keys)

0 commit comments

Comments
 (0)