/// <summary> /// 得到年得所以分片 /// </summary> /// <returns></returns> protected virtual IList <ShardingInfo> GetAllYearShardings() { var maxTableIndex = GetMaxTableIndex(); var shardings = new List <ShardingInfo>(); var maxDate = DateTime.Parse(maxTableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " ")); var curDate = DateTime.Parse(TableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " ")); var i = 1; while (curDate < maxDate) { var sharding = new ShardingInfo { GetDataBase = GetQueryDataBaseIndex(i), SetDataBase = GetSaveDataBaseIndex(i), IsWrite = IsWrite, MaxTableIndex = MaxTableIndex, TableStep = TableStep, TableStepType = TableStepType }; sharding.TableIndex = curDate.ToString("yyyy"); curDate = curDate.AddYears(TableStep); shardings.Add(sharding); i++; } return(shardings); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual string GetAutoTableIndex(object routeValue, ShardingInfo sharding) { var step = GetTableStep(routeValue, sharding); if (step == -1) { return(null); } switch (sharding.TableStepType) { case TableStepType.Value: return(step.ToString()); case TableStepType.Hour: return(DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-").Insert(10, " ")).AddHours(step).ToString("yyyyMMddHH")); case TableStepType.Day: return(DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-")).AddDays(step).ToString("yyyyMMdd")); case TableStepType.Month: return(DateTime.Parse(sharding.TableIndex.Insert(4, "-")).AddMonths(step).ToString("yyyyMM")); case TableStepType.Year: return(DateTime.Parse(sharding.TableIndex).AddYears(step).ToString("yyyy")); } return(null); }
/// <summary> /// 得到表索引 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetTableStep(object routeValue, ShardingInfo sharding) { var step = -1; switch (ShardingType) { case ShardingType.Value: step = GetValueTableStep(routeValue, sharding); break; case ShardingType.Remainder: step = GetRemainderTableStep(routeValue, sharding); break; case ShardingType.Hour: step = GetHourTableStep(routeValue, sharding); break; case ShardingType.Day: step = GetDayTableStep(routeValue, sharding); break; case ShardingType.Month: step = GetMonthTableStep(routeValue, sharding); break; case ShardingType.Year: step = GetYearTableStep(routeValue, sharding); break; } return(step); }
/// <summary> /// 得到存储数据库 /// </summary> public virtual string GetSaveDataBaseIndex(object routeValue, ShardingInfo sharding) { if (string.IsNullOrEmpty(sharding.TableIndex)) { GetFixedTableIndex(routeValue, sharding); } var step = GetTableStep(routeValue, sharding); return(sharding.GetSaveDataBaseIndex(step)); }
/// <summary> /// 得到路由值 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual object GetRouteValue(object routeValue, ShardingInfo sharding) { if (!string.IsNullOrEmpty(Tag) && !routeValue.ToString().ToLower().Contains(Tag.ToLower())) { return(null); } routeValue = string.IsNullOrEmpty(Tag) ? routeValue : routeValue.ToString().ToLower().Replace(Tag.ToLower(), ""); return(routeValue); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetRemainderTableStep(object routeValue, ShardingInfo sharding) { var tableMaxStep = sharding.GetTableMaxStep(); if (tableMaxStep == -1) { return(-1); } var value = Math.Abs(long.Parse(routeValue.ToString())); var step = (int)(value % tableMaxStep); return(step); }
/// <summary> /// 根据节点得到OrmDataBase /// </summary> /// <param name="dbRoute"></param> /// <param name="node"></param> /// <returns></returns> protected virtual void LoadShardingsByXmlNode(DbRouteInfo dbRoute, XmlNode node) { var nodes = node.SelectNodes("Sharding"); if (nodes == null) { return; } foreach (XmlNode nd in nodes) { var sharding = new ShardingInfo { ShardProperties = new List <ShardPropertyInfo>() }; sharding.GetDataBase = nd.Attributes["GetDataBase"] != null ? nd.Attributes["GetDataBase"].Value.ToLower() : ""; sharding.SetDataBase = nd.Attributes["SetDataBase"] != null ? nd.Attributes["SetDataBase"].Value.ToLower() : ""; sharding.TableIndex = nd.Attributes["TableIndex"] != null ? nd.Attributes["TableIndex"].Value.ToLower() : ""; sharding.MaxTableIndex = nd.Attributes["MaxTableIndex"] != null ? nd.Attributes["MaxTableIndex"].Value.ToLower() : ""; sharding.TableTag = nd.Attributes["TableTag"] != null ? nd.Attributes["TableTag"].Value.ToLower() : ""; sharding.IsWrite = nd.Attributes["IsWrite"] == null || Convert.ToBoolean(nd.Attributes["IsWrite"].Value); if (nd.Attributes["TableStepType"] != null) { sharding.TableStepType = (TableStepType)Enum.Parse(typeof(TableStepType), nd.Attributes["TableStepType"].Value); } if (nd.Attributes["TableStep"] != null) { sharding.TableStep = Convert.ToInt32(nd.Attributes["TableStep"].Value); } if (nd.Attributes["GetDataBaseTableCount"] != null) { sharding.GetDataBaseTableCount = Convert.ToInt32(nd.Attributes["GetDataBaseTableCount"].Value); } if (nd.Attributes["SetDataBaseTableCount"] != null) { sharding.SetDataBaseTableCount = Convert.ToInt32(nd.Attributes["SetDataBaseTableCount"].Value); } LoadShardingPropertiesByXmlNode(sharding, nd); dbRoute.Shardings.Add(sharding); } }
/// <summary> /// 匹配 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> public virtual string GetTableIndex(object routeValue, ShardingInfo sharding) { if (string.IsNullOrEmpty(sharding.TableIndex)) { GetFixedTableIndex(routeValue, sharding); } routeValue = GetRouteValue(routeValue, sharding); if (routeValue == null) { return(null); } var tableIndex = ShardingType == 0 || ShardingType == ShardingType.Fixed? GetFixedTableIndex(routeValue, sharding): GetAutoTableIndex(routeValue, sharding); return(string.Format("{0}{1}", sharding.TableTag, tableIndex)); }
/// <summary> /// 得到查询 /// </summary> /// <param name="dbRoute"></param> /// <param name="query"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual QueryInfo GetQuery(DbRouteInfo dbRoute, QueryInfo query, ShardingInfo sharding) { if (sharding == null) { return(null); } var result = new QueryInfo { DataCount = query.DataCount, FromExp = query.FromExp, GroupByExp = query.GroupByExp, HavingExp = query.HavingExp, IsDisinct = query.IsDisinct, IsGreedyLoad = query.IsGreedyLoad, IsLazyLoad = query.IsLazyLoad, OrderByExp = query.OrderByExp, PageSize = query.PageSize + query.PageIndex * query.PageSize, RemoteQueries = query.RemoteQueries, SelectExp = query.SelectExp, WhereExp = query.WhereExp, TableIndex = string.IsNullOrWhiteSpace(sharding.TableIndex) ? sharding.TableIndex : sharding.TableIndex.ToLower(), GetDataBase = string.IsNullOrWhiteSpace(sharding.GetDataBase)? sharding.GetDataBase: sharding.GetDataBase.ToLower(), Object = query.Object, DbRoute = query.DbRoute }; if (query.Parameters != null) { result.Parameters = new Dictionary <string, object>(); foreach (var parameter in query.Parameters) { result.Parameters.Add(parameter.Key, parameter.Value); } } if (query.Cache != null) { result.Cache = new CacheInfo { Time = query.Cache.Time, TimeSpan = query.Cache.TimeSpan }; } return(result); }
/// <summary> /// 加载分片属性 /// </summary> /// <param name="sharding"></param> /// <param name="node"></param> protected virtual void LoadShardingPropertiesByXmlNode(ShardingInfo sharding, XmlNode node) { var nodes = node.SelectNodes("Property"); if (nodes == null) { return; } foreach (XmlNode nd in nodes) { var shardProperty = new ShardPropertyInfo(); shardProperty.PropertyName = nd.Attributes["PropertyName"] != null ? nd.Attributes["PropertyName"].Value : ""; shardProperty.Tag = nd.Attributes["Tag"] != null ? nd.Attributes["Tag"].Value : ""; if (nd.Attributes["StartValue"] != null) { shardProperty.StartValue = Convert.ToInt64(nd.Attributes["StartValue"].Value); } if (nd.Attributes["EndValue"] != null) { shardProperty.EndValue = Convert.ToInt64(nd.Attributes["EndValue"].Value); } if (nd.Attributes["FixedValue"] != null) { shardProperty.FixedValue = nd.Attributes["FixedValue"].Value; } if (nd.Attributes["DateFormat"] != null) { shardProperty.DateFormat = nd.Attributes["DateFormat"].Value; } if (nd.Attributes["ShardingType"] != null) { shardProperty.ShardingType = (ShardingType)Enum.Parse(typeof(ShardingType), nd.Attributes["ShardingType"].Value); } sharding.ShardProperties.Add(shardProperty); } }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual string GetFixedTableIndex(object routeValue, ShardingInfo sharding) { if (StartValue > 0 && EndValue > 0) { var value = Math.Abs(long.Parse(routeValue.ToString())); if (value >= StartValue && value <= EndValue) { return(sharding.TableIndex); } } else if (!string.IsNullOrEmpty(FixedValue)) { var value = string.IsNullOrEmpty(DateFormat) ? routeValue.ToString() : DateTime.Parse(routeValue.ToString()).ToString(DateFormat); if (value == FixedValue) { return(sharding.TableIndex); } } return(null); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetValueTableStep(object routeValue, ShardingInfo sharding) { var tableMaxStep = sharding.GetTableMaxStep(); if (tableMaxStep == -1) { return(-1); } var value = Math.Abs(long.Parse(routeValue.ToString())); if (value > StartValue + (EndValue - StartValue + 1) * tableMaxStep) { return(-1); } var step = (int)(Math.Floor((double)((value - StartValue) / (EndValue - StartValue)))); if (sharding.TableStep > 0) { step = step / sharding.TableStep; } return(step); }
/// <summary> /// 得到值得所以分片 /// </summary> /// <returns></returns> protected virtual IList <ShardingInfo> GetAllValueShardings() { var maxTableIndex = GetMaxTableIndex(); var shardings = new List <ShardingInfo>(); var max = int.Parse(maxTableIndex); for (int i = int.Parse(TableIndex); i < max;) { var sharding = new ShardingInfo { GetDataBase = GetQueryDataBaseIndex(i), SetDataBase = GetSaveDataBaseIndex(i), IsWrite = IsWrite, MaxTableIndex = MaxTableIndex, TableStep = TableStep, TableStepType = TableStepType }; sharding.TableIndex = i.ToString(); i += TableStep; shardings.Add(sharding); } return(shardings); }
/// <summary> /// 得到所有分片 /// </summary> /// <returns></returns> public virtual IList <ShardingInfo> GetAllShardings() { if (string.IsNullOrEmpty(TableIndex)) { var sharding = new ShardingInfo { GetDataBase = GetDataBase, SetDataBase = SetDataBase, IsWrite = IsWrite, MaxTableIndex = MaxTableIndex, TableStep = TableStep, TableIndex = "", TableStepType = TableStepType }; return(new List <ShardingInfo> { sharding }); } switch (TableStepType) { case TableStepType.Value: return(GetAllValueShardings()); case TableStepType.Hour: return(GetAllHourShardings()); case TableStepType.Day: return(GetAllDayShardings()); case TableStepType.Month: return(GetAllMonthShardings()); case TableStepType.Year: return(GetAllYearShardings()); } return(null); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetDayTableStep(object routeValue, ShardingInfo sharding) { var tableMaxStep = sharding.GetTableMaxStep(); if (tableMaxStep == -1) { return(-1); } var date = DateTime.Parse(routeValue.ToString()); var maxDate = DateTime.Parse(sharding.TableIndex.Insert(4, "-").Insert(7, "-")).AddDays(tableMaxStep); if (date > maxDate) { return(-1); } var curdate = DateTime.Parse(FixedValue); var step = (date - curdate).TotalDays; if (sharding.TableStep > 0) { step = step / sharding.TableStep; } return((int)step); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetMonthTableStep(object routeValue, ShardingInfo sharding) { var tableMaxStep = sharding.GetTableMaxStep(); if (tableMaxStep == -1) { return(-1); } var date = DateTime.Parse(routeValue.ToString()); var maxDate = DateTime.Parse(sharding.TableIndex.Insert(4, "-")).AddMonths(tableMaxStep); if (date > maxDate) { return(-1); } var curdate = DateTime.Parse(FixedValue); var step = (date.Year - curdate.Year) * 12 + (date.Month - curdate.Month); if (sharding.TableStep > 0) { step = step / sharding.TableStep; } return(step); }
/// <summary> /// 匹配正常 /// </summary> /// <param name="routeValue"></param> /// <param name="sharding"></param> /// <returns></returns> protected virtual int GetYearTableStep(object routeValue, ShardingInfo sharding) { var tableMaxStep = sharding.GetTableMaxStep(); if (tableMaxStep == -1) { return(-1); } var date = DateTime.Parse(routeValue.ToString()); var maxDate = DateTime.Parse(sharding.TableIndex).AddYears(tableMaxStep); if (date > maxDate) { return(-1); } var curdate = DateTime.Parse(FixedValue); var step = date.Year - curdate.Year; if (sharding.TableStep > 0) { step = step / sharding.TableStep; } return(step); }