// using System.Collections.ObjectModel; // using System.Reflection; // using ShardingCore.Core.EntityMetadatas; // using ShardingCore.Core.VirtualRoutes; // using ShardingCore.Helpers; // using ShardingCore.Utils; // using Xunit; // // namespace ShardingCore.CommonTest // { // /// // /// 测试按年分库,按月分表 // /// // public class ShardingTimeAll // { // private readonly EntityMetadata _testEntityMetadata; // private readonly List _allTables; // private readonly List _allDataSources; // public ShardingTimeAll() // { // var entityMetadata = new EntityMetadata(typeof(TestTimeShardingEntity), nameof(TestTimeShardingEntity), typeof(ShardingDataSourceMod), // new ReadOnlyCollection(typeof(TestTimeShardingEntity).GetProperties().ToList()), null); // //分库 // var entityMetadataDataSourceBuilder = EntityMetadataDataSourceBuilder.CreateEntityMetadataDataSourceBuilder(entityMetadata); // entityMetadataDataSourceBuilder.ShardingProperty(o => o.Time); // entityMetadata.CheckShardingDataSourceMetadata(); // //分表 // var entityMetadataTableBuilder = EntityMetadataTableBuilder.CreateEntityMetadataTableBuilder(entityMetadata); // entityMetadataTableBuilder.ShardingProperty(o => o.Time); // entityMetadata.CheckShardingTableMetadata(); // _testEntityMetadata = entityMetadata; // //[01....12] // _allTables = Enumerable.Range(1,13).Select(o=>o.ToString().PadLeft(2,'0')).ToList(); // _allDataSources = new[] { "2020", "2021", "2022" }.ToList(); // } // // public static Func GetDataSourceRouteFilter(object shardingValue, ShardingOperatorEnum shardingOperator, // string propertyName) // { // if (propertyName != nameof(TestTimeEntity.Time)) // { // throw new Exception($"{nameof(propertyName)}:[{propertyName}] error"); // } // // var shardingKey = (DateTime)shardingValue; // var t = $"{shardingKey:yyyy}"; // switch (shardingOperator) // { // case ShardingOperatorEnum.GreaterThan: // case ShardingOperatorEnum.GreaterThanOrEqual: // return tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0; // case ShardingOperatorEnum.LessThan: // { // var currentYear =new DateTime(shardingKey.Year,1,1); // //处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回 // if (currentYear == shardingKey) // 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: // { // return tail => true; // } // } // } // public static Func GetTableRouteFilter(object shardingValue, ShardingOperatorEnum shardingOperator, // string propertyName) // { // if (propertyName != nameof(TestTimeEntity.Time)) // { // throw new Exception($"{nameof(propertyName)}:[{propertyName}] error"); // } // // var shardingKey = (DateTime)shardingValue; // var t = $"{shardingKey:MM}"; // switch (shardingOperator) // { // case ShardingOperatorEnum.GreaterThan: // case ShardingOperatorEnum.GreaterThanOrEqual: // return tail => String.Compare(tail, t, StringComparison.Ordinal) >= 0; // case ShardingOperatorEnum.LessThan: // { // var currentMonth = ShardingCoreHelper.GetCurrentMonthFirstDay(shardingKey); // //处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回 // if (currentMonth == shardingKey) // 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: // { // return tail => true; // } // } // } // // // private void TestDataSource(IQueryable queryable, string[] dataSources) // { // var routePredicateExpression = ShardingUtil.GetRouteParseExpression(queryable,_testEntityMetadata,GetDataSourceRouteFilter,false); // Assert.NotNull(routePredicateExpression); // var routePredicate = routePredicateExpression.GetRoutePredicate(); // // var list = _allDataSources.Where(routePredicate).ToList(); // Assert.NotNull(list); // Assert.Equal(dataSources.Length,list.Count); // foreach (var table in dataSources) // { // Assert.True(list.Any(o=>o==table)); // } // } // private void TestTable(IQueryable queryable, string[] tables) // { // var routePredicateExpression = ShardingUtil.GetRouteParseExpression(queryable,_testEntityMetadata,GetTableRouteFilter,true); // Assert.NotNull(routePredicateExpression); // var routePredicate = routePredicateExpression.GetRoutePredicate(); // // var list = _allTables.Where(routePredicate).ToList(); // Assert.NotNull(list); // Assert.Equal(tables.Length,list.Count); // foreach (var table in tables) // { // Assert.True(list.Any(o=>o==table)); // } // } // // private void TestForDataSource(List> queryables, string[] dataSources) // { // foreach (var queryable in queryables) // { // TestDataSource(queryable, dataSources); // } // } // private void TestForTable(List> queryables, string[] tables) // { // foreach (var queryable in queryables) // { // TestTable(queryable, tables); // } // } // [Fact] // public void TestSingleDataSource() // { // var dataSources = new []{"2021"}; // var tables = new []{"01","02","03","04","05","06","07","08"}; // var queryTime = new DateTime(2021, 1, 2); // var queryTime1 = queryTime.AddMonths(7); // var queryables=new List>() // { // new List().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time<=queryTime1), // new List().AsQueryable().Where(o=>o.Time<=queryTime1&&o.Time>=queryTime) // }; // TestForDataSource(queryables,dataSources); // TestForTable(queryables,tables); // } // [Fact] // public void TestMultiDataSource() // { // var dataSources = new []{"2021","2020"}; // var tables = new []{"01","02","03","04","05","06","07","08"}; // var queryTime = new DateTime(2021, 7, 2); // var queryTime1 = new DateTime(2022, 3, 2); // var queryables=new List>() // { // new List().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time<=queryTime1), // new List().AsQueryable().Where(o=>o.Time<=queryTime1&&o.Time>=queryTime) // }; // TestForDataSource(queryables,dataSources); // TestForTable(queryables,tables); // } // } // public class TestTimeShardingEntity // { // public string Id { get; set; } // public DateTime Time { get; set; } // } // }