Skip to content

Commit

Permalink
[fix]修正日期分表时的边界问题
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Jul 18, 2024
1 parent 69c75a0 commit 5861f46
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 15 deletions.
2 changes: 1 addition & 1 deletion XCode/Entity/Entity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1024,7 +1024,7 @@ public static IList<TEntity> FindAll(Expression? where, String? order, String? s
else
{
var ss = Meta.Session;
using var span = DAL.GlobalTracer?.NewSpan($"db:{ss.ConnName}:{ss.TableName}:AutoShard", "自动分页查询");
using var span = DAL.GlobalTracer?.NewSpan($"db:{ss.ConnName}:{ss.TableName}:AutoShard", "自动分页查询", shards.Length);

// 先生成查询语句
var builder = CreateBuilder(where, order, selects);
Expand Down
43 changes: 29 additions & 14 deletions XCode/Shards/TimeShardPolicy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,21 @@ public virtual ShardModel[] Shards(Expression expression)
var start = sf.Value.ToDateTime();
if (start.Year > 1)
{
// 不等于时,增加1秒
if (sf.Action == ">") start = start.AddSeconds(1);

var end = DateTime.Now;

if (ef != null)
{
var time = ef.Value.ToDateTime();
if (time.Year > 1) end = time;
if (time.Year > 1)
{
end = time;

// 不等于时,减少1秒
if (ef.Action == "<") end = end.AddSeconds(-1);
}
}

return GetModels(start, end);
Expand Down Expand Up @@ -218,6 +227,12 @@ private ShardModel[] GetModels(DateTime start, DateTime end)
{
var models = new List<ShardModel>();

// 根据不仅,把start调整到整点
if (Step.TotalDays >= 1)
start = start.Date;
else if (start.Hour >= 1)
start = start.Date.AddHours(start.Hour);

var hash = new HashSet<String>();
for (var dt = start; dt < end; dt = dt.Add(Step))
{
Expand All @@ -233,19 +248,19 @@ private ShardModel[] GetModels(DateTime start, DateTime end)
}
}

// 标准时间区间 start <= @fi < end ,但是要考虑到end有一部分落入新的分片,减一秒判断
{
var model = Shard(end.AddSeconds(1));
if (model != null)
{
var key = $"{model.ConnName}#{model.TableName}";
if (key != "#" && !hash.Contains(key))
{
models.Add(model);
hash.Add(key);
}
}
}
//// 标准时间区间 start <= @fi < end ,但是要考虑到end有一部分落入新的分片,减一秒判断
//{
// var model = Shard(end.AddSeconds(1));
// if (model != null)
// {
// var key = $"{model.ConnName}#{model.TableName}";
// if (key != "#" && !hash.Contains(key))
// {
// models.Add(model);
// hash.Add(key);
// }
// }
//}

return models.ToArray();
}
Expand Down
20 changes: 20 additions & 0 deletions XUnitTest.XCode/EntityTests/ShardTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -441,4 +441,24 @@ public void SearchAutoShard4()
}
);
}

[Fact]
public void ExpressionShards()
{
var policy = new TimeShardPolicy(Log2._.CreateTime, Log2.Meta.Factory)
{
TablePolicy = "{0}_{1:yyyyMMdd}",
};

var start = "2024-05-29".ToDateTime();
var end = start.AddDays(1);
//var fi = Log2.Meta.Factory.Table.FindByName("ID");
var fi = policy.Field;
var where = fi >= start & fi < end;

var shards = policy.Shards(where);
Assert.NotNull(shards);
Assert.Single(shards);
Assert.Equal("Log2_20240529", shards[0].TableName);
}
}

0 comments on commit 5861f46

Please sign in to comment.