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