Example #1
0
 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);
     }
 }
Example #2
0
        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);
        }
Example #3
0
 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));
        }