sharding/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKe...

88 lines
3.3 KiB
C#

using ShardingCore.Core.VirtualRoutes;
using ShardingCore.Helpers;
using ShardingCore.VirtualRoutes.Abstractions;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace ShardingCore.VirtualRoutes.Days
{
/*
* @Author: xjm
* @Description:
* @Date: Wednesday, 27 January 2021 08:56:38
* @Email: 326308290@qq.com
*/
public abstract class AbstractSimpleShardingDayKeyLongVirtualTableRoute<TEntity>:AbstractShardingTimeKeyLongVirtualTableRoute<TEntity> where TEntity:class
{
public abstract DateTime GetBeginTime();
protected override List<string> CalcTailsOnStart()
{
var beginTime = GetBeginTime().Date;
var tails=new List<string>();
//提前创建表
var nowTimeStamp = DateTime.Now.Date;
if (beginTime > nowTimeStamp)
throw new ArgumentException("begin time error");
var currentTimeStamp = beginTime;
while (currentTimeStamp <= nowTimeStamp)
{
var currentTimeStampLong=ShardingCoreHelper.ConvertDateTimeToLong(currentTimeStamp);
var tail = TimeFormatToTail(currentTimeStampLong);
tails.Add(tail);
currentTimeStamp = currentTimeStamp.AddDays(1);
}
return tails;
}
protected override string TimeFormatToTail(long time)
{
var dateTime=ShardingCoreHelper.ConvertLongToDateTime(time);
return $"{dateTime:yyyyMMdd}";
}
public override Func<string, bool> GetRouteToFilter(long shardingKey, ShardingOperatorEnum shardingOperator)
{
var t = TimeFormatToTail(shardingKey);
switch (shardingOperator)
{
case ShardingOperatorEnum.GreaterThan:
case ShardingOperatorEnum.GreaterThanOrEqual:
return tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0;
case ShardingOperatorEnum.LessThan:
{
var dateTime = ShardingCoreHelper.ConvertLongToDateTime(shardingKey);
var shardingKeyDate = dateTime.Date;
//处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回
if (shardingKeyDate == dateTime)
return tail => String.Compare(tail, t, StringComparison.Ordinal) < 0;
return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0;
}
case ShardingOperatorEnum.LessThanOrEqual:
return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0;
case ShardingOperatorEnum.Equal: return tail => tail == t;
default:
{
#if DEBUG
Console.WriteLine($"shardingOperator is not equal scan all table tail");
#endif
return tail => true;
}
}
}
public override string[] GetCronExpressions()
{
return new[]
{
"0 59 23 * * ?",
"0 0 0 * * ?",
"0 1 0 * * ?",
};
}
public override string[] GetCompensateCronExpressions()
{
return new[] { "0 0 0 * * ?" };
}
}
}