private void CreateSequence(Schema schema, StorageSequenceInfo sequenceInfo, string name)
        {
            var sequence   = schema.CreateSequence(name);
            var descriptor = new SequenceDescriptor(sequence, sequenceInfo.Seed, sequenceInfo.Increment)
            {
                MinValue = sequenceInfo.Seed
            };

            sequence.SequenceDescriptor = descriptor;
        }
        /// <inheritdoc/>
        protected override IPathNode VisitSequence(Sequence sequence)
        {
            var sequenceInfo = new StorageSequenceInfo(targetModel, resolver.GetNodeName(sequence))
            {
                Increment = sequence.SequenceDescriptor.Increment.Value,
                // StartValue = sequence.SequenceDescriptor.StartValue.Value,
            };

            return(sequenceInfo);
        }
        /// <summary>
        /// Visits the generator table.
        /// </summary>
        /// <param name="generatorTable">The generator table.</param>
        /// <returns>Visit result.</returns>
        private IPathNode VisitGeneratorTable(Table generatorTable)
        {
            var idColumn   = generatorTable.TableColumns[0];
            var startValue = idColumn.SequenceDescriptor.StartValue;
            var increment  = idColumn.SequenceDescriptor.Increment;
            var type       = ExtractType(idColumn);
            var sequence   =
                new StorageSequenceInfo(targetModel, resolver.GetNodeName(generatorTable))
            {
                Seed      = startValue ?? 0,
                Increment = increment ?? 1,
                Type      = type,
            };

            return(sequence);
        }
        /// <inheritdoc/>
        protected override IPathNode VisitSequence(Sequence sequence)
        {
            var sequenceInfo = new StorageSequenceInfo(targetModel, resolver.GetNodeName(sequence))
            {
                Increment = sequence.SequenceDescriptor.Increment.Value
            };

            if (sequence.SequenceDescriptor.StartValue != null)
            {
                sequenceInfo.Seed = sequence.SequenceDescriptor.StartValue.Value;
            }
            if (sequence.SequenceDescriptor.LastValue != null)
            {
                sequenceInfo.Current = sequence.SequenceDescriptor.LastValue;
            }
            return(sequenceInfo);
        }
        private void CreateGeneratorTable(Schema schema, StorageSequenceInfo sequenceInfo, string name)
        {
            var sequenceTable = schema.CreateTable(name);
            var idColumn      = sequenceTable.CreateColumn(WellKnown.GeneratorColumnName,
                                                           (SqlValueType)sequenceInfo.Type.NativeType);

            idColumn.SequenceDescriptor =
                new SequenceDescriptor(
                    idColumn,
                    sequenceInfo.Current ?? sequenceInfo.Seed,
                    sequenceInfo.Increment);
            sequenceTable.CreatePrimaryKey(string.Format("PK_{0}", sequenceInfo.Name), idColumn);
            if (!provider.Supports(ProviderFeatures.InsertDefaultValues))
            {
                var fakeColumn = sequenceTable.CreateColumn(WellKnown.GeneratorFakeColumnName, driver.MapValueType(typeof(int)));
                fakeColumn.IsNullable = true;
            }
        }
        /// <inheritdoc/>
        protected override IPathNode VisitKeyInfo(KeyInfo keyInfo)
        {
            if (keyInfo.Sequence == null || !keyInfo.IsFirstAmongSimilarKeys)
            {
                return(null);
            }
            var  sequenceInfo = keyInfo.Sequence;
            long increment    = 1;

            if (providerInfo.Supports(ProviderFeatures.ArbitraryIdentityIncrement) || providerInfo.Supports(ProviderFeatures.Sequences))
            {
                increment = sequenceInfo.Increment;
            }
            var sequence = new StorageSequenceInfo(targetModel, resolver.GetNodeName(sequenceInfo))
            {
                Seed      = sequenceInfo.Seed,
                Increment = increment,
                Type      = CreateType(keyInfo.TupleDescriptor[0], null, null, null),
            };

            return(sequence);
        }