From 5861f46f4e126275bb2714d0e8e490f062f27dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Thu, 18 Jul 2024 18:03:54 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E4=BF=AE=E6=AD=A3=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E5=88=86=E8=A1=A8=E6=97=B6=E7=9A=84=E8=BE=B9=E7=95=8C=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XCode/Entity/Entity.cs | 2 +- XCode/Shards/TimeShardPolicy.cs | 43 +++++++++++++++-------- XUnitTest.XCode/EntityTests/ShardTests.cs | 20 +++++++++++ 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/XCode/Entity/Entity.cs b/XCode/Entity/Entity.cs index 568cee55a..521c350a1 100644 --- a/XCode/Entity/Entity.cs +++ b/XCode/Entity/Entity.cs @@ -1024,7 +1024,7 @@ public static IList 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); diff --git a/XCode/Shards/TimeShardPolicy.cs b/XCode/Shards/TimeShardPolicy.cs index 34245abc4..c7dcc661e 100644 --- a/XCode/Shards/TimeShardPolicy.cs +++ b/XCode/Shards/TimeShardPolicy.cs @@ -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); @@ -218,6 +227,12 @@ private ShardModel[] GetModels(DateTime start, DateTime end) { var models = new List(); + // 根据不仅,把start调整到整点 + if (Step.TotalDays >= 1) + start = start.Date; + else if (start.Hour >= 1) + start = start.Date.AddHours(start.Hour); + var hash = new HashSet(); for (var dt = start; dt < end; dt = dt.Add(Step)) { @@ -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(); } diff --git a/XUnitTest.XCode/EntityTests/ShardTests.cs b/XUnitTest.XCode/EntityTests/ShardTests.cs index ff1b3fdd7..f5f2d7db6 100644 --- a/XUnitTest.XCode/EntityTests/ShardTests.cs +++ b/XUnitTest.XCode/EntityTests/ShardTests.cs @@ -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); + } } \ No newline at end of file