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; }
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(); }
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(); }
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"); }
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); }
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"); }
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); }
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; }
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(); }