private void MergeShardingConditions(ShardingConditions shardingConditions) { if (shardingConditions.Conditions.Count > 1) { ShardingCondition shardingCondition = shardingConditions.Conditions[shardingConditions.Conditions.Count - 1]; shardingConditions.Conditions.RemoveAt(shardingConditions.Conditions.Count - 1); shardingConditions.Conditions.Clear(); shardingConditions.Conditions.Add(shardingCondition); } }
private bool IsSameShardingCondition(ShardingRule shardingRule, ShardingConditions shardingConditions) { ShardingCondition example = shardingConditions.Conditions.Last(); shardingConditions.Conditions.RemoveAt(shardingConditions.Conditions.Count - 1); foreach (var condition in shardingConditions.Conditions) { if (!IsSameShardingCondition(shardingRule, example, condition)) { return(false); } } return(true); }
private bool IsSameShardingCondition(ShardingRule shardingRule, ShardingCondition shardingCondition1, ShardingCondition shardingCondition2) { if (shardingCondition1.RouteValues.Count != shardingCondition2.RouteValues.Count) { return(false); } for (int i = 0; i < shardingCondition1.RouteValues.Count; i++) { var shardingValue1 = shardingCondition1.RouteValues.ElementAt(i); var shardingValue2 = shardingCondition2.RouteValues.ElementAt(i); if (!IsSameRouteValue(shardingRule, (ListRouteValue)shardingValue1, (ListRouteValue)shardingValue2)) { return(false); } } return(true); }
private ShardingCondition CreateShardingCondition(string tableName, IEnumerator <string> columnNames, InsertValueContext insertValueContext, ParameterContext parameterContext) { ShardingCondition result = new ShardingCondition(); SPITimeService timeService = SPITimeService.GetInstance(); foreach (var valueExpression in insertValueContext.GetValueExpressions()) { string columnName = columnNames.Next(); if (_shardingRule.IsShardingColumn(columnName, tableName)) { if (valueExpression is ISimpleExpressionSegment simpleExpressionSegment) { result.RouteValues.Add(new ListRouteValue(columnName, tableName, new List <IComparable>() { GetRouteValue(simpleExpressionSegment, parameterContext) })); } else if (ExpressionConditionUtils.IsNowExpression(valueExpression)) { result.RouteValues.Add(new ListRouteValue(columnName, tableName, new List <IComparable>() { timeService.GetTime() })); } else if (ExpressionConditionUtils.IsNullExpression(valueExpression)) { throw new ShardingException("Insert clause sharding column can't be null."); } } } return(result); }
private ShardingCondition CreateShardingCondition(IDictionary <Column, ICollection <IRouteValue> > routeValueMap) { ShardingCondition result = new ShardingCondition(); foreach (var routeValueKv in routeValueMap) { try { var routeValue = MergeRouteValues(routeValueKv.Key, routeValueKv.Value); if (routeValue is AlwaysFalseRouteValue) { return(new AlwaysFalseShardingCondition()); } result.RouteValues.Add(routeValue); } catch (InvalidCastException ex) { throw new ShardingException("Found different types for sharding value `{entry.Key}`."); } } return(result); }
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); }
private List <IRouteValue> GetTableShardingValues(ShardingRule shardingRule, TableRule tableRule, ShardingCondition shardingCondition) { IShardingStrategy tableShardingStrategy = shardingRule.GetTableShardingStrategy(tableRule); return(IsGettingShardingValuesFromHint(tableShardingStrategy) ? GetTableShardingValuesFromHint() : GetShardingValuesFromShardingConditions(shardingRule, tableShardingStrategy.GetShardingColumns(), shardingCondition)); }