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
1010using Xtensive . Core ;
1111using Xtensive . Orm . Configuration ;
1212using Xtensive . Orm . Providers ;
13+ using Xtensive . Orm . Rse ;
1314using Xtensive . Sql . Model ;
1415
1516namespace 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