This is an automated email from the ASF dual-hosted git repository.

hucong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new aeeba8a9010 Refactor FederationMetaDataRefreshEngine (#37969)
aeeba8a9010 is described below

commit aeeba8a90101c47bca63cee1879ba6024e1ba434
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Feb 6 16:13:19 2026 +0800

    Refactor FederationMetaDataRefreshEngine (#37969)
---
 .../FederationMetaDataRefreshEngine.java           | 36 ++++++----
 .../FederationMetaDataRefreshEngineTest.java       | 84 +++++++---------------
 2 files changed, 48 insertions(+), 72 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
index 74640a5be73..caaf12bf6fb 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngine.java
@@ -22,7 +22,13 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mode.metadata.refresher.util.SchemaRefreshUtils;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Optional;
 
 /**
@@ -30,20 +36,12 @@ import java.util.Optional;
  */
 public final class FederationMetaDataRefreshEngine {
     
-    private final SQLStatementContext sqlStatementContext;
+    private static final Collection<Class<?>> SUPPORTED_REFRESH_TYPES = new 
HashSet<>(Arrays.asList(CreateViewStatement.class, AlterViewStatement.class, 
DropViewStatement.class));
     
-    @SuppressWarnings("rawtypes")
-    private final FederationMetaDataRefresher refresher;
+    private final SQLStatementContext sqlStatementContext;
     
     public FederationMetaDataRefreshEngine(final SQLStatementContext 
sqlStatementContext) {
         this.sqlStatementContext = sqlStatementContext;
-        refresher = findFederationMetaDataRefresher().orElse(null);
-    }
-    
-    @SuppressWarnings("rawtypes")
-    private Optional<FederationMetaDataRefresher> 
findFederationMetaDataRefresher() {
-        Optional<FederationMetaDataRefresher> refresher = 
TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatementContext.getSqlStatement().getClass());
-        return refresher.isPresent() ? refresher : 
TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
     }
     
     /**
@@ -52,7 +50,7 @@ public final class FederationMetaDataRefreshEngine {
      * @return is need refresh meta data or not
      */
     public boolean isNeedRefresh() {
-        return null != refresher;
+        return 
SUPPORTED_REFRESH_TYPES.contains(sqlStatementContext.getSqlStatement().getClass());
     }
     
     /**
@@ -61,9 +59,19 @@ public final class FederationMetaDataRefreshEngine {
      * @param metaDataManagerPersistService meta data manager persist service
      * @param database database
      */
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "rawtypes"})
     public void refresh(final MetaDataManagerPersistService 
metaDataManagerPersistService, final ShardingSphereDatabase database) {
-        refresher.refresh(metaDataManagerPersistService,
-                sqlStatementContext.getSqlStatement().getDatabaseType(), 
database, SchemaRefreshUtils.getSchemaName(database, sqlStatementContext), 
sqlStatementContext.getSqlStatement());
+        Optional<FederationMetaDataRefresher> refresher = 
findFederationMetaDataRefresher();
+        if (!refresher.isPresent()) {
+            return;
+        }
+        refresher.get().refresh(metaDataManagerPersistService, 
sqlStatementContext.getSqlStatement().getDatabaseType(),
+                database, SchemaRefreshUtils.getSchemaName(database, 
sqlStatementContext), sqlStatementContext.getSqlStatement());
+    }
+    
+    @SuppressWarnings("rawtypes")
+    private Optional<FederationMetaDataRefresher> 
findFederationMetaDataRefresher() {
+        Optional<FederationMetaDataRefresher> refresher = 
TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatementContext.getSqlStatement().getClass());
+        return refresher.isPresent() ? refresher : 
TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
     }
 }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngineTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngineTest.java
index 1c8907a0c27..c7ea6574ed9 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngineTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/federation/FederationMetaDataRefreshEngineTest.java
@@ -23,20 +23,20 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mode.metadata.refresher.util.SchemaRefreshUtils;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DMLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DeleteStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.InsertStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.UpdateStatement;
 import 
org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
 import 
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
+
 import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -58,100 +58,68 @@ class FederationMetaDataRefreshEngineTest {
     private SQLStatementContext sqlStatementContext;
     
     @Test
-    void assertIsNeedRefreshWhenRefresherAbsent() {
+    void assertIsNeedRefreshWhenStatementNotSupported() {
         when(sqlStatementContext.getSqlStatement()).thenReturn(new 
UpdateStatement(databaseType));
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
UpdateStatement.class)).thenReturn(Optional.empty());
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
DMLStatement.class)).thenReturn(Optional.empty());
         assertFalse(new 
FederationMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
     }
     
-    @SuppressWarnings("unchecked")
     @Test
-    void assertIsNeedRefreshWhenRefresherFoundFromSuperClass() {
-        SQLStatement sqlStatement = mock(SQLStatement.class);
-        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatement.getClass())).thenReturn(Optional.empty());
-        FederationMetaDataRefresher<SQLStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
SQLStatement.class)).thenReturn(Optional.of(refresher));
+    void assertIsNeedRefreshWhenCreateViewStatement() {
+        when(sqlStatementContext.getSqlStatement()).thenReturn(new 
CreateViewStatement(databaseType));
         assertTrue(new 
FederationMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
     }
     
-    @SuppressWarnings("unchecked")
     @Test
-    void assertIsNeedRefreshWhenRefresherFoundFromExactClass() {
-        SQLStatement sqlStatement = mock(SQLStatement.class);
-        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        FederationMetaDataRefresher<SQLStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
+    void assertIsNeedRefreshWhenAlterViewStatement() {
+        when(sqlStatementContext.getSqlStatement()).thenReturn(new 
AlterViewStatement(databaseType));
         assertTrue(new 
FederationMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
     }
     
     @Test
-    void assertIsNeedRefreshWithDifferentStatementTypes() {
-        DeleteStatement deleteStatement = new DeleteStatement(databaseType);
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(deleteStatement);
-        FederationMetaDataRefresher<DeleteStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
DeleteStatement.class)).thenReturn(Optional.of(refresher));
+    void assertIsNeedRefreshWhenDropViewStatement() {
+        when(sqlStatementContext.getSqlStatement()).thenReturn(new 
DropViewStatement(databaseType));
         assertTrue(new 
FederationMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
     }
     
-    @SuppressWarnings("unchecked")
     @Test
-    void assertRefresh() {
-        SQLStatement sqlStatement = mock(SQLStatement.class);
-        when(sqlStatement.getDatabaseType()).thenReturn(databaseType);
+    void assertRefreshWithCreateViewStatement() {
+        CreateViewStatement sqlStatement = new 
CreateViewStatement(databaseType);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        FederationMetaDataRefresher<SQLStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
+        FederationMetaDataRefresher<CreateViewStatement> refresher = 
mock(FederationMetaDataRefresher.class);
+        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
CreateViewStatement.class)).thenReturn(Optional.of(refresher));
         when(SchemaRefreshUtils.getSchemaName(database, 
sqlStatementContext)).thenReturn("foo_schema");
         new 
FederationMetaDataRefreshEngine(sqlStatementContext).refresh(metaDataManagerPersistService,
 database);
         verify(refresher).refresh(metaDataManagerPersistService, databaseType, 
database, "foo_schema", sqlStatement);
     }
     
-    @SuppressWarnings("unchecked")
     @Test
-    void assertRefreshWithDifferentSchemaName() {
-        InsertStatement sqlStatement = new InsertStatement(databaseType);
+    void assertRefreshWithAlterViewStatement() {
+        AlterViewStatement sqlStatement = new AlterViewStatement(databaseType);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        FederationMetaDataRefresher<InsertStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
InsertStatement.class)).thenReturn(Optional.of(refresher));
+        FederationMetaDataRefresher<AlterViewStatement> refresher = 
mock(FederationMetaDataRefresher.class);
+        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
AlterViewStatement.class)).thenReturn(Optional.of(refresher));
         when(SchemaRefreshUtils.getSchemaName(database, 
sqlStatementContext)).thenReturn("bar_schema");
         new 
FederationMetaDataRefreshEngine(sqlStatementContext).refresh(metaDataManagerPersistService,
 database);
         verify(refresher).refresh(metaDataManagerPersistService, databaseType, 
database, "bar_schema", sqlStatement);
     }
     
     @Test
-    void assertRefreshThrowsNullPointerExceptionWhenRefresherIsNull() {
+    void assertRefreshWhenRefresherNotFound() {
         when(sqlStatementContext.getSqlStatement()).thenReturn(new 
UpdateStatement(databaseType));
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
UpdateStatement.class)).thenReturn(Optional.empty());
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
DMLStatement.class)).thenReturn(Optional.empty());
         FederationMetaDataRefreshEngine engine = new 
FederationMetaDataRefreshEngine(sqlStatementContext);
-        assertThrows(NullPointerException.class, () -> 
engine.refresh(metaDataManagerPersistService, database));
+        engine.refresh(metaDataManagerPersistService, database);
     }
     
-    @SuppressWarnings("unchecked")
     @Test
     void assertRefreshMultipleTimesWithSameStatement() {
-        SQLStatement sqlStatement = mock(SQLStatement.class);
-        when(sqlStatement.getDatabaseType()).thenReturn(databaseType);
+        CreateViewStatement sqlStatement = new 
CreateViewStatement(databaseType);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        FederationMetaDataRefresher<SQLStatement> refresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
+        FederationMetaDataRefresher<CreateViewStatement> refresher = 
mock(FederationMetaDataRefresher.class);
+        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
CreateViewStatement.class)).thenReturn(Optional.of(refresher));
         when(SchemaRefreshUtils.getSchemaName(database, 
sqlStatementContext)).thenReturn("foo_schema");
         FederationMetaDataRefreshEngine engine = new 
FederationMetaDataRefreshEngine(sqlStatementContext);
         engine.refresh(metaDataManagerPersistService, database);
         engine.refresh(metaDataManagerPersistService, database);
-        verify(refresher, 
org.mockito.Mockito.times(2)).refresh(metaDataManagerPersistService, 
databaseType, database, "foo_schema", sqlStatement);
-    }
-    
-    @SuppressWarnings("unchecked")
-    @Test
-    void assertIsNeedRefreshWhenRefresherFoundForBothClassAndSuperClass() {
-        SQLStatement sqlStatement = mock(SQLStatement.class);
-        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
-        FederationMetaDataRefresher<SQLStatement> classRefresher = 
mock(FederationMetaDataRefresher.class);
-        when(TypedSPILoader.findService(FederationMetaDataRefresher.class, 
sqlStatement.getClass())).thenReturn(Optional.of(classRefresher));
-        FederationMetaDataRefreshEngine engine = new 
FederationMetaDataRefreshEngine(sqlStatementContext);
-        assertTrue(engine.isNeedRefresh());
+        verify(refresher, 
Mockito.times(2)).refresh(metaDataManagerPersistService, databaseType, 
database, "foo_schema", sqlStatement);
     }
 }

Reply via email to