Esempio n. 1
0
        public override SqlToken GenerateSqlToken(InsertCommandContext sqlCommandContext)
        {
            var result = FindPreviousSqlToken();

            ShardingAssert.ShouldBeNotNull(result, "not find PreviousSqlToken");
            var generatedKey = sqlCommandContext.GetGeneratedKeyContext();

            ShardingAssert.ShouldBeNotNull(generatedKey, "generatedKey is required");
            var generatedValues = generatedKey.GetGeneratedValues().Reverse().GetEnumerator();
            int count           = 0;

            foreach (var insertValueContext in sqlCommandContext.GetInsertValueContexts())
            {
                var insertValueToken = result.InsertValues[count];
                IDerivedSimpleExpressionSegment expressionSegment;
                if (IsToAddDerivedLiteralExpression(sqlCommandContext, count))
                {
                    expressionSegment = new DerivedLiteralExpressionSegment(generatedValues.Next());
                }
                else
                {
                    expressionSegment = new DerivedParameterMarkerExpressionSegment(insertValueContext.GetParametersCount(), string.Empty);
                }
                insertValueToken.GetValues().Add(expressionSegment);
                count++;
            }
            return(result);
        }
        /**
         * Create sharding conditions.
         *
         * @param insertCommandContext insert statement context
         * @param parameters SQL parameters
         * @return sharding conditions
         */
        public List <ShardingCondition> CreateShardingConditions(InsertCommandContext insertCommandContext,
                                                                 ParameterContext parameterContext)
        {
            ICollection <ShardingCondition> result = new LinkedList <ShardingCondition>();
            string tableName = insertCommandContext.GetSqlCommand().Table.GetTableName().GetIdentifier().GetValue();
            ICollection <string> columnNames = GetColumnNames(insertCommandContext);

            foreach (var insertValueContext in insertCommandContext.GetInsertValueContexts())
            {
                result.Add(CreateShardingCondition(tableName, columnNames.GetEnumerator(), insertValueContext,
                                                   parameterContext));
            }

            var generatedKey = insertCommandContext.GetGeneratedKeyContext();

            if (generatedKey != null && generatedKey.IsGenerated())
            {
                generatedKey.GetGeneratedValues().AddAll(GetGeneratedKeys(tableName,
                                                                          insertCommandContext.GetSqlCommand().GetValueListCount()));
                if (_shardingRule.IsShardingColumn(generatedKey.GetColumnName(), tableName))
                {
                    AppendGeneratedKeyCondition(generatedKey, tableName, result);
                }
            }

            return(result.ToList());
        }
Esempio n. 3
0
        public override SqlToken GenerateSqlToken(InsertCommandContext sqlCommandContext)
        {
            var insertColumnsSegment = sqlCommandContext.GetSqlCommand().InsertColumns;

            ShardingAssert.ShouldBeNotNull(insertColumnsSegment, "insertColumnsSegment is required");
            return(new UseDefaultInsertColumnsToken(insertColumnsSegment.GetStopIndex(), GetColumnNames(sqlCommandContext)));
        }
Esempio n. 4
0
        public override SqlToken GenerateSqlToken(InsertCommandContext sqlCommandContext)
        {
            var generatedKey = sqlCommandContext.GetGeneratedKeyContext();

            ShardingAssert.ShouldBeNotNull(generatedKey, "generatedKey is required");
            var sqlSegment = sqlCommandContext.GetSqlCommand().InsertColumns;

            ShardingAssert.ShouldBeNotNull(sqlSegment, "sqlSegment is required");
            return(new GeneratedKeyInsertColumnToken(sqlSegment.GetStopIndex(), generatedKey.GetColumnName()));
        }
Esempio n. 5
0
        private List <String> GetColumnNames(InsertCommandContext insertCommandContext)
        {
            var generatedKey = insertCommandContext.GetGeneratedKeyContext();

            ShardingAssert.ShouldBeNotNull(generatedKey, "generatedKey is required");
            List <String> result = new List <string>(insertCommandContext.GetColumnNames());

            result.Remove(generatedKey.GetColumnName());
            result.Add(generatedKey.GetColumnName());
            return(result);
        }
        private ICollection <string> GetColumnNames(InsertCommandContext insertCommandContext)
        {
            var generatedKey = insertCommandContext.GetGeneratedKeyContext();

            if (generatedKey != null && generatedKey.IsGenerated())
            {
                ICollection <string> result = new LinkedList <string>(insertCommandContext.GetColumnNames());
                result.Remove(generatedKey.GetColumnName());
                return(result);
            }

            return(insertCommandContext.GetColumnNames());
        }
        public override SqlToken GenerateSqlToken(InsertCommandContext sqlCommandContext)
        {
            var generatedKey = sqlCommandContext.GetGeneratedKeyContext();

            ShardingAssert.ShouldBeNotNull(generatedKey, "generatedKey is required");
            ShardingAssert.ShouldBeNotNull(sqlCommandContext.GetSqlCommand().SetAssignment, "setAssignment is required");
            int startIndex = sqlCommandContext.GetSqlCommand().SetAssignment.GetStopIndex() + 1;

            if (_parameterContext.IsEmpty())
            {
                return(new LiteralGeneratedKeyAssignmentToken(startIndex, generatedKey.GetColumnName(), generatedKey.GetGeneratedValues().LastOrDefault()));
            }
            return(new ParameterMarkerGeneratedKeyAssignmentToken(startIndex, generatedKey.GetColumnName()));
        }
Esempio n. 8
0
 private bool IsToAddDerivedLiteralExpression(InsertCommandContext insertCommandContext, int insertValueCount)
 {
     return(insertCommandContext.GetGroupedParameters()[insertValueCount].IsEmpty());
 }