Skip to content

Commit 306106a

Browse files
committed
IgnoreRulesHandler supports rules for indexes
1 parent e68d75a commit 306106a

File tree

1 file changed

+71
-28
lines changed

1 file changed

+71
-28
lines changed

Orm/Xtensive.Orm/Orm/Upgrade/Internals/IgnoreRulesHandler.cs

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2013-2020 Xtensive LLC.
1+
// Copyright (C) 2013-2020 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Alexey Kulakov
@@ -10,6 +10,7 @@
1010
using Xtensive.Core;
1111
using Xtensive.Orm.Configuration;
1212
using Xtensive.Orm.Providers;
13+
using Xtensive.Orm.Rse;
1314
using Xtensive.Sql.Model;
1415

1516
namespace Xtensive.Orm.Upgrade
@@ -31,8 +32,9 @@ public SchemaExtractionResult Handle()
3132
{
3233
foreach (var ignoreRule in ignoreRules) {
3334
var schema = mappingResolver.ResolveSchema(targetModel, ignoreRule.Database, ignoreRule.Schema);
34-
if (schema!=null)
35+
if (schema != null) {
3536
VisitSchema(schema, ignoreRule);
37+
}
3638
}
3739
return targetModel;
3840
}
@@ -42,59 +44,99 @@ private void VisitSchema(Schema schema, IgnoreRule rule)
4244
foreignKeysOfSchema = schema.Tables.SelectMany(t => t.TableConstraints.OfType<ForeignKey>()).ToList();
4345
var matcher = RuleMatcher<Table>.Create(rule.Table);
4446
var matchedTables = matcher.Get(schema.Tables);
45-
if (!MatchingHelper.IsMatchAll(rule.Column))
46-
foreach (var table in matchedTables)
47+
if (!MatchingHelper.IsMatchAll(rule.Column) || !MatchingHelper.IsMatchAll(rule.Index)) {
48+
foreach (var table in matchedTables) {
4749
VisitTable(table, rule);
48-
else
49-
foreach (var table in matchedTables)
50+
}
51+
}
52+
else {
53+
foreach (var table in matchedTables) {
5054
RemoveTable(schema.Tables, table);
55+
}
56+
}
5157
}
5258

5359
private void VisitTable(Table table, IgnoreRule rule)
5460
{
55-
var matcher = RuleMatcher<TableColumn>.Create(rule.Column);
56-
var matchedColumns = matcher.Get(table.TableColumns);
57-
foreach (var matchedColumn in matchedColumns)
58-
RemoveColumn(table.TableColumns, matchedColumn);
61+
var isColumnRule = !string.IsNullOrEmpty(rule.Column);
62+
if (isColumnRule) {
63+
var matcher = RuleMatcher<TableColumn>.Create(rule.Column);
64+
var matchedColumns = matcher.Get(table.TableColumns);
65+
foreach (var matchedColumn in matchedColumns) {
66+
RemoveColumn(table.TableColumns, matchedColumn);
67+
}
68+
}
69+
else {
70+
var matcher = RuleMatcher<Xtensive.Sql.Model.Index>.Create(rule.Index);
71+
var matchedIndexes = matcher.Get(table.Indexes);
72+
foreach (var matchedIndex in matchedIndexes) {
73+
RemoveIndex(table.Indexes, matchedIndex);
74+
}
75+
}
76+
5977
}
6078

6179
private void RemoveTable(PairedNodeCollection<Schema, Table> tables, Table tableToRemove)
6280
{
63-
foreach (var foreignKey in foreignKeysOfSchema)
64-
if (foreignKey.Owner==tableToRemove || foreignKey.ReferencedTable==tableToRemove) {
65-
if (foreignKey.Owner==tableToRemove) {
81+
foreach (var foreignKey in foreignKeysOfSchema) {
82+
if (foreignKey.Owner == tableToRemove || foreignKey.ReferencedTable == tableToRemove) {
83+
if (foreignKey.Owner == tableToRemove) {
6684
var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable);
67-
if (!targetModel.LockedTables.ContainsKey(resolvedTableName))
68-
targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name));
85+
if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) {
86+
targetModel.LockedTables.Add(resolvedTableName,
87+
string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn,
88+
foreignKey.ReferencedTable.Name, foreignKey.Name));
89+
}
6990
}
70-
foreignKey.Owner.TableConstraints.Remove(foreignKey);
91+
_ = foreignKey.Owner.TableConstraints.Remove(foreignKey);
7192
}
72-
tables.Remove(tableToRemove);
93+
}
94+
95+
_ = tables.Remove(tableToRemove);
7396
}
7497

7598
private void RemoveColumn(PairedNodeCollection<Table, TableColumn> columns, TableColumn columnToRemove)
7699
{
77100
RemoveForeignKeys(columnToRemove);
78101
RemoveIndexes(columnToRemove.Table, columnToRemove.Name);
102+
79103
var resolvedTableName = mappingResolver.GetNodeName(columnToRemove.Table);
80-
if (!targetModel.LockedTables.ContainsKey(resolvedTableName))
81-
targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToTheIgnoredColumnY, columnToRemove.Table.Name, columnToRemove.Name));
82-
columns.Remove(columnToRemove);
104+
if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) {
105+
targetModel.LockedTables.Add(resolvedTableName,
106+
string.Format(Strings.ExTableXCantBeRemovedDueToTheIgnoredColumnY,
107+
columnToRemove.Table.Name, columnToRemove.Name));
108+
}
109+
_ = columns.Remove(columnToRemove);
110+
}
111+
112+
private void RemoveIndex(PairedNodeCollection<DataTable, Xtensive.Sql.Model.Index> indexes, Xtensive.Sql.Model.Index indexToRemove)
113+
{
114+
var resolvedTableName = mappingResolver.GetNodeName((Table)indexToRemove.DataTable);
115+
if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) {
116+
targetModel.LockedTables.Add(resolvedTableName,
117+
string.Format(Strings.ExTableXCantBeRemovedDueToTheIgnoredColumnY,
118+
((Table) indexToRemove.DataTable).Name, indexToRemove.Name));
119+
}
120+
_ = indexes.Remove(indexToRemove);
83121
}
84122

85123
private void RemoveForeignKeys(TableColumn referencedColumn)
86124
{
87125
foreach (var foreignKey in foreignKeysOfSchema) {
88-
if (foreignKey.ReferencedColumns.Contains(referencedColumn))
89-
foreignKey.Owner.TableConstraints.Remove(foreignKey);
126+
if (foreignKey.ReferencedColumns.Contains(referencedColumn)) {
127+
_ = foreignKey.Owner.TableConstraints.Remove(foreignKey);
128+
}
90129

91130
if (foreignKey.Columns.Contains(referencedColumn)) {
92-
if (foreignKey.Owner==referencedColumn.Table) {
131+
if (foreignKey.Owner == referencedColumn.Table) {
93132
var resolvedTableName = mappingResolver.GetNodeName(foreignKey.ReferencedTable);
94-
if (!targetModel.LockedTables.ContainsKey(resolvedTableName))
95-
targetModel.LockedTables.Add(resolvedTableName, string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn, foreignKey.ReferencedTable.Name, foreignKey.Name));
133+
if (!targetModel.LockedTables.ContainsKey(resolvedTableName)) {
134+
targetModel.LockedTables.Add(resolvedTableName,
135+
string.Format(Strings.ExTableXCantBeRemovedDueToForeignKeyYOfIgnoredTableOrColumn,
136+
foreignKey.ReferencedTable.Name, foreignKey.Name));
137+
}
96138
}
97-
foreignKey.Owner.TableConstraints.Remove(foreignKey);
139+
_ = foreignKey.Owner.TableConstraints.Remove(foreignKey);
98140
}
99141
}
100142
}
@@ -104,8 +146,9 @@ private void RemoveIndexes(DataTable table, string columnName)
104146
var indexes = table.Indexes.Select(index => index)
105147
.Where(item => item.Columns.Any(column => stringComparer.Equals(column.Name, columnName)))
106148
.ToList();
107-
foreach (var index in indexes)
108-
table.Indexes.Remove(index);
149+
foreach (var index in indexes) {
150+
_ = table.Indexes.Remove(index);
151+
}
109152
}
110153

111154
// Constructors

0 commit comments

Comments
 (0)