sharding page process part
This commit is contained in:
parent
631115a317
commit
2f0a6b3af9
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Sample.SqlServer.Domain.Entities;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
|
|
||||||
|
namespace Sample.SqlServer.Shardings
|
||||||
|
{
|
||||||
|
public class SysUserModPaginationConfiguration : IPaginationConfiguration<SysUserMod>
|
||||||
|
{
|
||||||
|
public void Configure(PaginationBuilder<SysUserMod> builder)
|
||||||
|
{
|
||||||
|
builder.PaginationSequence(o => o.Id)
|
||||||
|
.UseQueryMatch(PaginationMatchEnum.Owner | PaginationMatchEnum.Named | PaginationMatchEnum.FirstMatch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using Sample.SqlServer.Domain.Entities;
|
using Sample.SqlServer.Domain.Entities;
|
||||||
using ShardingCore.Core.VirtualRoutes;
|
using ShardingCore.Core.VirtualRoutes;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
using ShardingCore.VirtualRoutes;
|
using ShardingCore.VirtualRoutes;
|
||||||
using ShardingCore.VirtualRoutes.Mods;
|
using ShardingCore.VirtualRoutes.Mods;
|
||||||
|
|
||||||
|
@ -25,5 +26,10 @@ namespace Sample.SqlServer.Shardings
|
||||||
public SysUserModVirtualTableRoute() : base(2,3)
|
public SysUserModVirtualTableRoute() : base(2,3)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override IPaginationConfiguration<SysUserMod> CreatePaginationConfiguration()
|
||||||
|
{
|
||||||
|
return new SysUserModPaginationConfiguration();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:46:13
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public interface IShardingPageAccessor
|
||||||
|
{
|
||||||
|
ShardingPageContext ShardingPageContext { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:46:37
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public interface IShardingPageManager
|
||||||
|
{
|
||||||
|
ShardingPageContext Current { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// 创建分页scope
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
ShardingPageScope CreateScope();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:47:35
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class ShardingPageAccessor:IShardingPageAccessor
|
||||||
|
{
|
||||||
|
private static AsyncLocal<ShardingPageContext> _shardingPageContext = new AsyncLocal<ShardingPageContext>();
|
||||||
|
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public ShardingPageContext ShardingPageContext
|
||||||
|
{
|
||||||
|
get => _shardingPageContext.Value;
|
||||||
|
set => _shardingPageContext.Value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using ShardingCore.Sharding.StreamMergeEngines;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:46:55
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class ShardingPageContext
|
||||||
|
{
|
||||||
|
public ICollection<RouteQueryResult<long>> RouteQueryResults { get; }
|
||||||
|
private ShardingPageContext()
|
||||||
|
{
|
||||||
|
RouteQueryResults = new LinkedList<RouteQueryResult<long>>();
|
||||||
|
}
|
||||||
|
public static ShardingPageContext Create()
|
||||||
|
{
|
||||||
|
return new ShardingPageContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:50:13
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class ShardingPageManager: IShardingPageManager
|
||||||
|
{
|
||||||
|
private readonly IShardingPageAccessor _shardingPageAccessor;
|
||||||
|
|
||||||
|
public ShardingPageManager(IShardingPageAccessor shardingPageAccessor)
|
||||||
|
{
|
||||||
|
_shardingPageAccessor = shardingPageAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShardingPageContext Current => _shardingPageAccessor.ShardingPageContext;
|
||||||
|
public ShardingPageScope CreateScope()
|
||||||
|
{
|
||||||
|
var shardingPageScope = new ShardingPageScope(_shardingPageAccessor);
|
||||||
|
_shardingPageAccessor.ShardingPageContext = ShardingPageContext.Create();
|
||||||
|
return shardingPageScope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.ShardingPage
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 13:49:12
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class ShardingPageScope : IDisposable
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分表配置访问器
|
||||||
|
/// </summary>
|
||||||
|
public IShardingPageAccessor ShardingPageAccessor { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构造函数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shardingPageAccessor"></param>
|
||||||
|
public ShardingPageScope(IShardingPageAccessor shardingPageAccessor)
|
||||||
|
{
|
||||||
|
ShardingPageAccessor = shardingPageAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 回收
|
||||||
|
/// </summary>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
ShardingPageAccessor.ShardingPageContext = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ using ShardingCore.Core.QueryRouteManagers;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
|
|
||||||
namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
||||||
{
|
{
|
||||||
|
@ -17,6 +18,11 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractVirtualTableRoute<T, TKey> : IVirtualTableRoute<T> where T : class, IShardingTable
|
public abstract class AbstractVirtualTableRoute<T, TKey> : IVirtualTableRoute<T> where T : class, IShardingTable
|
||||||
{
|
{
|
||||||
|
public virtual IPaginationConfiguration<T> CreatePaginationConfiguration()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public Type ShardingEntityType => typeof(T);
|
public Type ShardingEntityType => typeof(T);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 如何将分表字段转成对应的类型
|
/// 如何将分表字段转成对应的类型
|
||||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using ShardingCore.Core.PhysicTables;
|
using ShardingCore.Core.PhysicTables;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
|
|
||||||
namespace ShardingCore.Core.VirtualRoutes.TableRoutes
|
namespace ShardingCore.Core.VirtualRoutes.TableRoutes
|
||||||
{
|
{
|
||||||
|
@ -44,5 +45,10 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes
|
||||||
|
|
||||||
public interface IVirtualTableRoute<T> : IVirtualTableRoute where T : class, IShardingTable
|
public interface IVirtualTableRoute<T> : IVirtualTableRoute where T : class, IShardingTable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 返回null就是表示不开启分页配置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
IPaginationConfiguration<T> CreatePaginationConfiguration();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -23,5 +23,22 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine
|
||||||
|
|
||||||
public ISet<IPhysicTable> ReplaceTables { get; }
|
public ISet<IPhysicTable> ReplaceTables { get; }
|
||||||
|
|
||||||
|
protected bool Equals(RouteResult other)
|
||||||
|
{
|
||||||
|
return Equals(ReplaceTables, other.ReplaceTables);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(null, obj)) return false;
|
||||||
|
if (ReferenceEquals(this, obj)) return true;
|
||||||
|
if (obj.GetType() != this.GetType()) return false;
|
||||||
|
return Equals((RouteResult) obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return (ReplaceTables != null ? ReplaceTables.GetHashCode() : 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using ShardingCore.Core.PhysicTables;
|
using ShardingCore.Core.PhysicTables;
|
||||||
using ShardingCore.Core.VirtualRoutes;
|
using ShardingCore.Core.VirtualRoutes;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
|
|
||||||
namespace ShardingCore.Core.VirtualTables
|
namespace ShardingCore.Core.VirtualTables
|
||||||
{
|
{
|
||||||
|
@ -22,6 +23,14 @@ namespace ShardingCore.Core.VirtualTables
|
||||||
/// 分表配置
|
/// 分表配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ShardingTableConfig ShardingConfig { get; }
|
ShardingTableConfig ShardingConfig { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// 分页配置
|
||||||
|
/// </summary>
|
||||||
|
PaginationMetadata PaginationMetadata { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用分页配置
|
||||||
|
/// </summary>
|
||||||
|
bool EnablePagination => PaginationMetadata != null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取所有的物理表
|
/// 获取所有的物理表
|
||||||
|
|
|
@ -8,6 +8,7 @@ using ShardingCore.Core.VirtualRoutes;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding.PaginationConfigurations;
|
||||||
using ShardingCore.Utils;
|
using ShardingCore.Utils;
|
||||||
|
|
||||||
namespace ShardingCore.Core.VirtualTables
|
namespace ShardingCore.Core.VirtualTables
|
||||||
|
@ -28,12 +29,22 @@ namespace ShardingCore.Core.VirtualTables
|
||||||
|
|
||||||
public Type EntityType => typeof(T);
|
public Type EntityType => typeof(T);
|
||||||
public ShardingTableConfig ShardingConfig { get; }
|
public ShardingTableConfig ShardingConfig { get; }
|
||||||
|
|
||||||
|
public PaginationMetadata PaginationMetadata { get; }
|
||||||
|
|
||||||
private readonly List<IPhysicTable> _physicTables = new List<IPhysicTable>();
|
private readonly List<IPhysicTable> _physicTables = new List<IPhysicTable>();
|
||||||
|
|
||||||
public OneDbVirtualTable(IVirtualTableRoute<T> virtualTableRoute)
|
public OneDbVirtualTable(IVirtualTableRoute<T> virtualTableRoute)
|
||||||
{
|
{
|
||||||
_virtualTableRoute = virtualTableRoute;
|
_virtualTableRoute = virtualTableRoute;
|
||||||
ShardingConfig = ShardingKeyUtil.Parse(EntityType);
|
ShardingConfig = ShardingKeyUtil.Parse(EntityType);
|
||||||
|
var paginationConfiguration = virtualTableRoute.CreatePaginationConfiguration();
|
||||||
|
if (paginationConfiguration != null)
|
||||||
|
{
|
||||||
|
PaginationMetadata = new PaginationMetadata();
|
||||||
|
var paginationBuilder = new PaginationBuilder<T>(PaginationMetadata);
|
||||||
|
paginationConfiguration.Configure(paginationBuilder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<IPhysicTable> GetAllPhysicTables()
|
public List<IPhysicTable> GetAllPhysicTables()
|
||||||
|
|
|
@ -16,6 +16,8 @@ using ShardingCore.Core.QueryRouteManagers;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Core.ShardingAccessors;
|
using ShardingCore.Core.ShardingAccessors;
|
||||||
using ShardingCore.Core.ShardingAccessors.Abstractions;
|
using ShardingCore.Core.ShardingAccessors.Abstractions;
|
||||||
|
using ShardingCore.Core.ShardingPage;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
using ShardingCore.Core.VirtualRoutes;
|
using ShardingCore.Core.VirtualRoutes;
|
||||||
using ShardingCore.Core.VirtualRoutes.RouteTails.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.RouteTails.Abstractions;
|
||||||
using ShardingCore.Sharding.ShardingQueryExecutors;
|
using ShardingCore.Sharding.ShardingQueryExecutors;
|
||||||
|
@ -87,9 +89,15 @@ namespace ShardingCore
|
||||||
services.AddSingleton<IShardingAccessor, ShardingAccessor>();
|
services.AddSingleton<IShardingAccessor, ShardingAccessor>();
|
||||||
services.AddSingleton<IShardingScopeFactory, ShardingScopeFactory>();
|
services.AddSingleton<IShardingScopeFactory, ShardingScopeFactory>();
|
||||||
services.AddSingleton<IRouteTailFactory, RouteTailFactory>();
|
services.AddSingleton<IRouteTailFactory, RouteTailFactory>();
|
||||||
|
services.AddSingleton<IShardingQueryExecutor, DefaultShardingQueryExecutor>();
|
||||||
|
|
||||||
|
//route manage
|
||||||
services.AddSingleton<IShardingRouteManager, ShardingRouteManager>();
|
services.AddSingleton<IShardingRouteManager, ShardingRouteManager>();
|
||||||
services.AddSingleton<IShardingRouteAccessor, ShardingRouteAccessor>();
|
services.AddSingleton<IShardingRouteAccessor, ShardingRouteAccessor>();
|
||||||
services.AddSingleton<IShardingQueryExecutor, DefaultShardingQueryExecutor>();
|
|
||||||
|
//sharding page
|
||||||
|
services.AddSingleton<IShardingPageManager, ShardingPageManager>();
|
||||||
|
services.AddSingleton<IShardingPageAccessor, ShardingPageAccessor>();
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,5 +62,28 @@ namespace ShardingCore.Extensions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否有差异
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="source"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool HasDifference<T>(this IEnumerable<T> source)
|
||||||
|
{
|
||||||
|
return source.Distinct().Count() > 1;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 是否有差异
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <typeparam name="TKey"></typeparam>
|
||||||
|
/// <param name="source"></param>
|
||||||
|
/// <param name="keySelector"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool HasDifference<T,TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
|
||||||
|
{
|
||||||
|
return source.Select(keySelector).Distinct().Count() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -16,6 +16,12 @@ namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
*/
|
*/
|
||||||
public class PaginationBuilder<TEntity> where TEntity:class,IShardingTable
|
public class PaginationBuilder<TEntity> where TEntity:class,IShardingTable
|
||||||
{
|
{
|
||||||
|
private readonly PaginationMetadata _metadata;
|
||||||
|
|
||||||
|
public PaginationBuilder(PaginationMetadata metadata)
|
||||||
|
{
|
||||||
|
_metadata = metadata;
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 分页顺序
|
/// 分页顺序
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -23,7 +29,27 @@ namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
/// <typeparam name="TProperty"></typeparam>
|
/// <typeparam name="TProperty"></typeparam>
|
||||||
public PaginationOrderPropertyBuilder PaginationSequence<TProperty>(Expression<Func<TEntity, TProperty>> orderPropertyExpression)
|
public PaginationOrderPropertyBuilder PaginationSequence<TProperty>(Expression<Func<TEntity, TProperty>> orderPropertyExpression)
|
||||||
{
|
{
|
||||||
return new PaginationOrderPropertyBuilder(orderPropertyExpression);
|
return new PaginationOrderPropertyBuilder(orderPropertyExpression, _metadata);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 配置当跳过多少条后开始启用只能分页
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="skip"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public PaginationBuilder<TEntity> ConfigUseShardingPageIfGeSkip(long skip)
|
||||||
|
{
|
||||||
|
_metadata.UseShardingPageIfGeSkipAvg = skip;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 配置当分表数目小于多少后直接取到内存不在流式处理
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="count"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public PaginationBuilder<TEntity> ConfigTakeInMemoryCountIfLe(int count)
|
||||||
|
{
|
||||||
|
_metadata.TakeInMemoryCountIfLe = count;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 7:45:55
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class PaginationConfig
|
||||||
|
{
|
||||||
|
public PaginationConfig(LambdaExpression orderPropertyExpression, PaginationMatchEnum paginationMatchEnum= PaginationMatchEnum.Owner, IComparer<string> tailComparer=null)
|
||||||
|
{
|
||||||
|
OrderPropertyExpression = orderPropertyExpression;
|
||||||
|
OrderPropertyInfo = orderPropertyExpression.GetPropertyAccess();
|
||||||
|
PropertyName = OrderPropertyInfo.Name;
|
||||||
|
PaginationMatchEnum = paginationMatchEnum;
|
||||||
|
TailComparer = tailComparer ?? Comparer<string>.Default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LambdaExpression OrderPropertyExpression { get; set; }
|
||||||
|
public IComparer<string> TailComparer { get; set; }
|
||||||
|
public PaginationMatchEnum PaginationMatchEnum { get; set; }
|
||||||
|
public PropertyInfo OrderPropertyInfo { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 如果查询没发现排序就将当前配置追加上去
|
||||||
|
/// </summary>
|
||||||
|
public bool AppendIfOrderNone { get; set; }
|
||||||
|
public string PropertyName { get;}
|
||||||
|
|
||||||
|
|
||||||
|
protected bool Equals(PaginationConfig other)
|
||||||
|
{
|
||||||
|
return PropertyName == other.PropertyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(null, obj)) return false;
|
||||||
|
if (ReferenceEquals(this, obj)) return true;
|
||||||
|
if (obj.GetType() != this.GetType()) return false;
|
||||||
|
return Equals((PaginationConfig) obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return (PropertyName != null ? PropertyName.GetHashCode() : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,15 +2,26 @@ using System;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.PaginationConfigurations
|
namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* @Author: xjm
|
* @Author: xjm
|
||||||
* @Description:
|
* @Description:
|
||||||
* @Date: Wednesday, 01 September 2021 21:27:25
|
* @Date: Wednesday, 01 September 2021 21:27:25
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
|
[Flags]
|
||||||
public enum PaginationMatchEnum
|
public enum PaginationMatchEnum
|
||||||
{
|
{
|
||||||
Owner=1,
|
/// <summary>
|
||||||
Named=1<<1
|
/// 必须是当前对象的属性
|
||||||
|
/// </summary>
|
||||||
|
Owner = 1,
|
||||||
|
/// <summary>
|
||||||
|
/// 只要名称一样就可以了
|
||||||
|
/// </summary>
|
||||||
|
Named = 1 << 1,
|
||||||
|
/// <summary>
|
||||||
|
/// 仅第一个匹配就可以了
|
||||||
|
/// </summary>
|
||||||
|
FirstMatch = 1 << 2
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 7:45:16
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
/// <summary>
|
||||||
|
/// 分页配置元数据
|
||||||
|
/// </summary>
|
||||||
|
public class PaginationMetadata
|
||||||
|
{
|
||||||
|
public ISet<PaginationConfig> PaginationConfigs = new HashSet<PaginationConfig>();
|
||||||
|
/// <summary>
|
||||||
|
/// 配置生效当跳过多少条后 GREATER THAN OR EQUAL
|
||||||
|
/// </summary>
|
||||||
|
public long UseShardingPageIfGeSkipAvg { get; set; } = 3000L;
|
||||||
|
/// <summary>
|
||||||
|
/// 分表发现如果少于多少条后直接取到内存 LESS THAN OR EQUAL
|
||||||
|
/// </summary>
|
||||||
|
public int TakeInMemoryCountIfLe { get; set; } = 100;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +1,23 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Reflection;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.PaginationConfigurations
|
namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* @Author: xjm
|
* @Author: xjm
|
||||||
* @Description:
|
* @Description:
|
||||||
* @Date: Wednesday, 01 September 2021 21:32:53
|
* @Date: Wednesday, 01 September 2021 21:32:53
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
public class PaginationOrderPropertyBuilder
|
public class PaginationOrderPropertyBuilder
|
||||||
{
|
{
|
||||||
private readonly LambdaExpression _orderPropertyExpression;
|
private readonly PaginationConfig _paginationConfig;
|
||||||
private IComparer<string> _tailComparer;
|
|
||||||
private PaginationMatchEnum _paginationMatchEnum;
|
|
||||||
private PropertyInfo _orderPropertyInfo;
|
|
||||||
|
|
||||||
public PaginationOrderPropertyBuilder(LambdaExpression orderPropertyExpression)
|
public PaginationOrderPropertyBuilder(LambdaExpression orderPropertyExpression,PaginationMetadata metadata)
|
||||||
{
|
{
|
||||||
_orderPropertyExpression = orderPropertyExpression;
|
_paginationConfig = new PaginationConfig(orderPropertyExpression);
|
||||||
_orderPropertyInfo = orderPropertyExpression.GetPropertyAccess();
|
metadata.PaginationConfigs.Add(_paginationConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -32,7 +27,8 @@ namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PaginationOrderPropertyBuilder UseTailCompare(IComparer<string> tailComparer)
|
public PaginationOrderPropertyBuilder UseTailCompare(IComparer<string> tailComparer)
|
||||||
{
|
{
|
||||||
_tailComparer = tailComparer ?? throw new ArgumentException(nameof(tailComparer));
|
|
||||||
|
_paginationConfig.TailComparer= tailComparer ?? throw new ArgumentException(nameof(tailComparer));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -42,7 +38,16 @@ namespace ShardingCore.Sharding.PaginationConfigurations
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PaginationOrderPropertyBuilder UseQueryMatch(PaginationMatchEnum paginationMatchEnum)
|
public PaginationOrderPropertyBuilder UseQueryMatch(PaginationMatchEnum paginationMatchEnum)
|
||||||
{
|
{
|
||||||
_paginationMatchEnum = paginationMatchEnum;
|
_paginationConfig.PaginationMatchEnum = paginationMatchEnum;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 如果查询没发现排序就将当前配置追加上去
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public PaginationOrderPropertyBuilder UseAppendIfOrderNone()
|
||||||
|
{
|
||||||
|
_paginationConfig.AppendIfOrderNone = true;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,5 +104,10 @@ namespace ShardingCore.Sharding
|
||||||
return this.SelectContext.SelectProperties.Any(o => o.IsAggregateMethod);
|
return this.SelectContext.SelectProperties.Any(o => o.IsAggregateMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IShardingDbContext GetShardingDbContext()
|
||||||
|
{
|
||||||
|
return _shardingDbContext;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
||||||
|
@ -32,120 +33,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
|
|
||||||
public override TEnsureResult MergeResult()
|
public override TEnsureResult MergeResult()
|
||||||
{
|
{
|
||||||
if (typeof(decimal) == typeof(TEnsureResult))
|
return AsyncHelper.RunSync(() => MergeResultAsync());
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<decimal>)queryable).Average());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum() / result.Count;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(decimal?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<decimal?>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(int) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<int>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum() / result.Count;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(int?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<int?>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(long) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<long>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum() / result.Count;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(long?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<long?>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(double) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<double>)queryable).Average()
|
|
||||||
);
|
|
||||||
var average = result.Sum() / result.Count;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(double?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<double?>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(float) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<float>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum() / result.Count;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(float?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(
|
|
||||||
queryable => ((IQueryable<float?>)queryable).Average()
|
|
||||||
);
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
|
||||||
return ConvertSum(average);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression().Print()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
#if EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TEnsureResult> MergeResultAsync(
|
public override async Task<TEnsureResult> MergeResultAsync(
|
||||||
|
@ -158,7 +46,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum() / result.Count;
|
var average = result.Sum(o=>o.QueryResult) / result.Count;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +57,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
|
var average = sum.HasValue ? sum / result.Count : default;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +69,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum() / result.Count;
|
var average = result.Sum(o => o.QueryResult) / result.Count;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +80,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
|
var average = sum.HasValue ? sum / result.Count : default;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +92,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum() / result.Count;
|
var average = result.Sum(o => o.QueryResult) / result.Count;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +103,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
|
var average = sum.HasValue ? sum / result.Count : default;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +113,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(
|
var result = await base.ExecuteAsync(
|
||||||
queryable => ((IQueryable<double>)queryable).AverageAsync(cancellationToken),
|
queryable => ((IQueryable<double>)queryable).AverageAsync(cancellationToken),
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
var average = result.Sum() / result.Count;
|
var average = result.Sum(o => o.QueryResult) / result.Count;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +124,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
|
var average = sum.HasValue ? sum / result.Count : default;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,7 +136,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum() / result.Count;
|
var average = result.Sum(o => o.QueryResult) / result.Count;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,18 +147,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var average = result.Sum().HasValue ? result.Sum() / result.Count : default;
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
|
var average = sum.HasValue ? sum / result.Count : default;
|
||||||
return ConvertSum(average);
|
return ConvertSum(average);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
throw new ShardingCoreException(
|
||||||
$"not support {GetMethodCallExpression().Print()} result {typeof(TEnsureResult)}");
|
$"not support {GetMethodCallExpression().ShardingPrint()} result {typeof(TEnsureResult)}");
|
||||||
#endif
|
|
||||||
#if EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TEnsureResult ConvertSum<TNumber>(TNumber number)
|
private TEnsureResult ConvertSum<TNumber>(TNumber number)
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -27,14 +28,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).Max());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
return result.Max();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).MaxAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).MaxAsync(cancellationToken), cancellationToken);
|
||||||
return result.Max();
|
return result.Max(o=>o.QueryResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,14 +29,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).Min());
|
|
||||||
return result.Min();
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).MinAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).MinAsync(cancellationToken), cancellationToken);
|
||||||
return result.Min();
|
return result.Min(o=>o.QueryResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
||||||
|
@ -30,94 +31,8 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
|
|
||||||
public override TEnsureResult MergeResult()
|
public override TEnsureResult MergeResult()
|
||||||
{
|
{
|
||||||
if (typeof(decimal) == typeof(TEnsureResult))
|
|
||||||
{
|
return AsyncHelper.RunSync(() => MergeResultAsync());
|
||||||
var result = base.Execute(queryable => ((IQueryable<decimal>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(decimal?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<decimal?>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(int) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<int>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(int?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<int?>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(long) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<long>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(long?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<long?>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(double) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<double>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(double?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<double?>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(float) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<float>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
if (typeof(float?) == typeof(TEnsureResult))
|
|
||||||
{
|
|
||||||
var result = base.Execute(queryable => ((IQueryable<float?>)queryable).Sum());
|
|
||||||
if (result.IsEmpty())
|
|
||||||
return default;
|
|
||||||
var sum = result.Sum();
|
|
||||||
return ConvertSum(sum);
|
|
||||||
}
|
|
||||||
#if !EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression().Print()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
#if EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TEnsureResult> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TEnsureResult> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
@ -127,7 +42,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<decimal>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<decimal>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o=>o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(decimal?) == typeof(TEnsureResult))
|
if (typeof(decimal?) == typeof(TEnsureResult))
|
||||||
|
@ -135,7 +50,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<decimal?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<decimal?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o=>o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(int) == typeof(TEnsureResult))
|
if (typeof(int) == typeof(TEnsureResult))
|
||||||
|
@ -143,7 +58,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<int>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<int>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o=>o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(int?) == typeof(TEnsureResult))
|
if (typeof(int?) == typeof(TEnsureResult))
|
||||||
|
@ -151,7 +66,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<int?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<int?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(long) == typeof(TEnsureResult))
|
if (typeof(long) == typeof(TEnsureResult))
|
||||||
|
@ -159,7 +74,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<long>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<long>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(long?) == typeof(TEnsureResult))
|
if (typeof(long?) == typeof(TEnsureResult))
|
||||||
|
@ -167,7 +82,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<long?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<long?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(double) == typeof(TEnsureResult))
|
if (typeof(double) == typeof(TEnsureResult))
|
||||||
|
@ -175,7 +90,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<double>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<double>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(double?) == typeof(TEnsureResult))
|
if (typeof(double?) == typeof(TEnsureResult))
|
||||||
|
@ -183,7 +98,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<double?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<double?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(float) == typeof(TEnsureResult))
|
if (typeof(float) == typeof(TEnsureResult))
|
||||||
|
@ -191,7 +106,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<float>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<float>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
if (typeof(float?) == typeof(TEnsureResult))
|
if (typeof(float?) == typeof(TEnsureResult))
|
||||||
|
@ -199,18 +114,12 @@ namespace ShardingCore.Sharding.StreamMergeEngines.AggregateMergeEngines
|
||||||
var result = await base.ExecuteAsync(queryable => ((IQueryable<float?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync(queryable => ((IQueryable<float?>)queryable).SumAsync(cancellationToken), cancellationToken);
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
return default;
|
return default;
|
||||||
var sum = result.Sum();
|
var sum = result.Sum(o => o.QueryResult);
|
||||||
return ConvertSum(sum);
|
return ConvertSum(sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
throw new ShardingCoreException(
|
||||||
$"not support {GetMethodCallExpression().Print()} result {typeof(TEnsureResult)}");
|
$"not support {GetMethodCallExpression().ShardingPrint()} result {typeof(TEnsureResult)}");
|
||||||
#endif
|
|
||||||
#if EFCORE2
|
|
||||||
throw new ShardingCoreException(
|
|
||||||
$"not support {GetMethodCallExpression()} result {typeof(TEnsureResult)}");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
private TEnsureResult ConvertSum<TNumber>(TNumber number)
|
private TEnsureResult ConvertSum<TNumber>(TNumber number)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).AnyAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).AnyAsync(cancellationToken), cancellationToken);
|
||||||
|
|
||||||
return result.All(o => o);
|
return result.All(o => o.QueryResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.Enumerators;
|
using ShardingCore.Sharding.Enumerators;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
|
@ -29,16 +30,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override bool MergeResult()
|
public override bool MergeResult()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TEntity>)queryable).Any());
|
return AsyncHelper.RunSync(() => MergeResultAsync());
|
||||||
|
|
||||||
return result.Any(o => o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<bool> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<bool> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).AnyAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).AnyAsync(cancellationToken), cancellationToken);
|
||||||
|
|
||||||
return result.Any(o => o);
|
return result.Any(o => o.QueryResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
private IAsyncEnumerator<T> GetShardingEnumerator()
|
private IAsyncEnumerator<T> GetShardingEnumerator()
|
||||||
{
|
{
|
||||||
var tableResult = _mergeContext.GetRouteResults();
|
var tableResult = _mergeContext.RouteResults;
|
||||||
var routeCount = tableResult.Count();
|
var routeCount = tableResult.Count();
|
||||||
var enumeratorTasks = tableResult.Select(routeResult =>
|
var enumeratorTasks = tableResult.Select(routeResult =>
|
||||||
{
|
{
|
||||||
|
@ -114,7 +114,7 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public IEnumerator<T> GetEnumerator()
|
public IEnumerator<T> GetEnumerator()
|
||||||
{
|
{
|
||||||
var tableResult = _mergeContext.GetRouteResults();
|
var tableResult = _mergeContext.RouteResults;
|
||||||
var routeCount = tableResult.Count();
|
var routeCount = tableResult.Count();
|
||||||
var enumeratorTasks = tableResult.Select(routeResult =>
|
var enumeratorTasks = tableResult.Select(routeResult =>
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
||||||
|
@ -25,16 +26,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override bool MergeResult()
|
public override bool MergeResult()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TEntity>)queryable).Contains(GetConstantItem()));
|
return AsyncHelper.RunSync(() => MergeResultAsync());
|
||||||
|
|
||||||
return result.Any(o => o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<bool> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<bool> MergeResultAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).ContainsAsync(GetConstantItem(), cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).ContainsAsync(GetConstantItem(), cancellationToken), cancellationToken);
|
||||||
|
|
||||||
return result.Any(o => o);
|
return result.Any(o => o.QueryResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
using ShardingCore.Helpers;
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractEnsureExpressionMergeEngines;
|
||||||
|
|
||||||
|
@ -18,8 +19,10 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
*/
|
*/
|
||||||
public class CountAsyncInMemoryMergeEngine<TEntity> : AbstractEnsureMethodCallWhereInMemoryAsyncMergeEngine<TEntity,int>
|
public class CountAsyncInMemoryMergeEngine<TEntity> : AbstractEnsureMethodCallWhereInMemoryAsyncMergeEngine<TEntity,int>
|
||||||
{
|
{
|
||||||
|
private readonly IShardingPageManager _shardingPageManager;
|
||||||
public CountAsyncInMemoryMergeEngine(MethodCallExpression methodCallExpression, IShardingDbContext shardingDbContext) : base(methodCallExpression, shardingDbContext)
|
public CountAsyncInMemoryMergeEngine(MethodCallExpression methodCallExpression, IShardingDbContext shardingDbContext) : base(methodCallExpression, shardingDbContext)
|
||||||
{
|
{
|
||||||
|
_shardingPageManager = ShardingContainer.GetService<IShardingPageManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override int MergeResult()
|
public override int MergeResult()
|
||||||
|
@ -31,6 +34,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).CountAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).CountAsync(cancellationToken), cancellationToken);
|
||||||
|
|
||||||
|
if (_shardingPageManager.Current != null)
|
||||||
|
{
|
||||||
|
foreach (var routeQueryResult in result)
|
||||||
|
{
|
||||||
|
_shardingPageManager.Current.RouteQueryResults.Add(new RouteQueryResult<long>(routeQueryResult.RouteResult, routeQueryResult.QueryResult));
|
||||||
|
}
|
||||||
|
}
|
||||||
return result.Sum(o=>o.QueryResult);
|
return result.Sum(o=>o.QueryResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine;
|
||||||
|
using ShardingCore.Exceptions;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding.Enumerators;
|
||||||
|
using ShardingCore.Sharding.Enumerators.StreamMergeAsync;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 15:38:05
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public abstract class AbstractEnumeratorAsyncStreamMergeEngine<TEntity>: AbstractEnumeratorStreamMergeEngine<TEntity>
|
||||||
|
{
|
||||||
|
public AbstractEnumeratorAsyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext) : base(streamMergeContext)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IAsyncEnumerator<TEntity> GetAsyncEnumerator(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
var dbStreamMergeAsyncEnumerators = GetDbStreamMergeAsyncEnumerators();
|
||||||
|
if (dbStreamMergeAsyncEnumerators.IsEmpty())
|
||||||
|
throw new ShardingCoreException("GetDbStreamMergeAsyncEnumerators empty");
|
||||||
|
return GetStreamMergeAsyncEnumerator(dbStreamMergeAsyncEnumerators);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract IStreamMergeAsyncEnumerator<TEntity>[] GetDbStreamMergeAsyncEnumerators();
|
||||||
|
public abstract IStreamMergeAsyncEnumerator<TEntity> GetStreamMergeAsyncEnumerator(IStreamMergeAsyncEnumerator<TEntity>[] streamsAsyncEnumerators);
|
||||||
|
public async Task<IAsyncEnumerator<TEntity>> DoGetAsyncEnumerator(IQueryable<TEntity> newQueryable)
|
||||||
|
{
|
||||||
|
var enumator = newQueryable.AsAsyncEnumerable().GetAsyncEnumerator();
|
||||||
|
await enumator.MoveNextAsync();
|
||||||
|
return enumator;
|
||||||
|
}
|
||||||
|
public virtual IQueryable<TEntity> CreateAsyncExecuteQueryable(RouteResult routeResult, int routeCount)
|
||||||
|
{
|
||||||
|
var shardingDbContext = StreamMergeContext.CreateDbContext(routeResult);
|
||||||
|
var useOriginal = routeCount > 1;
|
||||||
|
DbContextQueryStore.TryAdd(routeResult,shardingDbContext);
|
||||||
|
var newQueryable = (IQueryable<TEntity>)(useOriginal ? StreamMergeContext.GetReWriteQueryable() : StreamMergeContext.GetOriginalQueryable())
|
||||||
|
.ReplaceDbContextQueryable(shardingDbContext);
|
||||||
|
return newQueryable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerator<TEntity> GetEnumerator()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 15:35:39
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public abstract class AbstractEnumeratorStreamMergeEngine<TEntity>:IEnumeratorStreamMergeEngine<TEntity>
|
||||||
|
{
|
||||||
|
public StreamMergeContext<TEntity> StreamMergeContext { get; }
|
||||||
|
public ConcurrentDictionary<RouteResult,DbContext> DbContextQueryStore { get; }
|
||||||
|
|
||||||
|
public AbstractEnumeratorStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext)
|
||||||
|
{
|
||||||
|
StreamMergeContext = streamMergeContext;
|
||||||
|
DbContextQueryStore = new ConcurrentDictionary<RouteResult, DbContext>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract IAsyncEnumerator<TEntity> GetAsyncEnumerator(
|
||||||
|
CancellationToken cancellationToken = new CancellationToken());
|
||||||
|
|
||||||
|
public abstract IEnumerator<TEntity> GetEnumerator();
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (DbContextQueryStore.IsNotEmpty())
|
||||||
|
{
|
||||||
|
DbContextQueryStore.Values.ForEach(dbContext =>
|
||||||
|
{
|
||||||
|
dbContext.Dispose();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 15:38:13
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class AbstractEnumeratorSyncStreamMergeEngine<TEntity> : AbstractEnumeratorStreamMergeEngine<TEntity>
|
||||||
|
{
|
||||||
|
public AbstractEnumeratorSyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext) : base(streamMergeContext)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IAsyncEnumerator<TEntity> GetAsyncEnumerator(CancellationToken cancellationToken = new CancellationToken())
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerator<TEntity> GetEnumerator()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 15:15:34
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public interface IEnumeratorStreamMergeEngine<TEntity> : IAsyncEnumerable<TEntity>, IEnumerable<TEntity>, IDisposable
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding.Enumerators;
|
||||||
|
using ShardingCore.Sharding.Enumerators.StreamMergeAsync;
|
||||||
|
using ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 16:16:12
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class NormalEnumeratorAsyncStreamMergeEngine<TEntity>:AbstractEnumeratorAsyncStreamMergeEngine<TEntity>
|
||||||
|
{
|
||||||
|
private readonly bool _multiRouteQuery;
|
||||||
|
public NormalEnumeratorAsyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext) : base(streamMergeContext)
|
||||||
|
{
|
||||||
|
_multiRouteQuery = streamMergeContext.RouteResults.Count() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IStreamMergeAsyncEnumerator<TEntity>[] GetDbStreamMergeAsyncEnumerators()
|
||||||
|
{
|
||||||
|
var tableResult = StreamMergeContext.RouteResults;
|
||||||
|
var routeCount = tableResult.Count();
|
||||||
|
var enumeratorTasks = tableResult.Select(routeResult =>
|
||||||
|
{
|
||||||
|
return Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var newQueryable = CreateAsyncExecuteQueryable(routeResult, routeCount);
|
||||||
|
|
||||||
|
var asyncEnumerator = await DoGetAsyncEnumerator(newQueryable);
|
||||||
|
return new StreamMergeAsyncEnumerator<TEntity>(asyncEnumerator);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).ToArray();
|
||||||
|
|
||||||
|
var streamEnumerators = Task.WhenAll(enumeratorTasks).GetAwaiter().GetResult();
|
||||||
|
return streamEnumerators;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IQueryable<TEntity> CreateAsyncExecuteQueryable(RouteResult routeResult, int routeCount)
|
||||||
|
{
|
||||||
|
var shardingDbContext = StreamMergeContext.CreateDbContext(routeResult);
|
||||||
|
DbContextQueryStore.TryAdd(routeResult, shardingDbContext);
|
||||||
|
var newQueryable = (IQueryable<TEntity>)(_multiRouteQuery ? StreamMergeContext.GetReWriteQueryable() : StreamMergeContext.GetOriginalQueryable())
|
||||||
|
.ReplaceDbContextQueryable(shardingDbContext);
|
||||||
|
return newQueryable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IStreamMergeAsyncEnumerator<TEntity> GetStreamMergeAsyncEnumerator(IStreamMergeAsyncEnumerator<TEntity>[] streamsAsyncEnumerators)
|
||||||
|
{
|
||||||
|
if (_multiRouteQuery && StreamMergeContext.HasSkipTake())
|
||||||
|
return new PaginationStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
if (StreamMergeContext.HasGroupQuery())
|
||||||
|
return new MultiAggregateOrderStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
return new MultiOrderStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,100 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine;
|
||||||
|
using ShardingCore.Core.VirtualTables;
|
||||||
|
using ShardingCore.Exceptions;
|
||||||
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding.Enumerators;
|
||||||
|
using ShardingCore.Sharding.Enumerators.StreamMergeAsync;
|
||||||
|
using ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines.Abstractions;
|
||||||
|
|
||||||
|
namespace ShardingCore.Sharding.StreamMergeEngines.EnumeratorStreamMergeEngines
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* @Author: xjm
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2021/9/2 16:29:06
|
||||||
|
* @Ver: 1.0
|
||||||
|
* @Email: 326308290@qq.com
|
||||||
|
*/
|
||||||
|
public class SequenceEnumeratorAsyncStreamMergeEngine<TEntity> : AbstractEnumeratorAsyncStreamMergeEngine<TEntity>
|
||||||
|
{
|
||||||
|
private IShardingPageManager _shardingPageManager;
|
||||||
|
private IVirtualTableManager _virtualTableManager;
|
||||||
|
public SequenceEnumeratorAsyncStreamMergeEngine(StreamMergeContext<TEntity> streamMergeContext) : base(streamMergeContext)
|
||||||
|
{
|
||||||
|
_shardingPageManager = ShardingContainer.GetService<IShardingPageManager>();
|
||||||
|
_virtualTableManager = ShardingContainer.GetService<IVirtualTableManager>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IStreamMergeAsyncEnumerator<TEntity>[] GetDbStreamMergeAsyncEnumerators()
|
||||||
|
{
|
||||||
|
var routeQueryResults = _shardingPageManager.Current.RouteQueryResults.ToList();
|
||||||
|
if (routeQueryResults.Any(o => o.RouteResult.ReplaceTables.Count(p=>p.IsShardingTable())!=1)
|
||||||
|
|| routeQueryResults.HasDifference(o=>o.RouteResult.ReplaceTables.First().EntityType))
|
||||||
|
throw new InvalidOperationException($"error sharding page:[{StreamMergeContext.GetOriginalQueryable().Expression.ShardingPrint()}]");
|
||||||
|
var shardingEntityType = routeQueryResults[0].RouteResult.ReplaceTables.FirstOrDefault(o=>o.IsShardingTable()).EntityType;
|
||||||
|
var virtualTable = _virtualTableManager.GetVirtualTable(StreamMergeContext.GetShardingDbContext().ShardingDbContextType, shardingEntityType);
|
||||||
|
if (!virtualTable.EnablePagination)
|
||||||
|
{
|
||||||
|
throw new ShardingCoreException("not support Sequence enumerator");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (base.StreamMergeContext.Orders.IsEmpty())
|
||||||
|
{
|
||||||
|
var append = virtualTable.PaginationMetadata.PaginationConfigs.FirstOrDefault(o=>o.AppendIfOrderNone);
|
||||||
|
if (append != null)
|
||||||
|
{
|
||||||
|
StreamMergeContext.GetOriginalQueryable().OrderBy("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var tableResult = StreamMergeContext.RouteResults;
|
||||||
|
var routeCount = tableResult.Count();
|
||||||
|
var enumeratorTasks = tableResult.Select(routeResult =>
|
||||||
|
{
|
||||||
|
return Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var newQueryable = CreateAsyncExecuteQueryable(routeResult, routeCount);
|
||||||
|
|
||||||
|
var asyncEnumerator = await DoGetAsyncEnumerator(newQueryable);
|
||||||
|
return new StreamMergeAsyncEnumerator<TEntity>(asyncEnumerator);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).ToArray();
|
||||||
|
|
||||||
|
var streamEnumerators = Task.WhenAll(enumeratorTasks).GetAwaiter().GetResult();
|
||||||
|
return streamEnumerators;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IQueryable<TEntity> CreateAsyncExecuteQueryable(RouteResult routeResult, int routeCount)
|
||||||
|
{
|
||||||
|
var shardingDbContext = StreamMergeContext.CreateDbContext(routeResult);
|
||||||
|
DbContextQueryStore.TryAdd(routeResult, shardingDbContext);
|
||||||
|
var newQueryable = (IQueryable<TEntity>)(_multiRouteQuery ? StreamMergeContext.GetReWriteQueryable() : StreamMergeContext.GetOriginalQueryable())
|
||||||
|
.ReplaceDbContextQueryable(shardingDbContext);
|
||||||
|
return newQueryable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IStreamMergeAsyncEnumerator<TEntity> GetStreamMergeAsyncEnumerator(IStreamMergeAsyncEnumerator<TEntity>[] streamsAsyncEnumerators)
|
||||||
|
{
|
||||||
|
if (_multiRouteQuery && StreamMergeContext.HasSkipTake())
|
||||||
|
return new PaginationStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
if (StreamMergeContext.HasGroupQuery())
|
||||||
|
return new MultiAggregateOrderStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
return new MultiOrderStreamMergeAsyncEnumerator<TEntity>(StreamMergeContext, streamsAsyncEnumerators);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,20 +29,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute(queryable => ((IQueryable<TResult>)queryable).First());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).First();
|
|
||||||
|
|
||||||
return q.First();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).FirstAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).FirstAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
|
@ -9,6 +9,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.Enumerators;
|
using ShardingCore.Sharding.Enumerators;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
|
@ -31,20 +32,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).FirstOrDefault());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).FirstOrDefault();
|
|
||||||
|
|
||||||
return q.FirstOrDefault();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).FirstOrDefaultAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).FirstOrDefaultAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,21 +29,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).Last());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).Last();
|
|
||||||
|
|
||||||
return q.Last();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
|
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).LastAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).LastAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,20 +29,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).LastOrDefault());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).LastOrDefault();
|
|
||||||
|
|
||||||
return q.LastOrDefault();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).LastOrDefaultAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).LastOrDefaultAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using ShardingCore.Core.ShardingPage.Abstractions;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Helpers;
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
@ -25,8 +26,10 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
*/
|
*/
|
||||||
public class LongCountAsyncInMemoryMergeEngine<TEntity> : AbstractEnsureMethodCallWhereInMemoryAsyncMergeEngine<TEntity,long>
|
public class LongCountAsyncInMemoryMergeEngine<TEntity> : AbstractEnsureMethodCallWhereInMemoryAsyncMergeEngine<TEntity,long>
|
||||||
{
|
{
|
||||||
|
private readonly IShardingPageManager _shardingPageManager;
|
||||||
public LongCountAsyncInMemoryMergeEngine(MethodCallExpression methodCallExpression, IShardingDbContext shardingDbContext) : base(methodCallExpression, shardingDbContext)
|
public LongCountAsyncInMemoryMergeEngine(MethodCallExpression methodCallExpression, IShardingDbContext shardingDbContext) : base(methodCallExpression, shardingDbContext)
|
||||||
{
|
{
|
||||||
|
_shardingPageManager= ShardingContainer.GetService<IShardingPageManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override long MergeResult()
|
public override long MergeResult()
|
||||||
|
@ -39,6 +42,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).LongCountAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TEntity>)queryable).LongCountAsync(cancellationToken), cancellationToken);
|
||||||
|
|
||||||
|
if (_shardingPageManager.Current != null)
|
||||||
|
{
|
||||||
|
foreach (var routeQueryResult in result)
|
||||||
|
{
|
||||||
|
_shardingPageManager.Current.RouteQueryResults.Add(routeQueryResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result.Sum(o=>o.QueryResult);
|
return result.Sum(o=>o.QueryResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,20 +29,13 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute( queryable => ((IQueryable<TResult>)queryable).Single());
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).Single();
|
|
||||||
|
|
||||||
return q.Single();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).SingleAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).SingleAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions;
|
||||||
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
using ShardingCore.Sharding.StreamMergeEngines.Abstractions.AbstractGenericExpressionMergeEngines;
|
||||||
|
@ -28,20 +29,14 @@ namespace ShardingCore.Sharding.StreamMergeEngines
|
||||||
|
|
||||||
public override TResult MergeResult<TResult>()
|
public override TResult MergeResult<TResult>()
|
||||||
{
|
{
|
||||||
var result = base.Execute(queryable => ((IQueryable<TResult>)queryable).SingleOrDefault());
|
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
return AsyncHelper.RunSync(() => MergeResultAsync<TResult>());
|
||||||
if (streamMergeContext.Orders.Any())
|
|
||||||
return q.OrderWithExpression(streamMergeContext.Orders).SingleOrDefault();
|
|
||||||
|
|
||||||
return q.SingleOrDefault();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task<TResult> MergeResultAsync<TResult>(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).SingleOrDefaultAsync(cancellationToken), cancellationToken);
|
var result = await base.ExecuteAsync( queryable => ((IQueryable<TResult>)queryable).SingleOrDefaultAsync(cancellationToken), cancellationToken);
|
||||||
var q = result.Where(o => o != null).AsQueryable();
|
var q = result.Where(o => o != null&&o.QueryResult!=null).Select(o=>o.QueryResult).AsQueryable();
|
||||||
|
|
||||||
var streamMergeContext = GetStreamMergeContext();
|
var streamMergeContext = GetStreamMergeContext();
|
||||||
if (streamMergeContext.Orders.Any())
|
if (streamMergeContext.Orders.Any())
|
||||||
|
|
Loading…
Reference in New Issue