public RouteContext Decorate(RouteContext routeContext, ShardingConnectorMetaData metaData, ShardingRule shardingRule, ConfigurationProperties properties) { var sqlStatementContext = routeContext.GetSqlCommandContext(); // var tableNames = sqlStatementContext.GetTablesContext().GetTableNames(); // if (!shardingRule.TableRules.Any(o => tableNames.Any(t => o.LogicTable.EqualsIgnoreCase(t)))) // { // return routeContext; // } var parameters = routeContext.GetParameterContext(); ShardingCommandValidatorFactory.NewInstance( sqlStatementContext.GetSqlCommand()) .IfPresent(validator => validator.Validate(shardingRule, sqlStatementContext.GetSqlCommand(), parameters)); ShardingConditions shardingConditions = GetShardingConditions(parameters, sqlStatementContext, metaData.Schema, shardingRule); var needMergeShardingValues = IsNeedMergeShardingValues(sqlStatementContext, shardingRule); if (needMergeShardingValues && sqlStatementContext.GetSqlCommand() is DMLCommand) { CheckSubQueryShardingValues(sqlStatementContext, shardingRule, shardingConditions); MergeShardingConditions(shardingConditions); } var shardingRouteEngine = ShardingRouteEngineFactory.NewInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, properties); RouteResult routeResult = shardingRouteEngine.Route(shardingRule); if (needMergeShardingValues) { ShardingAssert.Else(1 == routeResult.GetRouteUnits().Count, "Must have one sharding with sub query."); } return(new RouteContext(sqlStatementContext, parameters, routeResult)); }
protected BasePrepareEngine(ICollection <IBaseRule> rules, ConfigurationProperties properties, ShardingConnectorMetaData metaData, SqlParserEngine sqlParserEngine) { _router = new DataNodeRouter(metaData, sqlParserEngine, properties); _rules = rules; _properties = properties; _metaData = metaData; _rewriter = new SqlRewriteEntry(metaData.Schema, properties); }
/// <summary> /// 创建数据库元数据信息 /// </summary> /// <param name="dataSourceMap"></param> /// <param name="databaseType"></param> /// <returns></returns> private ShardingConnectorMetaData CreateMetaData(IDictionary <string, IDataSource> dataSourceMap, IDatabaseType databaseType) { long start = UtcTime.CurrentTimeMillis(); DataSourceMetas dataSourceMetas = new DataSourceMetas(databaseType, GetDatabaseAccessConfigurationMap(dataSourceMap)); SchemaMetaData schemaMetaData = LoadSchemaMetaData(dataSourceMap); ShardingConnectorMetaData result = new ShardingConnectorMetaData(dataSourceMetas, schemaMetaData); var costMillis = UtcTime.CurrentTimeMillis() - start; _logger.LogInformation($"Meta data load finished, cost {costMillis} milliseconds."); return(result); }
public static IShardingRouteEngine NewInstance(ShardingRule shardingRule, ShardingConnectorMetaData metaData, ISqlCommandContext <ISqlCommand> sqlCommandContext, ShardingConditions shardingConditions, ConfigurationProperties properties) { var sqlStatement = sqlCommandContext.GetSqlCommand(); ICollection <String> tableNames = sqlCommandContext.GetTablesContext().GetTableNames(); if (sqlStatement is TCLCommand) { return(new ShardingDatabaseBroadcastRoutingEngine()); } if (sqlStatement is DDLCommand) { return(new ShardingTableBroadcastRoutingEngine(metaData.Schema, sqlCommandContext)); } if (sqlStatement is DALCommand) { return(GetDALRoutingEngine(shardingRule, sqlStatement, tableNames)); } if (sqlStatement is DCLCommand) { return(GetDCLRoutingEngine(sqlCommandContext, metaData)); } if (shardingRule.IsAllInDefaultDataSource(tableNames)) { return(new ShardingDefaultDatabaseRoutingEngine(tableNames)); } if (shardingRule.IsAllBroadcastTables(tableNames)) { if (sqlStatement is SelectCommand) { return(new ShardingUnicastRoutingEngine(tableNames)); } return(new ShardingDatabaseBroadcastRoutingEngine()); } if (sqlCommandContext.GetSqlCommand() is DMLCommand && tableNames.IsEmpty() && shardingRule.HasDefaultDataSourceName()) { return(new ShardingDefaultDatabaseRoutingEngine(tableNames)); } if (sqlCommandContext.GetSqlCommand() is DMLCommand && shardingConditions.IsAlwaysFalse() || tableNames.IsEmpty() || !shardingRule.TableRuleExists(tableNames)) { return(new ShardingUnicastRoutingEngine(tableNames)); } return(GetShardingRoutingEngine(shardingRule, sqlCommandContext, shardingConditions, tableNames, properties)); }
public PreparedQueryPrepareEngine(ICollection <IBaseRule> rules, ConfigurationProperties properties, ShardingConnectorMetaData metaData, SqlParserEngine sqlParserEngine) : base(rules, properties, metaData, sqlParserEngine) { }
protected MultipleDataSourcesRuntimeContext(IDictionary <string, IDataSource> dataSourceMap, T rule, IDictionary <string, object> props, IDatabaseType databaseType) : base(rule, props, databaseType) { _metaData = CreateMetaData(dataSourceMap, databaseType); }
public DataNodeRouter(ShardingConnectorMetaData metaData, SqlParserEngine parserEngine, ConfigurationProperties properties) { _metaData = metaData; _parserEngine = parserEngine; _properties = properties; }
private static IShardingRouteEngine GetDCLRoutingEngine(ISqlCommandContext <ISqlCommand> sqlCommandContext, ShardingConnectorMetaData metaData) { if (IsDCLForSingleTable(sqlCommandContext)) { return(new ShardingTableBroadcastRoutingEngine(metaData.Schema, sqlCommandContext)); } return(new ShardingMasterInstanceBroadcastRoutingEngine(metaData.DataSources)); }
public RouteContext Decorate(RouteContext routeContext, ShardingConnectorMetaData metaData, IBaseRule rule, ConfigurationProperties properties) { return(Decorate(routeContext, metaData, (ShardingRule)rule, properties)); }