Skip to content

Commit 255398b

Browse files
committed
111
1 parent 8070b2f commit 255398b

File tree

11 files changed

+88
-43
lines changed

11 files changed

+88
-43
lines changed

src/ShardingCore/Core/PhysicTables/DefaultPhysicTable.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,47 @@ public DefaultPhysicTable(IVirtualTable virtualTable, string tail)
2121
OriginalName = virtualTable.GetOriginalTableName();
2222
Tail = tail;
2323
}
24+
2425
public string FullName => $"{OriginalName}{TailPrefix}{Tail}";
2526
public string OriginalName { get; }
2627
public string TailPrefix =>VirtualTable.ShardingConfig.TailPrefix;
2728
public string Tail { get; }
2829
public Type EntityType => VirtualTable.EntityType;
2930
public IVirtualTable VirtualTable { get; }
31+
32+
protected bool Equals(DefaultPhysicTable other)
33+
{
34+
return OriginalName == other.OriginalName && Tail == other.Tail && Equals(VirtualTable, other.VirtualTable);
35+
}
36+
37+
public override bool Equals(object obj)
38+
{
39+
if (ReferenceEquals(null, obj)) return false;
40+
if (ReferenceEquals(this, obj)) return true;
41+
if (obj.GetType() != this.GetType()) return false;
42+
return Equals((DefaultPhysicTable) obj);
43+
}
44+
45+
#if !EFCORE2
46+
47+
public override int GetHashCode()
48+
{
49+
return HashCode.Combine(OriginalName, Tail, VirtualTable);
50+
}
51+
#endif
52+
53+
#if EFCORE2
54+
55+
public override int GetHashCode()
56+
{
57+
unchecked
58+
{
59+
var hashCode = (OriginalName != null ? OriginalName.GetHashCode() : 0);
60+
hashCode = (hashCode * 397) ^ (Tail != null ? Tail.GetHashCode() : 0);
61+
hashCode = (hashCode * 397) ^ (VirtualTable != null ? VirtualTable.GetHashCode() : 0);
62+
return hashCode;
63+
}
64+
}
65+
#endif
3066
}
3167
}

src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingFilterVirtualTableRoute.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ public abstract class AbstractShardingFilterVirtualTableRoute<T, TKey> : Abstrac
3535
/// 启用断言路由
3636
/// </summary>
3737
protected virtual bool EnableAssertRoute => false;
38-
public override List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable)
38+
public override List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable,bool isQuery)
3939
{
40+
if (!isQuery)
41+
{
42+
//后拦截器
43+
return AfterPhysicTableFilter(allPhysicTables,DoRouteWithPredicate(allPhysicTables,queryable));
44+
}
4045
//强制路由不经过断言
4146
if (EnableHintRoute)
4247
{

src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractVirtualTableRoute.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ public virtual IPaginationConfiguration<T> CreatePaginationConfiguration()
4343
/// </summary>
4444
/// <param name="allPhysicTables"></param>
4545
/// <param name="queryable"></param>
46+
/// <param name="isQuery"></param>
4647
/// <returns></returns>
47-
public abstract List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable);
48+
public abstract List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables, IQueryable queryable,bool isQuery);
4849

4950
/// <summary>
5051
/// 根据值路由

src/ShardingCore/Core/VirtualRoutes/TableRoutes/IVirtualTableRoute.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ public interface IVirtualTableRoute
2525
/// </summary>
2626
/// <param name="allPhysicTables"></param>
2727
/// <param name="queryable"></param>
28+
/// <param name="isQuery"></param>
2829
/// <returns></returns>
29-
List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables,IQueryable queryable);
30+
List<IPhysicTable> RouteWithPredicate(List<IPhysicTable> allPhysicTables,IQueryable queryable,bool isQuery);
3031

3132
/// <summary>
3233
/// 根据值进行路由

src/ShardingCore/Core/VirtualTables/OneDbVirtualTable.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Concurrent;
23
using System.Collections.Generic;
34
using System.Linq;
45
using System.Linq.Expressions;
@@ -33,7 +34,7 @@ public class OneDbVirtualTable<T> : IVirtualTable<T> where T : class, IShardingT
3334
public PaginationMetadata PaginationMetadata { get; }
3435
public bool EnablePagination => PaginationMetadata != null;
3536

36-
private readonly List<IPhysicTable> _physicTables = new List<IPhysicTable>();
37+
private readonly ConcurrentDictionary<IPhysicTable,object> _physicTables = new ConcurrentDictionary<IPhysicTable,object>();
3738

3839
public OneDbVirtualTable(IVirtualTableRoute<T> virtualTableRoute)
3940
{
@@ -50,16 +51,16 @@ public OneDbVirtualTable(IVirtualTableRoute<T> virtualTableRoute)
5051

5152
public List<IPhysicTable> GetAllPhysicTables()
5253
{
53-
return _physicTables;
54+
return _physicTables.Keys.ToList();
5455
}
5556

5657
public List<IPhysicTable> RouteTo(TableRouteConfig tableRouteConfig)
5758
{
5859
var route = _virtualTableRoute;
5960
if (tableRouteConfig.UseQueryable())
60-
return route.RouteWithPredicate(_physicTables, tableRouteConfig.GetQueryable());
61+
return route.RouteWithPredicate(GetAllPhysicTables(), tableRouteConfig.GetQueryable(),true);
6162
if (tableRouteConfig.UsePredicate())
62-
return route.RouteWithPredicate(_physicTables, new EnumerableQuery<T>((Expression<Func<T, bool>>) tableRouteConfig.GetPredicate()));
63+
return route.RouteWithPredicate(GetAllPhysicTables(), new EnumerableQuery<T>((Expression<Func<T, bool>>) tableRouteConfig.GetPredicate()),false);
6364
object shardingKeyValue = null;
6465
if (tableRouteConfig.UseValue())
6566
shardingKeyValue = tableRouteConfig.GetShardingKeyValue();
@@ -69,7 +70,7 @@ public List<IPhysicTable> RouteTo(TableRouteConfig tableRouteConfig)
6970

7071
if (shardingKeyValue != null)
7172
{
72-
var routeWithValue = route.RouteWithValue(_physicTables, shardingKeyValue);
73+
var routeWithValue = route.RouteWithValue(GetAllPhysicTables(), shardingKeyValue);
7374
return new List<IPhysicTable>(1) {routeWithValue};
7475
}
7576

@@ -79,8 +80,8 @@ public List<IPhysicTable> RouteTo(TableRouteConfig tableRouteConfig)
7980

8081
public void AddPhysicTable(IPhysicTable physicTable)
8182
{
82-
if (_physicTables.All(o => o.Tail != physicTable.Tail))
83-
_physicTables.Add(physicTable);
83+
if (GetAllPhysicTables().All(o => o.Tail != physicTable.Tail))
84+
_physicTables.TryAdd(physicTable,null);
8485
}
8586

8687
public void SetOriginalTableName(string originalTableName)
@@ -100,7 +101,7 @@ IVirtualTableRoute IVirtualTable.GetVirtualRoute()
100101

101102
public List<string> GetTaleAllTails()
102103
{
103-
return _physicTables.Select(o => o.Tail).ToList();
104+
return _physicTables.Keys.Select(o => o.Tail).ToList();
104105
}
105106

106107
public IVirtualTableRoute<T> GetVirtualRoute()

src/ShardingCore/Sharding/PaginationConfigurations/PaginationMetadata.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace ShardingCore.Sharding.PaginationConfigurations
1717
/// </summary>
1818
public class PaginationMetadata
1919
{
20-
public ISet<PaginationConfig> PaginationConfigs = new HashSet<PaginationConfig>();
20+
public ISet<PaginationSequenceConfig> PaginationConfigs = new HashSet<PaginationSequenceConfig>();
2121

2222
/// <summary>
2323
/// 反向排序因子

src/ShardingCore/Sharding/PaginationConfigurations/PaginationOrderPropertyBuilder.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ namespace ShardingCore.Sharding.PaginationConfigurations
1212
*/
1313
public class PaginationOrderPropertyBuilder
1414
{
15-
private readonly PaginationConfig _paginationConfig;
15+
private readonly PaginationSequenceConfig _paginationSequenceConfig;
1616

1717
public PaginationOrderPropertyBuilder(LambdaExpression orderPropertyExpression,PaginationMetadata metadata)
1818
{
19-
_paginationConfig = new PaginationConfig(orderPropertyExpression);
20-
metadata.PaginationConfigs.Add(_paginationConfig);
19+
_paginationSequenceConfig = new PaginationSequenceConfig(orderPropertyExpression);
20+
metadata.PaginationConfigs.Add(_paginationSequenceConfig);
2121
}
2222

2323
/// <summary>
@@ -28,7 +28,7 @@ public PaginationOrderPropertyBuilder(LambdaExpression orderPropertyExpression,P
2828
public PaginationOrderPropertyBuilder UseTailCompare(IComparer<string> tailComparer)
2929
{
3030

31-
_paginationConfig.TailComparer= tailComparer ?? throw new ArgumentException(nameof(tailComparer));
31+
_paginationSequenceConfig.TailComparer= tailComparer ?? throw new ArgumentException(nameof(tailComparer));
3232
return this;
3333
}
3434
/// <summary>
@@ -38,7 +38,7 @@ public PaginationOrderPropertyBuilder UseTailCompare(IComparer<string> tailCompa
3838
/// <returns></returns>
3939
public PaginationOrderPropertyBuilder UseQueryMatch(PaginationMatchEnum paginationMatchEnum)
4040
{
41-
_paginationConfig.PaginationMatchEnum = paginationMatchEnum;
41+
_paginationSequenceConfig.PaginationMatchEnum = paginationMatchEnum;
4242
return this;
4343
}
4444
/// <summary>
@@ -48,7 +48,7 @@ public PaginationOrderPropertyBuilder UseQueryMatch(PaginationMatchEnum paginati
4848
/// <returns></returns>
4949
public PaginationOrderPropertyBuilder UseAppendIfOrderNone(int order=0)
5050
{
51-
_paginationConfig.AppendOrder = order;
51+
_paginationSequenceConfig.AppendOrder = order;
5252
return this;
5353
}
5454
}

src/ShardingCore/Sharding/PaginationConfigurations/PaginationConfig.cs renamed to src/ShardingCore/Sharding/PaginationConfigurations/PaginationSequenceConfig.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq.Expressions;
44
using System.Reflection;
@@ -15,18 +15,17 @@ namespace ShardingCore.Sharding.PaginationConfigurations
1515
* @Ver: 1.0
1616
1717
*/
18-
public class PaginationConfig
18+
public class PaginationSequenceConfig
1919
{
20-
public PaginationConfig(LambdaExpression orderPropertyExpression, PaginationMatchEnum paginationMatchEnum= PaginationMatchEnum.Owner, IComparer<string> tailComparer=null)
20+
public PaginationSequenceConfig(LambdaExpression orderPropertyExpression, PaginationMatchEnum paginationMatchEnum= PaginationMatchEnum.Owner, IComparer<string> tailComparer=null)
2121
{
22-
OrderPropertyExpression = orderPropertyExpression;
2322
OrderPropertyInfo = orderPropertyExpression.GetPropertyAccess();
2423
PropertyName = OrderPropertyInfo.Name;
2524
PaginationMatchEnum = paginationMatchEnum;
2625
TailComparer = tailComparer ?? Comparer<string>.Default;
26+
SequenceTails = new HashSet<string>();
2727
}
2828

29-
public LambdaExpression OrderPropertyExpression { get; set; }
3029
public IComparer<string> TailComparer { get; set; }
3130
public PaginationMatchEnum PaginationMatchEnum { get; set; }
3231
public PropertyInfo OrderPropertyInfo { get; set; }
@@ -40,9 +39,11 @@ public PaginationConfig(LambdaExpression orderPropertyExpression, PaginationMatc
4039
/// </summary>
4140
public int AppendOrder { get; set; } = -1;
4241
public string PropertyName { get;}
42+
43+
public ISet<string> SequenceTails { get; }
4344

4445

45-
protected bool Equals(PaginationConfig other)
46+
protected bool Equals(PaginationSequenceConfig other)
4647
{
4748
return PropertyName == other.PropertyName;
4849
}
@@ -52,7 +53,7 @@ public override bool Equals(object obj)
5253
if (ReferenceEquals(null, obj)) return false;
5354
if (ReferenceEquals(this, obj)) return true;
5455
if (obj.GetType() != this.GetType()) return false;
55-
return Equals((PaginationConfig) obj);
56+
return Equals((PaginationSequenceConfig) obj);
5657
}
5758

5859
public override int GetHashCode()

src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,21 +102,21 @@ public EnumeratorShardingQueryExecutor(StreamMergeContext<TEntity> streamMergeCo
102102
return new DefaultShardingEnumeratorAsyncStreamMergeEngine<TEntity>(_streamMergeContext);
103103
}
104104

105-
private bool PaginationMatch(PaginationConfig paginationConfig)
105+
private bool PaginationMatch(PaginationSequenceConfig paginationSequenceConfig)
106106
{
107-
if (paginationConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Owner) && !paginationConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Named))
108-
return typeof(TEntity) == paginationConfig.OrderPropertyInfo.DeclaringType;
107+
if (paginationSequenceConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Owner) && !paginationSequenceConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Named))
108+
return typeof(TEntity) == paginationSequenceConfig.OrderPropertyInfo.DeclaringType;
109109

110110
return false;
111111
}
112112

113-
private bool PaginationPrimaryMatch(PaginationConfig paginationConfig, PropertyOrder propertyOrder)
113+
private bool PaginationPrimaryMatch(PaginationSequenceConfig paginationSequenceConfig, PropertyOrder propertyOrder)
114114
{
115-
if (propertyOrder.PropertyExpression != paginationConfig.PropertyName)
115+
if (propertyOrder.PropertyExpression != paginationSequenceConfig.PropertyName)
116116
return false;
117117

118-
if (paginationConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Owner) && !paginationConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Named))
119-
return typeof(TEntity) == paginationConfig.OrderPropertyInfo.DeclaringType;
118+
if (paginationSequenceConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Owner) && !paginationSequenceConfig.PaginationMatchEnum.HasFlag(PaginationMatchEnum.Named))
119+
return typeof(TEntity) == paginationSequenceConfig.OrderPropertyInfo.DeclaringType;
120120

121121
return false;
122122
}

src/ShardingCore/Sharding/StreamMergeEngines/EnumeratorStreamMergeEngines/EnumeratorAsync/AppenOrderSequenceEnumeratorAsyncStreamMergeEngine.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.
2323
*/
2424
public class AppenOrderSequenceEnumeratorAsyncStreamMergeEngine<TEntity> : AbstractEnumeratorAsyncStreamMergeEngine<TEntity>
2525
{
26-
private readonly PaginationConfig _appendPaginationConfig;
26+
private readonly PaginationSequenceConfig _appendPaginationSequenceConfig;
2727
private readonly ICollection<RouteQueryResult<long>> _routeQueryResults;
28-
public AppenOrderSequenceEnumeratorAsyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext, PaginationConfig appendPaginationConfig, ICollection<RouteQueryResult<long>> routeQueryResults) : base(streamMergeContext)
28+
public AppenOrderSequenceEnumeratorAsyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext, PaginationSequenceConfig appendPaginationSequenceConfig, ICollection<RouteQueryResult<long>> routeQueryResults) : base(streamMergeContext)
2929
{
30-
_appendPaginationConfig = appendPaginationConfig;
30+
_appendPaginationSequenceConfig = appendPaginationSequenceConfig;
3131
_routeQueryResults = routeQueryResults;
3232
}
3333

@@ -46,12 +46,12 @@ public override IStreamMergeAsyncEnumerator<TEntity>[] GetDbStreamMergeAsyncEnum
4646
{
4747
Tail = o.RouteResult.ReplaceTables.First().Tail,
4848
RouteQueryResult = o
49-
}).OrderBy(o => o.Tail, _appendPaginationConfig.TailComparer).ToList();
49+
}).OrderBy(o => o.Tail, _appendPaginationSequenceConfig.TailComparer).ToList();
5050
var skipCount = skip;
5151

5252
var sequenceResults = new SequencePaginationList(sortRouteResults.Select(o=>o.RouteQueryResult)).Skip(skip).Take(take).ToList();
5353

54-
StreamMergeContext.ReSetOrders(new [] { new PropertyOrder(_appendPaginationConfig.PropertyName, true) });
54+
StreamMergeContext.ReSetOrders(new [] { new PropertyOrder(_appendPaginationSequenceConfig.PropertyName, true) });
5555
var enumeratorTasks = sequenceResults.Select(sequenceResult =>
5656
{
5757
var newQueryable = CreateAsyncExecuteQueryable(noPaginationQueryable, sequenceResult);
@@ -66,7 +66,7 @@ private IQueryable<TEntity> CreateAsyncExecuteQueryable(IQueryable<TEntity> noP
6666
{
6767
var shardingDbContext = StreamMergeContext.CreateDbContext(sequenceResult.RouteResult);
6868
DbContextQueryStore.TryAdd(sequenceResult.RouteResult, shardingDbContext);
69-
var newQueryable = (IQueryable<TEntity>)(noPaginationQueryable.Skip(sequenceResult.Skip).Take(sequenceResult.Take).OrderWithExpression(new PropertyOrder[]{new PropertyOrder(_appendPaginationConfig.PropertyName,true)}))
69+
var newQueryable = (IQueryable<TEntity>)(noPaginationQueryable.Skip(sequenceResult.Skip).Take(sequenceResult.Take).OrderWithExpression(new PropertyOrder[]{new PropertyOrder(_appendPaginationSequenceConfig.PropertyName,true)}))
7070
.ReplaceDbContextQueryable(shardingDbContext);
7171
return newQueryable;
7272
}

0 commit comments

Comments
 (0)