70 lines
2.3 KiB
C#
70 lines
2.3 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq.Expressions;
|
||
|
using ShardingCore.Core.VirtualRoutes;
|
||
|
using ShardingCore.Core.VirtualRoutes.Abstractions;
|
||
|
using ShardingCore.Helpers;
|
||
|
using ShardingCore.Test50.Domain.Entities;
|
||
|
|
||
|
namespace ShardingCore.Test50.Shardings
|
||
|
{
|
||
|
/*
|
||
|
* @Author: xjm
|
||
|
* @Description:
|
||
|
* @Date: Wednesday, 20 January 2021 10:46:37
|
||
|
* @Email: 326308290@qq.com
|
||
|
*/
|
||
|
public class SysUserRangeVirtualRoute: AbstractShardingOperatorVirtualRoute<SysUserRange, string>
|
||
|
{
|
||
|
private int _mod = 1000;
|
||
|
protected override string ConvertToShardingKey(object shardingKey)
|
||
|
{
|
||
|
return shardingKey.ToString();
|
||
|
}
|
||
|
|
||
|
public override string ShardingKeyToTail(object shardingKey)
|
||
|
{
|
||
|
var shardingKeyStr = ConvertToShardingKey(shardingKey);
|
||
|
var m = Math.Abs(ShardingCoreHelper.GetStringHashCode(shardingKeyStr) % _mod);
|
||
|
if (m > 800)//801-999
|
||
|
{
|
||
|
return "3";
|
||
|
} else if (m > 600)//601-800
|
||
|
{
|
||
|
return "2";
|
||
|
} else if (m > 300)//301-600
|
||
|
{
|
||
|
return "1";
|
||
|
} else //0-300
|
||
|
{
|
||
|
return "0";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override List<string> GetAllTails()
|
||
|
{
|
||
|
return new(){"0", "1","2","3"};
|
||
|
}
|
||
|
|
||
|
protected override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
|
||
|
{
|
||
|
var t = ShardingKeyToTail(shardingKey);
|
||
|
switch (shardingOperator)
|
||
|
{
|
||
|
case ShardingOperatorEnum.Equal: return tail => tail == t;
|
||
|
default:
|
||
|
{
|
||
|
Console.WriteLine($"shardingOperator is not equal scan all table tail");
|
||
|
return tail => true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// public override List<IPhysicTable> AfterPhysicTableFilter(List<IPhysicTable> allPhysicTables, List<IPhysicTable> filterPhysicTables)
|
||
|
// {
|
||
|
// if (filterPhysicTables.Count > 1)
|
||
|
// throw new Exception($"query {nameof(SysUserRange)} not support cross table");
|
||
|
// return base.AfterPhysicTableFilter(allPhysicTables, filterPhysicTables);
|
||
|
// }
|
||
|
}
|
||
|
}
|