@@ -58,12 +58,9 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa
58
58
59
59
private final MetaDataPersistFacade metaDataPersistFacade ;
60
60
61
- private final RuleItemChangedNodePathBuilder ruleItemChangedNodePathBuilder ;
62
-
63
61
public StandaloneMetaDataManagerPersistService (final MetaDataContextManager metaDataContextManager ) {
64
62
this .metaDataContextManager = metaDataContextManager ;
65
63
metaDataPersistFacade = metaDataContextManager .getMetaDataPersistFacade ();
66
- ruleItemChangedNodePathBuilder = new RuleItemChangedNodePathBuilder ();
67
64
}
68
65
69
66
@ Override
@@ -208,54 +205,65 @@ public void alterRuleConfiguration(final ShardingSphereDatabase database, final
208
205
return ;
209
206
}
210
207
Collection <String > needReloadTables = getNeedReloadTables (database , toBeAlteredRuleConfig );
211
- for (MetaDataVersion each : metaDataPersistFacade .getDatabaseRuleService ().persist (database .getName (), Collections .singleton (toBeAlteredRuleConfig ))) {
212
- Optional <DatabaseRuleNodePath > databaseRuleNodePath = ruleItemChangedNodePathBuilder .build (database .getName (), new VersionNodePath (each .getNodePath ()).getActiveVersionPath ());
213
- if (databaseRuleNodePath .isPresent ()
214
- && new ActiveVersionChecker (metaDataPersistFacade .getRepository ()).checkSame (new VersionNodePath (databaseRuleNodePath .get ()), each .getActiveVersion ())) {
215
- metaDataContextManager .getDatabaseRuleItemManager ().alter (databaseRuleNodePath .get ());
216
- }
217
- }
208
+ Collection <MetaDataVersion > metaDataVersions = metaDataPersistFacade .getDatabaseRuleService ().persist (database .getName (), Collections .singleton (toBeAlteredRuleConfig ));
209
+ alterRuleItem (database .getName (), metaDataVersions );
218
210
Map <String , Collection <ShardingSphereTable >> schemaAndTablesMap = metaDataPersistFacade .getDatabaseMetaDataFacade ().persistAlteredTables (
219
211
database .getName (), metaDataContextManager .getMetaDataContexts (), needReloadTables );
220
212
alterTables (database , schemaAndTablesMap );
221
213
OrderedServicesCache .clearCache ();
222
214
}
223
215
216
+ private void alterRuleItem (final String databaseName , final Collection <MetaDataVersion > metaDataVersions ) throws SQLException {
217
+ RuleItemChangedNodePathBuilder ruleItemChangedNodePathBuilder = new RuleItemChangedNodePathBuilder ();
218
+ ActiveVersionChecker activeVersionChecker = new ActiveVersionChecker (metaDataPersistFacade .getRepository ());
219
+ for (MetaDataVersion each : metaDataVersions ) {
220
+ Optional <DatabaseRuleNodePath > databaseRuleNodePath = ruleItemChangedNodePathBuilder .build (databaseName , new VersionNodePath (each .getNodePath ()).getActiveVersionPath ());
221
+ if (databaseRuleNodePath .isPresent () && activeVersionChecker .checkSame (new VersionNodePath (databaseRuleNodePath .get ()), each .getActiveVersion ())) {
222
+ metaDataContextManager .getDatabaseRuleItemManager ().alter (databaseRuleNodePath .get ());
223
+ }
224
+ }
225
+ }
226
+
224
227
@ Override
225
228
public void removeRuleConfigurationItem (final ShardingSphereDatabase database , final RuleConfiguration toBeRemovedRuleConfig ) throws SQLException {
226
229
if (null == toBeRemovedRuleConfig ) {
227
230
return ;
228
231
}
229
232
Collection <String > needReloadTables = getNeedReloadTables (database , toBeRemovedRuleConfig );
230
233
Collection <MetaDataVersion > metaDataVersions = metaDataPersistFacade .getDatabaseRuleService ().delete (database .getName (), Collections .singleton (toBeRemovedRuleConfig ));
231
- for (MetaDataVersion each : metaDataVersions ) {
232
- Optional <DatabaseRuleNodePath > databaseRuleNodePath = ruleItemChangedNodePathBuilder .build (database .getName (), new VersionNodePath (each .getNodePath ()).getActiveVersionPath ());
233
- if (databaseRuleNodePath .isPresent ()) {
234
- metaDataContextManager .getDatabaseRuleItemManager ().drop (databaseRuleNodePath .get ());
235
- }
236
- }
234
+ removeRuleItem (database .getName (), metaDataVersions );
237
235
Map <String , Collection <ShardingSphereTable >> schemaAndTablesMap = metaDataPersistFacade .getDatabaseMetaDataFacade ().persistAlteredTables (
238
236
database .getName (), metaDataContextManager .getMetaDataContexts (), needReloadTables );
239
237
alterTables (database , schemaAndTablesMap );
240
238
OrderedServicesCache .clearCache ();
241
239
}
242
240
243
- private void alterTables (final ShardingSphereDatabase database , final Map <String , Collection <ShardingSphereTable >> schemaAndTablesMap ) {
244
- for (Entry <String , Collection <ShardingSphereTable >> entry : schemaAndTablesMap .entrySet ()) {
245
- for (ShardingSphereTable each : entry .getValue ()) {
246
- metaDataContextManager .getDatabaseMetaDataManager ().alterTable (database .getName (), entry .getKey (), each );
241
+ private void removeRuleItem (final String databaseName , final Collection <MetaDataVersion > metaDataVersions ) throws SQLException {
242
+ RuleItemChangedNodePathBuilder ruleItemChangedNodePathBuilder = new RuleItemChangedNodePathBuilder ();
243
+ for (MetaDataVersion each : metaDataVersions ) {
244
+ Optional <DatabaseRuleNodePath > databaseRuleNodePath = ruleItemChangedNodePathBuilder .build (databaseName , new VersionNodePath (each .getNodePath ()).getActiveVersionPath ());
245
+ if (databaseRuleNodePath .isPresent ()) {
246
+ metaDataContextManager .getDatabaseRuleItemManager ().drop (databaseRuleNodePath .get ());
247
247
}
248
248
}
249
249
}
250
250
251
- private Collection <String > getNeedReloadTables (final ShardingSphereDatabase originalShardingDatabase , final RuleConfiguration toBeAlteredRuleConfig ) {
251
+ private Collection <String > getNeedReloadTables (final ShardingSphereDatabase originalDatabase , final RuleConfiguration toBeAlteredRuleConfig ) {
252
252
if (toBeAlteredRuleConfig instanceof SingleRuleConfiguration ) {
253
- Collection <String > originalSingleTables = originalShardingDatabase .getRuleMetaData ().getSingleRule (SingleRule .class ).getConfiguration ().getLogicTableNames ();
253
+ Collection <String > originalSingleTables = originalDatabase .getRuleMetaData ().getSingleRule (SingleRule .class ).getConfiguration ().getLogicTableNames ();
254
254
return toBeAlteredRuleConfig .getLogicTableNames ().stream ().filter (each -> !originalSingleTables .contains (each )).collect (Collectors .toList ());
255
255
}
256
256
return toBeAlteredRuleConfig .getLogicTableNames ();
257
257
}
258
258
259
+ private void alterTables (final ShardingSphereDatabase database , final Map <String , Collection <ShardingSphereTable >> schemaAndTablesMap ) {
260
+ for (Entry <String , Collection <ShardingSphereTable >> entry : schemaAndTablesMap .entrySet ()) {
261
+ for (ShardingSphereTable each : entry .getValue ()) {
262
+ metaDataContextManager .getDatabaseMetaDataManager ().alterTable (database .getName (), entry .getKey (), each );
263
+ }
264
+ }
265
+ }
266
+
259
267
@ Override
260
268
public void removeRuleConfiguration (final ShardingSphereDatabase database , final String ruleType ) {
261
269
metaDataPersistFacade .getDatabaseRuleService ().delete (database .getName (), ruleType );
0 commit comments