public RouteResult Route(ShardingRule shardingRule) { ICollection <RouteResult> result = new List <RouteResult>(logicTables.Count); ICollection <String> bindingTableNames = new SortedSet <string>(StringComparer.OrdinalIgnoreCase); foreach (var logicTable in logicTables) { var tableRule = shardingRule.FindTableRule(logicTable); if (tableRule != null) { if (!bindingTableNames.Contains(logicTable)) { result.Add(new ShardingStandardRoutingEngine(tableRule.LogicTable, sqlStatementContext, shardingConditions, properties).Route(shardingRule)); } shardingRule.FindBindingTableRule(logicTable).IfPresent(bindingTableRule => bindingTableNames.AddAll( bindingTableRule.GetTableRules().Select(o => o.LogicTable).ToList())); } } if (result.IsEmpty()) { throw new ShardingException($"Cannot find table rule and default data source with logic tables: '{logicTables}'"); } if (1 == result.Count) { return(result.First()); } return(new ShardingCartesianRoutingEngine(result).Route(shardingRule)); }
private List <IRouteValue> GetShardingValuesFromShardingConditions(ShardingRule shardingRule, ICollection <string> shardingColumns, ShardingCondition shardingCondition) { List <IRouteValue> result = new List <IRouteValue>(shardingColumns.Count); foreach (var routeValue in shardingCondition.RouteValues) { var bindingTableRule = shardingRule.FindBindingTableRule(LogicTableName); if ((LogicTableName.Equals(routeValue.GetTableName()) || bindingTableRule != null && bindingTableRule.HasLogicTable(LogicTableName)) && shardingColumns.Contains(routeValue.GetColumnName())) { result.Add(routeValue); } } return(result); }