This is an automated email from the ASF dual-hosted git repository.
menghaoran 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 af6c59b0274 Refactor PushDownMetaDataRefreshEngine (#37992)
af6c59b0274 is described below
commit af6c59b0274c1ce262c5bb29216ac52327e424d1
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Feb 9 16:21:14 2026 +0800
Refactor PushDownMetaDataRefreshEngine (#37992)
---
.../pushdown/PushDownMetaDataRefreshEngine.java | 48 ++++++++++++++--------
.../PushDownMetaDataRefreshEngineTest.java | 9 ++--
2 files changed, 37 insertions(+), 20 deletions(-)
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngine.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngine.java
index 143f183efd2..76db48f3f14 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngine.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngine.java
@@ -27,9 +27,24 @@ import
org.apache.shardingsphere.infra.route.context.RouteUnit;
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.index.AlterIndexStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.CreateIndexStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.DropIndexStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.AlterSchemaStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.CreateSchemaStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.DropSchemaStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.AlterTableStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
+import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.RenameTableStatement;
+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.sql.SQLException;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -40,21 +55,12 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public final class PushDownMetaDataRefreshEngine {
- private final SQLStatementContext sqlStatementContext;
-
- @SuppressWarnings("rawtypes")
- private final PushDownMetaDataRefresher refresher;
-
- public PushDownMetaDataRefreshEngine(final SQLStatementContext
sqlStatementContext) {
- this.sqlStatementContext = sqlStatementContext;
- refresher =
findPushDownMetaDataRefresher(sqlStatementContext).orElse(null);
- }
+ private static final Collection<Class<?>> SUPPORTED_REFRESH_TYPES = new
HashSet<>(Arrays.asList(CreateViewStatement.class, AlterViewStatement.class,
DropViewStatement.class,
+ CreateIndexStatement.class, AlterIndexStatement.class,
DropIndexStatement.class,
+ CreateSchemaStatement.class, AlterSchemaStatement.class,
DropSchemaStatement.class,
+ CreateTableStatement.class, AlterTableStatement.class,
DropTableStatement.class, RenameTableStatement.class));
- @SuppressWarnings("rawtypes")
- private Optional<PushDownMetaDataRefresher>
findPushDownMetaDataRefresher(final SQLStatementContext sqlStatementContext) {
- Optional<PushDownMetaDataRefresher> refresher =
TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass());
- return refresher.isPresent() ? refresher :
TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
- }
+ private final SQLStatementContext sqlStatementContext;
/**
* Whether to need refresh meta data.
@@ -62,7 +68,7 @@ public final class PushDownMetaDataRefreshEngine {
* @return is need refresh meta data or not
*/
public boolean isNeedRefresh() {
- return null != refresher;
+ return
SUPPORTED_REFRESH_TYPES.contains(sqlStatementContext.getSqlStatement().getClass());
}
/**
@@ -77,11 +83,21 @@ public final class PushDownMetaDataRefreshEngine {
@SuppressWarnings("unchecked")
public void refresh(final MetaDataManagerPersistService
metaDataManagerPersistService,
final ShardingSphereDatabase database, final
ConfigurationProperties props, final Collection<RouteUnit> routeUnits) throws
SQLException {
+ Optional<PushDownMetaDataRefresher> refresher =
findPushDownMetaDataRefresher(sqlStatementContext);
+ if (!refresher.isPresent()) {
+ return;
+ }
Collection<String> logicDataSourceNames = routeUnits.stream().map(each
-> each.getDataSourceMapper().getLogicName()).collect(Collectors.toList());
String schemaName = SchemaRefreshUtils.getSchemaName(database,
sqlStatementContext);
DatabaseType databaseType = routeUnits.stream().map(each ->
database.getResourceMetaData().getStorageUnits().get(each.getDataSourceMapper().getActualName()))
.filter(Objects::nonNull).findFirst().map(StorageUnit::getStorageType).orElseGet(()
-> sqlStatementContext.getSqlStatement().getDatabaseType());
- refresher.refresh(metaDataManagerPersistService, database,
+ refresher.get().refresh(metaDataManagerPersistService, database,
logicDataSourceNames.isEmpty() ? null :
logicDataSourceNames.iterator().next(), schemaName, databaseType,
sqlStatementContext.getSqlStatement(), props);
}
+
+ @SuppressWarnings("rawtypes")
+ private Optional<PushDownMetaDataRefresher>
findPushDownMetaDataRefresher(final SQLStatementContext sqlStatementContext) {
+ Optional<PushDownMetaDataRefresher> refresher =
TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass());
+ return refresher.isPresent() ? refresher :
TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatementContext.getSqlStatement().getClass().getSuperclass());
+ }
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngineTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngineTest.java
index 1cf09943de9..ac50b879d0a 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngineTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/pushdown/PushDownMetaDataRefreshEngineTest.java
@@ -42,7 +42,6 @@ import java.util.Optional;
import java.util.Properties;
import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -78,7 +77,7 @@ class PushDownMetaDataRefreshEngineTest {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
PushDownMetaDataRefresher<SQLStatement> refresher =
mock(PushDownMetaDataRefresher.class);
when(TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
- assertTrue(new
PushDownMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
+ assertFalse(new
PushDownMetaDataRefreshEngine(sqlStatementContext).isNeedRefresh());
}
@SuppressWarnings("unchecked")
@@ -95,7 +94,8 @@ class PushDownMetaDataRefreshEngineTest {
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
ConfigurationProperties props = new ConfigurationProperties(new
Properties());
PushDownMetaDataRefresher<SQLStatement> refresher =
mock(PushDownMetaDataRefresher.class);
- new PushDownMetaDataRefreshEngine(sqlStatementContext,
refresher).refresh(
+ when(TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
+ new PushDownMetaDataRefreshEngine(sqlStatementContext).refresh(
metaDataManagerPersistService, database, props,
Collections.singleton(new RouteUnit(new RouteMapper("logic_ds", "actual_ds"),
Collections.emptyList())));
verify(refresher).refresh(metaDataManagerPersistService, database,
"logic_ds", "foo_schema", storageType, sqlStatement, props);
}
@@ -108,7 +108,8 @@ class PushDownMetaDataRefreshEngineTest {
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
ConfigurationProperties props = new ConfigurationProperties(new
Properties());
PushDownMetaDataRefresher<SQLStatement> refresher =
mock(PushDownMetaDataRefresher.class);
- new PushDownMetaDataRefreshEngine(sqlStatementContext,
refresher).refresh(metaDataManagerPersistService, database, props,
Collections.emptyList());
+ when(TypedSPILoader.findService(PushDownMetaDataRefresher.class,
sqlStatement.getClass())).thenReturn(Optional.of(refresher));
+ new
PushDownMetaDataRefreshEngine(sqlStatementContext).refresh(metaDataManagerPersistService,
database, props, Collections.emptyList());
verify(refresher).refresh(metaDataManagerPersistService, database,
null, "foo_schema", databaseType, sqlStatement, props);
}
}