Beispiel #1
0
        public SchemaDiff(IDocumentSchema schema, SchemaObjects existing, DocumentMapping mapping)
        {
            if (existing.HasNone())
            {
                AllMissing = true;
            }
            else
            {
                var expectedTable = mapping.ToTable(schema);
                TableDiff = new TableDiff(expectedTable, existing.Table);

                // TODO -- drop obsolete indices?

                mapping.Indexes.Each(index =>
                {
                    if (existing.ActualIndices.ContainsKey(index.IndexName))
                    {
                        var actualIndex = existing.ActualIndices[index.IndexName];
                        if (!index.Matches(actualIndex))
                        {
                            IndexChanges.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{index.ToDDL()}");
                        }
                    }
                    else
                    {
                        IndexChanges.Add(index.ToDDL());
                    }
                });

            }

            _existing = existing;
            _mapping = mapping;
            _schema = schema;
        }
Beispiel #2
0
        public void perfect_match()
        {
            var users = DocumentMapping.For<User>();
            var actual = users.ToTable(null);
            var expected = users.ToTable(null);

            var diff = new TableDiff(expected, actual);
            diff.Matches.ShouldBeTrue();
        }
Beispiel #3
0
        public void perfect_match()
        {
            var users = DocumentSchemaObjects.For<User>();
            var actual = users.StorageTable();
            var expected = users.StorageTable();

            var diff = new TableDiff(expected, actual);
            diff.Matches.ShouldBeTrue();
        }
Beispiel #4
0
        public void can_match_up_on_columns()
        {
            var users = DocumentMapping.For<User>();
            var actual = users.ToTable(null);
            var expected = users.ToTable(null);

            var diff = new TableDiff(expected, actual);

            diff.Matched.OrderBy(x => x.Name).Select(x => x.Name)
                .ShouldHaveTheSameElementsAs("data", "id");
        }
Beispiel #5
0
        public void can_match_up_on_columns()
        {
            var users = DocumentSchemaObjects.For<User>();
            var actual = users.StorageTable();
            var expected = users.StorageTable();

            var diff = new TableDiff(expected, actual);

            diff.Matched.OrderBy(x => x.Name).Select(x => x.Name)
                .ShouldHaveTheSameElementsAs("data", "id", DocumentMapping.DotNetTypeColumn, DocumentMapping.LastModifiedColumn, DocumentMapping.VersionColumn);
        }
Beispiel #6
0
        public void not_matching_with_columns_of_same_name_that_are_different()
        {
            var users = DocumentMapping.For<User>();
            var actual = users.ToTable(null);
            actual.ReplaceOrAddColumn("id", "int");

            var expected = users.ToTable(null);

            var diff = new TableDiff(expected, actual);
            diff.Matches.ShouldBeFalse();

            diff.Different.Single().Name.ShouldBe("id");
        }
Beispiel #7
0
        public void not_matching_with_extra_columns()
        {
            var users = DocumentMapping.For<User>();
            var actual = users.ToTable(null);
            var tableColumn = new TableColumn("new", "varchar");
            actual.Columns.Add(tableColumn);

            var expected = users.ToTable(null);

            var diff = new TableDiff(expected, actual);

            diff.Matches.ShouldBeFalse();
            diff.Extras.Single().ShouldBe(tableColumn);
        }
Beispiel #8
0
        public SchemaDiff(SchemaObjects existing, DocumentMapping mapping, DdlRules rules)
        {
            if (existing.HasNone())
            {
                AllMissing = true;
            }
            else
            {
                var expectedTable = mapping.SchemaObjects.As<DocumentSchemaObjects>().StorageTable();
                TableDiff = new TableDiff(expectedTable, existing.Table);

                // TODO -- drop obsolete indices?

                mapping.Indexes.Each(index =>
                {
                    if (existing.ActualIndices.ContainsKey(index.IndexName))
                    {
                        var actualIndex = existing.ActualIndices[index.IndexName];
                        if (!index.Matches(actualIndex))
                        {
                            IndexChanges.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{index.ToDDL()};");
                            IndexRollbacks.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{actualIndex.DDL};");
                        }
                    }
                    else
                    {
                        IndexChanges.Add(index.ToDDL());
                        IndexRollbacks.Add($"drop index concurrently if exists {expectedTable.Table.Schema}.{index.IndexName};");
                    }
                });

                existing.ActualIndices.Values.Where(x => mapping.Indexes.All(_ => _.IndexName != x.Name)).Each(
                    index =>
                    {
                        IndexRollbacks.Add(index.DDL);
                        IndexChanges.Add($"drop index concurrently if exists {mapping.Table.Schema}.{index.Name};");
                    });

                var expectedFunction = new UpsertFunction(mapping);

                FunctionDiff = new FunctionDiff(expectedFunction.ToBody(rules), existing.Function);

                var missingFKs = mapping.ForeignKeys.Where(x => !existing.ForeignKeys.Contains(x.KeyName));
                MissingForeignKeys.AddRange(missingFKs);
            }

            _mapping = mapping;


        }
Beispiel #9
0
        public void not_matching_with_missing_columns()
        {
            var users = DocumentSchemaObjects.For<User>();
            var actual = users.StorageTable();

            var expected = users.StorageTable();
            var tableColumn = new TableColumn("new", "varchar");
            expected.Columns.Add(tableColumn);


            var diff = new TableDiff(expected, actual);
            diff.Matches.ShouldBeFalse();

            diff.Missing.Single().ShouldBe(tableColumn);
            diff.Extras.Any().ShouldBeFalse();
            diff.Different.Any().ShouldBeFalse();
        }