private List <IRouteValue> GetTableShardingValues(ShardingRule shardingRule, TableRule tableRule, ShardingCondition shardingCondition)
        {
            IShardingStrategy tableShardingStrategy = shardingRule.GetTableShardingStrategy(tableRule);

            return(IsGettingShardingValuesFromHint(tableShardingStrategy)
                    ? GetTableShardingValuesFromHint() : GetShardingValuesFromShardingConditions(shardingRule, tableShardingStrategy.GetShardingColumns(), shardingCondition));
        }
Exemplo n.º 2
0
        private static List <String> GetTableId(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints)
        {
            List <String> tableIdList  = new List <string>();
            Boolean       shardByTable = IsShardByTable(shardingStrategy);

            if (shardByTable)
            {
                var tableId = GetTableIdByHints(hints);
                if (String.IsNullOrEmpty(tableId))
                {
                    List <IComparable> shardColumnValue = shardingStrategy.GetShardColumnValueList(logicDbName, parameters, hints);

                    foreach (var comparable in shardColumnValue)
                    {
                        tableId = CalculateShardId(shardingStrategy, comparable);
                        tableIdList.Add(tableId);
                    }
                }
                else
                {
                    tableIdList.Add(tableId);
                }
            }

            return(tableIdList);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Initializes a new https ImgixSource object with multiple hosts.
        /// </summary>
        /// <param name="name">The name of the source</param>
        /// <param name="secureUrlToken">The secure url token for the source used to sign urls</param>
        /// <param name="hosts">
        ///     An array of hosts.
        ///     If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net
        /// </param>
        /// <param name="isHttps">Should urls use https</param>
        /// <param name="shardingStrategy">
        ///     What strategy should be used for sharding hosts.
        ///     Note: Sharding can lead to problems
        ///     http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance
        ///     and
        ///     https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300
        ///     Recommended to only use two shards.
        /// </param>
        public ImgixSource(string name, string secureUrlToken, string[] hosts, bool isHttps, IShardingStrategy shardingStrategy)
        {
            if (String.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentException("Name cannot be empty", nameof(name));
            }
            if (secureUrlToken == null)
            {
                throw new ArgumentNullException(nameof(secureUrlToken) + " cannot be null", nameof(secureUrlToken));
            }
            if (hosts.Length == 0)
            {
                throw new ArgumentException("Must define atleast one host", nameof(hosts));
            }
            if (shardingStrategy == null)
            {
                throw new ArgumentNullException(nameof(shardingStrategy));
            }

            Name              = name;
            _secureUrlToken   = secureUrlToken;
            _isHttps          = isHttps;
            _hosts            = SanitizeHosts(hosts);
            _shardingStrategy = shardingStrategy;
            _hostsCount       = _hosts.Length;
        }
Exemplo n.º 4
0
 /// <summary>
 /// 计算在哪个Shard执行操作
 /// </summary>
 /// <param name="shardingStrategy"></param>
 /// <param name="shardColumnValue"></param>
 /// <returns></returns>
 private static String CalculateShardId(IShardingStrategy shardingStrategy, IComparable shardColumnValue)
 {
     if (shardingStrategy == null || shardColumnValue == null)
     {
         return(null);
     }
     return(shardingStrategy.ComputeShardId(shardColumnValue));
 }
Exemplo n.º 5
0
        private static List <Statement> GetDefaultSqlStatement(String logicDbName, IShardingStrategy shardingStrategy,
                                                               String sql, StatementParameterCollection parameters, IDictionary hints, SqlStatementType sqlType, OperationType?operationType = null)
        {
            if (String.IsNullOrEmpty(logicDbName))
            {
                throw new DalException("Please specify databaseSet.");
            }
            if (String.IsNullOrEmpty(sql))
            {
                throw new DalException("Please specify sql.");
            }

            var result    = new List <Statement>();
            var tupleList = ShardingUtil.GetShardInfo(logicDbName, shardingStrategy, parameters, hints);

            if (tupleList.Count < 1)
            {
                //非sharding的场合
                Statement statement = GetStatement(logicDbName, StatementType.Sql,
                                                   operationType ?? OperationType.Default, sqlType, hints, null);
                statement.StatementText = GetSql(sql, null);
                statement.Parameters    = parameters;
#if !NETSTANDARD
                CurrentStackCustomizedLog(statement);
#endif
                result.Add(statement);
            }
            else
            {
                var bulkCopy = false;
                if (hints != null && hints.Contains(DALExtStatementConstant.BULK_COPY))//查看是否是批量插入的case
                {
                    bulkCopy = Convert.ToBoolean(hints[DALExtStatementConstant.BULK_COPY]);
                }

                if (bulkCopy)
                {
                    result.AddRange(BulkCopyCase(logicDbName, shardingStrategy, sql, parameters, hints, tupleList, sqlType, operationType));
                }
                else
                {
                    foreach (var tuple in tupleList)
                    {
                        Statement statement = GetStatement(logicDbName, StatementType.Sql, operationType ?? OperationType.Default, sqlType, hints, tuple.Item1);
                        statement.StatementText = GetSql(sql, tuple.Item2);
                        statement.Parameters    = parameters;
#if !NETSTANDARD
                        CurrentStackCustomizedLog(statement);
#endif
                        result.Add(statement);
                    }
                }
            }

            return(result);
        }
Exemplo n.º 6
0
        public static Boolean CheckKeyIsShardColumn(IShardingStrategy shardingStrategy, SqlTable table)
        {
            if (shardingStrategy == null || shardingStrategy.ShardColumns == null || shardingStrategy.ShardColumns.Count == 0)
            {
                return(false);
            }
            if (table == null || table.PkColumn == null || table.PkColumns.Count == 0)
            {
                return(false);
            }

            //only support one shard column now
            String shardColumn = shardingStrategy.ShardColumns[0];

            return(String.Equals(shardColumn, table.PkColumns[0].Name, StringComparison.OrdinalIgnoreCase));
        }
Exemplo n.º 7
0
        private static String GetTableId <T>(String logicDbName, IShardingStrategy shardingStrategy,
                                             T entity, ICollection <SqlColumn> columns, StatementParameterCollection parameters, IDictionary hints)
        {
            String  tableId      = null;
            Boolean shardByTable = IsShardByTable(shardingStrategy);

            if (shardByTable)
            {
                tableId = GetTableIdByHints(hints);

                if (String.IsNullOrEmpty(tableId))
                {
                    IComparable shardColumnValue = shardingStrategy.GetShardColumnValue(logicDbName, entity, columns, parameters, hints);
                    tableId = CalculateShardId(shardingStrategy, shardColumnValue);
                }
            }

            return(tableId);
        }
Exemplo n.º 8
0
        /// <summary>
        /// ShardByDB by default
        /// </summary>
        /// <param name="shardingStrategy"></param>
        /// <returns></returns>
        public static ShardingType GetShardingType(IShardingStrategy shardingStrategy)
        {
            Boolean shardByDb    = IsShardByDb(shardingStrategy);
            Boolean shardByTable = IsShardByTable(shardingStrategy);

            if (shardByDb && shardByTable)
            {
                return(ShardingType.ShardByDBAndTable);
            }
            if (shardByDb)
            {
                return(ShardingType.ShardByDB);
            }
            if (shardByTable)
            {
                return(ShardingType.ShardByTable);
            }

            return(ShardingType.ShardByDB);
        }
Exemplo n.º 9
0
        public static Tuple <String, String> GetShardInfo <T>(String logicDbName, IShardingStrategy shardingStrategy, T entity, ICollection <SqlColumn> columns, StatementParameterCollection parameters, IDictionary hints)
        {
            String  shardId      = null;
            String  tableId      = null;
            Boolean shardEnabled = IsShardEnabled(shardingStrategy);

            if (!shardEnabled)
            {
                return(Tuple.Create <String, String>(shardId, tableId));
            }

            shardId = GetShardId(logicDbName, shardingStrategy, entity, columns, parameters, hints);
            tableId = GetTableId(logicDbName, shardingStrategy, entity, columns, parameters, hints);

            if (String.IsNullOrEmpty(shardId) && String.IsNullOrEmpty(tableId))
            {
                throw new DalException("Please provide shard information.");
            }

            return(Tuple.Create <String, String>(shardId, tableId));
        }
Exemplo n.º 10
0
        public static List <Statement> GetQueryStatement(String logicDbName, string sql, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints, OperationType?operationType = null)
        {
            var result    = new List <Statement>();
            var tupleList = ShardingUtil.GetShardInfo(logicDbName, shardingStrategy, parameters, hints);

            foreach (var tuple in tupleList)
            {
                Statement statement = new Statement
                {
                    DatabaseSet      = logicDbName,
                    StatementType    = StatementType.Sql,
                    OperationType    = operationType ?? OperationType.Default,
                    Hints            = hints,
                    ShardID          = tuple.Item1,
                    TableName        = "",
                    SqlOperationType = SqlStatementType.SELECT,
                    Parameters       = parameters
                };

                statement.StatementText = string.IsNullOrEmpty(tuple.Item2) ? sql : string.Format(sql, tuple.Item2);
                result.Add(statement);
            }


            return(result);
        }
Exemplo n.º 11
0
        //private static IDictionary<String, IList<T>> ShuffledByDb<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters,
        //    IList<T> list, IDictionary hints)
        //{
        //    if (String.IsNullOrEmpty(logicDbName))
        //        return null;
        //    if (list == null || list.Count == 0)
        //        return null;
        //    var dict = new Dictionary<String, IList<T>>();

        //    foreach (var item in list)
        //    {
        //        String shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints);
        //        if (String.IsNullOrEmpty(shardId))
        //            continue;

        //        if (!dict.ContainsKey(shardId))
        //            dict.Add(shardId, new List<T>());
        //        dict[shardId].Add(item);
        //    }

        //    return dict;
        //}

        //private static IDictionary<String, IList<T>> ShuffledByTable<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters,
        //    IList<T> list,IDictionary hints)
        //{
        //    if (String.IsNullOrEmpty(logicDbName))
        //        return null;
        //    if (list == null || list.Count == 0)
        //        return null;
        //    var dict = new Dictionary<String, IList<T>>();

        //    foreach (var item in list)
        //    {
        //        String tableId = GetTableId(logicDbName, shardingStrategy, parameters, hints);
        //        if (String.IsNullOrEmpty(tableId))
        //            continue;

        //        if (!dict.ContainsKey(tableId))
        //            dict.Add(tableId, new List<T>());
        //        dict[tableId].Add(item);
        //    }

        //    return dict;
        //}

        //private static IDictionary<String, IDictionary<String, IList<T>>> ShuffledByDbTable<T>(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters,
        //    IList<T> list, IDictionary hints)
        //{
        //    if (String.IsNullOrEmpty(logicDbName))
        //        return null;
        //    if (list == null || list.Count == 0)
        //        return null;

        //    var dict = new Dictionary<String, IDictionary<String, IList<T>>>();

        //    foreach (var item in list)
        //    {
        //        String shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints);
        //        String tableId = GetTableId(logicDbName, shardingStrategy , parameters,hints);

        //        if (!dict.ContainsKey(shardId))
        //            dict.Add(shardId, new Dictionary<String, IList<T>>());
        //        if (!dict[shardId].ContainsKey(tableId))
        //            dict[shardId].Add(tableId, new List<T>());
        //        dict[shardId][tableId].Add(item);
        //    }

        //    return dict;
        //}

        #endregion Shuffled Items

        public static IList <Statement> GetShardStatement(String logicDbName, IShardingStrategy shardingStrategy,
                                                          StatementParameterCollection parameters, IDictionary hints, Func <IDictionary, List <Statement> > func, SqlStatementType sqlStatementType)
        {
            IList <Statement> statements;

            if (shardingStrategy == null)
            {
                return(null);
            }
            var shardingType = GetShardingType(shardingStrategy);

            if (shardingType != ShardingType.ShardByDBAndTable)
            {
                IList <String> shards = null;

                //Get shards from hints
                if (hints != null)
                {
                    IList <String> temp = null;

                    if (shardingType == ShardingType.ShardByDB)                //是分库的情况
                    {
                        if (hints.Contains(DALExtStatementConstant.SHARD_IDS)) //看下hints里面有没有指定分配id(一组)
                        {
                            temp = hints[DALExtStatementConstant.SHARD_IDS] as List <String>;
                        }
                        else if (hints.Contains(DALExtStatementConstant.SHARDID))//单个的分配id
                        {
                            temp = new List <String> {
                                hints[DALExtStatementConstant.SHARDID] as String
                            };
                        }
                    }
                    else if (shardingType == ShardingType.ShardByTable)//是分表的情况
                    {
                        if (hints.Contains(DALExtStatementConstant.TABLE_IDS))
                        {
                            temp = hints[DALExtStatementConstant.TABLE_IDS] as List <String>;
                        }
                        else if (hints.Contains(DALExtStatementConstant.TABLEID))
                        {
                            temp = new List <String> {
                                hints[DALExtStatementConstant.TABLEID] as String
                            };
                        }
                    }

                    if (temp != null)
                    {
                        shards = temp;
                    }
                }


                var bulkCopy = false;
                if (hints != null && hints.Contains(DALExtStatementConstant.BULK_COPY))//查看是否是批量插入的case
                {
                    bulkCopy = Convert.ToBoolean(hints[DALExtStatementConstant.BULK_COPY]);
                }

                if (bulkCopy)
                {
                    return(func.Invoke(hints));
                }
                //Get shards from parameters 这里会根据 查询参数得出分配的信息
                if (shards == null)
                {
                    if (shardingType == ShardingType.ShardByDB)
                    {
                        shards = GetShardId(logicDbName, shardingStrategy, parameters, hints);
                    }
                    else if (shardingType == ShardingType.ShardByTable)
                    {
                        shards = GetTableId(logicDbName, shardingStrategy, parameters, hints);
                    }
                }

                //对于不带条件的查询 都默认查询所有的
                if ((shards == null || shards.Count == 0) && sqlStatementType.Equals(SqlStatementType.SELECT))
                {
                    shards = shardingStrategy.AllShards;
                }

                if (shards == null || shards.Count == 0)
                {
                    throw new DalException("Please provide shard information.");
                }

                //Build statements
                statements = new List <Statement>();

                foreach (var item in shards.Distinct())
                {
                    var newHints = HintsUtil.CloneHints(hints);

                    switch (shardingType)
                    {
                    case ShardingType.ShardByDB:
                        newHints[DALExtStatementConstant.SHARDID] = item;
                        break;

                    case ShardingType.ShardByTable:
                        newHints[DALExtStatementConstant.TABLEID] = item;
                        break;
                    }

                    var statement = func.Invoke(newHints);
                    foreach (var ss in statement)
                    {
                        statements.Add(ss);
                    }
                }
            }
            else
            {
                statements = new List <Statement>();
                IDictionary <String, IList <String> > shardDict = null;
                if (hints != null && hints.Contains(DALExtStatementConstant.SHARD_TABLE_DICT))
                {
                    shardDict = hints[DALExtStatementConstant.SHARD_TABLE_DICT] as IDictionary <String, IList <String> >;
                }

                if (shardDict == null)
                {
                    var newHints = HintsUtil.CloneHints(hints);
                    newHints[DALExtStatementConstant.SHARDID] = GetShardIdByHints(hints);
                    newHints[DALExtStatementConstant.TABLEID] = GetTableIdByHints(hints);
                    var statement = func.Invoke(newHints);
                    foreach (var ss in statement)
                    {
                        statements.Add(ss);
                    }
                }
                else
                {
                    foreach (var shard in shardDict)
                    {
                        foreach (var table in shard.Value)
                        {
                            var newHints = HintsUtil.CloneHints(hints);
                            newHints[DALExtStatementConstant.SHARDID] = shard.Key;
                            newHints[DALExtStatementConstant.TABLEID] = table;
                            var statement = func.Invoke(newHints);
                            foreach (var ss in statement)
                            {
                                statements.Add(ss);
                            }
                        }
                    }
                }
            }

            return(statements);
        }
Exemplo n.º 12
0
        /// <summary>
        /// 获取分片信息
        /// </summary>
        /// <param name="logicDbName"></param>
        /// <param name="shardingStrategy"></param>
        /// <param name="hints"></param>
        /// <returns></returns>
        public static List <Tuple <String, String> > GetShardInfo(String logicDbName, IShardingStrategy shardingStrategy, StatementParameterCollection parameters, IDictionary hints)
        {
            List <String> shardId      = null;
            List <String> tableId      = null;
            var           result       = new List <Tuple <string, string> >();
            Boolean       shardEnabled = IsShardEnabled(shardingStrategy);

            if (!shardEnabled)
            {
                return(result);
            }

            shardId = GetShardId(logicDbName, shardingStrategy, parameters, hints); //是否有分库
            tableId = GetTableId(logicDbName, shardingStrategy, parameters, hints); //分表

            if (shardId.Count < 1 && tableId.Count < 1)
            {
                throw new DalException("Please provide shard information.");
            }

            if (shardId.Count > 0 && tableId.Count == 0)
            {
                foreach (var d in shardId)
                {
                    result.Add(Tuple.Create <String, String>(d, null));
                }
            }
            else if (shardId.Count == 0 && tableId.Count > 0)
            {
                foreach (var d in tableId)
                {
                    result.Add(Tuple.Create <String, String>(null, d));
                }
            }
            else
            {
                foreach (var d in shardId)
                {
                    foreach (var t in tableId)
                    {
                        result.Add(Tuple.Create <String, String>(d, t));
                    }
                }
            }

            return(result);
        }
Exemplo n.º 13
0
 /// <summary>
 /// </summary>
 /// <param name="logicDbName"></param>
 /// <param name="shardingStrategy"></param>
 /// <param name="sql"></param>
 /// <param name="parameters"></param>
 /// <param name="extendedParameters"></param>
 /// <param name="operationType"></param>
 /// <param name="sqlStatementType"></param>
 /// <returns></returns>
 public static List <Statement> GetNonQueryStatement(String logicDbName, IShardingStrategy shardingStrategy,
                                                     String sql, StatementParameterCollection parameters, IDictionary extendedParameters, OperationType?operationType = null, SqlStatementType?sqlStatementType = null)
 {
     return(GetDefaultSqlStatement(logicDbName, shardingStrategy, sql, parameters, extendedParameters, sqlStatementType ?? SqlStatementType.UNKNOWN, operationType ?? OperationType.Write));
 }
Exemplo n.º 14
0
        public static IList <Statement> GetShardStatementByEntity <T>(String logicDbName, IShardingStrategy shardingStrategy,
                                                                      IList <T> list, SqlTable table, IDictionary hints, Func <IList <T>, IDictionary, Statement> func) where T : class, new()
        {
            if (String.IsNullOrEmpty(logicDbName))
            {
                return(null);
            }
            if (list == null || list.Count == 0)
            {
                return(null);
            }
            if (table == null)
            {
                return(null);
            }

            var statements   = new List <Statement>();
            var shardingType = GetShardingType(shardingStrategy);

            if (shardingType == ShardingType.ShardByDB)
            {
                var dict = ShuffledByDb(logicDbName, shardingStrategy, list, table.ColumnList, hints);

                if (dict != null && dict.Count > 0)
                {
                    foreach (var item in dict)
                    {
                        var newHints = HintsUtil.CloneHints(hints);
                        newHints[DALExtStatementConstant.SHARDID] = item.Key;
                        Statement statement = func.Invoke(item.Value, newHints);
                        statements.Add(statement);
                    }
                }
            }
            else if (shardingType == ShardingType.ShardByTable)
            {
                var dict = ShuffledByTable(logicDbName, shardingStrategy, list, table.ColumnList, hints);

                if (dict != null && dict.Count > 0)
                {
                    foreach (var item in dict)
                    {
                        var newHints = HintsUtil.CloneHints(hints);
                        newHints[DALExtStatementConstant.TABLEID] = item.Key;
                        Statement statement = func.Invoke(item.Value, newHints);
                        statements.Add(statement);
                    }
                }
            }
            else
            {
                var dict = ShuffledByDbTable(logicDbName, shardingStrategy, list, table.ColumnList, hints);

                if (dict != null && dict.Count > 0)
                {
                    foreach (var item in dict)
                    {
                        foreach (var item2 in item.Value)
                        {
                            var newHints = HintsUtil.CloneHints(hints);
                            newHints[DALExtStatementConstant.SHARDID] = item.Key;
                            newHints[DALExtStatementConstant.TABLEID] = item2.Key;
                            Statement statement = func.Invoke(item2.Value, newHints);
                            statements.Add(statement);
                        }
                    }
                }
            }

            return(statements);
        }
Exemplo n.º 15
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="shardingStrategy"></param>
 /// <returns></returns>
 private static Boolean IsShardByTable(IShardingStrategy shardingStrategy)
 {
     return(shardingStrategy != null && shardingStrategy.ShardByTable);
 }
Exemplo n.º 16
0
        private static IDictionary <String, IDictionary <String, IList <T> > > ShuffledByDbTable <T>(String logicDbName, IShardingStrategy shardingStrategy,
                                                                                                     IList <T> list, ICollection <SqlColumn> columns, IDictionary hints)
        {
            if (String.IsNullOrEmpty(logicDbName))
            {
                return(null);
            }
            if (list == null || list.Count == 0)
            {
                return(null);
            }

            var dict = new Dictionary <String, IDictionary <String, IList <T> > >();

            foreach (var item in list)
            {
                String shardId = GetShardId(logicDbName, shardingStrategy, item, columns, null, hints);
                String tableId = GetTableId(logicDbName, shardingStrategy, item, columns, null, hints);

                if (!dict.ContainsKey(shardId))
                {
                    dict.Add(shardId, new Dictionary <String, IList <T> >());
                }
                if (!dict[shardId].ContainsKey(tableId))
                {
                    dict[shardId].Add(tableId, new List <T>());
                }
                dict[shardId][tableId].Add(item);
            }

            return(dict);
        }
Exemplo n.º 17
0
 /// <summary>
 /// Initializes a new https ImgixSource object with multiple hosts.
 /// </summary>
 /// <param name="name">The name of the source</param>
 /// <param name="hosts">
 ///     An array of hosts.
 ///     If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net
 /// </param>
 /// <param name="isHttps">Should urls use https</param>
 /// <param name="shardingStrategy">
 ///     What strategy should be used for sharding hosts.
 ///     Note: Sharding can lead to problems
 ///     http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance
 ///     and
 ///     https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300
 ///     Recommended to only use two shards.
 /// </param>
 public ImgixSource(string name, string[] hosts, bool isHttps, IShardingStrategy shardingStrategy)
     : this(name, "", hosts, isHttps, shardingStrategy)
 {
 }
Exemplo n.º 18
0
 /// <summary>
 /// 构造一个 <see cref="ShardingProperty"/>。
 /// </summary>
 /// <param name="key">给定的属性键。</param>
 /// <param name="strategy">给定的 <see cref="IShardingStrategy"/>。</param>
 public ShardingProperty(TypeNamedKey key, IShardingStrategy strategy)
 {
     Key      = key;
     Strategy = strategy;
 }
 /// <summary>
 /// 增加指定类型的分片策略。
 /// </summary>
 /// <param name="strategy">给定的 <see cref="IShardingStrategy"/>。</param>
 /// <returns>返回 <see cref="IShardingManager"/>。</returns>
 public virtual IShardingManager AddStrategy(IShardingStrategy strategy)
 {
     _strategies.AddOrUpdate(strategy.StrategyType, strategy, (key, value) => strategy);
     return(this);
 }
 private bool IsGettingShardingValuesFromHint(IShardingStrategy shardingStrategy)
 {
     return(shardingStrategy is HintShardingStrategy);
 }
Exemplo n.º 21
0
        public static IList <Statement> GetShardStatement(String logicDbName, IShardingStrategy shardingStrategy,
                                                          StatementParameterCollection parameters, IDictionary hints, Func <IDictionary, Statement> func)
        {
            IList <Statement> statements;

            if (shardingStrategy == null)
            {
                return(null);
            }
            var shardingType = GetShardingType(shardingStrategy);

            if (shardingType != ShardingType.ShardByDBAndTable)
            {
                IList <String> shards = null;

                //Get shards from hints
                if (hints != null)
                {
                    IList <String> temp = null;

                    if (shardingType == ShardingType.ShardByDB)
                    {
                        if (hints.Contains(DALExtStatementConstant.SHARD_IDS))
                        {
                            temp = hints[DALExtStatementConstant.SHARD_IDS] as List <String>;
                        }
                        else if (hints.Contains(DALExtStatementConstant.SHARDID))
                        {
                            temp = new List <String> {
                                hints[DALExtStatementConstant.SHARDID] as String
                            };
                        }
                    }
                    else if (shardingType == ShardingType.ShardByTable)
                    {
                        if (hints.Contains(DALExtStatementConstant.TABLE_IDS))
                        {
                            temp = hints[DALExtStatementConstant.TABLE_IDS] as List <String>;
                        }
                        else if (hints.Contains(DALExtStatementConstant.TABLEID))
                        {
                            temp = new List <String> {
                                hints[DALExtStatementConstant.TABLEID] as String
                            };
                        }
                    }

                    if (temp != null)
                    {
                        shards = temp;
                    }
                }

                //Get shards from parameters
                if (shards == null)
                {
                    if (parameters != null)
                    {
                        if (shardingType == ShardingType.ShardByDB)
                        {
                            String shardId = GetShardId <Object>(logicDbName, shardingStrategy, null, null, parameters, hints);
                            if (!String.IsNullOrEmpty(shardId))
                            {
                                shards = new List <String> {
                                    shardId
                                }
                            }
                            ;
                        }
                        else if (shardingType == ShardingType.ShardByTable)
                        {
                            String tableId = GetTableId <Object>(logicDbName, shardingStrategy, null, null, parameters, hints);
                            if (!String.IsNullOrEmpty(tableId))
                            {
                                shards = new List <String> {
                                    tableId
                                }
                            }
                            ;
                        }
                    }
                }

                if (shards == null)
                {
                    throw new DalException("Please provide shard information.");
                }

                //Build statements
                statements = new List <Statement>();

                foreach (var item in shards)
                {
                    var newHints = HintsUtil.CloneHints(hints);

                    switch (shardingType)
                    {
                    case ShardingType.ShardByDB:
                        newHints[DALExtStatementConstant.SHARDID] = item;
                        break;

                    case ShardingType.ShardByTable:
                        newHints[DALExtStatementConstant.TABLEID] = item;
                        break;
                    }

                    Statement statement = func.Invoke(newHints);
                    statements.Add(statement);
                }
            }
            else
            {
                statements = new List <Statement>();
                IDictionary <String, IList <String> > shardDict = null;
                if (hints != null && hints.Contains(DALExtStatementConstant.SHARD_TABLE_DICT))
                {
                    shardDict = hints[DALExtStatementConstant.SHARD_TABLE_DICT] as IDictionary <String, IList <String> >;
                }

                if (shardDict == null)
                {
                    var newHints = HintsUtil.CloneHints(hints);
                    newHints[DALExtStatementConstant.SHARDID] = GetShardIdByHints(hints);
                    newHints[DALExtStatementConstant.TABLEID] = GetTableIdByHints(hints);
                    Statement statement = func.Invoke(newHints);
                    statements.Add(statement);
                }
                else
                {
                    foreach (var shard in shardDict)
                    {
                        foreach (var table in shard.Value)
                        {
                            var newHints = HintsUtil.CloneHints(hints);
                            newHints[DALExtStatementConstant.SHARDID] = shard.Key;
                            newHints[DALExtStatementConstant.TABLEID] = table;
                            Statement statement = func.Invoke(newHints);
                            statements.Add(statement);
                        }
                    }
                }
            }

            return(statements);
        }
Exemplo n.º 22
0
 /// <summary>
 /// Initializes a new https ImgixSource object with multiple hosts.
 /// </summary>
 /// <param name="name">The name of the source</param>
 /// <param name="secureUrlToken">The secure url token for the source used to sign urls</param>
 /// <param name="hosts">
 ///     An array of hosts.
 ///     If a host is only single word with no dots it will be assumed that it is an imgix source identifier and add .imgix.net
 /// </param>
 /// <param name="shardingStrategy">
 ///     What strategy should be used for sharding hosts.
 ///     Note: Sharding can lead to problems
 ///     http://perf.fail/post/96104709544/zealous-sharding-hurts-etsy-performance
 ///     and
 ///     https://docs.google.com/presentation/d/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM/present?slide=id.g518e3c87f_0_300
 ///     Recommended to only use two shards.
 /// </param>
 public ImgixSource(string name, string secureUrlToken, string[] hosts, IShardingStrategy shardingStrategy)
     : this(name, secureUrlToken, hosts, true, shardingStrategy)
 {
 }
Exemplo n.º 23
0
 /// <summary>
 /// Whether shard is enabled
 /// </summary>
 /// <param name="shardingStrategy"></param>
 /// <returns></returns>
 public static Boolean IsShardEnabled(IShardingStrategy shardingStrategy)
 {
     return(shardingStrategy != null);
 }
Exemplo n.º 24
0
        /// <summary>
        /// 批量插入分片规则: 解析sqlstring 按照分片进行分组 在重新组合 如果没有找到分片的默认第一个分片
        /// </summary>
        /// <param name="logicDbName"></param>
        /// <param name="shardingStrategy"></param>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <param name="hints"></param>
        /// <param name="tupleList"></param>
        /// <param name="sqlType"></param>
        /// <param name="operationType"></param>
        /// <returns></returns>
        private static List <Statement> BulkCopyCase(String logicDbName, IShardingStrategy shardingStrategy,
                                                     String sql, StatementParameterCollection parameters, IDictionary hints, List <Tuple <String, String> > tupleList, SqlStatementType sqlType, OperationType?operationType = null)
        {
            var result = new List <Statement>();


            //var shardingDB = tuple.Item1;
            //var sharingTable = tuple.Item2;
            if (shardingStrategy.ShardByDB && shardingStrategy.ShardByTable)
            {
                //又分表又分库的情况
            }
            else if (shardingStrategy.ShardByDB || shardingStrategy.ShardByTable)
            {
                var dicValues = new Dictionary <string, Tuple <List <string>, StatementParameterCollection> >();
                foreach (var tuple in tupleList)
                {
                    dicValues.Add(shardingStrategy.ShardByDB?tuple.Item1: tuple.Item2, Tuple.Create(new List <string>(), new StatementParameterCollection()));
                }
                var defaultSharding = dicValues.Keys.First();
                //分库的情况
                var arr = sql.Split(new string[] { "VALUES" }, StringSplitOptions.None);
                if (arr.Length != 2)
                {
                    throw new DalException("sharding db for bulkInsert sql string err.");
                }
                var title       = arr[0] + " VALUES ";
                var body        = arr[1].Replace("\r\n", "");
                var values      = body.Split(')').Where(r => !string.IsNullOrEmpty(r)).Select(r => r.StartsWith(",")?r.Substring(1):r).ToArray(); //总共有多少行
                var first       = values.First();
                var cloumnCount = first.Split(',').Length;                                                                                        //每行总共有多少列

                if (parameters.Count != (cloumnCount * values.Length))
                {
                    throw new DalException("sharding db for bulkInsert sql parameters counts err.");
                }
                var ii = 0;
                //将parameters 按 分库进行分组
                for (int i = 0; i < values.Length; i++)
                {
                    var columns       = values[i].Split(',');
                    var haveShardingC = false;
                    var shardingValue = string.Empty;
                    List <StatementParameter> newC = new List <StatementParameter>();
                    for (int j = 0; j < columns.Length; j++)
                    {
                        var p = parameters.ElementAt(ii);
                        if (p.IsShardingColumn)
                        {
                            haveShardingC = true;
                            shardingValue = p.ShardingValue;
                        }
                        newC.Add(p);
                        ii++;
                    }

                    if (haveShardingC)
                    {
                        if (!string.IsNullOrEmpty(shardingValue))
                        {
                            if (dicValues.ContainsKey(shardingValue))
                            {
                                dicValues[shardingValue].Item1.Add(values[i] + ")");
                                foreach (var pp in newC)
                                {
                                    dicValues[shardingValue].Item2.Add(pp);
                                }
                            }
                        }
                        else
                        {
                            //添加到第一个分片
                            dicValues[defaultSharding].Item1.Add(values[i] + ")");
                            foreach (var pp in newC)
                            {
                                dicValues[defaultSharding].Item2.Add(pp);
                            }
                        }
                    }
                }

                foreach (var dic in dicValues)
                {
                    if (dic.Value.Item1.Count == 0)
                    {
                        continue;
                    }
                    var newHints = HintsUtil.CloneHints(hints);
                    if (shardingStrategy.ShardByDB)
                    {
                        newHints[DALExtStatementConstant.SHARDID] = dic.Key;
                    }
                    else
                    {
                        newHints[DALExtStatementConstant.TABLEID] = dic.Key;
                    }

                    var statement = GetStatement(logicDbName, StatementType.Sql, operationType ?? OperationType.Default, sqlType, newHints, shardingStrategy.ShardByDB? dic.Key:null);
                    statement.StatementText = shardingStrategy.ShardByDB ? (title + string.Join(",", dic.Value.Item1)): GetSql(title + string.Join(",", dic.Value.Item1), dic.Key);
                    statement.Parameters    = dic.Value.Item2;
#if !NETSTANDARD
                    CurrentStackCustomizedLog(statement);
#endif
                    result.Add(statement);
                }
            }

            return(result);
        }
Exemplo n.º 25
0
 /// <summary>
 /// GetScalarStatement
 /// </summary>
 /// <param name="logicDbName"></param>
 /// <param name="shardingStrategy"></param>
 /// <param name="sql"></param>
 /// <param name="parameters"></param>
 /// <param name="extendedParameters"></param>
 /// <param name="operationType"></param>
 /// <returns></returns>
 public static List <Statement> GetScalarStatement(String logicDbName, IShardingStrategy shardingStrategy,
                                                   String sql, StatementParameterCollection parameters, IDictionary extendedParameters, OperationType?operationType = null)
 {
     return(GetDefaultSqlStatement(logicDbName, shardingStrategy, sql, parameters, extendedParameters, SqlStatementType.SELECT, operationType ?? OperationType.Default));
 }
Exemplo n.º 26
0
 public void RegisterStrategy <T>(IShardingStrategy strategy)
 {
     _strategies[typeof(T)] = strategy;
 }