Exemple #1
0
        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));
        }
Exemple #2
0
 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));
        }
Exemple #5
0
 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));
 }
Exemple #9
0
 public RouteContext Decorate(RouteContext routeContext, ShardingConnectorMetaData metaData, IBaseRule rule,
                              ConfigurationProperties properties)
 {
     return(Decorate(routeContext, metaData, (ShardingRule)rule, properties));
 }