public override string[] GenerateSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            string createTable;
            string head             = $"CREATE TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]";
            var    optimizableGenes = _definitions
                                      .SelectMany(m => graph.PullPrerequisitesForward(m, this, CanOptimize))
                                      .ToImmutableList();

            if (optimizableGenes.Any())
            {
                var definitions = optimizableGenes
                                  .OfType <TableDefinitionGene>()
                                  .Where(d => !d.Dropped)
                                  .Select(d => d.GenerateDefinitionSql());
                createTable      = $"{head}({string.Join(",", definitions)})";
                optimizableGenes = optimizableGenes.AddRange(optimizableGenes
                                                             .OfType <CreateColumnGene>()
                                                             .SelectMany(d => d.Modifications));
            }
            else
            {
                createTable = head;
            }

            string[] sql =
            {
                createTable
            };
            genesAffected.AppendAll(optimizableGenes);

            return(sql);
        }
Esempio n. 2
0
 public GreedyEdgeChooserPunterWithStupidZergRush(
     IScorer scorer,
     IGraphVisitor graphVisitor
     )
 {
     this.scorer       = scorer;
     this.graphVisitor = graphVisitor;
 }
Esempio n. 3
0
 public Visitor(IGraph <Node, Edge> /*!*/ graph,
                //^ [Delayed]
                IGraphVisitor <Node, Edge> /*!*/ visitor)
     : this(graph, visitor.VisitNode, null, visitor.VisitEdge)
 {
     Contract.Requires(graph != null);   // Clousot Suggestion
     Contract.Requires(visitor != null); // Clousot Suggestion
 }
 public BargeHauler3(
     IScorer scorer,
     IGraphVisitor graphVisitor
     )
 {
     this.scorer       = scorer;
     this.graphVisitor = graphVisitor;
 }
 public GreedyEdgeChooserPunter(
     IScorer scorer,
     IGraphVisitor graphVisitor
     )
 {
     this.scorer       = scorer;
     this.graphVisitor = graphVisitor;
 }
 public FriendshipPunter(IScorer scorer)
 {
     this.scorer      = scorer;
     graphVisitor     = new GraphVisitor();
     componentManager = new ComponentManager(scorer);
     state            = new PunterState
     {
     };
 }
        public override string[] GenerateSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            string columnNames = string.Join(", ", _columns.Select(c => $"[{c.ColumnName}]").ToArray());

            string[] sql =
            {
                $"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]\r\n    ADD CONSTRAINT [PK_{TableName}] PRIMARY KEY CLUSTERED ({columnNames})"
            };

            return(sql);
        }
Esempio n. 8
0
        public override string[] GenerateSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            string indexTail  = string.Join("_", Columns.Select(c => $"{c.ColumnName}").ToArray());
            string columnList = string.Join(", ", Columns.Select(c => $"[{c.ColumnName}]").ToArray());

            string[] sql =
            {
                $"CREATE UNIQUE NONCLUSTERED INDEX [UX_{TableName}_{indexTail}] ON [{DatabaseName}].[{SchemaName}].[{TableName}] ({columnList})"
            };

            return(sql);
        }
Esempio n. 9
0
 public Scorer(
     IDistanceCalculator distanceCalculator,
     IGraphVisitor graphVisitor)
 {
     this.distanceCalculator = distanceCalculator;
     this.graphVisitor = graphVisitor;
     state = new ScorerState
     {
         DistancesFromMines = new Dictionary<int, Dictionary<int, int>>(),
         Mines = new Node[0]
     };
 }
Esempio n. 10
0
        public override string[] GenerateSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            string indexTail           = string.Join("_", Columns.Select(c => $"{c.ColumnName}").ToArray());
            string columnList          = string.Join(", ", Columns.Select(c => $"[{c.ColumnName}]").ToArray());
            string referenceColumnList = string.Join(", ", _referencing.Columns.Select(c => $"[{c.ColumnName}]").ToArray());
            string onDelete            = _cascadeDelete ? " ON DELETE CASCADE" : "";
            string onUpdate            = _cascadeUpdate ? " ON UPDATE CASCADE" : "";

            string[] sql =
            {
                $@"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]
    ADD CONSTRAINT [FK_{TableName}_{indexTail}] FOREIGN KEY ({columnList})
        REFERENCES [{_referencing.DatabaseName}].[{_referencing.SchemaName}].[{_referencing.TableName}] ({referenceColumnList}){onDelete}{onUpdate}"
            };

            return(sql);
        }
        public override string[] GenerateSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            var optimizableGenes = _modifications
                                   .SelectMany(m => graph.PullPrerequisitesForward(m, this, CanOptimize))
                                   .ToImmutableList();

            if (optimizableGenes.Any())
            {
                genesAffected.AppendAll(optimizableGenes);

                if (optimizableGenes.OfType <DropColumnGene>().Any())
                {
                    return(new string[0]);
                }
            }

            return(CreateColumnSql());
        }
Esempio n. 12
0
        /// <summary>
        /// Pass in a visitor to be visited by this graph and its child elements
        /// </summary>
        /// <typeparam name="TReturn">Return type of this visitor</typeparam>
        /// <param name="visitor">Visitor to visit</param>
        /// <returns>Result generated by the visitor.</returns>
        public TReturn Visit <TReturn>(IGraphVisitor <TReturn> visitor)
            where TReturn : class
        {
            if (visitor == null)
            {
                throw new ArgumentNullException("visitor", "Must have a visitor to approach.");
            }

            var nodeResults
                = Nodes.Select(n => n.Visit(visitor))
                  .ToList();

            var edgeResults
                = Edges.Select(e => e.Visit(visitor))
                  .ToList();

            var subGraphResults
                = SubGraphs.Select(g => g.Visit(visitor))
                  .ToList();

            return(visitor.VisitGraph(this, nodeResults, edgeResults, subGraphResults));
        }
Esempio n. 13
0
 public abstract string[] GenerateRollbackSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph);
 public override string[] GenerateSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
 {
     string[] sql = { };
     return(sql);
 }
 public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
 {
     throw new NotImplementedException();
 }
Esempio n. 16
0
    public static void DepthFirstTraversal <T>(this IGraph <T> graph, IGraphNode <T> startingNode, IGraphVisitor <T> visitor)
    {
        Stack <Pair <IGraphNode <T>, IEnumerator <IGraphEdge <T> > > > openNodes = new Stack <Pair <IGraphNode <T>, IEnumerator <IGraphEdge <T> > > >();
        HashSet <IGraphNode <T> > seenNodes = new HashSet <IGraphNode <T> >();

        openNodes.Push(new Pair <IGraphNode <T>, IEnumerator <IGraphEdge <T> > >(startingNode, graph.GetEdges(startingNode).GetEnumerator()));
        seenNodes.Add(startingNode);
        visitor.VisitNodeOpen(startingNode);

        while (openNodes.Count > 0)
        {
            var top = openNodes.Peek();
            if (top.Second.MoveNext())
            {
                IGraphEdge <T> edge = top.Second.Current;
                IGraphNode <T> node = edge.node2;
                if (!seenNodes.Add(node))
                {
                    continue;
                }

                openNodes.Push(new Pair <IGraphNode <T>, IEnumerator <IGraphEdge <T> > >(node, graph.GetEdges(node).GetEnumerator()));
                visitor.VisitNodeOpen(node);
            }
            else
            {
                visitor.VisitNodeClose(openNodes.Pop().First);
            }
        }
    }
Esempio n. 17
0
 /// <summary>
 /// Visit the passed visitor and return the result generated
 /// </summary>
 /// <param name="visitor">The visitor itself.</param>
 /// <typeparam name="TReturn">Type of return value.</typeparam>
 /// <returns>Result generated by the Visitor.</returns>
 public TReturn Visit <TReturn>(IGraphVisitor <TReturn> visitor)
     where TReturn : class
 {
     Require.NotNull("visitor", visitor);
     return(visitor.VisitEdge(this));
 }
 public override string[] GenerateRollbackSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
 {
     return(_parent.CreateColumnSql());
 }
Esempio n. 19
0
        public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
        {
            string[] sql =
            {
                $"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]\r\n    DROP CONSTRAINT [PK_{TableName}]"
            };

            return(sql);
        }
        public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
        {
            string[] sql =
            {
                $@"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]
    DROP COLUMN [{ColumnName}]"
            };

            return(sql);
        }
Esempio n. 21
0
 public abstract void Accept(IGraphVisitor visitor);
Esempio n. 22
0
        public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
        {
            string indexTail = string.Join("_", Columns.Select(c => $"{c.ColumnName}").ToArray());

            string[] sql =
            {
                $"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]\r\n    DROP CONSTRAINT [FK_{TableName}_{indexTail}]"
            };

            return(sql);
        }
        public override string[] GenerateSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
        {
            string[] identityTypes       = { "INT IDENTITY" };
            string[] numericTypes        = { "BIGINT", "INT", "SMALLINT", "TINYINT", "MONEY", "SMALLMONEY", "DECIMAL", "FLOAT", "REAL" };
            string[] dateTypes           = { "DATETIME", "SMALLDATETIME", "DATETIME2", "TIME" };
            string[] dateTimeOffsetTypes = { "DATETIMEOFFSET" };
            string[] stringTypes         = { "NVARCHAR", "NCHAR", "NTEXT" };
            string[] asciiStringTypes    = { "VARCHAR", "CHAR", "TEXT" };
            string[] guidTypes           = { "UNIQUEIDENTIFIER" };

            string defaultExpression =
                _nullable ? null :
                identityTypes.Any(t => TypeDescriptor.StartsWith(t)) ? null :
                numericTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "0" :
                dateTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "GETUTCDATE()" :
                dateTimeOffsetTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "SYSDATETIMEOFFSET()" :
                stringTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "N''" :
                asciiStringTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "''" :
                guidTypes.Any(t => TypeDescriptor.StartsWith(t)) ? "'00000000-0000-0000-0000-000000000000'" :
                null;

            if (defaultExpression == null)
            {
                string[] sql =
                {
                    $@"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]
    ADD [{ColumnName}] {TypeDescriptor} {NullableClause}"
                };

                return(sql);
            }
            else
            {
                string[] sql =
                {
                    $@"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]
    ADD [{ColumnName}] {TypeDescriptor} {NullableClause}
    CONSTRAINT [DF_{TableName}_{ColumnName}] DEFAULT ({defaultExpression})",
                    $@"ALTER TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]
    DROP CONSTRAINT [DF_{TableName}_{ColumnName}]",
                };

                return(sql);
            }
        }
 public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
 {
     return
         (_down != null ? new string[] { $"USE {DatabaseName}", _down } :
          new string[] { });
 }
Esempio n. 25
0
    public static void BreadthFirstTraversal <T>(this IGraph <T> graph, IGraphNode <T> startingNode, IGraphVisitor <T> visitor)
    {
        Queue <IGraphNode <T> >   openNodes = new Queue <IGraphNode <T> >();
        HashSet <IGraphNode <T> > seenNodes = new HashSet <IGraphNode <T> >();

        openNodes.Enqueue(startingNode);
        seenNodes.Add(startingNode);

        while (openNodes.Count > 0)
        {
            IGraphNode <T> node = openNodes.Dequeue();
            visitor.VisitNodeOpen(node);

            foreach (IGraphEdge <T> edge in graph.GetEdges(node))
            {
                if (!seenNodes.Add(edge.node2))
                {
                    continue;
                }

                openNodes.Enqueue(edge.node2);
            }
        }
    }
Esempio n. 26
0
        public override string[] GenerateRollbackSql(EvolutionHistoryBuilder genesAffected, IGraphVisitor graph)
        {
            string indexTail = string.Join("_", Columns.Select(c => $"{c.ColumnName}").ToArray());

            string[] sql =
            {
                $"DROP INDEX [UX_{TableName}_{indexTail}] ON [{DatabaseName}].[{SchemaName}].[{TableName}]"
            };

            return(sql);
        }
Esempio n. 27
0
 public override void Accept(IGraphVisitor visitor)
 {
     visitor.Visit(this);
 }
Esempio n. 28
0
 public abstract T Accept <T>(IGraphVisitor <T> visitor);
 public override string[] GenerateSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
 {
     return(new string[] { $"USE {DatabaseName}", _up });
 }
Esempio n. 30
0
        public override string[] GenerateRollbackSql(MigrationHistoryBuilder migrationsAffected, IGraphVisitor graph)
        {
            string[] sql =
            {
                $"DROP TABLE [{DatabaseName}].[{SchemaName}].[{TableName}]"
            };
            migrationsAffected.AppendAll(_definitions);

            return(sql);
        }