From 7fa315cd0d5d93aa8fefb3b1058fa8564bfa4583 Mon Sep 17 00:00:00 2001 From: xuejmnet <326308290@qq.com> Date: Fri, 3 Sep 2021 07:37:39 +0800 Subject: [PATCH] 1 --- .../PaginationConfig.cs | 1 + .../EnumeratorShardingQueryExecutor.cs | 33 ++++++++++++++++--- .../Sharding/StreamMergeContext.cs | 6 ++++ ...hardingEnumeratorAsyncStreamMergeEngine.cs | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/ShardingCore/Sharding/PaginationConfigurations/PaginationConfig.cs b/src/ShardingCore/Sharding/PaginationConfigurations/PaginationConfig.cs index 25201313..8a4568c5 100644 --- a/src/ShardingCore/Sharding/PaginationConfigurations/PaginationConfig.cs +++ b/src/ShardingCore/Sharding/PaginationConfigurations/PaginationConfig.cs @@ -4,6 +4,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Text; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Internal; namespace ShardingCore.Sharding.PaginationConfigurations { diff --git a/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs b/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs index 47de1bce..3ede8cfd 100644 --- a/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs +++ b/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs @@ -5,8 +5,10 @@ using System.Linq.Expressions; using System.Text; using System.Threading; using ShardingCore.Core.ShardingPage.Abstractions; +using ShardingCore.Core.VirtualTables; using ShardingCore.Extensions; using ShardingCore.Sharding.Abstractions; +using ShardingCore.Sharding.PaginationConfigurations; using ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines; using ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions; @@ -23,11 +25,13 @@ namespace ShardingCore.Sharding.ShardingQueryExecutors { private readonly StreamMergeContext _streamMergeContext; private readonly IShardingPageManager _shardingPageManager; + private readonly IVirtualTableManager _virtualTableManager; public EnumeratorShardingQueryExecutor(StreamMergeContext streamMergeContext) { _streamMergeContext = streamMergeContext; _shardingPageManager = ShardingContainer.GetService(); + _virtualTableManager = ShardingContainer.GetService(); } public IEnumeratorStreamMergeEngine ExecuteAsync(CancellationToken cancellationToken = new CancellationToken()) { @@ -36,14 +40,35 @@ namespace ShardingCore.Sharding.ShardingQueryExecutors { return new SingleQueryEnumeratorAsyncStreamMergeEngine(_streamMergeContext); } - //未开启系统分表 - if (_shardingPageManager.Current == null) + //未开启系统分表或者本次查询涉及多张分表 + if (!_streamMergeContext.IsPaginationQuery()||!_streamMergeContext.IsSingleShardingTableQuery()||_shardingPageManager.Current == null) { return new DefaultShardingEnumeratorAsyncStreamMergeEngine(_streamMergeContext); } - + var shardingEntityType = _streamMergeContext.RouteResults.First().ReplaceTables.Single(o=>o.IsShardingTable()).EntityType; + var virtualTable = _virtualTableManager.GetVirtualTable(_streamMergeContext.GetShardingDbContext().ShardingDbContextType,shardingEntityType); + if (!virtualTable.EnablePagination) + return new DefaultShardingEnumeratorAsyncStreamMergeEngine(_streamMergeContext); + if (_streamMergeContext.Orders.IsEmpty()) + { + var append = virtualTable.PaginationMetadata.PaginationConfigs.FirstOrDefault(o=>o.AppendIfOrderNone); + if (append != null) + { + 123 + return new SequenceEnumeratorAsyncStreamMergeEngine(_streamMergeContext); + } + } + + var propertyOrder = _streamMergeContext.Orders.First(); + //PaginationMatchEnum.Owner + 111 + var paginationConfig = virtualTable.PaginationMetadata.PaginationConfigs.FirstOrDefault(o=>o.PropertyName==propertyOrder.PropertyExpression); + if (paginationConfig==null) + return new DefaultShardingEnumeratorAsyncStreamMergeEngine(_streamMergeContext); + //调用顺序排序 + paginationConfig } - + } } diff --git a/src/ShardingCore/Sharding/StreamMergeContext.cs b/src/ShardingCore/Sharding/StreamMergeContext.cs index c310e745..f3c6ec5f 100644 --- a/src/ShardingCore/Sharding/StreamMergeContext.cs +++ b/src/ShardingCore/Sharding/StreamMergeContext.cs @@ -94,6 +94,12 @@ namespace ShardingCore.Sharding return Skip.HasValue || Take.HasValue; } + public bool IsPaginationQuery() + { + return Skip.GetValueOrDefault() > 0 || Take.GetValueOrDefault() > 0; + } + + public bool HasGroupQuery() { return this.GroupByContext.GroupExpression != null; diff --git a/src/ShardingCore/Sharding/StreamMergeEngines/EnumeratorStreamMergeEngines/DefaultShardingEnumeratorAsyncStreamMergeEngine.cs b/src/ShardingCore/Sharding/StreamMergeEngines/EnumeratorStreamMergeEngines/DefaultShardingEnumeratorAsyncStreamMergeEngine.cs index aeb38d68..7696322a 100644 --- a/src/ShardingCore/Sharding/StreamMergeEngines/EnumeratorStreamMergeEngines/DefaultShardingEnumeratorAsyncStreamMergeEngine.cs +++ b/src/ShardingCore/Sharding/StreamMergeEngines/EnumeratorStreamMergeEngines/DefaultShardingEnumeratorAsyncStreamMergeEngine.cs @@ -60,7 +60,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines public override IStreamMergeAsyncEnumerator GetStreamMergeAsyncEnumerator(IStreamMergeAsyncEnumerator[] streamsAsyncEnumerators) { - if (StreamMergeContext.HasSkipTake()) + if (StreamMergeContext.IsPaginationQuery()) return new PaginationStreamMergeAsyncEnumerator(StreamMergeContext, streamsAsyncEnumerators); if (StreamMergeContext.HasGroupQuery()) return new MultiAggregateOrderStreamMergeAsyncEnumerator(StreamMergeContext, streamsAsyncEnumerators);