修复重构后的bug 后需要实现group by
This commit is contained in:
parent
52ed6e0c49
commit
a1cc753cd7
|
@ -8,6 +8,7 @@ using ShardingCore.Sharding.MergeEngines.Common;
|
||||||
using ShardingCore.Sharding.MergeEngines.Common.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Common.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.Enumerables.Base;
|
using ShardingCore.Sharding.MergeEngines.Enumerables.Base;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.Executors.Enumerables;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.StreamMerge;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.StreamMerge;
|
||||||
using ShardingCore.Sharding.PaginationConfigurations;
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
@ -95,7 +96,7 @@ namespace ShardingCore.Sharding.MergeEngines.Enumerables
|
||||||
|
|
||||||
protected override IExecutor<IStreamMergeAsyncEnumerator<TEntity>> CreateExecutor(bool async)
|
protected override IExecutor<IStreamMergeAsyncEnumerator<TEntity>> CreateExecutor(bool async)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
return new AppendOrderSequenceEnumerableExecutor<TEntity>(GetStreamMergeContext(), async);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -92,13 +92,6 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Abstractions
|
||||||
//严格限制连接数就在内存中进行聚合并且直接回收掉当前dbcontext
|
//严格限制连接数就在内存中进行聚合并且直接回收掉当前dbcontext
|
||||||
if (dataSourceSqlExecutorUnit.ConnectionMode == ConnectionModeEnum.CONNECTION_STRICTLY)
|
if (dataSourceSqlExecutorUnit.ConnectionMode == ConnectionModeEnum.CONNECTION_STRICTLY)
|
||||||
{
|
{
|
||||||
var resultCount = result.Count;
|
|
||||||
if (resultCount > 1)
|
|
||||||
{
|
|
||||||
throw new ShardingCoreInvalidOperationException(
|
|
||||||
$"in memory merge result length error:{resultCount}");
|
|
||||||
}
|
|
||||||
|
|
||||||
GetShardingMerger()
|
GetShardingMerger()
|
||||||
.InMemoryMerge(result, routeQueryResults.Select(o => o.MergeResult).ToList());
|
.InMemoryMerge(result, routeQueryResults.Select(o => o.MergeResult).ToList());
|
||||||
// MergeParallelExecuteResult(result, , async);
|
// MergeParallelExecuteResult(result, , async);
|
||||||
|
|
|
@ -55,9 +55,9 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.CircuitBreakers
|
||||||
_afterTerminated?.Invoke();
|
_afterTerminated?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Register(Action afterTrip)
|
public void Register(Action afterTerminated)
|
||||||
{
|
{
|
||||||
_afterTerminated = afterTrip;
|
_afterTerminated = afterTerminated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -13,13 +13,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.CircuitBreakers
|
||||||
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
//只要有一个是false就拉闸
|
//只要有一个是false就拉闸
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult==false);
|
return results.Any(o => o is false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
//只要有一个是false就拉闸
|
//只要有一个是false就拉闸
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult == false);
|
return results.Any(o => o is false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,12 +11,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.CircuitBreakers
|
||||||
}
|
}
|
||||||
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult);
|
return results.Any(o => o is true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult);
|
return results.Any(o => o is true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,12 +12,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.CircuitBreakers
|
||||||
|
|
||||||
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult);
|
return results.Any(o => o is true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
||||||
{
|
{
|
||||||
return results.Any(o => o is RouteQueryResult<bool> routeQueryResult && routeQueryResult.QueryResult);
|
return results.Any(o => o is true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using ShardingCore.Sharding.StreamMergeEngines;
|
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.MergeEngines.Executors.CircuitBreakers
|
|
||||||
{
|
|
||||||
internal class SingleOrSingleOrDefaultCircuitBreaker : AbstractCircuitBreaker
|
|
||||||
{
|
|
||||||
public SingleOrSingleOrDefaultCircuitBreaker(StreamMergeContext streamMergeContext) : base(streamMergeContext)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OrderConditionTerminated<TResult>(IEnumerable<TResult> results)
|
|
||||||
{
|
|
||||||
return results
|
|
||||||
.Where(o => o is IRouteQueryResult routeQueryResult && routeQueryResult.HasQueryResult())
|
|
||||||
.Take(2).Count() > 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool RandomConditionTerminated<TResult>(IEnumerable<TResult> results)
|
|
||||||
{
|
|
||||||
return results
|
|
||||||
.Where(o => o is IRouteQueryResult routeQueryResult && routeQueryResult.HasQueryResult())
|
|
||||||
.Take(2).Count() > 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -30,7 +30,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Methods
|
||||||
|
|
||||||
public override ICircuitBreaker CreateCircuitBreaker()
|
public override ICircuitBreaker CreateCircuitBreaker()
|
||||||
{
|
{
|
||||||
return new AnyElementCircuitBreaker(GetStreamMergeContext());
|
var anyCircuitBreaker = new AnyCircuitBreaker(GetStreamMergeContext());
|
||||||
|
anyCircuitBreaker.Register(() =>
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
});
|
||||||
|
return anyCircuitBreaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IShardingMerger<bool> GetShardingMerger()
|
public override IShardingMerger<bool> GetShardingMerger()
|
||||||
|
|
|
@ -33,7 +33,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Methods
|
||||||
|
|
||||||
public override ICircuitBreaker CreateCircuitBreaker()
|
public override ICircuitBreaker CreateCircuitBreaker()
|
||||||
{
|
{
|
||||||
return new NoTripCircuitBreaker(GetStreamMergeContext());
|
var circuitBreaker = new NoTripCircuitBreaker(GetStreamMergeContext());
|
||||||
|
circuitBreaker.Register(() =>
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
});
|
||||||
|
return circuitBreaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IShardingMerger<RouteQueryResult<AverageResult<TSelect>>> GetShardingMerger()
|
public override IShardingMerger<RouteQueryResult<AverageResult<TSelect>>> GetShardingMerger()
|
||||||
|
|
|
@ -32,7 +32,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Methods
|
||||||
|
|
||||||
public override ICircuitBreaker CreateCircuitBreaker()
|
public override ICircuitBreaker CreateCircuitBreaker()
|
||||||
{
|
{
|
||||||
return new AnyElementCircuitBreaker(GetStreamMergeContext());
|
|
||||||
|
var circuitBreaker = new AnyElementCircuitBreaker(GetStreamMergeContext());
|
||||||
|
circuitBreaker.Register(() =>
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
});
|
||||||
|
return circuitBreaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IShardingMerger<RouteQueryResult<TResult>> GetShardingMerger()
|
public override IShardingMerger<RouteQueryResult<TResult>> GetShardingMerger()
|
||||||
|
|
|
@ -31,7 +31,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Methods
|
||||||
|
|
||||||
public override ICircuitBreaker CreateCircuitBreaker()
|
public override ICircuitBreaker CreateCircuitBreaker()
|
||||||
{
|
{
|
||||||
return new AnyElementCircuitBreaker(GetStreamMergeContext());
|
|
||||||
|
var circuitBreaker = new AnyElementCircuitBreaker(GetStreamMergeContext());
|
||||||
|
circuitBreaker.Register(() =>
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
});
|
||||||
|
return circuitBreaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IShardingMerger<RouteQueryResult<TResult>> GetShardingMerger()
|
public override IShardingMerger<RouteQueryResult<TResult>> GetShardingMerger()
|
||||||
|
|
|
@ -24,18 +24,23 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.Methods
|
||||||
/// Author: xjm
|
/// Author: xjm
|
||||||
/// Created: 2022/5/7 11:13:57
|
/// Created: 2022/5/7 11:13:57
|
||||||
/// Email: 326308290@qq.com
|
/// Email: 326308290@qq.com
|
||||||
internal class SumMethodWrapExecutor<TEntity> : AbstractMethodExecutor<TEntity>
|
internal class SumMethodExecutor<TEntity> : AbstractMethodWrapExecutor<TEntity>
|
||||||
{
|
{
|
||||||
public SumMethodWrapExecutor(StreamMergeContext streamMergeContext) : base(streamMergeContext)
|
public SumMethodExecutor(StreamMergeContext streamMergeContext) : base(streamMergeContext)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public override ICircuitBreaker CreateCircuitBreaker()
|
public override ICircuitBreaker CreateCircuitBreaker()
|
||||||
{
|
{
|
||||||
return new NoTripCircuitBreaker(GetStreamMergeContext());
|
var circuitBreaker = new NoTripCircuitBreaker(GetStreamMergeContext());
|
||||||
|
circuitBreaker.Register(() =>
|
||||||
|
{
|
||||||
|
Cancel();
|
||||||
|
});
|
||||||
|
return circuitBreaker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IShardingMerger<TEntity> GetShardingMerger()
|
public override IShardingMerger<RouteQueryResult<TEntity>> GetShardingMerger()
|
||||||
{
|
{
|
||||||
return new SumMethodShardingMerger<TEntity>();
|
return new SumMethodShardingMerger<TEntity>();
|
||||||
}
|
}
|
|
@ -7,7 +7,7 @@ using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
internal abstract class AbstractEnumerableShardingMerger<TEntity>:IShardingMerger<IStreamMergeAsyncEnumerator<TEntity>>
|
internal abstract class AbstractEnumerableShardingMerger<TEntity> : IShardingMerger<IStreamMergeAsyncEnumerator<TEntity>>
|
||||||
{
|
{
|
||||||
private readonly StreamMergeContext _streamMergeContext;
|
private readonly StreamMergeContext _streamMergeContext;
|
||||||
private readonly bool _async;
|
private readonly bool _async;
|
||||||
|
@ -16,7 +16,7 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
return _streamMergeContext;
|
return _streamMergeContext;
|
||||||
}
|
}
|
||||||
public AbstractEnumerableShardingMerger(StreamMergeContext streamMergeContext,bool async)
|
public AbstractEnumerableShardingMerger(StreamMergeContext streamMergeContext, bool async)
|
||||||
{
|
{
|
||||||
_streamMergeContext = streamMergeContext;
|
_streamMergeContext = streamMergeContext;
|
||||||
_async = async;
|
_async = async;
|
||||||
|
@ -30,6 +30,11 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
return new MultiOrderStreamMergeAsyncEnumerator<TEntity>(_streamMergeContext, parallelResults);
|
return new MultiOrderStreamMergeAsyncEnumerator<TEntity>(_streamMergeContext, parallelResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual IStreamMergeAsyncEnumerator<TEntity> StreamInMemoryMerge(List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
||||||
|
{
|
||||||
|
return StreamMerge(parallelResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public virtual void InMemoryMerge(List<IStreamMergeAsyncEnumerator<TEntity>> beforeInMemoryResults, List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
public virtual void InMemoryMerge(List<IStreamMergeAsyncEnumerator<TEntity>> beforeInMemoryResults, List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
||||||
{
|
{
|
||||||
|
@ -58,12 +63,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
mergeAsyncEnumerators.Add(parallelStreamEnumeratorResult);
|
mergeAsyncEnumerators.Add(parallelStreamEnumeratorResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
var combineStreamMergeAsyncEnumerator =StreamMerge(mergeAsyncEnumerators);
|
var combineStreamMergeAsyncEnumerator = StreamInMemoryMerge(mergeAsyncEnumerators);
|
||||||
// var streamMergeContext = GetStreamMergeContext();
|
// var streamMergeContext = GetStreamMergeContext();
|
||||||
// IStreamMergeAsyncEnumerator<TResult> inMemoryStreamMergeAsyncEnumerator =streamMergeContext.HasGroupQuery()&&streamMergeContext.GroupQueryMemoryMerge()?
|
// IStreamMergeAsyncEnumerator<TResult> inMemoryStreamMergeAsyncEnumerator =streamMergeContext.HasGroupQuery()&&streamMergeContext.GroupQueryMemoryMerge()?
|
||||||
// new InMemoryGroupByOrderStreamMergeAsyncEnumerator<TResult>(streamMergeContext,combineStreamMergeAsyncEnumerator,async):
|
// new InMemoryGroupByOrderStreamMergeAsyncEnumerator<TResult>(streamMergeContext,combineStreamMergeAsyncEnumerator,async):
|
||||||
// new InMemoryStreamMergeAsyncEnumerator<TResult>(combineStreamMergeAsyncEnumerator, async);
|
// new InMemoryStreamMergeAsyncEnumerator<TResult>(combineStreamMergeAsyncEnumerator, async);
|
||||||
var inMemoryStreamMergeAsyncEnumerator= new InMemoryStreamMergeAsyncEnumerator<TEntity>(combineStreamMergeAsyncEnumerator, _async);
|
var inMemoryStreamMergeAsyncEnumerator = new InMemoryStreamMergeAsyncEnumerator<TEntity>(combineStreamMergeAsyncEnumerator, _async);
|
||||||
beforeInMemoryResults.Clear();
|
beforeInMemoryResults.Clear();
|
||||||
beforeInMemoryResults.Add(inMemoryStreamMergeAsyncEnumerator);
|
beforeInMemoryResults.Add(inMemoryStreamMergeAsyncEnumerator);
|
||||||
//合并
|
//合并
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
|
|
||||||
static AnyMethodShardingMerger()
|
static AnyMethodShardingMerger()
|
||||||
{
|
{
|
||||||
_allShardingMerger = new AllMethodShardingMerger();
|
_allShardingMerger = new AnyMethodShardingMerger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IShardingMerger<bool> Instance => _allShardingMerger;
|
public static IShardingMerger<bool> Instance => _allShardingMerger;
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
|
|
||||||
static ContainsMethodShardingMerger()
|
static ContainsMethodShardingMerger()
|
||||||
{
|
{
|
||||||
_allShardingMerger = new AllMethodShardingMerger();
|
_allShardingMerger = new ContainsMethodShardingMerger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IShardingMerger<bool> Instance => _allShardingMerger;
|
public static IShardingMerger<bool> Instance => _allShardingMerger;
|
||||||
|
|
|
@ -28,7 +28,9 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
|
|
||||||
return new RouteQueryResult<int>(null,null,r,true);
|
return new RouteQueryResult<int>(null,null,r,true);
|
||||||
}
|
}
|
||||||
return new RouteQueryResult<int>(null,null,parallelResults.Sum(o => o.QueryResult),true);
|
|
||||||
|
var sum = parallelResults.Sum(o => o.QueryResult);
|
||||||
|
return new RouteQueryResult<int>(null,null, sum, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InMemoryMerge(List<RouteQueryResult<int>> beforeInMemoryResults, List<RouteQueryResult<int>> parallelResults)
|
public void InMemoryMerge(List<RouteQueryResult<int>> beforeInMemoryResults, List<RouteQueryResult<int>> parallelResults)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using ShardingCore.Sharding.Enumerators;
|
using ShardingCore.Sharding.Enumerators;
|
||||||
|
using ShardingCore.Sharding.Enumerators.StreamMergeAsync;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
|
@ -8,5 +9,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
public DefaultEnumerableShardingMerger(StreamMergeContext streamMergeContext,bool async) : base(streamMergeContext,async)
|
public DefaultEnumerableShardingMerger(StreamMergeContext streamMergeContext,bool async) : base(streamMergeContext,async)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override IStreamMergeAsyncEnumerator<TEntity> StreamInMemoryMerge(List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
||||||
|
{
|
||||||
|
if (GetStreamMergeContext().IsPaginationQuery())
|
||||||
|
return new PaginationStreamMergeAsyncEnumerator<TEntity>(GetStreamMergeContext(), parallelResults, 0, GetStreamMergeContext().GetPaginationReWriteTake());//内存聚合分页不可以直接获取skip必须获取skip+take的数目
|
||||||
|
|
||||||
|
return base.StreamInMemoryMerge(parallelResults);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,13 +11,12 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IStreamMergeAsyncEnumerator<TEntity> StreamMerge(
|
protected override IStreamMergeAsyncEnumerator<TEntity> StreamInMemoryMerge(List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
||||||
List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
|
||||||
{
|
{
|
||||||
if (GetStreamMergeContext().IsPaginationQuery())
|
if (GetStreamMergeContext().IsPaginationQuery())
|
||||||
return new PaginationStreamMergeAsyncEnumerator<TEntity>(GetStreamMergeContext(), parallelResults, 0,
|
return new PaginationStreamMergeAsyncEnumerator<TEntity>(GetStreamMergeContext(), parallelResults, 0, GetStreamMergeContext().GetPaginationReWriteTake());//内存聚合分页不可以直接获取skip必须获取skip+take的数目
|
||||||
GetStreamMergeContext().GetPaginationReWriteTake()); //内存聚合分页不可以直接获取skip必须获取skip+take的数目
|
|
||||||
return base.StreamMerge(parallelResults);
|
return base.StreamInMemoryMerge(parallelResults);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
|
@ -9,38 +11,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
public RouteQueryResult<TResult> StreamMerge(List<RouteQueryResult<TResult>> parallelResults)
|
public RouteQueryResult<TResult> StreamMerge(List<RouteQueryResult<TResult>> parallelResults)
|
||||||
{
|
{
|
||||||
var result = parallelResults.Where(o => o.HasQueryResult()).Max(o => o.QueryResult);
|
var routeQueryResults = parallelResults.Where(o => o.HasQueryResult()).ToList();
|
||||||
return new RouteQueryResult<TResult>(null, null, result);
|
if (routeQueryResults.IsEmpty())
|
||||||
// var resultType = typeof(TEntity);
|
throw new InvalidOperationException("Sequence contains no elements.");
|
||||||
// if (!resultType.IsNullableType())
|
var min = routeQueryResults.Max(o => o.QueryResult);
|
||||||
// {
|
return new RouteQueryResult<TResult>(null, null, min);
|
||||||
// var minTResult = GetMinTResult(parallelResults);
|
|
||||||
// return new RouteQueryResult<TResult>(null, null, minTResult);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// var result = parallelResults.Where(o => o.HasQueryResult()).Min(o => o.QueryResult);
|
|
||||||
// return new RouteQueryResult<TResult>(null, null, result);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// private TResult GetMinTResult(List<RouteQueryResult<TResult>> source)
|
|
||||||
// {
|
|
||||||
// var routeQueryResults = source.Where(o => o.HasQueryResult()).ToList();
|
|
||||||
// if (routeQueryResults.IsEmpty())
|
|
||||||
// throw new InvalidOperationException("Sequence contains no elements.");
|
|
||||||
// var min = routeQueryResults.Min(o => o.QueryResult);
|
|
||||||
//
|
|
||||||
// return ConvertNumber<TResult>(min);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private TResult ConvertNumber<TNumber>(TNumber number)
|
|
||||||
// {
|
|
||||||
// if (number == null)
|
|
||||||
// return default;
|
|
||||||
// var convertExpr = Expression.Convert(Expression.Constant(number), typeof(TResult));
|
|
||||||
// return Expression.Lambda<Func<TResult>>(convertExpr).Compile()();
|
|
||||||
// }
|
|
||||||
public void InMemoryMerge(List<RouteQueryResult<TResult>> beforeInMemoryResults,
|
public void InMemoryMerge(List<RouteQueryResult<TResult>> beforeInMemoryResults,
|
||||||
List<RouteQueryResult<TResult>> parallelResults)
|
List<RouteQueryResult<TResult>> parallelResults)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,38 +13,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
public RouteQueryResult<TResult> StreamMerge(List<RouteQueryResult<TResult>> parallelResults)
|
public RouteQueryResult<TResult> StreamMerge(List<RouteQueryResult<TResult>> parallelResults)
|
||||||
{
|
{
|
||||||
var result = parallelResults.Where(o => o.HasQueryResult()).Min(o => o.QueryResult);
|
|
||||||
return new RouteQueryResult<TResult>(null, null, result);
|
|
||||||
// var resultType = typeof(TEntity);
|
|
||||||
// if (!resultType.IsNullableType())
|
|
||||||
// {
|
|
||||||
// var minTResult = GetMinTResult(parallelResults);
|
|
||||||
// return new RouteQueryResult<TResult>(null, null, minTResult);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// var result = parallelResults.Where(o => o.HasQueryResult()).Min(o => o.QueryResult);
|
|
||||||
// return new RouteQueryResult<TResult>(null, null, result);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// private TResult GetMinTResult(List<RouteQueryResult<TResult>> source)
|
var routeQueryResults = parallelResults.Where(o => o.HasQueryResult()).ToList();
|
||||||
// {
|
if (routeQueryResults.IsEmpty())
|
||||||
// var routeQueryResults = source.Where(o => o.HasQueryResult()).ToList();
|
throw new InvalidOperationException("Sequence contains no elements.");
|
||||||
// if (routeQueryResults.IsEmpty())
|
var min = routeQueryResults.Min(o => o.QueryResult);
|
||||||
// throw new InvalidOperationException("Sequence contains no elements.");
|
return new RouteQueryResult<TResult>(null, null, min);
|
||||||
// var min = routeQueryResults.Min(o => o.QueryResult);
|
}
|
||||||
//
|
|
||||||
// return ConvertNumber<TResult>(min);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private TResult ConvertNumber<TNumber>(TNumber number)
|
|
||||||
// {
|
|
||||||
// if (number == null)
|
|
||||||
// return default;
|
|
||||||
// var convertExpr = Expression.Convert(Expression.Constant(number), typeof(TResult));
|
|
||||||
// return Expression.Lambda<Func<TResult>>(convertExpr).Compile()();
|
|
||||||
// }
|
|
||||||
public void InMemoryMerge(List<RouteQueryResult<TResult>> beforeInMemoryResults,
|
public void InMemoryMerge(List<RouteQueryResult<TResult>> beforeInMemoryResults,
|
||||||
List<RouteQueryResult<TResult>> parallelResults)
|
List<RouteQueryResult<TResult>> parallelResults)
|
||||||
{
|
{
|
||||||
|
@ -52,42 +27,3 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// var resultType = typeof(TEntity);
|
|
||||||
// if (!resultType.IsNullableType())
|
|
||||||
// {
|
|
||||||
// if (typeof(decimal) == resultType)
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<decimal?>(cancellationToken);
|
|
||||||
// return GetMinTResult<decimal?>(result);
|
|
||||||
// }
|
|
||||||
// if (typeof(float) == resultType)
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<float?>(cancellationToken);
|
|
||||||
// return GetMinTResult<float?>(result);
|
|
||||||
// }
|
|
||||||
// if (typeof(int) == resultType)
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<int?>(cancellationToken);
|
|
||||||
// return GetMinTResult<int?>(result);
|
|
||||||
// }
|
|
||||||
// if (typeof(long) == resultType)
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<long?>(cancellationToken);
|
|
||||||
// return GetMinTResult<long?>(result);
|
|
||||||
// }
|
|
||||||
// if (typeof(double) == resultType)
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<double?>(cancellationToken);
|
|
||||||
// return GetMinTResult<double?>(result);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// throw new ShardingCoreException($"cant calc min value, type:[{resultType}]");
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// var result = await base.ExecuteAsync<TResult>(cancellationToken);
|
|
||||||
// return result.Where(o => o.HasQueryResult()).Min(o => o.QueryResult);
|
|
||||||
// }
|
|
|
@ -11,7 +11,7 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IStreamMergeAsyncEnumerator<TEntity> StreamMerge(
|
protected override IStreamMergeAsyncEnumerator<TEntity> StreamInMemoryMerge(
|
||||||
List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
List<IStreamMergeAsyncEnumerator<TEntity>> parallelResults)
|
||||||
{
|
{
|
||||||
if (GetStreamMergeContext().IsPaginationQuery() && GetStreamMergeContext().HasGroupQuery())
|
if (GetStreamMergeContext().IsPaginationQuery() && GetStreamMergeContext().HasGroupQuery())
|
||||||
|
@ -27,7 +27,7 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
if (GetStreamMergeContext().IsPaginationQuery())
|
if (GetStreamMergeContext().IsPaginationQuery())
|
||||||
return new PaginationStreamMergeAsyncEnumerator<TEntity>(GetStreamMergeContext(), parallelResults, 0,
|
return new PaginationStreamMergeAsyncEnumerator<TEntity>(GetStreamMergeContext(), parallelResults, 0,
|
||||||
GetStreamMergeContext().GetPaginationReWriteTake());
|
GetStreamMergeContext().GetPaginationReWriteTake());
|
||||||
return base.StreamMerge(parallelResults);
|
return base.StreamInMemoryMerge(parallelResults);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,16 +5,17 @@ using System.Linq.Expressions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.Enumerators.AggregateExtensions;
|
using ShardingCore.Sharding.Enumerators.AggregateExtensions;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
||||||
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
{
|
{
|
||||||
internal class SumMethodShardingMerger<TEntity> : IShardingMerger<TEntity>
|
internal class SumMethodShardingMerger<TEntity> : IShardingMerger<RouteQueryResult<TEntity>>
|
||||||
{
|
{
|
||||||
private TEntity GetSumResult<TInnerSelect>(List<TInnerSelect> source)
|
private TEntity GetSumResult<TInnerSelect>(List<TInnerSelect> source)
|
||||||
{
|
{
|
||||||
if (source.IsEmpty())
|
if (source.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = source.AsQueryable().SumByConstant<TInnerSelect>();
|
var sum = source.AsQueryable().SumByPropertyName(nameof(RouteQueryResult<TEntity>.QueryResult));
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,12 +31,13 @@ namespace ShardingCore.Sharding.MergeEngines.Executors.ShardingMergers
|
||||||
// {
|
// {
|
||||||
// return GetSumResult(resultList);
|
// return GetSumResult(resultList);
|
||||||
// }
|
// }
|
||||||
public TEntity StreamMerge(List<TEntity> parallelResults)
|
public RouteQueryResult<TEntity> StreamMerge(List<RouteQueryResult<TEntity>> parallelResults)
|
||||||
{
|
{
|
||||||
return GetSumResult(parallelResults);
|
var sumResult = GetSumResult(parallelResults);
|
||||||
|
return new RouteQueryResult<TEntity>(null, null, sumResult, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InMemoryMerge(List<TEntity> beforeInMemoryResults, List<TEntity> parallelResults)
|
public void InMemoryMerge(List<RouteQueryResult<TEntity>> beforeInMemoryResults, List<RouteQueryResult<TEntity>> parallelResults)
|
||||||
{
|
{
|
||||||
beforeInMemoryResults.AddRange(parallelResults);
|
beforeInMemoryResults.AddRange(parallelResults);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,14 +32,5 @@ namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.I
|
||||||
var result =await ShardingExecutor.Instance.ExecuteAsync<RouteQueryResult<TResult>>(GetStreamMergeContext(),executor,true,defaultSqlRouteUnits,cancellationToken);
|
var result =await ShardingExecutor.Instance.ExecuteAsync<RouteQueryResult<TResult>>(GetStreamMergeContext(),executor,true,defaultSqlRouteUnits,cancellationToken);
|
||||||
return result.QueryResult;
|
return result.QueryResult;
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// protected abstract TResult DoMergeResult(List<RouteQueryResult<TResult>> resultList);
|
|
||||||
//
|
|
||||||
// protected override IExecutor<TR> CreateExecutor<TR>(bool async)
|
|
||||||
// {
|
|
||||||
// return CreateExecutor0(async) as IExecutor<TR>;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// protected abstract IExecutor<RouteQueryResult<TResult>> CreateExecutor0(bool async);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.ShardingExecutors;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
|
@ -22,43 +24,111 @@ namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines
|
||||||
* @Ver: 1.0
|
* @Ver: 1.0
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
internal class MaxAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractMethodEnsureWrapMergeEngine<TResult>
|
internal class MaxAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractBaseMergeEngine, IEnsureMergeResult<TResult>
|
||||||
{
|
{
|
||||||
public MaxAsyncInMemoryMergeEngine(StreamMergeContext streamStreamMergeContext) : base(streamStreamMergeContext)
|
|
||||||
|
public MaxAsyncInMemoryMergeEngine(StreamMergeContext streamMergeContext) : base(streamMergeContext)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IExecutor<RouteQueryResult<TResult>> CreateExecutor()
|
public TResult MergeResult()
|
||||||
|
{
|
||||||
|
return MergeResultAsync().WaitAndUnwrapException(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<TResult> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
|
||||||
|
var resultType = typeof(TEntity);
|
||||||
|
if (!resultType.IsNullableType())
|
||||||
|
{
|
||||||
|
if (typeof(decimal) == resultType)
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<decimal?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
|
}
|
||||||
|
if (typeof(float) == resultType)
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<float?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
|
}
|
||||||
|
if (typeof(int) == resultType)
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<int?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
|
}
|
||||||
|
if (typeof(long) == resultType)
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<long?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
|
}
|
||||||
|
if (typeof(double) == resultType)
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<double?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ShardingCoreException($"cant calc min value, type:[{resultType}]");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = await ExecuteAsync<TResult>(cancellationToken);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TResult ConvertNumber<TNumber>(TNumber number)
|
||||||
|
{
|
||||||
|
if (number == null)
|
||||||
|
return default;
|
||||||
|
var convertExpr = Expression.Convert(Expression.Constant(number), typeof(TResult));
|
||||||
|
return Expression.Lambda<Func<TResult>>(convertExpr).Compile()();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<TR> ExecuteAsync<TR>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
if (!GetStreamMergeContext().TryPrepareExecuteContinueQuery(() => default(TR), out var tr))
|
||||||
|
{
|
||||||
|
return tr;
|
||||||
|
}
|
||||||
|
var defaultSqlRouteUnits = GetDefaultSqlRouteUnits();
|
||||||
|
var executor = CreateExecutor<TR>();
|
||||||
|
var result = await ShardingExecutor.Instance.ExecuteAsync<RouteQueryResult<TR>>(GetStreamMergeContext(), executor, true, defaultSqlRouteUnits, cancellationToken);
|
||||||
|
return result.QueryResult;
|
||||||
|
}
|
||||||
|
protected IExecutor<RouteQueryResult<TR>> CreateExecutor<TR>()
|
||||||
{
|
{
|
||||||
var resultType = typeof(TEntity);
|
var resultType = typeof(TEntity);
|
||||||
if (!resultType.IsNullableType())
|
if (!resultType.IsNullableType())
|
||||||
{
|
{
|
||||||
if (typeof(decimal) == resultType)
|
if (typeof(decimal) == resultType)
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity,decimal?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity,decimal?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
if (typeof(float) == resultType)
|
if (typeof(float) == resultType)
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity, float?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity, float?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
if (typeof(int) == resultType)
|
if (typeof(int) == resultType)
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity, int?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity, int?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
if (typeof(long) == resultType)
|
if (typeof(long) == resultType)
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity, long?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity, long?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
if (typeof(double) == resultType)
|
if (typeof(double) == resultType)
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity, double?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity, double?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ShardingCoreException($"cant calc max value, type:[{resultType}]");
|
throw new ShardingCoreException($"cant calc max value, type:[{resultType}]");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new MaxMethodExecutor<TEntity,TEntity>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
return new MaxMethodExecutor<TEntity,TEntity>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.ShardingExecutors;
|
||||||
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
|
@ -22,43 +24,112 @@ namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines
|
||||||
* @Ver: 1.0
|
* @Ver: 1.0
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
internal class MinAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractMethodEnsureWrapMergeEngine<TResult>
|
internal class MinAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractBaseMergeEngine, IEnsureMergeResult<TResult>
|
||||||
{
|
{
|
||||||
public MinAsyncInMemoryMergeEngine(StreamMergeContext streamStreamMergeContext) : base(streamStreamMergeContext)
|
|
||||||
|
public MinAsyncInMemoryMergeEngine(StreamMergeContext streamMergeContext) : base(streamMergeContext)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IExecutor<RouteQueryResult<TResult>> CreateExecutor()
|
public TResult MergeResult()
|
||||||
{
|
{
|
||||||
|
return MergeResultAsync().WaitAndUnwrapException(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<TResult> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
|
||||||
var resultType = typeof(TEntity);
|
var resultType = typeof(TEntity);
|
||||||
if (!resultType.IsNullableType())
|
if (!resultType.IsNullableType())
|
||||||
{
|
{
|
||||||
if (typeof(decimal) == resultType)
|
if (typeof(decimal) == resultType)
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity,decimal?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<decimal?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
}
|
}
|
||||||
if (typeof(float) == resultType)
|
if (typeof(float) == resultType)
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity, float?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<float?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
}
|
}
|
||||||
if (typeof(int) == resultType)
|
if (typeof(int) == resultType)
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity, int?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<int?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
}
|
}
|
||||||
if (typeof(long) == resultType)
|
if (typeof(long) == resultType)
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity, long?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<long?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
}
|
}
|
||||||
if (typeof(double) == resultType)
|
if (typeof(double) == resultType)
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity, double?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<double?>(cancellationToken);
|
||||||
|
return ConvertNumber(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ShardingCoreException($"cant calc min value, type:[{resultType}]");
|
throw new ShardingCoreException($"cant calc min value, type:[{resultType}]");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new MinMethodExecutor<TEntity, TEntity>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TResult>>;
|
var result = await ExecuteAsync<TResult>(cancellationToken);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TResult ConvertNumber<TNumber>(TNumber number)
|
||||||
|
{
|
||||||
|
if (number == null)
|
||||||
|
return default;
|
||||||
|
var convertExpr = Expression.Convert(Expression.Constant(number), typeof(TResult));
|
||||||
|
return Expression.Lambda<Func<TResult>>(convertExpr).Compile()();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<TR> ExecuteAsync<TR>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
if (!GetStreamMergeContext().TryPrepareExecuteContinueQuery(() => default(TR), out var tr))
|
||||||
|
{
|
||||||
|
return tr;
|
||||||
|
}
|
||||||
|
var defaultSqlRouteUnits = GetDefaultSqlRouteUnits();
|
||||||
|
var executor = CreateExecutor<TR>();
|
||||||
|
var result = await ShardingExecutor.Instance.ExecuteAsync<RouteQueryResult<TR>>(GetStreamMergeContext(), executor, true, defaultSqlRouteUnits, cancellationToken);
|
||||||
|
return result.QueryResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected IExecutor<RouteQueryResult<TR>> CreateExecutor<TR>()
|
||||||
|
{
|
||||||
|
var resultType = typeof(TEntity);
|
||||||
|
if (!resultType.IsNullableType())
|
||||||
|
{
|
||||||
|
if (typeof(decimal) == resultType)
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity,decimal?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
|
}
|
||||||
|
if (typeof(float) == resultType)
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity, float?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
|
}
|
||||||
|
if (typeof(int) == resultType)
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity, int?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
|
}
|
||||||
|
if (typeof(long) == resultType)
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity, long?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
|
}
|
||||||
|
if (typeof(double) == resultType)
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity, double?>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ShardingCoreException($"cant calc min value, type:[{resultType}]");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new MinMethodExecutor<TEntity, TEntity>(GetStreamMergeContext()) as IExecutor<RouteQueryResult<TR>>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
using ShardingCore.Sharding.MergeEngines.Executors.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
using ShardingCore.Sharding.MergeEngines.Executors.Methods;
|
||||||
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
using ShardingCore.Sharding.MergeEngines.ShardingMergeEngines.Abstractions.InMemoryMerge;
|
||||||
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines
|
namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines
|
||||||
{
|
{
|
||||||
|
@ -11,34 +12,16 @@ namespace ShardingCore.Sharding.MergeEngines.ShardingMergeEngines
|
||||||
* @Ver: 1.0
|
* @Ver: 1.0
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
internal class SumAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractMethodEnsureMergeEngine<TResult>
|
internal class SumAsyncInMemoryMergeEngine<TEntity, TResult> : AbstractMethodEnsureWrapMergeEngine<TResult>
|
||||||
{
|
{
|
||||||
public SumAsyncInMemoryMergeEngine(StreamMergeContext streamStreamMergeContext) : base(streamStreamMergeContext)
|
public SumAsyncInMemoryMergeEngine(StreamMergeContext streamStreamMergeContext) : base(streamStreamMergeContext)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
// private TResult GetSumResult<TInnerSelect>(List<RouteQueryResult<TInnerSelect>> source)
|
|
||||||
// {
|
|
||||||
// if (source.IsEmpty())
|
|
||||||
// return default;
|
|
||||||
// var sum = source.AsQueryable().SumByPropertyName<TInnerSelect>(nameof(RouteQueryResult<TInnerSelect>.QueryResult));
|
|
||||||
// return ConvertSum(sum);
|
|
||||||
// }
|
|
||||||
// private TResult ConvertSum<TNumber>(TNumber number)
|
|
||||||
// {
|
|
||||||
// if (number == null)
|
|
||||||
// return default;
|
|
||||||
// var convertExpr = Expression.Convert(Expression.Constant(number), typeof(TResult));
|
|
||||||
// return Expression.Lambda<Func<TResult>>(convertExpr).Compile()();
|
|
||||||
// }
|
|
||||||
// protected override TResult DoMergeResult(List<RouteQueryResult<TResult>> resultList)
|
|
||||||
// {
|
|
||||||
// return GetSumResult(resultList);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
protected override IExecutor<TResult> CreateExecutor()
|
protected override IExecutor<RouteQueryResult<TResult>> CreateExecutor()
|
||||||
{
|
{
|
||||||
return new SumMethodWrapExecutor<TResult>(GetStreamMergeContext());
|
return new SumMethodExecutor<TResult>(GetStreamMergeContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue