From 4c09ccfab7299b9adfa021b1ce6831a546478dee Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Mon, 9 Dec 2024 13:46:08 +0800 Subject: [PATCH 001/192] Refactor Tableless route logic and add more unit test (#33973) --- .../TablelessRouteEngineFactory.java | 2 +- ...TablelessDataSourceUnicastRouteEngine.java | 11 ++-- .../TablelessRouteEngineFactoryTest.java | 2 +- ...essDataSourceBroadcastRouteEngineTest.java | 50 +++++++++++++++ ...elessInstanceBroadcastRouteEngineTest.java | 53 ++++++++++++++++ .../TablelessIgnoreRouteEngineTest.java | 40 ++++++++++++ ...elessDataSourceUnicastRouteEngineTest.java | 63 +++++++++++++++++++ 7 files changed, 212 insertions(+), 9 deletions(-) rename infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/{unicast => }/TablelessDataSourceUnicastRouteEngine.java (82%) create mode 100644 infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessDataSourceBroadcastRouteEngineTest.java create mode 100644 infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessInstanceBroadcastRouteEngineTest.java create mode 100644 infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/ignore/TablelessIgnoreRouteEngineTest.java create mode 100644 infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngineTest.java diff --git a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java index 785c2f1265e0f..c133e01f69021 100644 --- a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java +++ b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast.TablelessDataSourceBroadcastRouteEngine; import org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast.TablelessInstanceBroadcastRouteEngine; import org.apache.shardingsphere.infra.route.engine.tableless.type.ignore.TablelessIgnoreRouteEngine; -import org.apache.shardingsphere.infra.route.engine.tableless.type.unicast.unicast.TablelessDataSourceUnicastRouteEngine; +import org.apache.shardingsphere.infra.route.engine.tableless.type.unicast.TablelessDataSourceUnicastRouteEngine; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; diff --git a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/unicast/TablelessDataSourceUnicastRouteEngine.java b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngine.java similarity index 82% rename from infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/unicast/TablelessDataSourceUnicastRouteEngine.java rename to infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngine.java index 39d6381c6d3dd..d771880cb9369 100644 --- a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/unicast/TablelessDataSourceUnicastRouteEngine.java +++ b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngine.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.route.engine.tableless.type.unicast.unicast; +package org.apache.shardingsphere.infra.route.engine.tableless.type.unicast; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.concurrent.ThreadLocalRandom; /** @@ -42,8 +41,7 @@ public final class TablelessDataSourceUnicastRouteEngine implements TablelessRou @Override public RouteContext route(final RuleMetaData globalRuleMetaData, final Collection aggregatedDataSources) { RouteContext result = new RouteContext(); - RouteMapper dataSourceMapper = getDataSourceRouteMapper(aggregatedDataSources); - result.getRouteUnits().add(new RouteUnit(dataSourceMapper, Collections.emptyList())); + result.getRouteUnits().add(new RouteUnit(getDataSourceRouteMapper(aggregatedDataSources), Collections.emptyList())); return result; } @@ -53,8 +51,7 @@ private RouteMapper getDataSourceRouteMapper(final Collection dataSource } private String getRandomDataSourceName(final Collection dataSourceNames) { - Collection usedDataSourceNames = connectionContext.getUsedDataSourceNames(); - List availableDataSourceNames = new ArrayList<>(usedDataSourceNames.isEmpty() ? dataSourceNames : usedDataSourceNames); - return availableDataSourceNames.get(ThreadLocalRandom.current().nextInt(availableDataSourceNames.size())); + Collection usedDataSourceNames = connectionContext.getUsedDataSourceNames().isEmpty() ? dataSourceNames : connectionContext.getUsedDataSourceNames(); + return new ArrayList<>(usedDataSourceNames).get(ThreadLocalRandom.current().nextInt(usedDataSourceNames.size())); } } diff --git a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java index 13f71e9dc82d4..5937f0675e08b 100644 --- a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java +++ b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast.TablelessDataSourceBroadcastRouteEngine; import org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast.TablelessInstanceBroadcastRouteEngine; -import org.apache.shardingsphere.infra.route.engine.tableless.type.unicast.unicast.TablelessDataSourceUnicastRouteEngine; +import org.apache.shardingsphere.infra.route.engine.tableless.type.unicast.TablelessDataSourceUnicastRouteEngine; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement; diff --git a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessDataSourceBroadcastRouteEngineTest.java b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessDataSourceBroadcastRouteEngineTest.java new file mode 100644 index 0000000000000..b1d84018277a8 --- /dev/null +++ b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessDataSourceBroadcastRouteEngineTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast; + +import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class TablelessDataSourceBroadcastRouteEngineTest { + + @Test + void assertRoute() { + RouteContext actual = new TablelessDataSourceBroadcastRouteEngine().route(mock(RuleMetaData.class), Arrays.asList("foo_ds_1", "foo_ds_2")); + assertThat(actual.getRouteUnits().size(), is(2)); + List routeUnits = new ArrayList<>(actual.getRouteUnits()); + assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), is("foo_ds_1")); + assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), is("foo_ds_1")); + assertThat(routeUnits.get(0).getTableMappers().size(), is(0)); + assertThat(routeUnits.get(1).getDataSourceMapper().getLogicName(), is("foo_ds_2")); + assertThat(routeUnits.get(1).getDataSourceMapper().getActualName(), is("foo_ds_2")); + assertThat(routeUnits.get(1).getTableMappers().size(), is(0)); + } +} diff --git a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessInstanceBroadcastRouteEngineTest.java b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessInstanceBroadcastRouteEngineTest.java new file mode 100644 index 0000000000000..9c102ed666f7b --- /dev/null +++ b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/broadcast/TablelessInstanceBroadcastRouteEngineTest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast; + +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class TablelessInstanceBroadcastRouteEngineTest { + + @Test + void assertRoute() { + ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); + when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("foo_ds_1")); + RouteContext actual = new TablelessInstanceBroadcastRouteEngine(database).route(mock(RuleMetaData.class), Arrays.asList("foo_ds_1", "foo_ds_2")); + assertThat(actual.getRouteUnits().size(), is(1)); + List routeUnits = new ArrayList<>(actual.getRouteUnits()); + assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), is("foo_ds_1")); + assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), is("foo_ds_1")); + assertThat(routeUnits.get(0).getTableMappers().size(), is(0)); + } +} diff --git a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/ignore/TablelessIgnoreRouteEngineTest.java b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/ignore/TablelessIgnoreRouteEngineTest.java new file mode 100644 index 0000000000000..75b3d21545638 --- /dev/null +++ b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/ignore/TablelessIgnoreRouteEngineTest.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.route.engine.tableless.type.ignore; + +import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class TablelessIgnoreRouteEngineTest { + + @Test + void assertRoute() { + RouteContext actual = new TablelessIgnoreRouteEngine().route(mock(RuleMetaData.class), Collections.emptyList()); + assertThat(actual.getRouteUnits().size(), is(0)); + } +} diff --git a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngineTest.java b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngineTest.java new file mode 100644 index 0000000000000..e2f26d8c7231e --- /dev/null +++ b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/type/unicast/TablelessDataSourceUnicastRouteEngineTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.route.engine.tableless.type.unicast; + +import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.apache.shardingsphere.infra.session.connection.ConnectionContext; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class TablelessDataSourceUnicastRouteEngineTest { + + @Test + void assertRouteWithoutUsedDataSourceNames() { + ConnectionContext connectionContext = new ConnectionContext(Collections::emptyList); + Collection aggregatedDataSources = Arrays.asList("foo_ds_1", "foo_ds_2"); + RouteContext actual = new TablelessDataSourceUnicastRouteEngine(connectionContext).route(mock(RuleMetaData.class), aggregatedDataSources); + assertThat(actual.getRouteUnits().size(), is(1)); + RouteUnit routeUnit = actual.getRouteUnits().iterator().next(); + assertTrue(aggregatedDataSources.contains(routeUnit.getDataSourceMapper().getLogicName())); + assertTrue(aggregatedDataSources.contains(routeUnit.getDataSourceMapper().getActualName())); + assertThat(routeUnit.getTableMappers().size(), is(0)); + } + + @Test + void assertRouteWithUsedDataSourceNames() { + ConnectionContext connectionContext = new ConnectionContext(() -> Collections.singleton("foo_ds_1")); + Collection aggregatedDataSources = Arrays.asList("foo_ds_1", "foo_ds_2"); + RouteContext actual = new TablelessDataSourceUnicastRouteEngine(connectionContext).route(mock(RuleMetaData.class), aggregatedDataSources); + assertThat(actual.getRouteUnits().size(), is(1)); + RouteUnit routeUnit = actual.getRouteUnits().iterator().next(); + assertThat(routeUnit.getDataSourceMapper().getLogicName(), is("foo_ds_1")); + assertThat(routeUnit.getDataSourceMapper().getActualName(), is("foo_ds_1")); + assertThat(routeUnit.getTableMappers().size(), is(0)); + } +} From b18182df38b0ec5eaa4cc7de6a704072e8a24fe8 Mon Sep 17 00:00:00 2001 From: Maxim Sentyabrskiy <162702318+makssent@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:28:53 +0300 Subject: [PATCH 002/192] Adds documentation for Firebird support(#33782) (#33975) --- .../optional-plugins/testcontainers/_index.cn.md | 1 + .../optional-plugins/testcontainers/_index.en.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.cn.md index c1e8f42506852..4de7d12b78a76 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.cn.md @@ -70,6 +70,7 @@ dataSources: 5. 为 `jdbc:tc:mysql:` 的 jdbcURL 前缀提供支持的 Maven 模块 `org.testcontainers:mysql:1.20.3` 6. 为 `jdbc:tc:oracle:` 的 jdbcURL 前缀提供支持的 Maven 模块 `org.testcontainers:oracle-xe:1.20.3` 和 `org.testcontainers:oracle-free:1.20.3` 7. 为 `jdbc:tc:tidb:` 的 jdbcURL 前缀提供支持的 Maven 模块 `org.testcontainers:tidb:1.20.3` +8. 为 `jdbc:tc:firebird:` 的 jdbcURL 前缀提供支持的 Maven 模块 `org.firebirdsql:firebird-testcontainers-java:1.4.0` ## 使用限制 diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.en.md index 82cebf382ec8a..60950508b23f6 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/testcontainers/_index.en.md @@ -70,6 +70,7 @@ dataSources: 5. Maven module `org.testcontainers:mysql:1.20.3` that provides support for jdbcURL prefixes of `jdbc:tc:mysql:` 6. Maven modules `org.testcontainers:oracle-xe:1.20.3` and `org.testcontainers:oracle-free:1.20.3` that provide support for jdbcURL prefixes of `jdbc:tc:oracle:` 7. Maven module `org.testcontainers:tidb:1.20.3` that provides support for jdbcURL prefixes of `jdbc:tc:tidb:` +8. Maven module `org.firebirdsql:firebird-testcontainers-java:1.4.0` that provides support for jdbcURL prefixes of `jdbc:tc:firebird:` ## Usage restrictions From f33a6a2bb4f608574f13ed54b3a8e8e9ced049b9 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Mon, 9 Dec 2024 18:51:59 +0800 Subject: [PATCH 003/192] Fix sharding column route (#33974) --- .../condition/engine/WhereClauseShardingConditionEngine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java index 7613839e39470..752f68dbff152 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java @@ -120,7 +120,8 @@ private Map> createShardingConditionV Map> result = new HashMap<>(predicates.size(), 1F); for (ExpressionSegment each : predicates) { for (ColumnSegment columnSegment : ColumnExtractor.extract(each)) { - Optional tableName = Optional.ofNullable(columnTableNames.get(columnSegment.getExpression())); + Optional tableName = Optional.ofNullable(Optional.ofNullable(columnTableNames.get(columnSegment.getExpression())) + .orElse(columnSegment.getColumnBoundInfo().getOriginalTable().getValue())); Optional shardingColumn = tableName.flatMap(optional -> shardingRule.findShardingColumn(columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(), optional)); if (!tableName.isPresent() || !shardingColumn.isPresent()) { continue; From 830f9bc71d934c325f1a569f9d3c0a0523afddea Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Mon, 9 Dec 2024 22:22:21 +0800 Subject: [PATCH 004/192] Code format for InsertStatementContext (#33979) --- .../binder/context/statement/dml/InsertStatementContext.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java index 64453d4a7af7b..2f48a3daada07 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java @@ -104,7 +104,8 @@ public InsertStatementContext(final ShardingSphereMetaData metaData, final List< tablesContext = new TablesContext(getAllSimpleTableSegments(), getDatabaseType(), currentDatabaseName); List insertColumnNames = getInsertColumnNames(); ShardingSphereSchema schema = getSchema(metaData, currentDatabaseName); - columnNames = containsInsertColumns() ? insertColumnNames + columnNames = containsInsertColumns() + ? insertColumnNames : sqlStatement.getTable().map(optional -> schema.getVisibleColumnNames(optional.getTableName().getIdentifier().getValue())).orElseGet(Collections::emptyList); insertColumnNamesAndIndexes = createInsertColumnNamesAndIndexes(insertColumnNames); generatedKeyContext = new GeneratedKeyContextEngine(sqlStatement, schema).createGenerateKeyContext(insertColumnNamesAndIndexes, insertValueContexts, params).orElse(null); From 9035f4c6d5433d845aadbace2f4aa9b44b62ffa3 Mon Sep 17 00:00:00 2001 From: Timofey Sakharovsky <81485481+TedCraft@users.noreply.github.com> Date: Mon, 9 Dec 2024 17:45:10 +0300 Subject: [PATCH 005/192] Add firebird classes to infra/common and jdbc POMs (#33976) --- infra/common/pom.xml | 5 +++++ jdbc/pom.xml | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/infra/common/pom.xml b/infra/common/pom.xml index 4060398257507..d5f71e2e54b8a 100644 --- a/infra/common/pom.xml +++ b/infra/common/pom.xml @@ -83,6 +83,11 @@ shardingsphere-infra-database-p6spy ${project.version} + + org.apache.shardingsphere + shardingsphere-infra-database-firebird + ${project.version} + org.apache.shardingsphere shardingsphere-infra-data-source-pool-hikari diff --git a/jdbc/pom.xml b/jdbc/pom.xml index 374aa47ce2a5b..a835399dfa23a 100644 --- a/jdbc/pom.xml +++ b/jdbc/pom.xml @@ -87,6 +87,11 @@ shardingsphere-parser-sql-opengauss ${project.version} + + org.apache.shardingsphere + shardingsphere-parser-sql-firebird + ${project.version} + org.apache.shardingsphere From 4bb8eccc2319f2301233b041c19e32bfd118781c Mon Sep 17 00:00:00 2001 From: omkar-shitole <162119860+omkar-shitole@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:16:20 +0530 Subject: [PATCH 006/192] Replace System.lineSeparator() with \n for cross-platform consistency in tests (#33972) --- .../ddl/index/PostgreSQLIndexSQLGeneratorTest.java | 6 +++--- .../ddl/table/PostgreSQLTablePropertiesLoaderTest.java | 4 ++-- .../template/PostgreSQLPipelineFreemarkerManagerTest.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGeneratorTest.java b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGeneratorTest.java index 9691bd61f8288..de572aab2eee1 100644 --- a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGeneratorTest.java +++ b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/index/PostgreSQLIndexSQLGeneratorTest.java @@ -39,7 +39,7 @@ void assertGenerate() throws SQLException { Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS); ResultSet getNodesResultSet = mockGetNodesResultSet(); when(connection.createStatement().executeQuery( - contains("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name," + System.lineSeparator() + "(SELECT (CASE WHEN count(i.inhrelid) > 0 THEN true ELSE false END)"))) + contains("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name," + "\n" + "(SELECT (CASE WHEN count(i.inhrelid) > 0 THEN true ELSE false END)"))) .thenReturn(getNodesResultSet); ResultSet getPropertiesResultSet = mockGetPropertiesResultSet(); when(connection.createStatement().executeQuery(contains("SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name, indrelid, indkey, indisclustered"))).thenReturn(getPropertiesResultSet); @@ -50,8 +50,8 @@ void assertGenerate() throws SQLException { context.put("schema", "foo_schema"); context.put("name", "foo_tbl"); String actual = new PostgreSQLIndexSQLGenerator(connection, 10, 0).generate(context); - String expected = "CREATE INDEX IF NOT EXISTS foo_tbl" + System.lineSeparator() + "ON foo_schema.foo_tbl USING foo_am_name" - + System.lineSeparator() + "()" + System.lineSeparator() + "WITH (FILLFACTOR=90)" + System.lineSeparator() + "TABLESPACE default" + System.lineSeparator() + "WHERE NULL;"; + String expected = "CREATE INDEX IF NOT EXISTS foo_tbl" + "\n" + "ON foo_schema.foo_tbl USING foo_am_name" + + "\n" + "()" + "\n" + "WITH (FILLFACTOR=90)" + "\n" + "TABLESPACE default" + "\n" + "WHERE NULL;"; assertThat(actual, is(expected)); } diff --git a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoaderTest.java b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoaderTest.java index 8556ea175b162..5fc83af3be9ea 100644 --- a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoaderTest.java +++ b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/ddl/table/PostgreSQLTablePropertiesLoaderTest.java @@ -37,10 +37,10 @@ void assertLoad() throws SQLException { Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS); when(connection.getCatalog()).thenReturn("foo_db"); ResultSet fetchDatabaseIdResultSet = mockFetchDatabaseIdResultSet(); - when(connection.createStatement().executeQuery(System.lineSeparator() + "SELECT oid AS did, datlastsysoid FROM pg_catalog.pg_database WHERE datname = 'foo_db';" + System.lineSeparator())) + when(connection.createStatement().executeQuery("\n" + "SELECT oid AS did, datlastsysoid FROM pg_catalog.pg_database WHERE datname = 'foo_db';" + "\n")) .thenReturn(fetchDatabaseIdResultSet); ResultSet fetchSchemaIdResultSet = mockFetchSchemaIdResultSet(); - when(connection.createStatement().executeQuery(System.lineSeparator() + "SELECT oid AS scid FROM pg_catalog.pg_namespace WHERE nspname = 'foo_schema';" + System.lineSeparator())) + when(connection.createStatement().executeQuery("\n" + "SELECT oid AS scid FROM pg_catalog.pg_namespace WHERE nspname = 'foo_schema';" + "\n")) .thenReturn(fetchSchemaIdResultSet); Map actual = new PostgreSQLTablePropertiesLoader(connection, "foo_tbl", "foo_schema", 12, 0).load(); assertThat(actual.size(), is(7)); diff --git a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/template/PostgreSQLPipelineFreemarkerManagerTest.java b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/template/PostgreSQLPipelineFreemarkerManagerTest.java index 7a2dc17336e13..742e0a41ddc3d 100644 --- a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/template/PostgreSQLPipelineFreemarkerManagerTest.java +++ b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/template/PostgreSQLPipelineFreemarkerManagerTest.java @@ -32,7 +32,7 @@ class PostgreSQLPipelineFreemarkerManagerTest { @Test void assertGetSQLByDefaultVersion() { String actual = PostgreSQLPipelineFreemarkerManager.getSQLByVersion(Collections.singletonMap("databaseName", "foo_db"), "component/table/%s/get_database_id.ftl", 10, 0); - String expected = System.lineSeparator() + "SELECT oid AS did, datlastsysoid FROM pg_catalog.pg_database WHERE datname = 'foo_db';" + System.lineSeparator(); + String expected = "\n" + "SELECT oid AS did, datlastsysoid FROM pg_catalog.pg_database WHERE datname = 'foo_db';" + "\n"; assertThat(actual, is(expected)); } From 7a897ad3cf4c3e8178b72b5828db17ef79ffe3e6 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Mon, 9 Dec 2024 22:47:05 +0800 Subject: [PATCH 007/192] Refactor StandardPipelineTableMetaDataLoader (#33980) --- .../StandardPipelineTableMetaDataLoader.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java index c75f88041fa9a..75da750797e1c 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java @@ -71,26 +71,24 @@ public PipelineTableMetaData getTableMetaData(final String schemaName, final Str return result; } - private void loadTableMetaData(final String schemaName, final String tableNamePattern) throws SQLException { + private void loadTableMetaData(final String schemaName, final String tableName) throws SQLException { try (Connection connection = dataSource.getConnection()) { DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(dataSource.getDatabaseType()).getDialectDatabaseMetaData(); - Map tableMetaDataMap = loadTableMetaData0(connection, dialectDatabaseMetaData.isSchemaAvailable() ? schemaName : null, tableNamePattern); - this.tableMetaDataMap.putAll(tableMetaDataMap); + tableMetaDataMap.putAll(loadTableMetaData(connection, dialectDatabaseMetaData.isSchemaAvailable() ? schemaName : null, tableName)); } } - private Map loadTableMetaData0(final Connection connection, final String schemaName, final String tableNamePattern) throws SQLException { + private Map loadTableMetaData(final Connection connection, final String schemaName, final String tableNamePattern) throws SQLException { Collection tableNames = new LinkedList<>(); try (ResultSet resultSet = connection.getMetaData().getTables(connection.getCatalog(), schemaName, tableNamePattern, null)) { while (resultSet.next()) { - String tableName = resultSet.getString("TABLE_NAME"); - tableNames.add(tableName); + tableNames.add(resultSet.getString("TABLE_NAME")); } } Map result = new LinkedHashMap<>(tableNames.size(), 1F); for (String each : tableNames) { Collection primaryKeys = loadPrimaryKeys(connection, schemaName, each); - Map> uniqueKeys = loadUniqueIndexesOfTable(connection, schemaName, each); + Map> uniqueKeys = loadUniqueKeys(connection, schemaName, each); Map columnMetaDataMap = new LinkedHashMap<>(); try (ResultSet resultSet = connection.getMetaData().getColumns(connection.getCatalog(), schemaName, each, "%")) { while (resultSet.next()) { @@ -104,8 +102,7 @@ private Map loadTableMetaData0( boolean primaryKey = primaryKeys.contains(columnName); boolean isNullable = "YES".equals(resultSet.getString("IS_NULLABLE")); boolean isUniqueKey = uniqueKeys.values().stream().anyMatch(names -> names.contains(columnName)); - PipelineColumnMetaData columnMetaData = new PipelineColumnMetaData(ordinalPosition, columnName.toString(), dataType, dataTypeName, isNullable, primaryKey, isUniqueKey); - columnMetaDataMap.put(columnName, columnMetaData); + columnMetaDataMap.put(columnName, new PipelineColumnMetaData(ordinalPosition, columnName.toString(), dataType, dataTypeName, isNullable, primaryKey, isUniqueKey)); } } Collection uniqueIndexMetaData = uniqueKeys.entrySet().stream() @@ -117,8 +114,18 @@ private Map loadTableMetaData0( return result; } - private Map> loadUniqueIndexesOfTable(final Connection connection, - final String schemaName, final String tableName) throws SQLException { + private Collection loadPrimaryKeys(final Connection connection, final String schemaName, final String tableName) throws SQLException { + SortedMap result = new TreeMap<>(); + try (ResultSet resultSet = connection.getMetaData().getPrimaryKeys(connection.getCatalog(), schemaName, tableName)) { + while (resultSet.next()) { + result.put(resultSet.getShort("KEY_SEQ"), new ShardingSphereIdentifier(resultSet.getString("COLUMN_NAME"))); + } + } + return result.values(); + } + + private Map> loadUniqueKeys(final Connection connection, + final String schemaName, final String tableName) throws SQLException { Map> orderedColumnsOfIndexes = new LinkedHashMap<>(); // Set approximate=true to avoid Oracle driver 19 run `analyze table` try (ResultSet resultSet = connection.getMetaData().getIndexInfo(connection.getCatalog(), schemaName, tableName, true, true)) { @@ -127,8 +134,8 @@ private Map> load if (null == indexName) { continue; } - orderedColumnsOfIndexes.computeIfAbsent(indexName, unused -> new TreeMap<>()).put( - resultSet.getShort("ORDINAL_POSITION"), new ShardingSphereIdentifier(resultSet.getString("COLUMN_NAME"))); + orderedColumnsOfIndexes.computeIfAbsent(indexName, + unused -> new TreeMap<>()).put(resultSet.getShort("ORDINAL_POSITION"), new ShardingSphereIdentifier(resultSet.getString("COLUMN_NAME"))); } } Map> result = new LinkedHashMap<>(); @@ -138,14 +145,4 @@ private Map> load } return result; } - - private Collection loadPrimaryKeys(final Connection connection, final String schemaName, final String tableName) throws SQLException { - SortedMap result = new TreeMap<>(); - try (ResultSet resultSet = connection.getMetaData().getPrimaryKeys(connection.getCatalog(), schemaName, tableName)) { - while (resultSet.next()) { - result.put(resultSet.getShort("KEY_SEQ"), new ShardingSphereIdentifier(resultSet.getString("COLUMN_NAME"))); - } - } - return result.values(); - } } From 56bcafa3d799f1807e996d8866cc535bf7531b91 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Mon, 9 Dec 2024 22:58:41 +0800 Subject: [PATCH 008/192] Code format for StandardPipelineTableMetaDataLoader (#33981) --- .../metadata/loader/StandardPipelineTableMetaDataLoader.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java index 75da750797e1c..d1a11519e66a9 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/loader/StandardPipelineTableMetaDataLoader.java @@ -124,8 +124,7 @@ private Collection loadPrimaryKeys(final Connection co return result.values(); } - private Map> loadUniqueKeys(final Connection connection, - final String schemaName, final String tableName) throws SQLException { + private Map> loadUniqueKeys(final Connection connection, final String schemaName, final String tableName) throws SQLException { Map> orderedColumnsOfIndexes = new LinkedHashMap<>(); // Set approximate=true to avoid Oracle driver 19 run `analyze table` try (ResultSet resultSet = connection.getMetaData().getIndexInfo(connection.getCatalog(), schemaName, tableName, true, true)) { From 922514b6c22ed14c2136753c4d984730e2b64dad Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 10:50:03 +0800 Subject: [PATCH 009/192] Fixes duplicate column names added when index changed in DDL (#33982) * Fix duplicate column names added when index changed in DDL * Fix duplicate column names added when index changed in DDL --- RELEASE-NOTES.md | 1 + .../data/loader/MySQLMetaDataLoader.java | 3 +-- .../AlterIndexStatementSchemaRefresher.java | 22 ++++++++---------- .../CreateIndexStatementSchemaRefresher.java | 23 ++++++++++--------- .../DropIndexStatementSchemaRefresher.java | 22 +++++++++--------- 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index b880b94df863e..0f8f89e0dc5c8 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -35,6 +35,7 @@ ### Bug Fixes 1. Mode: Fixes `JDBCRepository` improper handling of H2-database in memory mode - [#33281](https://github.com/apache/shardingsphere/issues/33281) +1. Mode: Fixes duplicate column names added when index changed in DDL - [#33982](https://github.com/apache/shardingsphere/issues/33281) 1. SQL Binder: Fixes table does not exist exception when use HintManager#setDatabaseName to transparent - [#33370](https://github.com/apache/shardingsphere/pull/33370) 1. SQL Parser: Fixes LiteralExpressionSegment cast exception in SQL parser - [#33332](https://github.com/apache/shardingsphere/pull/33332) 1. SQL Parser: Fixes PostgreSQL and openGauss time extract function parse week and quarter error - [#33564](https://github.com/apache/shardingsphere/pull/33564) diff --git a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java index 492ccfed15909..09cf576ec26a6 100644 --- a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java +++ b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java @@ -51,8 +51,7 @@ public final class MySQLMetaDataLoader implements DialectMetaDataLoader { private static final String ORDER_BY_ORDINAL_POSITION = " ORDER BY ORDINAL_POSITION"; private static final String TABLE_META_DATA_NO_ORDER = - "SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION, COLUMN_TYPE, IS_NULLABLE FROM information_schema.columns " - + "WHERE TABLE_SCHEMA=?"; + "SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION, COLUMN_TYPE, IS_NULLABLE FROM information_schema.columns WHERE TABLE_SCHEMA=?"; private static final String TABLE_META_DATA_SQL = TABLE_META_DATA_NO_ORDER + ORDER_BY_ORDINAL_POSITION; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java index f0501f1aff019..8e162d1ac7a13 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java @@ -20,6 +20,9 @@ import com.google.common.base.Preconditions; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -48,11 +51,14 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe } String actualSchemaName = sqlStatement.getIndex().get().getOwner().map(optional -> optional.getIdentifier().getValue().toLowerCase()).orElse(schemaName); String indexName = sqlStatement.getIndex().get().getIndexName().getIdentifier().getValue(); - Optional logicTableName = findLogicTableName(database.getSchema(actualSchemaName), indexName); + ShardingSpherePreconditions.checkState(database.containsSchema(actualSchemaName), () -> new SchemaNotFoundException(actualSchemaName)); + ShardingSphereSchema schema = database.getSchema(actualSchemaName); + Optional logicTableName = findLogicTableName(schema, indexName); + // TODO define IndexNotFoundException Preconditions.checkState(logicTableName.isPresent(), "Can not find logic table by index '%s' of schema '%s'.", indexName, schemaName); - ShardingSphereTable table = database.getSchema(actualSchemaName).getTable(logicTableName.get()); - Preconditions.checkNotNull(table, "Can not get the table '%s' meta data!", logicTableName.get()); - ShardingSphereTable newTable = newShardingSphereTable(table); + ShardingSpherePreconditions.checkState(schema.containsTable(logicTableName.get()), () -> new TableNotFoundException(logicTableName.get())); + ShardingSphereTable table = schema.getTable(logicTableName.get()); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); newTable.removeIndex(indexName); String renameIndexName = renameIndex.get().getIndexName().getIdentifier().getValue(); newTable.putIndex(new ShardingSphereIndex(renameIndexName, new LinkedList<>(), false)); @@ -65,14 +71,6 @@ private Optional findLogicTableName(final ShardingSphereSchema schema, f return schema.getAllTables().stream().filter(each -> each.containsIndex(indexName)).findFirst().map(ShardingSphereTable::getName); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class getType() { return AlterIndexStatement.class; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java index aa1cfbfbe8907..a09320e35c9b0 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java @@ -21,8 +21,12 @@ import com.google.common.base.Strings; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; @@ -44,23 +48,20 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe String indexName = null == sqlStatement.getIndex() ? IndexMetaDataUtils.getGeneratedLogicIndexName(sqlStatement.getColumns()) : sqlStatement.getIndex().getIndexName().getIdentifier().getValue(); + // TODO define IndexNotFoundException Preconditions.checkArgument(!Strings.isNullOrEmpty(indexName), "Index name is not exist."); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); - ShardingSphereTable table = newShardingSphereTable(database.getSchema(schemaName).getTable(tableName)); - table.putIndex(new ShardingSphereIndex(indexName, new LinkedList<>(), false)); + ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), () -> new SchemaNotFoundException(schemaName)); + ShardingSphereSchema schema = database.getSchema(schemaName); + ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); + ShardingSphereTable table = schema.getTable(tableName); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); + newTable.putIndex(new ShardingSphereIndex(indexName, new LinkedList<>(), false)); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName); - alterSchemaMetaDataPOJO.getAlteredTables().add(table); + alterSchemaMetaDataPOJO.getAlteredTables().add(newTable); metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class getType() { return CreateIndexStatement.class; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java index b43444aa9bb36..6006b26c8f31a 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java @@ -19,8 +19,12 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; @@ -48,10 +52,14 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe if (!logicTableName.isPresent()) { continue; } + ShardingSpherePreconditions.checkState(database.containsSchema(actualSchemaName), () -> new SchemaNotFoundException(schemaName)); + ShardingSphereSchema schema = database.getSchema(actualSchemaName); + ShardingSpherePreconditions.checkState(schema.containsTable(logicTableName.get()), () -> new TableNotFoundException(logicTableName.get())); + ShardingSphereTable table = schema.getTable(logicTableName.get()); + ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); + newTable.removeIndex(each.getIndexName().getIdentifier().getValue()); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), actualSchemaName); - ShardingSphereTable table = newShardingSphereTable(database.getSchema(actualSchemaName).getTable(logicTableName.get())); - table.removeIndex(each.getIndexName().getIdentifier().getValue()); - alterSchemaMetaDataPOJO.getAlteredTables().add(table); + alterSchemaMetaDataPOJO.getAlteredTables().add(newTable); metaDataManagerPersistService.alterSchemaMetaData(alterSchemaMetaDataPOJO); } } @@ -65,14 +73,6 @@ private Optional findLogicTableName(final ShardingSphereDatabase databas return tableNames.isEmpty() ? Optional.empty() : Optional.of(tableNames.iterator().next().getTableName()); } - private ShardingSphereTable newShardingSphereTable(final ShardingSphereTable table) { - ShardingSphereTable result = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); - result.getColumnNames().addAll(table.getColumnNames()); - result.getVisibleColumns().addAll(table.getVisibleColumns()); - result.getPrimaryKeyColumns().addAll(table.getPrimaryKeyColumns()); - return result; - } - @Override public Class getType() { return DropIndexStatement.class; From a778c3e3c9cfa0049e5005c82706d43d1177cf93 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 11:13:11 +0800 Subject: [PATCH 010/192] Move DuplicateIndexException and IndexNotFoundException from sharding module to infra module (#33984) --- .../error-code/sql-error-code.cn.md | 4 ++-- .../error-code/sql-error-code.en.md | 4 ++-- .../ShardingAlterIndexSupportedChecker.java | 6 +++--- .../ShardingCreateIndexSupportedChecker.java | 2 +- .../ddl/ShardingDropIndexSupportedChecker.java | 4 ++-- ...ShardingAlterIndexSupportedCheckerTest.java | 6 +++--- ...hardingCreateIndexSupportedCheckerTest.java | 2 +- .../ShardingDropIndexSupportedCheckerTest.java | 4 ++-- .../metadata/DuplicateIndexException.java | 10 +++++----- .../metadata/IndexNotFoundException.java | 18 +++++++++++------- .../AlterIndexStatementSchemaRefresher.java | 5 ++--- .../CreateIndexStatementSchemaRefresher.java | 4 ---- 12 files changed, 34 insertions(+), 35 deletions(-) rename {features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception => infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel}/metadata/DuplicateIndexException.java (73%) rename features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/IndexNotExistedException.java => infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/IndexNotFoundException.java (57%) diff --git a/docs/document/content/user-manual/error-code/sql-error-code.cn.md b/docs/document/content/user-manual/error-code/sql-error-code.cn.md index c0811a31ea436..0845881f875c4 100644 --- a/docs/document/content/user-manual/error-code/sql-error-code.cn.md +++ b/docs/document/content/user-manual/error-code/sql-error-code.cn.md @@ -18,6 +18,8 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供, | 10001 | 42S02 | Schema '%s' does not exist. | | 10002 | 42S02 | Table or view '%s' does not exist. | | 10003 | 42S02 | Unknown column '%s' in '%s'. | +| 10004 | 42S02 | Index '%s' does not exist. | +| 10005 | 42S01 | Index '%s' already exists. | | 10010 | HY000 | Rule and storage meta data mismatched, reason is: %s. | | 10100 | HY000 | Can not %s storage units '%s'. | | 10101 | 42S02 | There is no storage unit in database '%s'. | @@ -151,8 +153,6 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供, | 20004 | 42S02 | Actual table '%s.%s' is not in table rule configuration. | | 20005 | 42S02 | Can not find binding actual table, data source is '%s', logic table is '%s', other actual table is '%s'. | | 20006 | 44000 | Actual tables '%s' are in use. | -| 20007 | 42S01 | Index '%s' already exists. | -| 20008 | 42S02 | Index '%s' does not exist. | | 20009 | 42S01 | View name has to bind to %s tables. | | 20010 | 44000 | Invalid binding table configuration. | | 20011 | 44000 | Only allowed 0 or 1 sharding strategy configuration. | diff --git a/docs/document/content/user-manual/error-code/sql-error-code.en.md b/docs/document/content/user-manual/error-code/sql-error-code.en.md index 3fef910024907..4359e8d65c17e 100644 --- a/docs/document/content/user-manual/error-code/sql-error-code.en.md +++ b/docs/document/content/user-manual/error-code/sql-error-code.en.md @@ -18,6 +18,8 @@ SQL error codes provide by standard `SQL State`, `Vendor Code` and `Reason`, whi | 10001 | 42S02 | Schema '%s' does not exist. | | 10002 | 42S02 | Table or view '%s' does not exist. | | 10003 | 42S02 | Unknown column '%s' in '%s'. | +| 10004 | 42S02 | Index '%s' does not exist. | +| 10005 | 42S01 | Index '%s' already exists. | | 10010 | HY000 | Rule and storage meta data mismatched, reason is: %s. | | 10100 | HY000 | Can not %s storage units '%s'. | | 10101 | 42S02 | There is no storage unit in database '%s'. | @@ -151,8 +153,6 @@ SQL error codes provide by standard `SQL State`, `Vendor Code` and `Reason`, whi | 20004 | 42S02 | Actual table '%s.%s' is not in table rule configuration. | | 20005 | 42S02 | Can not find binding actual table, data source is '%s', logic table is '%s', other actual table is '%s'. | | 20006 | 44000 | Actual tables '%s' are in use. | -| 20007 | 42S01 | Index '%s' already exists. | -| 20008 | 42S02 | Index '%s' does not exist. | | 20009 | 42S01 | View name has to bind to %s tables. | | 20010 | 44000 | Invalid binding table configuration. | | 20011 | 44000 | Only allowed 0 or 1 sharding strategy configuration. | diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedChecker.java index 310c419dc5192..8c6c9527f3f95 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedChecker.java @@ -23,8 +23,8 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sharding.checker.sql.util.ShardingSupportedCheckUtils; -import org.apache.shardingsphere.sharding.exception.metadata.DuplicateIndexException; -import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.IndexNotFoundException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; @@ -47,7 +47,7 @@ public void check(final ShardingRule rule, final ShardingSphereDatabase database Optional index = alterIndexStatement.getIndex(); ShardingSphereSchema schema = index.flatMap(optional -> optional.getOwner().map(owner -> database.getSchema(owner.getIdentifier().getValue()))).orElse(currentSchema); if (index.isPresent() && !ShardingSupportedCheckUtils.isSchemaContainsIndex(schema, index.get())) { - throw new IndexNotExistedException(index.get().getIndexName().getIdentifier().getValue()); + throw new IndexNotFoundException(index.get().getIndexName().getIdentifier().getValue()); } Optional renameIndex = alterIndexStatement.getRenameIndex(); if (renameIndex.isPresent() && ShardingSupportedCheckUtils.isSchemaContainsIndex(schema, renameIndex.get())) { diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedChecker.java index a8c3c50685ab6..f8cf00bcc75bf 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedChecker.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sharding.checker.sql.common.ShardingSupportedCommonChecker; -import org.apache.shardingsphere.sharding.exception.metadata.DuplicateIndexException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedChecker.java index 15e19b64d660b..08f7aff26a3b8 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedChecker.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sharding.checker.sql.util.ShardingSupportedCheckUtils; -import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.IndexNotFoundException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; @@ -47,7 +47,7 @@ public void check(final ShardingRule rule, final ShardingSphereDatabase database } for (IndexSegment each : dropIndexStatement.getIndexes()) { ShardingSphereSchema schema = each.getOwner().map(optional -> optional.getIdentifier().getValue()).map(database::getSchema).orElse(currentSchema); - ShardingSpherePreconditions.checkState(ShardingSupportedCheckUtils.isSchemaContainsIndex(schema, each), () -> new IndexNotExistedException(each.getIndexName().getIdentifier().getValue())); + ShardingSpherePreconditions.checkState(ShardingSupportedCheckUtils.isSchemaContainsIndex(schema, each), () -> new IndexNotFoundException(each.getIndexName().getIdentifier().getValue())); } } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedCheckerTest.java index 9161b8842a15a..897a46822ec57 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterIndexSupportedCheckerTest.java @@ -21,8 +21,8 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import org.apache.shardingsphere.sharding.exception.metadata.DuplicateIndexException; -import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.IndexNotFoundException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; @@ -70,7 +70,7 @@ void assertCheckWhenIndexNotExistRenameIndexNotExistForPostgreSQL() { sqlStatement.setRenameIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index_new")))); ShardingSphereTable table = mock(ShardingSphereTable.class); when(database.getSchema("public").getTable("t_order")).thenReturn(table); - assertThrows(IndexNotExistedException.class, () -> new ShardingAlterIndexSupportedChecker().check(rule, database, mock(), new AlterIndexStatementContext(sqlStatement, "foo_db"))); + assertThrows(IndexNotFoundException.class, () -> new ShardingAlterIndexSupportedChecker().check(rule, database, mock(), new AlterIndexStatementContext(sqlStatement, "foo_db"))); } @Test diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java index 60e86be90a0b3..3f115e5e965e8 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.sharding.exception.metadata.DuplicateIndexException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedCheckerTest.java index cbd1912f58be5..c6784dd59e775 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropIndexSupportedCheckerTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import org.apache.shardingsphere.sharding.exception.metadata.IndexNotExistedException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.IndexNotFoundException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; @@ -70,6 +70,6 @@ void assertCheckWhenIndexNotExistForPostgreSQL() { ShardingSphereTable table = mock(ShardingSphereTable.class); when(database.getSchema("public").getAllTables()).thenReturn(Collections.singleton(table)); when(database.getSchema("public").getTable("t_order")).thenReturn(table); - assertThrows(IndexNotExistedException.class, () -> new ShardingDropIndexSupportedChecker().check(rule, database, mock(), new DropIndexStatementContext(sqlStatement, "foo_db"))); + assertThrows(IndexNotFoundException.class, () -> new ShardingDropIndexSupportedChecker().check(rule, database, mock(), new DropIndexStatementContext(sqlStatement, "foo_db"))); } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/DuplicateIndexException.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/DuplicateIndexException.java similarity index 73% rename from features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/DuplicateIndexException.java rename to infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/DuplicateIndexException.java index e11731beebb3d..9395a8b43ce6c 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/DuplicateIndexException.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/DuplicateIndexException.java @@ -15,19 +15,19 @@ * limitations under the License. */ -package org.apache.shardingsphere.sharding.exception.metadata; +package org.apache.shardingsphere.infra.exception.kernel.metadata; import org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState; -import org.apache.shardingsphere.sharding.exception.ShardingSQLException; +import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.MetaDataSQLException; /** * Duplicate index exception. */ -public final class DuplicateIndexException extends ShardingSQLException { +public final class DuplicateIndexException extends MetaDataSQLException { - private static final long serialVersionUID = 2884666477007627873L; + private static final long serialVersionUID = 1463379993377506978L; public DuplicateIndexException(final String indexName) { - super(XOpenSQLState.DUPLICATE, 7, "Index '%s' already exists.", indexName); + super(XOpenSQLState.DUPLICATE, 5, "Index '%s' already exists.", indexName); } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/IndexNotExistedException.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/IndexNotFoundException.java similarity index 57% rename from features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/IndexNotExistedException.java rename to infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/IndexNotFoundException.java index f55c354797b96..3bb297885178d 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/IndexNotExistedException.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/kernel/metadata/IndexNotFoundException.java @@ -15,19 +15,23 @@ * limitations under the License. */ -package org.apache.shardingsphere.sharding.exception.metadata; +package org.apache.shardingsphere.infra.exception.kernel.metadata; import org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState; -import org.apache.shardingsphere.sharding.exception.ShardingSQLException; +import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.MetaDataSQLException; /** - * Index not existed exception. + * Index not found exception. */ -public final class IndexNotExistedException extends ShardingSQLException { +public final class IndexNotFoundException extends MetaDataSQLException { - private static final long serialVersionUID = 206503570677185269L; + private static final long serialVersionUID = -4182388839280501305L; - public IndexNotExistedException(final String indexName) { - super(XOpenSQLState.NOT_FOUND, 8, "Index '%s' does not exist.", indexName); + public IndexNotFoundException(final String indexName) { + super(XOpenSQLState.NOT_FOUND, 4, "Index '%s' does not exist.", indexName); + } + + public IndexNotFoundException(final String indexName, final String schemaName) { + super(XOpenSQLState.NOT_FOUND, 4, "Index '%s' does not exist from schema '%s'.", indexName, schemaName); } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java index 8e162d1ac7a13..812a1417f2bd5 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java @@ -17,10 +17,10 @@ package org.apache.shardingsphere.mode.metadata.refresher.type.index; -import com.google.common.base.Preconditions; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.IndexNotFoundException; import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -54,8 +54,7 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe ShardingSpherePreconditions.checkState(database.containsSchema(actualSchemaName), () -> new SchemaNotFoundException(actualSchemaName)); ShardingSphereSchema schema = database.getSchema(actualSchemaName); Optional logicTableName = findLogicTableName(schema, indexName); - // TODO define IndexNotFoundException - Preconditions.checkState(logicTableName.isPresent(), "Can not find logic table by index '%s' of schema '%s'.", indexName, schemaName); + ShardingSpherePreconditions.checkState(logicTableName.isPresent(), () -> new IndexNotFoundException(indexName, schemaName)); ShardingSpherePreconditions.checkState(schema.containsTable(logicTableName.get()), () -> new TableNotFoundException(logicTableName.get())); ShardingSphereTable table = schema.getTable(logicTableName.get()); ShardingSphereTable newTable = new ShardingSphereTable(table.getName(), table.getAllColumns(), table.getAllIndexes(), table.getAllConstraints(), table.getType()); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java index a09320e35c9b0..fce62478ddfa0 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java @@ -17,8 +17,6 @@ package org.apache.shardingsphere.mode.metadata.refresher.type.index; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; @@ -48,8 +46,6 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe String indexName = null == sqlStatement.getIndex() ? IndexMetaDataUtils.getGeneratedLogicIndexName(sqlStatement.getColumns()) : sqlStatement.getIndex().getIndexName().getIdentifier().getValue(); - // TODO define IndexNotFoundException - Preconditions.checkArgument(!Strings.isNullOrEmpty(indexName), "Index name is not exist."); String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), () -> new SchemaNotFoundException(schemaName)); ShardingSphereSchema schema = database.getSchema(schemaName); From 9fab3b3aa973e759a01c2e6fcb2969d445d08b2a Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 13:06:01 +0800 Subject: [PATCH 011/192] Refactor GenericSchemaBuilder (#33985) --- .../schema/builder/GenericSchemaBuilder.java | 20 +++---------------- .../schema/model/ShardingSphereColumn.java | 12 +++++++++++ .../model/ShardingSphereConstraint.java | 7 +++++++ .../schema/model/ShardingSphereIndex.java | 7 +++++++ .../metadata/data/model/TableMetaData.java | 2 +- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java index c030d214bd6e2..323c34ee156e2 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java @@ -134,28 +134,14 @@ private static Collection convertToTables(final Collection< } private static Collection convertToColumns(final Collection columnMetaDataList) { - Collection result = new LinkedList<>(); - for (ColumnMetaData each : columnMetaDataList) { - result.add(new ShardingSphereColumn(each.getName(), each.getDataType(), each.isPrimaryKey(), each.isGenerated(), each.isCaseSensitive(), each.isVisible(), each.isUnsigned(), - each.isNullable())); - } - return result; + return columnMetaDataList.stream().map(ShardingSphereColumn::new).collect(Collectors.toList()); } private static Collection convertToIndexes(final Collection indexMetaDataList) { - Collection result = new LinkedList<>(); - for (IndexMetaData each : indexMetaDataList) { - ShardingSphereIndex index = new ShardingSphereIndex(each.getName(), each.getColumns(), each.isUnique()); - result.add(index); - } - return result; + return indexMetaDataList.stream().map(ShardingSphereIndex::new).collect(Collectors.toList()); } private static Collection convertToConstraints(final Collection constraintMetaDataList) { - Collection result = new LinkedList<>(); - for (ConstraintMetaData each : constraintMetaDataList) { - result.add(new ShardingSphereConstraint(each.getName(), each.getReferencedTableName())); - } - return result; + return constraintMetaDataList.stream().map(ShardingSphereConstraint::new).collect(Collectors.toList()); } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereColumn.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereColumn.java index da4d44ccbb832..35c69931b7725 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereColumn.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereColumn.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnMetaData; /** * ShardingSphere column. @@ -46,4 +47,15 @@ public final class ShardingSphereColumn { private final boolean unsigned; private final boolean nullable; + + public ShardingSphereColumn(final ColumnMetaData columnMetaData) { + name = columnMetaData.getName(); + dataType = columnMetaData.getDataType(); + primaryKey = columnMetaData.isPrimaryKey(); + generated = columnMetaData.isGenerated(); + caseSensitive = columnMetaData.isCaseSensitive(); + visible = columnMetaData.isVisible(); + unsigned = columnMetaData.isUnsigned(); + nullable = columnMetaData.isNullable(); + } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereConstraint.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereConstraint.java index 3178bda7c5138..914a6621b8540 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereConstraint.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereConstraint.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import org.apache.shardingsphere.infra.database.core.metadata.data.model.ConstraintMetaData; /** * ShardingSphere constraint. @@ -34,4 +35,10 @@ public final class ShardingSphereConstraint { private final String name; private final String referencedTableName; + + public ShardingSphereConstraint(final ConstraintMetaData constraintMetaData) { + name = constraintMetaData.getName(); + referencedTableName = constraintMetaData.getReferencedTableName(); + + } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereIndex.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereIndex.java index e0e0f40e269f4..9ab59867ad4b3 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereIndex.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereIndex.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData; import java.util.Collection; @@ -38,4 +39,10 @@ public final class ShardingSphereIndex { private final Collection columns; private final boolean unique; + + public ShardingSphereIndex(final IndexMetaData indexMetaData) { + name = indexMetaData.getName(); + columns = indexMetaData.getColumns(); + unique = indexMetaData.isUnique(); + } } diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/TableMetaData.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/TableMetaData.java index 792a0a850c6c1..7652306dbba37 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/TableMetaData.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/TableMetaData.java @@ -46,9 +46,9 @@ public final class TableMetaData { public TableMetaData(final String name, final Collection columns, final Collection indexes, final Collection constraints) { this.name = name; - type = TableType.TABLE; this.columns = columns; this.indexes = indexes; this.constraints = constraints; + type = TableType.TABLE; } } From d5e792aab6a345685e23a1878075bd334c595664 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 14:20:56 +0800 Subject: [PATCH 012/192] Refactor GenericSchemaBuilderMaterial (#33986) * Refactor GenericSchemaBuilderMaterial * Refactor GenericSchemaBuilderMaterial * Refactor GenericSchemaBuilderMaterial --- .../database/ShardingSphereDatabase.java | 5 ++-- .../schema/builder/GenericSchemaBuilder.java | 8 ++--- .../builder/GenericSchemaBuilderMaterial.java | 19 ++---------- .../schema/reviser/MetaDataReviseEngine.java | 5 ++-- .../schema/util/SchemaMetaDataUtils.java | 27 ++++++++--------- .../database/ShardingSphereDatabaseTest.java | 4 +-- .../GenericSchemaBuilderMaterialTest.java | 5 ++-- .../builder/GenericSchemaBuilderTest.java | 8 +++-- .../schema/util/SchemaMetaDataUtilsTest.java | 30 +++++++++---------- .../factory/ExternalMetaDataFactory.java | 6 ++-- .../mode/manager/ContextManager.java | 6 ++-- .../AlterTableStatementSchemaRefresher.java | 4 +-- .../CreateTableStatementSchemaRefresher.java | 4 +-- .../RenameTableStatementSchemaRefresher.java | 4 +-- .../AlterViewStatementSchemaRefresher.java | 4 +-- .../CreateViewStatementSchemaRefresher.java | 4 +-- 16 files changed, 61 insertions(+), 82 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java index 8233629431e55..ba75ae4b37f64 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java @@ -92,19 +92,18 @@ public static ShardingSphereDatabase create(final String name, final DatabaseTyp * * @param name database name * @param protocolType database protocol type - * @param storageTypes storage types * @param databaseConfig database configuration * @param props configuration properties * @param computeNodeInstanceContext compute node instance context * @return created database * @throws SQLException SQL exception */ - public static ShardingSphereDatabase create(final String name, final DatabaseType protocolType, final Map storageTypes, final DatabaseConfiguration databaseConfig, + public static ShardingSphereDatabase create(final String name, final DatabaseType protocolType, final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException { ResourceMetaData resourceMetaData = new ResourceMetaData(databaseConfig.getDataSources(), databaseConfig.getStorageUnits()); Collection databaseRules = DatabaseRulesBuilder.build(name, protocolType, databaseConfig, computeNodeInstanceContext, resourceMetaData); Map schemas = new ConcurrentHashMap<>(GenericSchemaBuilder.build(new GenericSchemaBuilderMaterial( - protocolType, storageTypes, resourceMetaData.getDataSourceMap(), databaseRules, props, new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name)))); + protocolType, resourceMetaData.getStorageUnits(), databaseRules, props, new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name)))); SystemSchemaBuilder.build(name, protocolType, props).forEach(schemas::putIfAbsent); return new ShardingSphereDatabase(name, protocolType, resourceMetaData, new RuleMetaData(databaseRules), schemas.values()); } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java index 323c34ee156e2..703879d0ee510 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java @@ -27,8 +27,8 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereConstraint; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; @@ -87,7 +87,7 @@ public static Map build(final Collection t private static Collection getAllTableNames(final Collection rules) { Collection result = new HashSet<>(); for (ShardingSphereRule each : rules) { - each.getAttributes().findAttribute(TableMapperRuleAttribute.class).ifPresent(mapperRule -> result.addAll(mapperRule.getLogicTableNames())); + each.getAttributes().findAttribute(TableMapperRuleAttribute.class).ifPresent(optional -> result.addAll(optional.getLogicTableNames())); } return result; } @@ -100,8 +100,8 @@ private static Map loadSchemas(final Collection private static Map translate(final Map schemaMetaDataMap, final GenericSchemaBuilderMaterial material) { Collection tableMetaDataList = new LinkedList<>(); - for (DatabaseType each : material.getStorageTypes().values()) { - String defaultSchemaName = new DatabaseTypeRegistry(each).getDefaultSchemaName(material.getDefaultSchemaName()); + for (StorageUnit each : material.getStorageUnits().values()) { + String defaultSchemaName = new DatabaseTypeRegistry(each.getStorageType()).getDefaultSchemaName(material.getDefaultSchemaName()); tableMetaDataList.addAll(Optional.ofNullable(schemaMetaDataMap.get(defaultSchemaName)).map(SchemaMetaData::getTables).orElseGet(Collections::emptyList)); } String frontendSchemaName = new DatabaseTypeRegistry(material.getProtocolType()).getDefaultSchemaName(material.getDefaultSchemaName()); diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java index 3aeb4f5e8d1d5..d1a05c2124a8d 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java @@ -24,12 +24,8 @@ import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; -import javax.sql.DataSource; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; /** * ShardingSphere schema builder material. @@ -40,9 +36,7 @@ public final class GenericSchemaBuilderMaterial { private final DatabaseType protocolType; - private final Map storageTypes; - - private final Map dataSourceMap; + private final Map storageUnits; private final Collection rules; @@ -50,21 +44,12 @@ public final class GenericSchemaBuilderMaterial { private final String defaultSchemaName; - public GenericSchemaBuilderMaterial(final DatabaseType protocolType, final Map storageUnits, - final Collection rules, final ConfigurationProperties props, final String defaultSchemaName) { - this(protocolType, storageUnits.entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getStorageType(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)), - storageUnits.entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)), - rules, props, defaultSchemaName); - } - /** * Judge whether same protocol and storage database types. * * @return is same or not */ public boolean isSameProtocolAndStorageTypes() { - return storageTypes.values().stream().allMatch(protocolType::equals); + return storageUnits.values().stream().map(StorageUnit::getStorageType).allMatch(protocolType::equals); } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java index 8ed529f77b804..6ddf574a133d8 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.schema.SchemaMetaDataReviseEngine; @@ -49,8 +50,8 @@ public Map revise(final Map sche Map result = new LinkedHashMap<>(schemaMetaDataMap.size(), 1F); for (Entry entry : schemaMetaDataMap.entrySet()) { // TODO establish a corresponding relationship between tables and data sources - DatabaseType databaseType = material.getStorageTypes().values().stream().findFirst().orElse(null); - DataSource dataSource = material.getDataSourceMap().values().stream().findFirst().orElse(null); + DatabaseType databaseType = material.getStorageUnits().values().stream().map(StorageUnit::getStorageType).findFirst().orElse(null); + DataSource dataSource = material.getStorageUnits().values().stream().map(StorageUnit::getDataSource).findFirst().orElse(null); result.put(entry.getKey(), new SchemaMetaDataReviseEngine(rules, material.getProps(), databaseType, dataSource).revise(entry.getValue())); } return result; diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java index 63d51985a177e..10571c905dd59 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.datanode.DataNode; import org.apache.shardingsphere.infra.datanode.DataNodes; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; import org.apache.shardingsphere.infra.exception.kernel.metadata.datanode.UnsupportedActualDataNodeStructureException; @@ -36,6 +37,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; +import java.util.stream.Collectors; /** * Schema meta data utility class. @@ -53,7 +55,7 @@ public final class SchemaMetaDataUtils { */ public static Collection getMetaDataLoaderMaterials(final Collection tableNames, final GenericSchemaBuilderMaterial material, final boolean checkMetaDataEnable) { Map> dataSourceTableGroups = new LinkedHashMap<>(); - Collection unsupportedThreeTierStorageStructureDatabaseTypes = getUnsupportedThreeTierStorageStructureDatabaseTypes(material.getStorageTypes().values()); + Collection unsupportedThreeTierStorageStructureDatabaseTypes = getUnsupportedThreeTierStorageStructureDatabaseTypes(material.getStorageUnits().values()); DataNodes dataNodes = new DataNodes(material.getRules()); for (String each : tableNames) { checkDataSourceTypeIncludeInstanceAndSetDatabaseTableMap(unsupportedThreeTierStorageStructureDatabaseTypes, dataNodes, each); @@ -65,7 +67,7 @@ public static Collection getMetaDataLoaderMaterials(fina } Collection result = new LinkedList<>(); for (Entry> entry : dataSourceTableGroups.entrySet()) { - DatabaseType storageType = material.getStorageTypes().get(entry.getKey()); + DatabaseType storageType = material.getStorageUnits().get(entry.getKey()).getStorageType(); String defaultSchemaName = getDefaultSchemaNameByStorageType(storageType, material.getDefaultSchemaName()); result.add(new MetaDataLoaderMaterial(entry.getValue(), entry.getKey(), getDataSource(material, entry.getKey()), storageType, defaultSchemaName)); } @@ -77,7 +79,7 @@ private static String getDefaultSchemaNameByStorageType(final DatabaseType stora } private static DataSource getDataSource(final GenericSchemaBuilderMaterial material, final String dataSourceName) { - return material.getDataSourceMap().get(dataSourceName.contains(".") ? dataSourceName.split("\\.")[0] : dataSourceName); + return material.getStorageUnits().get(dataSourceName.contains(".") ? dataSourceName.split("\\.")[0] : dataSourceName).getDataSource(); } private static void checkDataSourceTypeIncludeInstanceAndSetDatabaseTableMap(final Collection notSupportThreeTierStructureStorageTypes, final DataNodes dataNodes, @@ -93,30 +95,25 @@ private static void checkDataSourceTypeIncludeInstanceAndSetDatabaseTableMap(fin } } - private static Collection getUnsupportedThreeTierStorageStructureDatabaseTypes(final Collection storageTypes) { - Collection result = new LinkedList<>(); - for (DatabaseType each : storageTypes) { - if (!new DatabaseTypeRegistry(each).getDialectDatabaseMetaData().isSupportThreeTierStorageStructure()) { - result.add(each); - } - } - return result; + private static Collection getUnsupportedThreeTierStorageStructureDatabaseTypes(final Collection storageUnits) { + return storageUnits.stream() + .map(StorageUnit::getStorageType).filter(each -> !new DatabaseTypeRegistry(each).getDialectDatabaseMetaData().isSupportThreeTierStorageStructure()).collect(Collectors.toList()); } private static void addOneActualTableDataNode(final GenericSchemaBuilderMaterial material, final Map> dataSourceTableGroups, final DataNodes dataNodes, final String table) { Optional dataNode = dataNodes.getDataNodes(table).stream().filter(each -> isSameDataSourceNameSchemaName(material, each)).findFirst(); - if (!dataNode.isPresent() && !material.getDataSourceMap().keySet().iterator().hasNext()) { + if (!dataNode.isPresent() && !material.getStorageUnits().keySet().iterator().hasNext()) { return; } - String dataSourceName = dataNode.map(DataNode::getDataSourceName).orElseGet(() -> material.getDataSourceMap().keySet().iterator().next()); + String dataSourceName = dataNode.map(DataNode::getDataSourceName).orElseGet(() -> material.getStorageUnits().keySet().iterator().next()); String tableName = dataNode.map(DataNode::getTableName).orElse(table); addDataSourceTableGroups(dataSourceName, tableName, dataSourceTableGroups); } private static boolean isSameDataSourceNameSchemaName(final GenericSchemaBuilderMaterial material, final DataNode dataNode) { String dataSourceName = dataNode.getDataSourceName().contains(".") ? dataNode.getDataSourceName().split("\\.")[0] : dataNode.getDataSourceName(); - if (!material.getDataSourceMap().containsKey(dataSourceName)) { + if (!material.getStorageUnits().containsKey(dataSourceName)) { return false; } return null == dataNode.getSchemaName() || dataNode.getSchemaName().equalsIgnoreCase(material.getDefaultSchemaName()); @@ -126,7 +123,7 @@ private static void addAllActualTableDataNode(final GenericSchemaBuilderMaterial final Map> dataSourceTableGroups, final DataNodes dataNodes, final String table) { Collection tableDataNodes = dataNodes.getDataNodes(table); if (tableDataNodes.isEmpty()) { - addDataSourceTableGroups(material.getDataSourceMap().keySet().iterator().next(), table, dataSourceTableGroups); + addDataSourceTableGroups(material.getStorageUnits().keySet().iterator().next(), table, dataSourceTableGroups); } else { tableDataNodes.forEach(each -> addDataSourceTableGroups(each.getDataSourceName(), each.getTableName(), dataSourceTableGroups)); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java index 73258c6c2c676..03bea57493904 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java @@ -154,7 +154,7 @@ void assertReloadRules() { @Test void assertGetPostgreSQLDefaultSchema() throws SQLException { DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"); - ShardingSphereDatabase actual = ShardingSphereDatabase.create("foo_db", databaseType, Collections.singletonMap("", databaseType), + ShardingSphereDatabase actual = ShardingSphereDatabase.create("foo_db", databaseType, mock(DataSourceProvidedDatabaseConfiguration.class), new ConfigurationProperties(new Properties()), mock(ComputeNodeInstanceContext.class)); assertNotNull(actual.getSchema("public")); } @@ -162,7 +162,7 @@ void assertGetPostgreSQLDefaultSchema() throws SQLException { @Test void assertGetMySQLDefaultSchema() throws SQLException { DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL"); - ShardingSphereDatabase actual = ShardingSphereDatabase.create("foo_db", databaseType, Collections.singletonMap("", databaseType), + ShardingSphereDatabase actual = ShardingSphereDatabase.create("foo_db", databaseType, mock(DataSourceProvidedDatabaseConfiguration.class), new ConfigurationProperties(new Properties()), mock(ComputeNodeInstanceContext.class)); assertNotNull(actual.getSchema("foo_db")); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java index 3b3237496fa3d..65546d0dffaaa 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java @@ -27,13 +27,13 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; class GenericSchemaBuilderMaterialTest { @Test void assertIsSameProtocolAndStorageTypes() { GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), - Collections.singletonMap("foo", TypedSPILoader.getService(DatabaseType.class, "FIXTURE")), Collections.emptyMap(), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); assertTrue(material.isSameProtocolAndStorageTypes()); } @@ -41,8 +41,7 @@ void assertIsSameProtocolAndStorageTypes() { @Test void assertIsDifferentProtocolAndStorageTypes() { GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), - Collections.singletonMap("foo", null), - Collections.emptyMap(), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); + Collections.singletonMap("foo", mock()), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); assertFalse(material.isSameProtocolAndStorageTypes()); } } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java index 7f9fc6cd54db0..deb2a7fb5ba3d 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes; @@ -64,8 +65,11 @@ void setUp() { DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); ShardingSphereRule rule = mock(ShardingSphereRule.class); when(rule.getAttributes()).thenReturn(new RuleAttributes(mock(TableMapperRuleAttribute.class))); - material = new GenericSchemaBuilderMaterial(databaseType, Collections.singletonMap("foo_db", databaseType), - Collections.singletonMap("foo_db", new MockedDataSource()), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_db"); + StorageUnit storageUnit = mock(StorageUnit.class); + when(storageUnit.getStorageType()).thenReturn(databaseType); + when(storageUnit.getDataSource()).thenReturn(new MockedDataSource()); + material = new GenericSchemaBuilderMaterial( + databaseType, Collections.singletonMap("foo_db", storageUnit), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_db"); } @Test diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java index b10d3fb333bdc..60877a908a503 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.loader.MetaDataLoaderMaterial; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.datanode.DataNode; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes; @@ -29,7 +30,6 @@ import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; import org.junit.jupiter.api.Test; -import javax.sql.DataSource; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -54,7 +54,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenConfigCheckMetaDataEnable() { ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageTypes(), mockDataSourceMap(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); + mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_order"), material, true); assertThat(actual.size(), is(2)); Iterator iterator = actual.iterator(); @@ -75,7 +75,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenNotConfigCheckMetaDataEnable() { ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageTypes(), mockDataSourceMap(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); + mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_order"), material, false); assertThat(actual.size(), is(1)); Iterator iterator = actual.iterator(); @@ -93,7 +93,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenNotConfigCheckMetaDataEnableForSi ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageTypes(), mockDataSourceMap(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "public"); + mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "public"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_single"), material, false); assertThat(actual.size(), is(1)); Iterator iterator = actual.iterator(); @@ -114,18 +114,16 @@ private List mockSingleTableDataNodes() { return Arrays.asList(firstDataNode, secondDataNode); } - private Map mockDataSourceMap() { - Map result = new HashMap<>(2, 1F); - result.put("ds_0", new MockedDataSource()); - result.put("ds_1", new MockedDataSource()); - return result; - } - - private Map mockStorageTypes() { - Map result = new HashMap<>(2, 1F); - DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); - result.put("ds_0", databaseType); - result.put("ds_1", databaseType); + private Map mockStorageUnits() { + Map result = new HashMap<>(2, 1F); + StorageUnit storageUnit1 = mock(StorageUnit.class); + when(storageUnit1.getStorageType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); + when(storageUnit1.getDataSource()).thenReturn(new MockedDataSource()); + result.put("ds_0", storageUnit1); + StorageUnit storageUnit2 = mock(StorageUnit.class); + when(storageUnit2.getStorageType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); + when(storageUnit2.getDataSource()).thenReturn(new MockedDataSource()); + result.put("ds_1", storageUnit2); return result; } } diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactory.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactory.java index 3746fd2d4080b..7b654d910aa1b 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactory.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/ExternalMetaDataFactory.java @@ -51,8 +51,7 @@ public final class ExternalMetaDataFactory { */ public static ShardingSphereDatabase create(final String databaseName, final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException { - return ShardingSphereDatabase.create(databaseName, DatabaseTypeEngine.getProtocolType(databaseConfig, props), - DatabaseTypeEngine.getStorageTypes(databaseConfig), databaseConfig, props, computeNodeInstanceContext); + return ShardingSphereDatabase.create(databaseName, DatabaseTypeEngine.getProtocolType(databaseConfig, props), databaseConfig, props, computeNodeInstanceContext); } /** @@ -81,8 +80,7 @@ private static Map createGenericDatabases(final for (Entry entry : databaseConfigMap.entrySet()) { String databaseName = entry.getKey(); if (!entry.getValue().getStorageUnits().isEmpty() || !systemDatabase.getSystemSchemas().contains(databaseName)) { - Map storageTypes = DatabaseTypeEngine.getStorageTypes(entry.getValue()); - result.put(databaseName.toLowerCase(), ShardingSphereDatabase.create(databaseName, protocolType, storageTypes, entry.getValue(), props, computeNodeInstanceContext)); + result.put(databaseName.toLowerCase(), ShardingSphereDatabase.create(databaseName, protocolType, entry.getValue(), props, computeNodeInstanceContext)); } } return result; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 7a60596056d65..dcd0c996fe7dd 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -142,8 +142,7 @@ public void reloadSchema(final ShardingSphereDatabase database, final String sch private ShardingSphereSchema loadSchema(final ShardingSphereDatabase database, final String schemaName, final String dataSourceName) throws SQLException { database.reloadRules(); GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getProtocolType(), - Collections.singletonMap(dataSourceName, database.getResourceMetaData().getStorageUnits().get(dataSourceName).getStorageType()), - Collections.singletonMap(dataSourceName, database.getResourceMetaData().getStorageUnits().get(dataSourceName).getDataSource()), + Collections.singletonMap(dataSourceName, database.getResourceMetaData().getStorageUnits().get(dataSourceName)), database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); ShardingSphereSchema result = GenericSchemaBuilder.build(material).get(schemaName); persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataFacade().getView().load(database.getName(), schemaName).forEach(result::putView); @@ -178,8 +177,7 @@ public void reloadTable(final ShardingSphereDatabase database, final String sche public void reloadTable(final ShardingSphereDatabase database, final String schemaName, final String dataSourceName, final String tableName) { StorageUnit storageUnit = database.getResourceMetaData().getStorageUnits().get(dataSourceName); GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getProtocolType(), - Collections.singletonMap(dataSourceName, storageUnit.getStorageType()), Collections.singletonMap(dataSourceName, storageUnit.getDataSource()), - database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); + Collections.singletonMap(dataSourceName, storageUnit), database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); try { persistTable(database, schemaName, tableName, material); } catch (final SQLException ex) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java index e83fe46c7900e..299669ad48b08 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java @@ -67,8 +67,8 @@ private ShardingSphereTable getTable(final ShardingSphereDatabase database, fina } GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemaMap = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); - return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(tableName)) + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + return Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)) .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java index 57823f37c5fea..d2f1201619e0d 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java @@ -55,8 +55,8 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe } GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemaMap = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); - Optional actualTableMetaData = Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(tableName)); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + Optional actualTableMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)); Preconditions.checkState(actualTableMetaData.isPresent(), "Load actual table metadata '%s' failed.", tableName); metaDataManagerPersistService.createTable(database.getName(), schemaName, actualTableMetaData.get(), logicDataSourceNames.isEmpty() ? null : logicDataSourceNames.iterator().next()); if (isSingleTable && TableRefreshUtils.isRuleRefreshRequired(ruleMetaData, schemaName, tableName)) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java index a1e133e948b67..9a9edd9d996b1 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java @@ -65,8 +65,8 @@ private ShardingSphereTable getTable(final ShardingSphereDatabase database, fina } GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemaMap = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); - return Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(tableName)) + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + return Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)) .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java index f603a19f93eec..cfb2afae1b2c9 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java @@ -78,8 +78,8 @@ private ShardingSphereSchema getSchema(final ShardingSphereDatabase database, fi } GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemaMap = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); - Optional actualViewMetaData = Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(viewName)); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); + Optional actualViewMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(viewName)); ShardingSphereSchema result = new ShardingSphereSchema(schemaName); actualViewMetaData.ifPresent(result::putTable); result.putView(new ShardingSphereView(viewName, viewDefinition)); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java index 07fe62b6454c7..7a1e89925326a 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java @@ -56,8 +56,8 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe } GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemaMap = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); - Optional actualTableMetaData = Optional.ofNullable(schemaMap.get(schemaName)).map(optional -> optional.getTable(viewName)); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); + Optional actualTableMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(viewName)); Preconditions.checkState(actualTableMetaData.isPresent(), "Load actual view metadata '%s' failed.", viewName); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames); alterSchemaMetaDataPOJO.getAlteredTables().add(actualTableMetaData.get()); From 7df9e25023bb630d290b4b48ef27e73a2084f27b Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Tue, 10 Dec 2024 14:55:30 +0800 Subject: [PATCH 013/192] Log the necessary cluster persist exception (#33987) --- .../cluster/zookeeper/handler/ZookeeperExceptionHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/handler/ZookeeperExceptionHandler.java b/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/handler/ZookeeperExceptionHandler.java index d04bc5aca1804..275d51feb1201 100644 --- a/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/handler/ZookeeperExceptionHandler.java +++ b/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/handler/ZookeeperExceptionHandler.java @@ -51,6 +51,7 @@ public static void handleException(final Exception cause) { log.info("InterruptedException caught"); Thread.currentThread().interrupt(); } else { + log.error("Zookeeper exception occured.", cause); throw new ClusterRepositoryPersistException(cause); } } From 7a1663cea8110fc548b678d879d0a4568635509f Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 16:39:55 +0800 Subject: [PATCH 014/192] Revise GenericSchemaBuilderTest (#33989) --- .../schema/builder/GenericSchemaBuilderMaterialTest.java | 7 ++++--- .../database/schema/builder/GenericSchemaBuilderTest.java | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java index 65546d0dffaaa..d7cfd74d98647 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java @@ -31,16 +31,17 @@ class GenericSchemaBuilderMaterialTest { + private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); + @Test void assertIsSameProtocolAndStorageTypes() { - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), - Collections.emptyMap(), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(databaseType, Collections.emptyMap(), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); assertTrue(material.isSameProtocolAndStorageTypes()); } @Test void assertIsDifferentProtocolAndStorageTypes() { - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(databaseType, Collections.singletonMap("foo", mock()), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); assertFalse(material.isSameProtocolAndStorageTypes()); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java index deb2a7fb5ba3d..b09e2640086e7 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java @@ -69,21 +69,21 @@ void setUp() { when(storageUnit.getStorageType()).thenReturn(databaseType); when(storageUnit.getDataSource()).thenReturn(new MockedDataSource()); material = new GenericSchemaBuilderMaterial( - databaseType, Collections.singletonMap("foo_db", storageUnit), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_db"); + databaseType, Collections.singletonMap("foo_schema", storageUnit), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_schema"); } @Test void assertLoadWithExistedTableName() throws SQLException { Collection tableNames = Collections.singletonList("data_node_routed_table1"); when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); - assertFalse(GenericSchemaBuilder.build(tableNames, material).get("foo_db").getAllTables().isEmpty()); + assertFalse(GenericSchemaBuilder.build(tableNames, material).get("foo_schema").getAllTables().isEmpty()); } @Test void assertLoadWithNotExistedTableName() throws SQLException { Collection tableNames = Collections.singletonList("invalid_table"); when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); - assertTrue(GenericSchemaBuilder.build(tableNames, material).get("foo_db").getAllTables().isEmpty()); + assertTrue(GenericSchemaBuilder.build(tableNames, material).get("foo_schema").getAllTables().isEmpty()); } @Test @@ -92,7 +92,7 @@ void assertLoadAllTables() throws SQLException { when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); Map actual = GenericSchemaBuilder.build(tableNames, material); assertThat(actual.size(), is(1)); - assertTables(new ShardingSphereSchema("foo_db", actual.values().iterator().next().getAllTables(), Collections.emptyList())); + assertTables(new ShardingSphereSchema("foo_schema", actual.values().iterator().next().getAllTables(), Collections.emptyList())); } private Map createSchemaMetaDataMap(final Collection tableNames, final GenericSchemaBuilderMaterial material) { From ffce9b2f4fe16f582f2d5d2a16dfb82b3f10009d Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 17:36:57 +0800 Subject: [PATCH 015/192] Remove useless DatabaseTypeEngine.getStorageTypes (#33990) --- .../infra/database/DatabaseTypeEngine.java | 15 --------------- .../infra/database/DatabaseTypeEngineTest.java | 9 --------- 2 files changed, 24 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngine.java index 6c99493bbd533..25c336abb95c1 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngine.java @@ -98,21 +98,6 @@ private static Map getDataSources(final DatabaseConfiguratio .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); } - /** - * Get storage types. - * - * @param databaseConfig database configuration - * @return storage types - */ - public static Map getStorageTypes(final DatabaseConfiguration databaseConfig) { - Map result = new LinkedHashMap<>(databaseConfig.getStorageUnits().size(), 1F); - Map dataSources = getDataSources(databaseConfig); - for (Entry entry : dataSources.entrySet()) { - result.put(entry.getKey(), getStorageType(entry.getValue())); - } - return result; - } - /** * Get storage type. * Similar to apache/hive#5554, diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngineTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngineTest.java index bc49a70a10e97..0d822a345ee9a 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngineTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/database/DatabaseTypeEngineTest.java @@ -42,7 +42,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -65,14 +64,6 @@ void assertGetProtocolTypeFromDataSource() throws SQLException { assertThat(DatabaseTypeEngine.getProtocolType(Collections.singletonMap("foo_db", databaseConfig), new ConfigurationProperties(new Properties())), instanceOf(PostgreSQLDatabaseType.class)); } - @Test - void assertGetStorageTypes() throws SQLException { - DataSource datasource = mockDataSource(TypedSPILoader.getService(DatabaseType.class, "MySQL")); - DatabaseConfiguration databaseConfig = new DataSourceProvidedDatabaseConfiguration(Collections.singletonMap("foo_db", datasource), Collections.singletonList(new FixtureRuleConfiguration())); - assertTrue(DatabaseTypeEngine.getStorageTypes(databaseConfig).containsKey("foo_db")); - assertThat(DatabaseTypeEngine.getStorageTypes(databaseConfig).get("foo_db"), instanceOf(MySQLDatabaseType.class)); - } - @Test void assertGetStorageType() throws SQLException { assertThat(DatabaseTypeEngine.getStorageType(mockDataSource(TypedSPILoader.getService(DatabaseType.class, "H2"))).getType(), is("H2")); From 11c1c95cf7973dbebbb3c10a5ae3beb91c5cef44 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 18:58:40 +0800 Subject: [PATCH 016/192] Move GenericSchemaBuilderMaterial.isSameProtocolAndStorageTypes() to GenericSchemaBuilder (#33995) * Move GenericSchemaBuilderMaterial.isSameProtocolAndStorageTypes() to GenericSchemaBuilder * Move GenericSchemaBuilderMaterial.isSameProtocolAndStorageTypes() to GenericSchemaBuilder --- .../schema/builder/GenericSchemaBuilder.java | 7 ++- .../builder/GenericSchemaBuilderMaterial.java | 9 ---- .../GenericSchemaBuilderMaterialTest.java | 48 ------------------- 3 files changed, 6 insertions(+), 58 deletions(-) delete mode 100644 infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java index 703879d0ee510..cc5751aa89c86 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; +import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; @@ -78,7 +79,7 @@ public static Map build(final GenericSchemaBuilder */ public static Map build(final Collection tableNames, final GenericSchemaBuilderMaterial material) throws SQLException { Map result = loadSchemas(tableNames, material); - if (!material.isSameProtocolAndStorageTypes()) { + if (!isSameProtocolAndStorageTypes(material.getProtocolType(), material.getStorageUnits())) { result = translate(result, material); } return revise(result, material); @@ -98,6 +99,10 @@ private static Map loadSchemas(final Collection return materials.isEmpty() ? Collections.emptyMap() : MetaDataLoader.load(materials); } + private static boolean isSameProtocolAndStorageTypes(final DatabaseType protocolType, final Map storageUnits) { + return storageUnits.values().stream().map(StorageUnit::getStorageType).allMatch(protocolType::equals); + } + private static Map translate(final Map schemaMetaDataMap, final GenericSchemaBuilderMaterial material) { Collection tableMetaDataList = new LinkedList<>(); for (StorageUnit each : material.getStorageUnits().values()) { diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java index d1a05c2124a8d..f77db09a9c3f1 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java @@ -43,13 +43,4 @@ public final class GenericSchemaBuilderMaterial { private final ConfigurationProperties props; private final String defaultSchemaName; - - /** - * Judge whether same protocol and storage database types. - * - * @return is same or not - */ - public boolean isSameProtocolAndStorageTypes() { - return storageUnits.values().stream().map(StorageUnit::getStorageType).allMatch(protocolType::equals); - } } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java deleted file mode 100644 index d7cfd74d98647..0000000000000 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterialTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.infra.metadata.database.schema.builder; - -import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.junit.jupiter.api.Test; - -import java.util.Collections; -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; - -class GenericSchemaBuilderMaterialTest { - - private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); - - @Test - void assertIsSameProtocolAndStorageTypes() { - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(databaseType, Collections.emptyMap(), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); - assertTrue(material.isSameProtocolAndStorageTypes()); - } - - @Test - void assertIsDifferentProtocolAndStorageTypes() { - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(databaseType, - Collections.singletonMap("foo", mock()), Collections.emptyList(), new ConfigurationProperties(new Properties()), ""); - assertFalse(material.isSameProtocolAndStorageTypes()); - } -} From 7eabecf0f3b5c509b45df6ac2056dd0350e398cc Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 19:12:22 +0800 Subject: [PATCH 017/192] Move GenericSchemaBuilderMaterial.protocolType to GenericSchemaBuilder (#33997) --- .../database/ShardingSphereDatabase.java | 4 ++-- .../schema/builder/GenericSchemaBuilder.java | 16 +++++++++------- .../builder/GenericSchemaBuilderMaterial.java | 3 --- .../schema/builder/GenericSchemaBuilderTest.java | 12 ++++++------ .../schema/util/SchemaMetaDataUtilsTest.java | 9 +++------ .../mode/manager/ContextManager.java | 11 +++++------ .../AlterTableStatementSchemaRefresher.java | 5 ++--- .../CreateTableStatementSchemaRefresher.java | 5 ++--- .../RenameTableStatementSchemaRefresher.java | 5 ++--- .../view/AlterViewStatementSchemaRefresher.java | 5 ++--- .../view/CreateViewStatementSchemaRefresher.java | 5 ++--- 11 files changed, 35 insertions(+), 45 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java index ba75ae4b37f64..7da9ea92999e9 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java @@ -102,8 +102,8 @@ public static ShardingSphereDatabase create(final String name, final DatabaseTyp final ConfigurationProperties props, final ComputeNodeInstanceContext computeNodeInstanceContext) throws SQLException { ResourceMetaData resourceMetaData = new ResourceMetaData(databaseConfig.getDataSources(), databaseConfig.getStorageUnits()); Collection databaseRules = DatabaseRulesBuilder.build(name, protocolType, databaseConfig, computeNodeInstanceContext, resourceMetaData); - Map schemas = new ConcurrentHashMap<>(GenericSchemaBuilder.build(new GenericSchemaBuilderMaterial( - protocolType, resourceMetaData.getStorageUnits(), databaseRules, props, new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name)))); + Map schemas = new ConcurrentHashMap<>(GenericSchemaBuilder.build(protocolType, + new GenericSchemaBuilderMaterial(resourceMetaData.getStorageUnits(), databaseRules, props, new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(name)))); SystemSchemaBuilder.build(name, protocolType, props).forEach(schemas::putIfAbsent); return new ShardingSphereDatabase(name, protocolType, resourceMetaData, new RuleMetaData(databaseRules), schemas.values()); } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java index cc5751aa89c86..4d8fb929da563 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java @@ -61,26 +61,28 @@ public final class GenericSchemaBuilder { /** * Build generic schema. * + * @param protocolType database type * @param material generic schema builder material * @return generic schema map * @throws SQLException SQL exception */ - public static Map build(final GenericSchemaBuilderMaterial material) throws SQLException { - return build(getAllTableNames(material.getRules()), material); + public static Map build(final DatabaseType protocolType, final GenericSchemaBuilderMaterial material) throws SQLException { + return build(getAllTableNames(material.getRules()), protocolType, material); } /** * Build generic schema. * * @param tableNames table names + * @param protocolType database type * @param material generic schema builder material * @return generic schema map * @throws SQLException SQL exception */ - public static Map build(final Collection tableNames, final GenericSchemaBuilderMaterial material) throws SQLException { + public static Map build(final Collection tableNames, final DatabaseType protocolType, final GenericSchemaBuilderMaterial material) throws SQLException { Map result = loadSchemas(tableNames, material); - if (!isSameProtocolAndStorageTypes(material.getProtocolType(), material.getStorageUnits())) { - result = translate(result, material); + if (!isSameProtocolAndStorageTypes(protocolType, material.getStorageUnits())) { + result = translate(result, protocolType, material); } return revise(result, material); } @@ -103,13 +105,13 @@ private static boolean isSameProtocolAndStorageTypes(final DatabaseType protocol return storageUnits.values().stream().map(StorageUnit::getStorageType).allMatch(protocolType::equals); } - private static Map translate(final Map schemaMetaDataMap, final GenericSchemaBuilderMaterial material) { + private static Map translate(final Map schemaMetaDataMap, final DatabaseType protocolType, final GenericSchemaBuilderMaterial material) { Collection tableMetaDataList = new LinkedList<>(); for (StorageUnit each : material.getStorageUnits().values()) { String defaultSchemaName = new DatabaseTypeRegistry(each.getStorageType()).getDefaultSchemaName(material.getDefaultSchemaName()); tableMetaDataList.addAll(Optional.ofNullable(schemaMetaDataMap.get(defaultSchemaName)).map(SchemaMetaData::getTables).orElseGet(Collections::emptyList)); } - String frontendSchemaName = new DatabaseTypeRegistry(material.getProtocolType()).getDefaultSchemaName(material.getDefaultSchemaName()); + String frontendSchemaName = new DatabaseTypeRegistry(protocolType).getDefaultSchemaName(material.getDefaultSchemaName()); Map result = new LinkedHashMap<>(); result.put(frontendSchemaName, new SchemaMetaData(frontendSchemaName, tableMetaDataList)); return result; diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java index f77db09a9c3f1..5cd5fa4919182 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderMaterial.java @@ -20,7 +20,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; @@ -34,8 +33,6 @@ @Getter public final class GenericSchemaBuilderMaterial { - private final DatabaseType protocolType; - private final Map storageUnits; private final Collection rules; diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java index b09e2640086e7..bac7fc8b37b71 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java @@ -58,39 +58,39 @@ @StaticMockSettings(MetaDataLoader.class) class GenericSchemaBuilderTest { + private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); + private GenericSchemaBuilderMaterial material; @BeforeEach void setUp() { - DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); ShardingSphereRule rule = mock(ShardingSphereRule.class); when(rule.getAttributes()).thenReturn(new RuleAttributes(mock(TableMapperRuleAttribute.class))); StorageUnit storageUnit = mock(StorageUnit.class); when(storageUnit.getStorageType()).thenReturn(databaseType); when(storageUnit.getDataSource()).thenReturn(new MockedDataSource()); - material = new GenericSchemaBuilderMaterial( - databaseType, Collections.singletonMap("foo_schema", storageUnit), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_schema"); + material = new GenericSchemaBuilderMaterial(Collections.singletonMap("foo_schema", storageUnit), Collections.singleton(rule), new ConfigurationProperties(new Properties()), "foo_schema"); } @Test void assertLoadWithExistedTableName() throws SQLException { Collection tableNames = Collections.singletonList("data_node_routed_table1"); when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); - assertFalse(GenericSchemaBuilder.build(tableNames, material).get("foo_schema").getAllTables().isEmpty()); + assertFalse(GenericSchemaBuilder.build(tableNames, databaseType, material).get("foo_schema").getAllTables().isEmpty()); } @Test void assertLoadWithNotExistedTableName() throws SQLException { Collection tableNames = Collections.singletonList("invalid_table"); when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); - assertTrue(GenericSchemaBuilder.build(tableNames, material).get("foo_schema").getAllTables().isEmpty()); + assertTrue(GenericSchemaBuilder.build(tableNames, databaseType, material).get("foo_schema").getAllTables().isEmpty()); } @Test void assertLoadAllTables() throws SQLException { Collection tableNames = Arrays.asList("data_node_routed_table1", "data_node_routed_table2"); when(MetaDataLoader.load(any())).thenReturn(createSchemaMetaDataMap(tableNames, material)); - Map actual = GenericSchemaBuilder.build(tableNames, material); + Map actual = GenericSchemaBuilder.build(tableNames, databaseType, material); assertThat(actual.size(), is(1)); assertTables(new ShardingSphereSchema("foo_schema", actual.values().iterator().next().getAllTables(), Collections.emptyList())); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java index 60877a908a503..63f64317c5a05 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java @@ -53,8 +53,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenConfigCheckMetaDataEnable() { when(rule0.getAttributes()).thenReturn(new RuleAttributes(ruleAttribute)); ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_order"), material, true); assertThat(actual.size(), is(2)); Iterator iterator = actual.iterator(); @@ -74,8 +73,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenNotConfigCheckMetaDataEnable() { when(rule0.getAttributes()).thenReturn(new RuleAttributes(ruleAttribute)); ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "sharding_db"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_order"), material, false); assertThat(actual.size(), is(1)); Iterator iterator = actual.iterator(); @@ -92,8 +90,7 @@ void assertGetSchemaMetaDataLoaderMaterialsWhenNotConfigCheckMetaDataEnableForSi when(rule0.getAttributes()).thenReturn(new RuleAttributes(ruleAttribute)); ShardingSphereRule rule1 = mock(ShardingSphereRule.class); when(rule1.getAttributes()).thenReturn(new RuleAttributes()); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - mock(DatabaseType.class), mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "public"); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(mockStorageUnits(), Arrays.asList(rule0, rule1), mock(ConfigurationProperties.class), "public"); Collection actual = SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("t_single"), material, false); assertThat(actual.size(), is(1)); Iterator iterator = actual.iterator(); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index dcd0c996fe7dd..5afaf40b62535 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -141,10 +141,9 @@ public void reloadSchema(final ShardingSphereDatabase database, final String sch private ShardingSphereSchema loadSchema(final ShardingSphereDatabase database, final String schemaName, final String dataSourceName) throws SQLException { database.reloadRules(); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getProtocolType(), - Collections.singletonMap(dataSourceName, database.getResourceMetaData().getStorageUnits().get(dataSourceName)), + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(Collections.singletonMap(dataSourceName, database.getResourceMetaData().getStorageUnits().get(dataSourceName)), database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); - ShardingSphereSchema result = GenericSchemaBuilder.build(material).get(schemaName); + ShardingSphereSchema result = GenericSchemaBuilder.build(database.getProtocolType(), material).get(schemaName); persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataFacade().getView().load(database.getName(), schemaName).forEach(result::putView); return result; } @@ -157,7 +156,7 @@ private ShardingSphereSchema loadSchema(final ShardingSphereDatabase database, f * @param tableName to be reloaded table name */ public void reloadTable(final ShardingSphereDatabase database, final String schemaName, final String tableName) { - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getProtocolType(), + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( database.getResourceMetaData().getStorageUnits(), database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); try { persistTable(database, schemaName, tableName, material); @@ -176,7 +175,7 @@ public void reloadTable(final ShardingSphereDatabase database, final String sche */ public void reloadTable(final ShardingSphereDatabase database, final String schemaName, final String dataSourceName, final String tableName) { StorageUnit storageUnit = database.getResourceMetaData().getStorageUnits().get(dataSourceName); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getProtocolType(), + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( Collections.singletonMap(dataSourceName, storageUnit), database.getRuleMetaData().getRules(), metaDataContexts.get().getMetaData().getProps(), schemaName); try { persistTable(database, schemaName, tableName, material); @@ -186,7 +185,7 @@ public void reloadTable(final ShardingSphereDatabase database, final String sche } private void persistTable(final ShardingSphereDatabase database, final String schemaName, final String tableName, final GenericSchemaBuilderMaterial material) throws SQLException { - ShardingSphereSchema schema = GenericSchemaBuilder.build(Collections.singleton(tableName), material).getOrDefault(schemaName, new ShardingSphereSchema(schemaName)); + ShardingSphereSchema schema = GenericSchemaBuilder.build(Collections.singleton(tableName), database.getProtocolType(), material).getOrDefault(schemaName, new ShardingSphereSchema(schemaName)); persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataFacade().getTable().persist(database.getName(), schemaName, Collections.singleton(schema.getTable(tableName))); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java index 299669ad48b08..d296cd3c67eb4 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java @@ -65,9 +65,8 @@ private ShardingSphereTable getTable(final ShardingSphereDatabase database, fina if (TableRefreshUtils.isSingleTable(tableName, database)) { ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName)); } - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), database.getProtocolType(), material); return Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)) .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java index d2f1201619e0d..2cf7f2d14c3de 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java @@ -53,9 +53,8 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe if (isSingleTable) { ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName)); } - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), database.getProtocolType(), material); Optional actualTableMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)); Preconditions.checkState(actualTableMetaData.isPresent(), "Load actual table metadata '%s' failed.", tableName); metaDataManagerPersistService.createTable(database.getName(), schemaName, actualTableMetaData.get(), logicDataSourceNames.isEmpty() ? null : logicDataSourceNames.iterator().next()); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java index 9a9edd9d996b1..435143a41f228 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java @@ -63,9 +63,8 @@ private ShardingSphereTable getTable(final ShardingSphereDatabase database, fina if (TableRefreshUtils.isSingleTable(tableName, database) && !logicDataSourceNames.isEmpty()) { ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName)); } - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), material); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(tableName), database.getProtocolType(), material); return Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(tableName)) .orElseGet(() -> new ShardingSphereTable(tableName, Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java index cfb2afae1b2c9..b1ffa59cedd1f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java @@ -76,9 +76,8 @@ private ShardingSphereSchema getSchema(final ShardingSphereDatabase database, fi if (TableRefreshUtils.isSingleTable(viewName, database)) { ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, viewName)); } - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), database.getProtocolType(), material); Optional actualViewMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(viewName)); ShardingSphereSchema result = new ShardingSphereSchema(schemaName); actualViewMetaData.ifPresent(result::putTable); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java index 7a1e89925326a..371cfc2daab63 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java @@ -54,9 +54,8 @@ public void refresh(final MetaDataManagerPersistService metaDataManagerPersistSe if (TableRefreshUtils.isSingleTable(viewName, database)) { ruleMetaData.getAttributes(MutableDataNodeRuleAttribute.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, viewName)); } - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial( - database.getProtocolType(), database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); - Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), material); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), ruleMetaData.getRules(), props, schemaName); + Map schemas = GenericSchemaBuilder.build(Collections.singletonList(viewName), database.getProtocolType(), material); Optional actualTableMetaData = Optional.ofNullable(schemas.get(schemaName)).map(optional -> optional.getTable(viewName)); Preconditions.checkState(actualTableMetaData.isPresent(), "Load actual view metadata '%s' failed.", viewName); AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO(database.getName(), schemaName, logicDataSourceNames); From fac2bb62e26d7db2b214b12dd4152f3f073385f7 Mon Sep 17 00:00:00 2001 From: YaoFly <2465939235@qq.com> Date: Tue, 10 Dec 2024 19:25:36 +0800 Subject: [PATCH 018/192] Support GroupConcat sql for aggregating multiple shards in opengauss and doris database(#33992) (#33991) * Support GroupConcat sql for aggregating multiple shards(#33797) * Check Style fix(#33797) * Check Style fix(#33797) * spotless fix (#33797) * unit test fix (#33797) * spotless fix (#33797) * group_concat distinct compatible (#33797) * group_concat distinct compatible (#33797) * unit test fix for distinct group_concat (#33797) * e2e test for group_concat (#33797) * e2e test for group_concat (#33797) * code format (#33797) * e2e test (#33797) * e2e test (#33797) * e2e test (#33797) * remove useless code(#33797) * code optimization (#33797) * sql parse unit test (#33797) * RELEASE-NOTES.md updated(#33797) * Code Optimization (#33797) * Support GroupConcat sql for aggregating multiple shards in opengauss and doris database(#33797) * doris parse unit test fix (#33797) * spotless fix (#33797) * Update RELEASE-NOTES.md --------- Co-authored-by: yaofly Co-authored-by: Zhengqiang Duan --- RELEASE-NOTES.md | 2 +- .../src/main/antlr4/imports/doris/BaseRule.g4 | 10 +++++- .../statement/DorisStatementVisitor.java | 34 +++++++++++++------ .../statement/MySQLStatementVisitor.java | 16 ++++++++- .../main/antlr4/imports/opengauss/BaseRule.g4 | 7 ++-- .../main/antlr4/imports/opengauss/Keyword.g4 | 3 ++ .../statement/OpenGaussStatementVisitor.java | 10 ++++-- .../cases/dql/e2e-dql-select-aggregate.xml | 4 +-- .../case/dml/select-special-function.xml | 3 ++ .../sql/supported/dml/select-aggregate.xml | 4 +-- .../supported/dml/select-special-function.xml | 2 +- 11 files changed, 72 insertions(+), 23 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0f8f89e0dc5c8..a80e8f1c66f05 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -28,7 +28,7 @@ 1. Proxy Native: Change the Base Docker Image of ShardingSphere Proxy Native - [#33263](https://github.com/apache/shardingsphere/issues/33263) 1. Proxy Native: Support connecting to HiveServer2 with ZooKeeper Service Discovery enabled in GraalVM Native Image - [#33768](https://github.com/apache/shardingsphere/pull/33768) 1. Proxy Native: Support local transactions of ClickHouse under GraalVM Native Image - [#33801](https://github.com/apache/shardingsphere/pull/33801) -1. Sharding: Support MYSQL GroupConcat function for aggregating multiple shards - [#33808](https://github.com/apache/shardingsphere/pull/33808) +1. Sharding: Support GroupConcat function for aggregating multiple shards in MySQL, OpenGauss, Doris - [#33808](https://github.com/apache/shardingsphere/pull/33808) 1. Proxy Native: Support Seata AT integration under Proxy Native in GraalVM Native Image - [#33889](https://github.com/apache/shardingsphere/pull/33889) 1. Agent: Simplify the use of Agent's Docker Image - [#33356](https://github.com/apache/shardingsphere/pull/33356) diff --git a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 index 8cf25e65a6395..6a560ccbc429b 100644 --- a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 +++ b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 @@ -965,8 +965,16 @@ udfFunction : functionName LP_ (expr? | expr (COMMA_ expr)*) RP_ ; +separatorName + : SEPARATOR string_ + ; + +aggregationExpression + : expr (COMMA_ expr)* | ASTERISK_ + ; + aggregationFunction - : aggregationFunctionName LP_ distinct? (expr (COMMA_ expr)* | ASTERISK_)? collateClause? RP_ overClause? + : aggregationFunctionName LP_ distinct? aggregationExpression? collateClause? separatorName? RP_ overClause? ; // DORIS ADDED BEGIN diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java index 1fc3967231b7e..ef186494f8257 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java @@ -22,6 +22,7 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.Interval; +import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.shardingsphere.sql.parser.api.ASTNode; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementBaseVisitor; @@ -958,14 +959,18 @@ public final ASTNode visitJsonTableFunction(final JsonTableFunctionContext ctx) private ASTNode createAggregationSegment(final AggregationFunctionContext ctx, final String aggregationType) { AggregationType type = AggregationType.valueOf(aggregationType.toUpperCase()); + String separator = null; + if (null != ctx.separatorName()) { + separator = new StringLiteralValue(ctx.separatorName().string_().getText()).getValue(); + } if (null != ctx.distinct()) { AggregationDistinctProjectionSegment result = - new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), getDistinctExpression(ctx)); - result.getParameters().addAll(getExpressions(ctx.expr())); + new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), getDistinctExpression(ctx), separator); + result.getParameters().addAll(getExpressions(ctx.aggregationExpression().expr())); return result; } - AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx)); - result.getParameters().addAll(getExpressions(ctx.expr())); + AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), separator); + result.getParameters().addAll(getExpressions(ctx.aggregationExpression().expr())); return result; } @@ -981,11 +986,7 @@ protected Collection getExpressions(final List e } private String getDistinctExpression(final AggregationFunctionContext ctx) { - StringBuilder result = new StringBuilder(); - for (int i = 3; i < ctx.getChildCount() - 1; i++) { - result.append(ctx.getChild(i).getText()); - } - return result.toString(); + return ctx.aggregationExpression().getText(); } @Override @@ -1046,12 +1047,25 @@ public final ASTNode visitSpecialFunction(final SpecialFunctionContext ctx) { public final ASTNode visitGroupConcatFunction(final GroupConcatFunctionContext ctx) { calculateParameterCount(ctx.expr()); FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.GROUP_CONCAT().getText(), getOriginalText(ctx)); - for (ExprContext each : ctx.expr()) { + for (ExprContext each : getTargetRuleContextFromParseTree(ctx, ExprContext.class)) { result.getParameters().add((ExpressionSegment) visit(each)); } return result; } + private Collection getTargetRuleContextFromParseTree(final ParseTree parseTree, final Class clazz) { + Collection result = new LinkedList<>(); + for (int index = 0; index < parseTree.getChildCount(); index++) { + ParseTree child = parseTree.getChild(index); + if (clazz.isInstance(child)) { + result.add(clazz.cast(child)); + } else { + result.addAll(getTargetRuleContextFromParseTree(child, clazz)); + } + } + return result; + } + // DORIS ADDED BEGIN @Override public final ASTNode visitBitwiseFunction(final BitwiseFunctionContext ctx) { diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java index 6ab433e59a16c..28fb3b1022bb4 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java @@ -22,6 +22,7 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.Interval; +import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.shardingsphere.sql.parser.api.ASTNode; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementBaseVisitor; @@ -1041,12 +1042,25 @@ public final ASTNode visitSpecialFunction(final SpecialFunctionContext ctx) { public final ASTNode visitGroupConcatFunction(final GroupConcatFunctionContext ctx) { calculateParameterCount(ctx.expr()); FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.GROUP_CONCAT().getText(), getOriginalText(ctx)); - for (ExprContext each : ctx.expr()) { + for (ExprContext each : getTargetRuleContextFromParseTree(ctx, ExprContext.class)) { result.getParameters().add((ExpressionSegment) visit(each)); } return result; } + private Collection getTargetRuleContextFromParseTree(final ParseTree parseTree, final Class clazz) { + Collection result = new LinkedList<>(); + for (int index = 0; index < parseTree.getChildCount(); index++) { + ParseTree child = parseTree.getChild(index); + if (clazz.isInstance(child)) { + result.add(clazz.cast(child)); + } else { + result.addAll(getTargetRuleContextFromParseTree(child, clazz)); + } + } + return result; + } + @Override public final ASTNode visitCastFunction(final CastFunctionContext ctx) { FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.CAST().getText(), getOriginalText(ctx)); diff --git a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4 b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4 index 610ebdda0be74..80817068f1e86 100644 --- a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4 +++ b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4 @@ -954,13 +954,16 @@ typeList : typeName (COMMA_ typeName)* ; +separatorName + : SEPARATOR STRING_ + ; + funcApplication : funcName LP_ RP_ - | funcName LP_ funcArgList sortClause? RP_ + | funcName LP_ DISTINCT? funcArgList sortClause? separatorName? RP_ | funcName LP_ VARIADIC funcArgExpr sortClause? RP_ | funcName LP_ funcArgList COMMA_ VARIADIC funcArgExpr sortClause? RP_ | funcName LP_ ALL funcArgList sortClause? RP_ - | funcName LP_ DISTINCT funcArgList sortClause? RP_ | funcName LP_ ASTERISK_ RP_ ; diff --git a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/Keyword.g4 b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/Keyword.g4 index 2a69c54c9e560..1f1bd27374103 100644 --- a/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/Keyword.g4 +++ b/parser/sql/dialect/opengauss/src/main/antlr4/imports/opengauss/Keyword.g4 @@ -664,3 +664,6 @@ MAXVALUE : M A X V A L U E ; +SEPARATOR + : S E P A R A T O R + ; diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java index 266d7d1fca7e9..00d0758eb9805 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/OpenGaussStatementVisitor.java @@ -449,7 +449,7 @@ public ASTNode visitFuncExpr(final FuncExprContext ctx) { Collection expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, AExprContext.class)); // TODO replace aggregation segment String aggregationType = ctx.funcApplication().funcName().getText(); - if (AggregationType.isAggregationType(aggregationType)) { + if (AggregationType.isAggregationType(aggregationType) && null == ctx.funcApplication().sortClause()) { return createAggregationSegment(ctx.funcApplication(), aggregationType, expressionSegments); } FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.funcApplication().funcName().getText(), getOriginalText(ctx)); @@ -594,13 +594,17 @@ public ASTNode visitBExpr(final BExprContext ctx) { private ProjectionSegment createAggregationSegment(final FuncApplicationContext ctx, final String aggregationType, final Collection expressionSegments) { AggregationType type = AggregationType.valueOf(aggregationType.toUpperCase()); + String separator = null; + if (null != ctx.separatorName()) { + separator = new StringLiteralValue(ctx.separatorName().STRING_().getText()).getValue(); + } if (null == ctx.DISTINCT()) { - AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx)); + AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), separator); result.getParameters().addAll(expressionSegments); return result; } AggregationDistinctProjectionSegment result = - new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), getDistinctExpression(ctx)); + new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, getOriginalText(ctx), getDistinctExpression(ctx), separator); result.getParameters().addAll(expressionSegments); return result; } diff --git a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-aggregate.xml b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-aggregate.xml index f4bd5b4809205..643f8d69e48d6 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-aggregate.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-aggregate.xml @@ -145,11 +145,11 @@ - + - + diff --git a/test/it/parser/src/main/resources/case/dml/select-special-function.xml b/test/it/parser/src/main/resources/case/dml/select-special-function.xml index 102a9540647e6..2a297614d7e42 100644 --- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml +++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml @@ -28,6 +28,9 @@ + + + diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml b/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml index a419612760697..0cae6e4c9afa2 100644 --- a/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml +++ b/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml @@ -38,6 +38,6 @@ - - + + diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml index 99727b077bc5d..178b5e7ef9c33 100644 --- a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml +++ b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml @@ -17,7 +17,7 @@ --> - + From 71814406e3e5ece6c1a2ce256d91ec71d8643ed3 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 10 Dec 2024 23:13:42 +0800 Subject: [PATCH 019/192] Remove useless codes on ColumnReviseEngine (#33999) --- .../schema/reviser/MetaDataReviseEngine.java | 10 ++-------- .../schema/reviser/column/ColumnReviseEngine.java | 6 ------ .../reviser/schema/SchemaMetaDataReviseEngine.java | 12 +++--------- .../reviser/table/TableMetaDataReviseEngine.java | 8 +------- .../schema/SchemaMetaDataReviseEngineTest.java | 6 ++---- .../reviser/table/TableMetadataReviseEngineTest.java | 12 ++---------- 6 files changed, 10 insertions(+), 44 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java index 6ddf574a133d8..798922e32b89f 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/MetaDataReviseEngine.java @@ -18,14 +18,11 @@ package org.apache.shardingsphere.infra.metadata.database.schema.reviser; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; -import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; +import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.schema.SchemaMetaDataReviseEngine; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; -import javax.sql.DataSource; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; @@ -49,10 +46,7 @@ public final class MetaDataReviseEngine { public Map revise(final Map schemaMetaDataMap, final GenericSchemaBuilderMaterial material) { Map result = new LinkedHashMap<>(schemaMetaDataMap.size(), 1F); for (Entry entry : schemaMetaDataMap.entrySet()) { - // TODO establish a corresponding relationship between tables and data sources - DatabaseType databaseType = material.getStorageUnits().values().stream().map(StorageUnit::getStorageType).findFirst().orElse(null); - DataSource dataSource = material.getStorageUnits().values().stream().map(StorageUnit::getDataSource).findFirst().orElse(null); - result.put(entry.getKey(), new SchemaMetaDataReviseEngine(rules, material.getProps(), databaseType, dataSource).revise(entry.getValue())); + result.put(entry.getKey(), new SchemaMetaDataReviseEngine(rules, material.getProps()).revise(entry.getValue())); } return result; } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/column/ColumnReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/column/ColumnReviseEngine.java index ba7355f7743c9..dc744ef076b19 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/column/ColumnReviseEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/column/ColumnReviseEngine.java @@ -19,11 +19,9 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnMetaData; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; -import javax.sql.DataSource; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Optional; @@ -38,10 +36,6 @@ public final class ColumnReviseEngine { private final T rule; - private final DatabaseType databaseType; - - private final DataSource dataSource; - private final MetaDataReviseEntry reviseEntry; /** diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngine.java index cacecc6145ba1..03bf9842152f9 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngine.java @@ -19,15 +19,13 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.schema.reviser.table.TableMetaDataReviseEngine; -import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; +import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry; +import org.apache.shardingsphere.infra.metadata.database.schema.reviser.table.TableMetaDataReviseEngine; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; -import javax.sql.DataSource; import java.util.Collection; import java.util.Map.Entry; import java.util.Optional; @@ -43,10 +41,6 @@ public final class SchemaMetaDataReviseEngine { private final ConfigurationProperties props; - private final DatabaseType databaseType; - - private final DataSource dataSource; - /** * Revise schema meta data. * @@ -63,7 +57,7 @@ public SchemaMetaData revise(final SchemaMetaData originalMetaData) { } private SchemaMetaData revise(final SchemaMetaData originalMetaData, final T rule, final MetaDataReviseEntry reviseEntry) { - TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource, reviseEntry); + TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, reviseEntry); Optional> aggregationReviser = reviseEntry.getSchemaTableAggregationReviser(props); if (!aggregationReviser.isPresent()) { return new SchemaMetaData(originalMetaData.getName(), originalMetaData.getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList())); diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetaDataReviseEngine.java index f29c355b44b4c..3822599555ebc 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetaDataReviseEngine.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetaDataReviseEngine.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.infra.metadata.database.schema.reviser.table; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.column.ColumnReviseEngine; @@ -26,7 +25,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.reviser.index.IndexReviseEngine; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; -import javax.sql.DataSource; import java.util.Optional; /** @@ -39,10 +37,6 @@ public final class TableMetaDataReviseEngine { private final T rule; - private final DatabaseType databaseType; - - private final DataSource dataSource; - private final MetaDataReviseEntry reviseEntry; /** @@ -54,7 +48,7 @@ public final class TableMetaDataReviseEngine { public TableMetaData revise(final TableMetaData originalMetaData) { Optional> tableNameReviser = reviseEntry.getTableNameReviser(); String revisedTableName = tableNameReviser.map(optional -> optional.revise(originalMetaData.getName(), rule)).orElse(originalMetaData.getName()); - return new TableMetaData(revisedTableName, new ColumnReviseEngine<>(rule, databaseType, dataSource, reviseEntry).revise(originalMetaData.getName(), originalMetaData.getColumns()), + return new TableMetaData(revisedTableName, new ColumnReviseEngine<>(rule, reviseEntry).revise(originalMetaData.getName(), originalMetaData.getColumns()), new IndexReviseEngine<>(rule, reviseEntry).revise(originalMetaData.getName(), originalMetaData.getIndexes()), new ConstraintReviseEngine<>(rule, reviseEntry).revise(originalMetaData.getName(), originalMetaData.getConstraints()), originalMetaData.getType()); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngineTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngineTest.java index f1b0d8c0b1155..b9b2f4e6efc72 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngineTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/schema/SchemaMetaDataReviseEngineTest.java @@ -23,11 +23,9 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.rule.builder.fixture.FixtureGlobalRule; import org.junit.jupiter.api.Test; -import javax.sql.DataSource; import java.sql.Types; import java.util.Arrays; import java.util.Collection; @@ -45,7 +43,7 @@ class SchemaMetaDataReviseEngineTest { void assertReviseWithoutMetaDataReviseEntry() { SchemaMetaData schemaMetaData = new SchemaMetaData("expected", Collections.singleton(mock(TableMetaData.class))); SchemaMetaData actual = new SchemaMetaDataReviseEngine( - Collections.emptyList(), new ConfigurationProperties(new Properties()), mock(DatabaseType.class), mock(DataSource.class)).revise(schemaMetaData); + Collections.emptyList(), new ConfigurationProperties(new Properties())).revise(schemaMetaData); assertThat(actual.getName(), is(schemaMetaData.getName())); assertThat(actual.getTables(), is(schemaMetaData.getTables())); } @@ -54,7 +52,7 @@ void assertReviseWithoutMetaDataReviseEntry() { void assertReviseWithMetaDataReviseEntry() { SchemaMetaData schemaMetaData = new SchemaMetaData("expected", Collections.singletonList(createTableMetaData())); SchemaMetaData actual = new SchemaMetaDataReviseEngine( - Collections.singleton(new FixtureGlobalRule()), new ConfigurationProperties(new Properties()), mock(DatabaseType.class), mock(DataSource.class)).revise(schemaMetaData); + Collections.singleton(new FixtureGlobalRule()), new ConfigurationProperties(new Properties())).revise(schemaMetaData); assertThat(actual.getName(), is(schemaMetaData.getName())); assertThat(actual.getTables(), is(schemaMetaData.getTables())); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java index 1d632b0ec0993..e304796c914e3 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/reviser/table/TableMetadataReviseEngineTest.java @@ -20,7 +20,6 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.test.mock.AutoMockExtension; @@ -31,7 +30,6 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; -import javax.sql.DataSource; import java.util.Collection; import java.util.LinkedList; import java.util.Optional; @@ -52,12 +50,6 @@ class TableMetadataReviseEngineTest { @Mock private T rule; - @Mock - private DatabaseType databaseType; - - @Mock - private DataSource dataSource; - @SuppressWarnings("rawtypes") @Mock private MetaDataReviseEntry metaDataReviseEntry; @@ -67,7 +59,7 @@ class TableMetadataReviseEngineTest { void assertGetRevisedTableName() { TableNameReviser tableNameReviser = mock(TableNameReviser.class); TableMetaData originalMetaData = new TableMetaData("originalTableName", new LinkedList<>(), null, null); - TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine(rule, databaseType, dataSource, metaDataReviseEntry); + TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine(rule, metaDataReviseEntry); doReturn(Optional.of(tableNameReviser)).when(metaDataReviseEntry).getTableNameReviser(); when(tableNameReviser.revise(anyString(), eq(rule))).thenReturn("revisedTableName"); TableMetaData revisedMetaData = tableMetaDataReviseEngine.revise(originalMetaData); @@ -82,7 +74,7 @@ void assertGetOriginalTableName() { Collection indexes = new LinkedList<>(); indexes.add(new IndexMetaData("index1")); TableMetaData tableMetaData = new TableMetaData("originalTableName", columns, indexes, null); - TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine(rule, databaseType, dataSource, metaDataReviseEntry); + TableMetaDataReviseEngine tableMetaDataReviseEngine = new TableMetaDataReviseEngine(rule, metaDataReviseEntry); when(metaDataReviseEntry.getTableNameReviser()).thenReturn(Optional.empty()); TableMetaData revisedMetaData = tableMetaDataReviseEngine.revise(tableMetaData); assertThat(revisedMetaData.getName(), is("originalTableName")); From 38ead32b4dcbf144c3aecf73ef4364a282abf904 Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Wed, 11 Dec 2024 10:03:11 +0800 Subject: [PATCH 020/192] Fix the mismatch between processed record count and actual data count for inventory dumper (#33996) --- .../core/ingest/dumper/inventory/InventoryDumper.java | 6 ++++-- .../dumper/inventory/InventoryDumperContext.java | 2 ++ .../splitter/InventoryDumperContextSplitter.java | 10 ++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumper.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumper.java index ff7a42fbb0c52..39024c346be42 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumper.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumper.java @@ -144,7 +144,8 @@ private void dumpByPage(final Connection connection, final PipelineTableMetaData AtomicLong rowCount = new AtomicLong(); IngestPosition position = dumperContext.getCommonContext().getPosition(); do { - QueryRange queryRange = new QueryRange(((PrimaryKeyIngestPosition) position).getBeginValue(), firstQuery, ((PrimaryKeyIngestPosition) position).getEndValue()); + QueryRange queryRange = new QueryRange(((PrimaryKeyIngestPosition) position).getBeginValue(), firstQuery && dumperContext.isFirstDump(), + ((PrimaryKeyIngestPosition) position).getEndValue()); InventoryQueryParameter queryParam = new InventoryRangeQueryParameter(queryRange); List dataRecords = dumpByPage(connection, queryParam, rowCount, tableMetaData); if (dataRecords.size() > 1 && Objects.deepEquals(getFirstUniqueKeyValue(dataRecords, 0), getFirstUniqueKeyValue(dataRecords, dataRecords.size() - 1))) { @@ -169,7 +170,8 @@ private List dumpByPage(final Connection connection, final InventoryQueryParameter queryParam, final AtomicLong rowCount, final PipelineTableMetaData tableMetaData) throws SQLException { DatabaseType databaseType = dumperContext.getCommonContext().getDataSourceConfig().getDatabaseType(); int batchSize = dumperContext.getBatchSize(); - try (PreparedStatement preparedStatement = JDBCStreamQueryBuilder.build(databaseType, connection, buildDumpByPageSQL(queryParam), batchSize)) { + String sql = buildDumpByPageSQL(queryParam); + try (PreparedStatement preparedStatement = JDBCStreamQueryBuilder.build(databaseType, connection, sql, batchSize)) { runningStatement.set(preparedStatement); setParameters(preparedStatement, queryParam); try (ResultSet resultSet = preparedStatement.executeQuery()) { diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumperContext.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumperContext.java index 306be54aadd05..2052b2c005e7c 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumperContext.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/ingest/dumper/inventory/InventoryDumperContext.java @@ -58,6 +58,8 @@ public final class InventoryDumperContext { private JobRateLimitAlgorithm rateLimitAlgorithm; + private boolean firstDump = true; + public InventoryDumperContext(final DumperCommonContext commonContext) { this.commonContext = new DumperCommonContext( commonContext.getDataSourceName(), commonContext.getDataSourceConfig(), commonContext.getTableNameMapper(), commonContext.getTableAndSchemaNameMapper()); diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/inventory/splitter/InventoryDumperContextSplitter.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/inventory/splitter/InventoryDumperContextSplitter.java index bca5d26788886..5fa5458177e74 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/inventory/splitter/InventoryDumperContextSplitter.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/inventory/splitter/InventoryDumperContextSplitter.java @@ -93,7 +93,7 @@ private Collection splitByPrimaryKey(final InventoryDump JobRateLimitAlgorithm rateLimitAlgorithm = jobProcessContext.getReadRateLimitAlgorithm(); int i = 0; for (IngestPosition each : getInventoryPositions(dumperContext, jobItemContext)) { - result.add(createPrimaryKeySplitDumperContext(dumperContext, each, i++, batchSize, rateLimitAlgorithm)); + result.add(createPrimaryKeySplitDumperContext(dumperContext, each, i++, batchSize, rateLimitAlgorithm, jobItemContext)); } return result; } @@ -149,7 +149,8 @@ private Range getUniqueKeyValuesRange(final TransmissionJobItemContext job } private InventoryDumperContext createPrimaryKeySplitDumperContext(final InventoryDumperContext dumperContext, final IngestPosition position, - final int shardingItem, final int batchSize, final JobRateLimitAlgorithm rateLimitAlgorithm) { + final int shardingItem, final int batchSize, final JobRateLimitAlgorithm rateLimitAlgorithm, + final TransmissionJobItemContext jobItemContext) { InventoryDumperContext result = new InventoryDumperContext(dumperContext.getCommonContext()); result.getCommonContext().setPosition(position); result.setShardingItem(shardingItem); @@ -159,6 +160,11 @@ private InventoryDumperContext createPrimaryKeySplitDumperContext(final Inventor result.setInsertColumnNames(dumperContext.getInsertColumnNames()); result.setBatchSize(batchSize); result.setRateLimitAlgorithm(rateLimitAlgorithm); + result.setFirstDump(isFirstDump(jobItemContext)); return result; } + + private boolean isFirstDump(final TransmissionJobItemContext jobItemContext) { + return null == jobItemContext.getInitProgress() && jobItemContext.getProcessedRecordsCount() == 0; + } } From 3624015aeb3a2caadcfddc31e7315ba699c35ad7 Mon Sep 17 00:00:00 2001 From: Daniel Giribet Date: Wed, 11 Dec 2024 03:33:46 +0100 Subject: [PATCH 021/192] Added EXTRACT_URL_PARAMETER to Doris parsing support (#31508) (#33571) * added extract_url_parameter as extra - added test - added parser g4 in `extractUrlParameterFunction` - added visitor logic - ran spotless - ran (though will check again once committed and do a full test) ``` cd test/it/parser/ mvn -DskipTests=true generate-sources compile install -q cd parser/sql/dialect/doris/ mvn test -Dit.test=InternalDorisParserIT ``` Question - do we collapse two consecutive changes? So ``` // DORIS ADDED END // DORIS ADDED BEGIN ``` would be ``` ``` * fixed test index * fixed all test indexes * updated release notes --- RELEASE-NOTES.md | 2 ++ .../src/main/antlr4/imports/doris/BaseRule.g4 | 12 ++++++++++++ .../main/antlr4/imports/doris/DorisKeyword.g4 | 6 ++++++ .../statement/DorisStatementVisitor.java | 16 ++++++++++++++++ .../case/dml/select-special-function.xml | 17 ++++++++++++++++- .../supported/dml/select-special-function.xml | 1 + 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index a80e8f1c66f05..cf068e87abc92 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -22,6 +22,8 @@ 1. SQL Federation: Upgrade calcite version to 1.38.0 and update all license info in LICENSE file - [#33279](https://github.com/apache/shardingsphere/pull/33279) 1. Transaction: Bump the minimum Seata Client version for Seata AT integration to 2.2.0 - [#33872](https://github.com/apache/shardingsphere/pull/33872) 1. JDBC: Add show database name for JDBC when execute SHOW COMPUTE NODES - [#33437](https://github.com/apache/shardingsphere/pull/33437) +1. Kernel: Add binding to owner table - [#33533](https://github.com/apache/shardingsphere/pull/33533) +1. SQL Parser: Support parsing Doris EXTRACT\_URL\_PARAMETER - [#33571](https://github.com/apache/shardingsphere/pull/33571) 1. JDBC: Support ZonedDateTime on ResultSet - [#33660](https://github.com/apache/shardingsphere/issues/33660) 1. Proxy: Add query parameters and check for MySQL kill processId - [#33274](https://github.com/apache/shardingsphere/pull/33274) 1. Proxy: Support table not exist exception for PostgreSQL proxy - [#33885](https://github.com/apache/shardingsphere/pull/33274) diff --git a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 index 6a560ccbc429b..81e18359d0749 100644 --- a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 +++ b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 @@ -231,6 +231,9 @@ identifierKeywordsUnambiguous | EXPORT | EXTENDED | EXTENT_SIZE + // DORIS ADDED BEGIN + | EXTRACT_URL_PARAMETER + // DORIS ADDED END | FAILED_LOGIN_ATTEMPTS | FAST | FAULTS @@ -1059,6 +1062,9 @@ specialFunction | currentUserFunction | charFunction | extractFunction + // DORIS ADDED BEGIN + | extractUrlParameterFunction + // DORIS ADDED END | groupConcatFunction // DORIS ADDED BEGIN | instrFunction @@ -1167,6 +1173,12 @@ extractFunction : EXTRACT LP_ intervalUnit FROM expr RP_ ; +// DORIS ADDED BEGIN +extractUrlParameterFunction + : EXTRACT_URL_PARAMETER LP_ expr COMMA_ expr RP_ + ; +// DORIS ADDED END + charFunction : CHAR LP_ expr (COMMA_ expr)* (USING charsetName)? RP_ ; diff --git a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4 b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4 index 57e5d9facf9f7..447ea9bfdd519 100644 --- a/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4 +++ b/parser/sql/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4 @@ -765,6 +765,12 @@ EXTENDED : E X T E N D E D ; +// DORIS ADDED BEGIN +EXTRACT_URL_PARAMETER + : E X T R A C T UL_ U R L UL_ P A R A M E T E R + ; +// DORIS ADDED END + EXTENT_SIZE : E X T E N T UL_ S I Z E ; diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java index ef186494f8257..ee182a80fcf44 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/DorisStatementVisitor.java @@ -60,6 +60,7 @@ import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.EscapedTableReferenceContext; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ExprContext; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ExtractFunctionContext; +import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ExtractUrlParameterFunctionContext; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.FieldLengthContext; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.FieldsContext; import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.FromClauseContext; @@ -1009,6 +1010,11 @@ public final ASTNode visitSpecialFunction(final SpecialFunctionContext ctx) { return visit(ctx.convertFunction()); } // DORIS ADDED BEGIN + if (null != ctx.extractUrlParameterFunction()) { + return visit(ctx.extractUrlParameterFunction()); + } + // DORIS ADDED END + // DORIS ADDED BEGIN if (null != ctx.instrFunction()) { return visit(ctx.instrFunction()); } @@ -1077,6 +1083,16 @@ public final ASTNode visitBitwiseFunction(final BitwiseFunctionContext ctx) { } // DORIS ADDED END + // DORIS ADDED BEGIN + @Override + public final ASTNode visitExtractUrlParameterFunction(final ExtractUrlParameterFunctionContext ctx) { + FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.EXTRACT_URL_PARAMETER().getText(), getOriginalText(ctx)); + result.getParameters().add(new LiteralExpressionSegment(ctx.expr(0).getStart().getStartIndex(), ctx.expr(0).getStop().getStopIndex(), ctx.expr(0).getText())); + result.getParameters().add(new LiteralExpressionSegment(ctx.expr(1).getStart().getStartIndex(), ctx.expr(1).getStop().getStopIndex(), ctx.expr(1).getText())); + return result; + } + // DORIS ADDED END + // DORIS ADDED BEGIN @Override public final ASTNode visitInstrFunction(final InstrFunctionContext ctx) { diff --git a/test/it/parser/src/main/resources/case/dml/select-special-function.xml b/test/it/parser/src/main/resources/case/dml/select-special-function.xml index 2a297614d7e42..dfdcd27b89685 100644 --- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml +++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml @@ -4767,7 +4767,22 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/select.xml b/test/it/binder/src/test/resources/sqls/dml/select.xml new file mode 100644 index 0000000000000..aa09790e7ad17 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/select.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java index ecaa805fd2c94..1f091e7cec7f3 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java @@ -48,6 +48,7 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.impl.top.ExpectedTopProjection; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.sql.type.SQLCaseType; +import java.util.ArrayList; import java.util.List; import static org.hamcrest.CoreMatchers.instanceOf; @@ -128,15 +129,26 @@ private static void assertShorthandProjection(final SQLCaseAssertContext assertC assertTrue(actual.getOwner().isPresent(), assertContext.getText("Actual owner should exist.")); OwnerAssert.assertIs(assertContext, actual.getOwner().get(), expected.getOwner()); } + assertActualProjections(assertContext, actual, expected); } - private static void assertColumnProjection(final SQLCaseAssertContext assertContext, final ColumnProjectionSegment actual, final ExpectedColumnProjection expected) { - assertThat(assertContext.getText("Column projection alias assertion error: "), actual.getAliasName().orElse(null), is(expected.getAlias())); - if (null != actual.getColumn().getNestedObjectAttributes()) { - assertThat(assertContext.getText("Nested Object attributes assertion error: "), actual.getColumn().getExpression(), is(expected.getName())); + private static void assertActualProjections(final SQLCaseAssertContext assertContext, final ShorthandProjectionSegment actual, final ExpectedShorthandProjection expected) { + if (0 == expected.getActualProjections().getSize()) { + assertTrue(actual.getActualProjectionSegments().isEmpty(), assertContext.getText("Actual projections should not exist.")); } else { - IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getIdentifier(), expected, "Column projection"); + assertFalse(actual.getActualProjectionSegments().isEmpty(), assertContext.getText("Actual projections should exist.")); + assertThat(assertContext.getText("Actual projections size assertion error:"), actual.getActualProjectionSegments().size(), is(expected.getActualProjections().getSize())); + List actualProjectionSegments = new ArrayList<>(actual.getActualProjectionSegments()); + int index = 0; + for (ExpectedProjection each : expected.getActualProjections().getExpectedProjections()) { + assertProjection(assertContext, actualProjectionSegments.get(index++), each); + } } + } + + private static void assertColumnProjection(final SQLCaseAssertContext assertContext, final ColumnProjectionSegment actual, final ExpectedColumnProjection expected) { + assertThat(assertContext.getText("Column projection alias assertion error: "), actual.getAliasName().orElse(null), is(expected.getAlias())); + assertColumnSegment(assertContext, actual, expected); assertLeftParentheses(assertContext, actual, expected); assertRightParentheses(assertContext, actual, expected); if (null == expected.getOwner()) { @@ -147,6 +159,20 @@ private static void assertColumnProjection(final SQLCaseAssertContext assertCont } } + private static void assertColumnSegment(final SQLCaseAssertContext assertContext, final ColumnProjectionSegment actual, final ExpectedColumnProjection expected) { + if (null != actual.getColumn().getNestedObjectAttributes()) { + assertThat(assertContext.getText("Nested Object attributes assertion error: "), actual.getColumn().getExpression(), is(expected.getName())); + } else { + IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getIdentifier(), expected, "Column projection"); + if (null != expected.getColumnBound()) { + IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalDatabase(), expected.getColumnBound().getOriginalDatabase(), "Bound Database"); + IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalSchema(), expected.getColumnBound().getOriginalSchema(), "Bound Schema"); + IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalTable(), expected.getColumnBound().getOriginalTable(), "Bound Table"); + IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalColumn(), expected.getColumnBound().getOriginalColumn(), "Bound Column"); + } + } + } + private static void assertLeftParentheses(final SQLCaseAssertContext assertContext, final ColumnProjectionSegment actual, final ExpectedColumnProjection expected) { if (null == expected.getLeftParentheses()) { assertFalse(actual.getColumn().getLeftParentheses().isPresent(), assertContext.getText("Actual left parentheses should not exist.")); diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java index 6285f307889ff..a13e50f21a0d6 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java @@ -121,7 +121,7 @@ private static void assertIs(final SQLCaseAssertContext assertContext, final Fun * @param expected expected table */ public static void assertIs(final SQLCaseAssertContext assertContext, final SimpleTableSegment actual, final ExpectedSimpleTable expected) { - IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getIdentifier(), expected, "Table"); + assertTableNameSegment(assertContext, actual, expected); assertThat(assertContext.getText("Table alias assertion error: "), actual.getAliasName().orElse(null), is(expected.getAlias())); if (null == expected.getOwner()) { assertFalse(actual.getOwner().isPresent(), assertContext.getText("Actual owner should not exist.")); @@ -237,13 +237,6 @@ private static void assertJoinType(final SQLCaseAssertContext assertContext, fin } } - /** - * Assert actual table function segment is correct with expected table function. - * - * @param assertContext assert context - * @param actual actual table function - * @param expected expected table function - */ private static void assertTableFunction(final SQLCaseAssertContext assertContext, final ExpressionSegment actual, final ExpectedTableFunction expected) { if (actual instanceof XmlTableFunctionSegment) { XmlTableFunctionSegment actualXmlTableFunction = (XmlTableFunctionSegment) actual; @@ -255,4 +248,15 @@ private static void assertTableFunction(final SQLCaseAssertContext assertContext assertThat(assertContext.getText("Function text assert error"), actual.getText(), is(expected.getText())); } } + + private static void assertTableNameSegment(final SQLCaseAssertContext assertContext, final SimpleTableSegment actual, final ExpectedSimpleTable expected) { + IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getIdentifier(), expected, "Table"); + if (null == expected.getTableBound()) { + assertFalse(actual.getTableName().getTableBoundInfo().isPresent(), assertContext.getText("Actual table bound should not exist.")); + } else { + assertTrue(actual.getTableName().getTableBoundInfo().isPresent(), assertContext.getText("Actual table bound should exist.")); + IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getTableBoundInfo().get().getOriginalDatabase(), expected.getTableBound().getOriginalDatabase(), "Bound Database"); + IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getTableBoundInfo().get().getOriginalSchema(), expected.getTableBound().getOriginalSchema(), "Bound Schema"); + } + } } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java new file mode 100644 index 0000000000000..bbbcb1cafde9f --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedColumnBoundInfo.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound; + +import lombok.Getter; +import lombok.Setter; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column.ExpectedOriginalColumn; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column.ExpectedOriginalTable; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalDatabase; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalSchema; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Expected column bound info. + */ +@Getter +@Setter +public final class ExpectedColumnBoundInfo extends AbstractExpectedSQLSegment { + + @XmlElement(name = "original-database") + private ExpectedOriginalDatabase originalDatabase; + + @XmlElement(name = "original-schema") + private ExpectedOriginalSchema originalSchema; + + @XmlElement(name = "original-table") + private ExpectedOriginalTable originalTable; + + @XmlElement(name = "original-column") + private ExpectedOriginalColumn originalColumn; +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java new file mode 100644 index 0000000000000..ea47c9c9e867b --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/ExpectedTableBoundInfo.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound; + +import lombok.Getter; +import lombok.Setter; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalDatabase; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table.ExpectedOriginalSchema; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Expected table bound info. + */ +@Getter +@Setter +public final class ExpectedTableBoundInfo extends AbstractExpectedSQLSegment { + + @XmlElement(name = "original-database") + private ExpectedOriginalDatabase originalDatabase; + + @XmlElement(name = "original-schema") + private ExpectedOriginalSchema originalSchema; +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java new file mode 100644 index 0000000000000..63249f7b7d171 --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalColumn.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column; + +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; + +/** + * Expected original column. + */ +public final class ExpectedOriginalColumn extends AbstractExpectedIdentifierSQLSegment { +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java new file mode 100644 index 0000000000000..a7e863a1835a6 --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/column/ExpectedOriginalTable.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.column; + +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; + +/** + * Expected original table. + */ +public final class ExpectedOriginalTable extends AbstractExpectedIdentifierSQLSegment { +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java new file mode 100644 index 0000000000000..fbf3a0ec66252 --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalDatabase.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table; + +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; + +/** + * Expected original database. + */ +public final class ExpectedOriginalDatabase extends AbstractExpectedIdentifierSQLSegment { +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java new file mode 100644 index 0000000000000..929acb240084d --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/bound/table/ExpectedOriginalSchema.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.table; + +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; + +/** + * Expected original schema. + */ +public final class ExpectedOriginalSchema extends AbstractExpectedIdentifierSQLSegment { +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java index 565e140fd47f3..7e57759c14db4 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/column/ExpectedColumnProjection.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedColumnBoundInfo; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.generic.ExpectedParentheses; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner; @@ -45,4 +46,7 @@ public final class ExpectedColumnProjection extends AbstractExpectedIdentifierSQ @XmlElement(name = "right-parentheses") private ExpectedParentheses rightParentheses; + + @XmlElement(name = "column-bound") + private ExpectedColumnBoundInfo columnBound; } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java index 019d71b2a5b7e..ba9cd77ad0e17 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/projection/impl/shorthand/ExpectedShorthandProjection.java @@ -21,6 +21,7 @@ import lombok.Setter; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjection; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.projection.ExpectedProjections; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner; import javax.xml.bind.annotation.XmlElement; @@ -34,4 +35,7 @@ public final class ExpectedShorthandProjection extends AbstractExpectedSQLSegmen @XmlElement private ExpectedOwner owner; + + @XmlElement(name = "actual-projections") + private final ExpectedProjections actualProjections = new ExpectedProjections(); } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java index 7354ce47e0d78..96421c3d0e3f8 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/table/ExpectedSimpleTable.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedTableBoundInfo; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; @@ -39,6 +40,9 @@ public final class ExpectedSimpleTable extends AbstractExpectedIdentifierSQLSegm @XmlElement private ExpectedOwner owner; + @XmlElement(name = "table-bound") + private ExpectedTableBoundInfo tableBound; + @XmlElement(name = "index-hint") private final Collection indexHints = new LinkedList<>(); } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java index ac0fecb2d35e2..c1f6ba1430ff4 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/loader/CaseLoaderTemplate.java @@ -40,9 +40,22 @@ public final class CaseLoaderTemplate { * @param type of test case * @return loaded cases */ - @SneakyThrows({JAXBException.class, IOException.class}) public static Map load(final String rootDirectory, final CaseLoaderCallback callback) { File file = new File(CaseLoaderTemplate.class.getProtectionDomain().getCodeSource().getLocation().getPath()); + return load(file, rootDirectory, callback); + } + + /** + * Load test cases. + * + * @param file file + * @param rootDirectory root directory + * @param callback callback of cases loader + * @param type of test case + * @return loaded cases + */ + @SneakyThrows({JAXBException.class, IOException.class}) + public static Map load(final File file, final String rootDirectory, final CaseLoaderCallback callback) { return file.isFile() ? callback.loadFromJar(file, rootDirectory) : callback.loadFromDirectory(rootDirectory); } } diff --git a/test/it/pom.xml b/test/it/pom.xml index 501cad8031024..fa0a4b30ecf08 100644 --- a/test/it/pom.xml +++ b/test/it/pom.xml @@ -35,5 +35,6 @@ optimizer rewriter pipeline + binder From bff515598becbca78e712a815ccf188203ed5ee6 Mon Sep 17 00:00:00 2001 From: jiangML <1060319118@qq.com> Date: Tue, 17 Dec 2024 15:07:42 +0800 Subject: [PATCH 090/192] Fix errors caused by missing oid column in pg_description, pg_attribute, pg_type, pg_attrdef table of OpenGauss (#34086) --- .../opengauss/select_opengauss_pg_catalog_pg_attrdef.xml | 1 + .../opengauss/select_opengauss_pg_catalog_pg_attribute.xml | 1 + .../opengauss/select_opengauss_pg_catalog_pg_description.xml | 1 + .../opengauss/select_opengauss_pg_catalog_pg_type.xml | 1 + 4 files changed, 4 insertions(+) diff --git a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attrdef.xml b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attrdef.xml index 8b4c7b3022eab..99bed2bf38cbc 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attrdef.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attrdef.xml @@ -17,6 +17,7 @@ + diff --git a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attribute.xml b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attribute.xml index 6eecde5da8abd..245b0fe9bb66b 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attribute.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_attribute.xml @@ -17,6 +17,7 @@ + diff --git a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_description.xml b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_description.xml index fe36074934c80..ed926b9733f06 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_description.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_description.xml @@ -17,6 +17,7 @@ + diff --git a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_type.xml b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_type.xml index d78ae8bebfd65..b74d73771bbc1 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_type.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/dataset/empty_storage_units/opengauss/select_opengauss_pg_catalog_pg_type.xml @@ -17,6 +17,7 @@ + From 8c33423979537ea2456509f26a4ae1565a2e06f4 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 17 Dec 2024 18:30:49 +0800 Subject: [PATCH 091/192] Remove useless codes on SQLStatementType (#34087) --- .../core/statement/SQLStatementType.java | 40 +----------- .../core/statement/SQLStatementTypeTest.java | 64 ------------------- 2 files changed, 1 insertion(+), 103 deletions(-) delete mode 100644 parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementTypeTest.java diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementType.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementType.java index 07cff1923882b..54f0f692a326d 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementType.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementType.java @@ -17,48 +17,10 @@ package org.apache.shardingsphere.sql.parser.statement.core.statement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; - -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.ConcurrentHashMap; - /** * SQL statement type. */ public enum SQLStatementType { - DML, DDL, TCL, DCL, DAL, RL; - - private static final Collection> INVOLVE_DATA_CHANGES_STATEMENTS = Collections.newSetFromMap(new ConcurrentHashMap<>()); - - private static final Collection> NOT_INVOLVE_DATA_CHANGES_STATEMENTS = Collections.newSetFromMap(new ConcurrentHashMap<>()); - - /** - * Judge whether involves data changes. - * - * @param sqlStatement SQL statement - * @return is statement involves data changes or not - */ - public static boolean involvesDataChanges(final SQLStatement sqlStatement) { - Class sqlStatementClass = sqlStatement.getClass(); - if (NOT_INVOLVE_DATA_CHANGES_STATEMENTS.contains(sqlStatementClass)) { - return false; - } - if (INVOLVE_DATA_CHANGES_STATEMENTS.contains(sqlStatementClass)) { - return true; - } - if (sqlStatement instanceof SelectStatement) { - NOT_INVOLVE_DATA_CHANGES_STATEMENTS.add(sqlStatementClass); - return false; - } - if (sqlStatement instanceof DMLStatement || sqlStatement instanceof DDLStatement) { - INVOLVE_DATA_CHANGES_STATEMENTS.add(sqlStatementClass); - return true; - } - NOT_INVOLVE_DATA_CHANGES_STATEMENTS.add(sqlStatementClass); - return false; - } + DML, DDL, TCL, DCL, DAL, RL } diff --git a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementTypeTest.java b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementTypeTest.java deleted file mode 100644 index 1e4bbfdf68284..0000000000000 --- a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/statement/SQLStatementTypeTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.sql.parser.statement.core.statement; - -import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; - -class SQLStatementTypeTest { - - @Test - void assertInvolvesDataChangesWithSelectStatement() { - assertFalse(SQLStatementType.involvesDataChanges(mock(SelectStatement.class))); - } - - @Test - void assertNotInvolvesDataChangesWithUpdateStatement() { - assertTrue(SQLStatementType.involvesDataChanges(mock(UpdateStatement.class))); - } - - @Test - void assertNotInvolvesDataChangesWithDDLStatement() { - assertTrue(SQLStatementType.involvesDataChanges(mock(CreateTableStatement.class))); - } - - @Test - void assertInvolvesDataChangesWithOtherStatement() { - assertFalse(SQLStatementType.involvesDataChanges(mock(ShowStatement.class))); - } - - @Test - void assertInvolvesDataChangesWithCache() { - assertFalse(SQLStatementType.involvesDataChanges(mock(SelectStatement.class))); - assertFalse(SQLStatementType.involvesDataChanges(mock(SelectStatement.class))); - } - - @Test - void assertNotInvolvesDataChangesWithCache() { - assertTrue(SQLStatementType.involvesDataChanges(mock(DeleteStatement.class))); - assertTrue(SQLStatementType.involvesDataChanges(mock(DeleteStatement.class))); - } -} From 694c6bfc2e3459ea34c4d32483e04e08ff9a193a Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Tue, 17 Dec 2024 19:04:34 +0800 Subject: [PATCH 092/192] Add sql bind logic for create table statement and check simple table binder (#34074) * Add sql bind logic for create table statement * update release note * fix unit test * Pass metadata to PipelineDDLGenerator * fix checkstyle * Add it test for create table statement * fix unit test * fix unit test --- RELEASE-NOTES.md | 1 + .../ShardingRouteCacheableCheckerTest.java | 2 +- ...ingCreateFunctionSupportedCheckerTest.java | 6 +- ...ngCreateProcedureSupportedCheckerTest.java | 6 +- ...ardingCreateTableSupportedCheckerTest.java | 12 ++- ...ingCreateTableRouteContextCheckerTest.java | 9 +- .../binder/engine/segment/SegmentType.java | 2 +- .../column/ColumnDefinitionSegmentBinder.java | 63 +++++++++++++ .../segment/combine/CombineSegmentBinder.java | 2 +- .../expression/type/ColumnSegmentBinder.java | 2 +- .../type/SubquerySegmentBinder.java | 2 +- .../from/type/JoinTableSegmentBinder.java | 3 +- .../from/type/SimpleTableSegmentBinder.java | 55 +++++++++--- .../from/type/SubqueryTableSegmentBinder.java | 4 +- .../statement/SQLStatementBinderContext.java | 12 +-- .../ddl/CreateTableStatementBinder.java | 59 +++++++++++++ .../engine/type/DDLStatementBindEngine.java | 7 +- .../engine/type/DMLStatementBindEngine.java | 2 +- .../type/ColumnSegmentBinderTest.java | 27 +++--- .../ExistsSubqueryExpressionBinderTest.java | 6 +- .../FunctionExpressionSegmentBinderTest.java | 7 +- .../type/SubquerySegmentBinderTest.java | 6 +- .../from/type/JoinTableSegmentBinderTest.java | 27 +++--- .../type/SimpleTableSegmentBinderTest.java | 7 +- .../type/SubqueryTableSegmentBinderTest.java | 13 ++- .../dml/DeleteStatementBinderTest.java | 2 +- .../dml/InsertStatementBinderTest.java | 6 +- .../dml/SelectStatementBinderTest.java | 2 +- .../dml/UpdateStatementBinderTest.java | 2 +- .../generator/PipelineDDLGenerator.java | 7 +- .../PipelineJobDataSourcePreparer.java | 9 +- .../param/PrepareTargetTablesParameter.java | 3 + .../PipelineJobDataSourcePreparerTest.java | 3 +- .../preparer/MigrationJobPreparer.java | 2 +- .../single/route/SingleSQLRouterTest.java | 3 +- .../engine/engine/SingleRouteEngineTest.java | 11 ++- .../transaction/util/AutoCommitUtilsTest.java | 4 +- .../type/DorisDDLStatementVisitor.java | 3 +- .../type/MySQLDDLStatementVisitor.java | 5 +- .../type/OpenGaussDDLStatementVisitor.java | 3 +- .../type/PostgreSQLDDLStatementVisitor.java | 3 +- .../type/PrestoDDLStatementVisitor.java | 3 +- .../core/statement/AbstractSQLStatement.java | 3 +- .../statement/ddl/CreateTableStatement.java | 24 +++++ .../doris/ddl/DorisCreateTableStatement.java | 2 +- .../mysql/ddl/MySQLCreateTableStatement.java | 2 +- .../ddl/OpenGaussCreateTableStatement.java | 4 +- .../ddl/PostgreSQLCreateTableStatement.java | 4 +- .../ddl/PrestoCreateTableStatement.java | 2 +- .../connector/ProxySQLExecutorTest.java | 6 +- .../MySQLComStmtPrepareCheckerTest.java | 4 +- .../test/resources/cases/ddl/create-table.xml | 88 +++++++++++++++++++ .../test/resources/sqls/ddl/create-table.xml | 21 +++++ .../segment/bound/ColumnBoundAssert.java | 49 +++++++++++ .../segment/bound/TableBoundAssert.java | 52 +++++++++++ .../definition/ColumnDefinitionAssert.java | 8 +- .../segment/projection/ProjectionAssert.java | 8 +- .../asserts/segment/table/TableAssert.java | 9 +- .../segment/impl/column/ExpectedColumn.java | 4 + .../ddl/create/create-table.xml | 8 +- .../encrypt/config/query-with-cipher.yaml | 26 ++++++ 61 files changed, 598 insertions(+), 139 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/create-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/create-table.xml create mode 100644 test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/ColumnBoundAssert.java create mode 100644 test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/TableBoundAssert.java diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index dcc167c950336..15249fef963f4 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -34,6 +34,7 @@ 1. Proxy Native: Support Seata AT integration under Proxy Native in GraalVM Native Image - [#33889](https://github.com/apache/shardingsphere/pull/33889) 1. Agent: Simplify the use of Agent's Docker Image - [#33356](https://github.com/apache/shardingsphere/pull/33356) 1. Metadata: Add load-table-metadata-batch-size props to concurrent load table metadata - [#34009](https://github.com/apache/shardingsphere/pull/34009) +1. SQL Binder: Add sql bind logic for create table statement - [#34074](https://github.com/apache/shardingsphere/pull/34074) ### Bug Fixes diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java index 4ca1d047cbd63..391c25814ad13 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java @@ -178,7 +178,7 @@ public Stream provideArguments(final ExtensionContext exten Arguments.of("update t_warehouse set warehouse_name = ? where id = ?", Arrays.asList("foo", 1), true, Collections.singletonList(1)), Arguments.of("delete from t_warehouse where id = ?", Collections.singletonList(1), true, Collections.singletonList(0))); Collection nonCacheableCases = Arrays.asList( - Arguments.of("create table t_warehouse (id int4 not null primary key)", Collections.emptyList(), false, Collections.emptyList()), + Arguments.of("create table t_warehouse_for_create (id int4 not null primary key)", Collections.emptyList(), false, Collections.emptyList()), Arguments.of("insert into t_warehouse (id) select warehouse_id from t_order", Collections.emptyList(), false, Collections.emptyList()), Arguments.of("insert into t_warehouse (id) values (?), (?)", Arrays.asList(1, 2), false, Collections.emptyList()), Arguments.of("insert into t_non_sharding_table (id) values (?)", Collections.singletonList(1), false, Collections.emptyList()), diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java index 517500fbdae6c..b9ed9e2000bf8 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateFunctionSupportedCheckerTest.java @@ -53,7 +53,8 @@ class ShardingCreateFunctionSupportedCheckerTest { void assertCheckCreateFunctionForMySQL() { MySQLSelectStatement selectStatement = new MySQLSelectStatement(); selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); - MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); createTableStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); @@ -104,7 +105,8 @@ void assertCheckCreateFunctionWithNoSuchTableForMySQL() { @Test void assertCheckCreateFunctionWithTableExistsForMySQL() { - MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); createTableStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java index e48488ffe9472..3713cbb5567bd 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java @@ -53,7 +53,8 @@ class ShardingCreateProcedureSupportedCheckerTest { void assertCheckForMySQL() { MySQLSelectStatement selectStatement = new MySQLSelectStatement(); selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); - MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); createTableStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); @@ -105,7 +106,8 @@ void assertCheckWithNoSuchTableForMySQL() { @Test void assertCheckWithTableExistsForMySQL() { - MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); createTableStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java index 6231def67420d..8e6a75b9ead6c 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateTableSupportedCheckerTest.java @@ -49,7 +49,8 @@ class ShardingCreateTableSupportedCheckerTest { @Test void assertCheckForMySQL() { - MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 2, new IdentifierValue("t_order")))); assertThrows(TableExistsException.class, () -> assertCheck(sqlStatement)); } @@ -63,7 +64,8 @@ void assertCheckForOracle() { @Test void assertCheckForPostgreSQL() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(false); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 2, new IdentifierValue("t_order")))); assertThrows(TableExistsException.class, () -> assertCheck(sqlStatement)); } @@ -92,14 +94,16 @@ private void assertCheck(final CreateTableStatement sqlStatement) { @Test void assertCheckIfNotExistsForMySQL() { - MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(true); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(true); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 2, new IdentifierValue("t_order")))); assertCheckIfNotExists(sqlStatement); } @Test void assertCheckIfNotExistsForPostgreSQL() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(true); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(true); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 2, new IdentifierValue("t_order")))); assertCheckIfNotExists(sqlStatement); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java index e2f568eb205ae..a5a0bee90c919 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingCreateTableRouteContextCheckerTest.java @@ -64,7 +64,8 @@ class ShardingCreateTableRouteContextCheckerTest { @Test void assertCheckWithSameRouteResultShardingTableForPostgreSQL() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(false); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -78,7 +79,8 @@ void assertCheckWithSameRouteResultShardingTableForPostgreSQL() { @Test void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(false); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -92,7 +94,8 @@ void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() { @Test void assertCheckWithSameRouteResultBroadcastTableForPostgreSQL() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(false); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_config")))); when(queryContext.getSqlStatementContext()).thenReturn(new CreateTableStatementContext(sqlStatement)); assertDoesNotThrow(() -> new ShardingCreateTableRouteContextChecker().check(shardingRule, queryContext, database, mock(ConfigurationProperties.class), routeContext)); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java index fb62d9f6ff757..6cd02df131ad0 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java @@ -22,5 +22,5 @@ */ public enum SegmentType { - PROJECTION, PREDICATE, JOIN_ON, JOIN_USING, ORDER_BY, GROUP_BY, LOCK, SET_ASSIGNMENT, VALUES, INSERT_COLUMNS + PROJECTION, PREDICATE, JOIN_ON, JOIN_USING, ORDER_BY, GROUP_BY, LOCK, SET_ASSIGNMENT, VALUES, INSERT_COLUMNS, DEFINITION_COLUMNS } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java new file mode 100644 index 0000000000000..633bfd8582171 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.column; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; + +/** + * Column definition segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ColumnDefinitionSegmentBinder { + + /** + * Bind column definition segment. + * + * @param segment column definition segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @return bound column definition segment + */ + public static ColumnDefinitionSegment bind(final ColumnDefinitionSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts) { + ColumnSegment boundColumnSegment = ColumnSegmentBinder.bind(segment.getColumnName(), SegmentType.DEFINITION_COLUMNS, binderContext, tableBinderContexts, LinkedHashMultimap.create()); + ColumnDefinitionSegment result = + new ColumnDefinitionSegment(segment.getStartIndex(), segment.getStopIndex(), boundColumnSegment, segment.getDataType(), segment.isPrimaryKey(), segment.isNotNull(), segment.getText()); + copy(segment, result); + segment.getReferencedTables().forEach(each -> result.getReferencedTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + private static void copy(final ColumnDefinitionSegment result, final ColumnDefinitionSegment segment) { + result.setAutoIncrement(segment.isAutoIncrement()); + result.setRef(segment.isRef()); + result.setCharsetName(segment.getCharsetName()); + result.setCollateName(segment.getCollateName()); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java index a8c9d3538df67..d3d6180de958a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java @@ -51,7 +51,7 @@ public static CombineSegment bind(final CombineSegment segment, final SQLStateme private static SubquerySegment bindSubquerySegment(final SubquerySegment segment, final SQLStatementBinderContext binderContext, final Multimap outerTableBinderContexts) { SubquerySegment result = new SubquerySegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText()); - SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(segment.getSelect(), binderContext.getMetaData(), binderContext.getCurrentDatabaseName()); + SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSelect()); subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); result.setSelect(new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSelect(), subqueryBinderContext)); return result; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java index 3e3a894764c12..6020cc3f1bbdf 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java @@ -172,7 +172,7 @@ private static Optional findInputColumnSegment(final ColumnSegmen } } if (!isFindInputColumn) { - result = findInputColumnSegmentByVariables(segment, binderContext.getVariableNames()).orElse(null); + result = findInputColumnSegmentByVariables(segment, binderContext.getSqlStatement().getVariableNames()).orElse(null); isFindInputColumn = null != result; } if (!isFindInputColumn) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java index bcefdbd14f9bc..afaca7dbcdba4 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java @@ -43,7 +43,7 @@ public final class SubquerySegmentBinder { */ public static SubquerySegment bind(final SubquerySegment segment, final SQLStatementBinderContext binderContext, final Multimap outerTableBinderContexts) { - SQLStatementBinderContext selectBinderContext = new SQLStatementBinderContext(segment.getSelect(), binderContext.getMetaData(), binderContext.getCurrentDatabaseName()); + SQLStatementBinderContext selectBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSelect()); selectBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); SelectStatement boundSelectStatement = new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSelect(), selectBinderContext); return new SubquerySegment(segment.getStartIndex(), segment.getStopIndex(), boundSelectStatement, segment.getText()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java index 20af49d943801..455d9d7a4936b 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java @@ -83,7 +83,8 @@ public static JoinTableSegment bind(final JoinTableSegment segment, final SQLSta result.setDerivedUsing(bindUsingColumns(derivedUsingColumns, tableBinderContexts)); result.getDerivedUsing().forEach(each -> binderContext.getUsingColumnNames().add(each.getIdentifier().getValue())); } - result.getDerivedJoinTableProjectionSegments().addAll(getDerivedJoinTableProjectionSegments(result, binderContext.getDatabaseType(), usingColumnsByNaturalJoin, tableBinderContexts)); + result.getDerivedJoinTableProjectionSegments() + .addAll(getDerivedJoinTableProjectionSegments(result, binderContext.getSqlStatement().getDatabaseType(), usingColumnsByNaturalJoin, tableBinderContexts)); binderContext.getJoinTableProjectionSegments().addAll(result.getDerivedJoinTableProjectionSegments()); return result; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java index d94ad27e23e16..7c3e9c00a6874 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java @@ -32,10 +32,14 @@ import org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException; +import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException; +import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.metadata.database.schema.manager.SystemSchemaManager; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; @@ -44,6 +48,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; @@ -71,11 +76,10 @@ public static SimpleTableSegment bind(final SimpleTableSegment segment, final SQ final Multimap tableBinderContexts) { fillPivotColumnNamesInBinderContext(segment, binderContext); IdentifierValue databaseName = getDatabaseName(segment, binderContext); - ShardingSpherePreconditions.checkNotNull(databaseName.getValue(), NoDatabaseSelectedException::new); - IdentifierValue schemaName = getSchemaName(segment, binderContext); + IdentifierValue schemaName = getSchemaName(segment, binderContext, databaseName); IdentifierValue tableName = segment.getTableName().getIdentifier(); - checkTableExists(binderContext, databaseName.getValue(), schemaName.getValue(), tableName.getValue()); ShardingSphereSchema schema = binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(schemaName.getValue()); + checkTableExists(binderContext, schema, schemaName.getValue(), tableName.getValue()); tableBinderContexts.put(new CaseInsensitiveString(segment.getAliasName().orElseGet(tableName::getValue)), createSimpleTableBinderContext(segment, schema, databaseName, schemaName, binderContext)); TableNameSegment tableNameSegment = new TableNameSegment(segment.getTableName().getStartIndex(), segment.getTableName().getStopIndex(), tableName); @@ -91,9 +95,19 @@ private static void fillPivotColumnNamesInBinderContext(final SimpleTableSegment } private static IdentifierValue getDatabaseName(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext) { - DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData(); + DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(binderContext.getSqlStatement().getDatabaseType()).getDialectDatabaseMetaData(); Optional owner = dialectDatabaseMetaData.getDefaultSchema().isPresent() ? segment.getOwner().flatMap(OwnerSegment::getOwner) : segment.getOwner(); - return new IdentifierValue(owner.map(optional -> optional.getIdentifier().getValue()).orElse(binderContext.getCurrentDatabaseName())); + IdentifierValue result = new IdentifierValue(owner.map(optional -> optional.getIdentifier().getValue()).orElse(binderContext.getCurrentDatabaseName())); + ShardingSpherePreconditions.checkNotNull(result.getValue(), NoDatabaseSelectedException::new); + ShardingSpherePreconditions.checkState(binderContext.getMetaData().containsDatabase(result.getValue()), () -> new UnknownDatabaseException(result.getValue())); + return result; + } + + private static IdentifierValue getSchemaName(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext, final IdentifierValue databaseName) { + IdentifierValue result = getSchemaName(segment, binderContext); + ShardingSpherePreconditions.checkState(binderContext.getMetaData().getDatabase(databaseName.getValue()).containsSchema(result.getValue()), + () -> new SchemaNotFoundException(result.getValue())); + return result; } private static IdentifierValue getSchemaName(final SimpleTableSegment segment, final SQLStatementBinderContext binderContext) { @@ -101,7 +115,7 @@ private static IdentifierValue getSchemaName(final SimpleTableSegment segment, f return segment.getOwner().get().getIdentifier(); } // TODO getSchemaName according to search path - DatabaseType databaseType = binderContext.getDatabaseType(); + DatabaseType databaseType = binderContext.getSqlStatement().getDatabaseType(); if ((databaseType instanceof PostgreSQLDatabaseType || databaseType instanceof OpenGaussDatabaseType) && SystemSchemaManager.isSystemTable(databaseType.getType(), PG_CATALOG, segment.getTableName().getIdentifier().getValue())) { return new IdentifierValue(PG_CATALOG); @@ -109,8 +123,13 @@ private static IdentifierValue getSchemaName(final SimpleTableSegment segment, f return new IdentifierValue(new DatabaseTypeRegistry(databaseType).getDefaultSchemaName(binderContext.getCurrentDatabaseName())); } - private static void checkTableExists(final SQLStatementBinderContext binderContext, final String databaseName, final String schemaName, final String tableName) { - if ("dual".equalsIgnoreCase(tableName)) { + private static void checkTableExists(final SQLStatementBinderContext binderContext, final ShardingSphereSchema schema, final String schemaName, final String tableName) { + if (binderContext.getSqlStatement() instanceof CreateTableStatement) { + CreateTableStatement sqlStatement = (CreateTableStatement) binderContext.getSqlStatement(); + ShardingSpherePreconditions.checkState(sqlStatement.isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } + if ("DUAL".equalsIgnoreCase(tableName)) { return; } if (SystemSchemaManager.isSystemTable(schemaName, tableName)) { @@ -119,10 +138,7 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte if (binderContext.getExternalTableBinderContexts().containsKey(new CaseInsensitiveString(tableName))) { return; } - ShardingSpherePreconditions.checkState(binderContext.getMetaData().containsDatabase(databaseName) - && binderContext.getMetaData().getDatabase(databaseName).containsSchema(schemaName) - && binderContext.getMetaData().getDatabase(databaseName).getSchema(schemaName).containsTable(tableName), - () -> new TableNotFoundException(tableName)); + ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); } private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, @@ -131,14 +147,27 @@ private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(fi if (binderContext.getMetaData().getDatabase(databaseName.getValue()).getSchema(schemaName.getValue()).containsTable(tableName.getValue())) { return createSimpleTableSegmentBinderContextWithMetaData(segment, schema, databaseName, schemaName, binderContext, tableName); } + if (binderContext.getSqlStatement() instanceof CreateTableStatement) { + return new SimpleTableSegmentBinderContext(createProjectionSegments((CreateTableStatement) binderContext.getSqlStatement(), databaseName, schemaName, tableName)); + } return new SimpleTableSegmentBinderContext(Collections.emptyList()); } + private static Collection createProjectionSegments(final CreateTableStatement sqlStatement, final IdentifierValue databaseName, + final IdentifierValue schemaName, final IdentifierValue tableName) { + Collection result = new LinkedList<>(); + for (ColumnDefinitionSegment each : sqlStatement.getColumnDefinitions()) { + each.getColumnName().setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(databaseName, schemaName), tableName, each.getColumnName().getIdentifier())); + result.add(new ColumnProjectionSegment(each.getColumnName())); + } + return result; + } + private static SimpleTableSegmentBinderContext createSimpleTableSegmentBinderContextWithMetaData(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, final IdentifierValue schemaName, final SQLStatementBinderContext binderContext, final IdentifierValue tableName) { Collection projectionSegments = new LinkedList<>(); - QuoteCharacter quoteCharacter = new DatabaseTypeRegistry(binderContext.getDatabaseType()).getDialectDatabaseMetaData().getQuoteCharacter(); + QuoteCharacter quoteCharacter = new DatabaseTypeRegistry(binderContext.getSqlStatement().getDatabaseType()).getDialectDatabaseMetaData().getQuoteCharacter(); for (ShardingSphereColumn each : schema.getTable(tableName.getValue()).getAllColumns()) { ColumnProjectionSegment columnProjectionSegment = new ColumnProjectionSegment(createColumnSegment(segment, databaseName, schemaName, each, quoteCharacter, tableName)); columnProjectionSegment.setVisible(each.isVisible()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java index fd056f567f1be..bd8b3ae73629f 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java @@ -51,7 +51,7 @@ public static SubqueryTableSegment bind(final SubqueryTableSegment segment, fina final Multimap tableBinderContexts, final Multimap outerTableBinderContexts) { fillPivotColumnNamesInBinderContext(segment, binderContext); - SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(segment.getSubquery().getSelect(), binderContext.getMetaData(), binderContext.getCurrentDatabaseName()); + SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSubquery().getSelect()); subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); SelectStatement boundSubSelect = new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSubquery().getSelect(), subqueryBinderContext); SubquerySegment boundSubquerySegment = new SubquerySegment(segment.getSubquery().getStartIndex(), segment.getSubquery().getStopIndex(), boundSubSelect, segment.getSubquery().getText()); @@ -59,7 +59,7 @@ public static SubqueryTableSegment bind(final SubqueryTableSegment segment, fina SubqueryTableSegment result = new SubqueryTableSegment(segment.getStartIndex(), segment.getStopIndex(), boundSubquerySegment); segment.getAliasSegment().ifPresent(result::setAlias); tableBinderContexts.put(new CaseInsensitiveString(subqueryTableName.getValue()), new SimpleTableSegmentBinderContext( - SubqueryTableBindUtils.createSubqueryProjections(boundSubSelect.getProjections().getProjections(), subqueryTableName, binderContext.getDatabaseType()))); + SubqueryTableBindUtils.createSubqueryProjections(boundSubSelect.getProjections().getProjections(), subqueryTableName, binderContext.getSqlStatement().getDatabaseType()))); return result; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java index 10d28175fa81e..172660b6ed5fc 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java @@ -24,7 +24,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; @@ -43,9 +42,7 @@ public final class SQLStatementBinderContext { private final String currentDatabaseName; - private final DatabaseType databaseType; - - private final Collection variableNames; + private final SQLStatement sqlStatement; private final Collection usingColumnNames = new CaseInsensitiveSet<>(); @@ -54,11 +51,4 @@ public final class SQLStatementBinderContext { private final Multimap externalTableBinderContexts = LinkedHashMultimap.create(); private final Collection pivotColumnNames = new CaseInsensitiveSet<>(); - - public SQLStatementBinderContext(final SQLStatement sqlStatement, final ShardingSphereMetaData metaData, final String currentDatabaseName) { - this.metaData = metaData; - this.currentDatabaseName = currentDatabaseName; - databaseType = sqlStatement.getDatabaseType(); - variableNames = new CaseInsensitiveSet<>(sqlStatement.getVariableNames()); - } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java new file mode 100644 index 0000000000000..99960f4fb5409 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.column.ColumnDefinitionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; + +/** + * Create table statement binder. + */ +public final class CreateTableStatementBinder implements SQLStatementBinder { + + @Override + public CreateTableStatement bind(final CreateTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + CreateTableStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTable(SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts)); + sqlStatement.getSelectStatement().ifPresent(optional -> result.setSelectStatement(new SelectStatementBinder().bind(optional, binderContext))); + sqlStatement.getColumnDefinitions().forEach(each -> result.getColumnDefinitions().add(ColumnDefinitionSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static CreateTableStatement copy(final CreateTableStatement sqlStatement) { + CreateTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.getConstraintDefinitions().addAll(sqlStatement.getConstraintDefinitions()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.setIfNotExists(sqlStatement.isIfNotExists()); + result.getColumns().addAll(sqlStatement.getColumns()); + sqlStatement.getLikeTable().ifPresent(result::setLikeTable); + sqlStatement.getCreateTableOption().ifPresent(result::setCreateTableOption); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index db899e183b37e..66a5f0215532f 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -19,8 +19,10 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; @@ -41,10 +43,13 @@ public final class DDLStatementBindEngine { * @return bound DDL statement */ public DDLStatement bind(final DDLStatement statement) { - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(statement, metaData, currentDatabaseName); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, statement); if (statement instanceof CursorStatement) { return new CursorStatementBinder().bind((CursorStatement) statement, binderContext); } + if (statement instanceof CreateTableStatement) { + return new CreateTableStatementBinder().bind((CreateTableStatement) statement, binderContext); + } return statement; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java index 4500a020a86d4..00a1688655de2 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java @@ -47,7 +47,7 @@ public final class DMLStatementBindEngine { * @return bound DML statement */ public DMLStatement bind(final DMLStatement statement) { - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(statement, metaData, currentDatabaseName); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, statement); if (statement instanceof SelectStatement) { return new SelectStatementBinder().bind((SelectStatement) statement, binderContext); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java index 9952c36f686bf..bfaddcd17ba37 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java @@ -33,6 +33,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -45,6 +46,7 @@ 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.when; class ColumnSegmentBinderTest { @@ -62,8 +64,9 @@ void assertBindWithMultiTablesJoinAndNoOwner() { new IdentifierValue("t_order_item"), new IdentifierValue("item_id"))); tableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundItemIdColumn)))); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("order_id")); - SQLStatementBinderContext binderContext = - new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", databaseType, Collections.emptySet()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.JOIN_ON, binderContext, tableBinderContexts, LinkedHashMultimap.create()); assertNotNull(actual.getColumnBoundInfo()); assertNull(actual.getOtherUsingColumnBoundInfo()); @@ -84,8 +87,9 @@ void assertBindFromOuterTable() { boundOrderItemStatusColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("t_order_item"), new IdentifierValue("status"))); outerTableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemStatusColumn)))); - SQLStatementBinderContext binderContext = - new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", databaseType, Collections.emptySet()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, LinkedHashMultimap.create(), outerTableBinderContexts); assertNotNull(actual.getColumnBoundInfo()); @@ -107,8 +111,9 @@ void assertBindWithSameTableAliasAndSameProjection() { boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("t_order_item"), new IdentifierValue("status"))); tableBinderContexts.put(new CaseInsensitiveString("temp"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemColumn)))); - SQLStatementBinderContext binderContext = - new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", databaseType, Collections.emptySet()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("temp"))); assertThrows(AmbiguousColumnException.class, () -> ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, tableBinderContexts, LinkedHashMultimap.create())); @@ -125,8 +130,9 @@ void assertBindWithSameTableAliasAndDifferentProjection() { boundOrderItemColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("t_order_item"), new IdentifierValue("status"))); tableBinderContexts.put(new CaseInsensitiveString("temp"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemColumn)))); - SQLStatementBinderContext binderContext = - new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", databaseType, Collections.emptySet()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("temp"))); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, tableBinderContexts, LinkedHashMultimap.create()); @@ -151,8 +157,9 @@ void assertBindOwner() { tableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundItemIdColumn)))); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("order_id")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("t_order"))); - SQLStatementBinderContext binderContext = - new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", databaseType, Collections.emptySet()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.JOIN_ON, binderContext, tableBinderContexts, LinkedHashMultimap.create()); assertTrue(actual.getOwner().isPresent()); assertTrue(actual.getOwner().get().getTableBoundInfo().isPresent()); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java index b8ace4d0b9cac..ce3d1b7b2a28f 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java @@ -23,12 +23,10 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExistsSubqueryExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionsSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement; -import org.apache.shardingsphere.test.fixture.database.MockedDatabaseType; import org.junit.jupiter.api.Test; -import java.util.Collections; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; @@ -40,7 +38,7 @@ void assertBindExistsSubqueryExpression() { MySQLSelectStatement selectStatement = new MySQLSelectStatement(); selectStatement.setProjections(new ProjectionsSegment(0, 0)); ExistsSubqueryExpression existsSubqueryExpression = new ExistsSubqueryExpression(0, 0, new SubquerySegment(0, 0, selectStatement, "t_test")); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new MockedDatabaseType(), Collections.emptyList()); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", mock(SQLStatement.class)); ExistsSubqueryExpression actual = ExistsSubqueryExpressionBinder.bind(existsSubqueryExpression, binderContext, LinkedHashMultimap.create()); assertThat(actual.getStartIndex(), is(existsSubqueryExpression.getStartIndex())); assertThat(actual.getStopIndex(), is(existsSubqueryExpression.getStopIndex())); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java index de1c871ded843..699ad7cc12923 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java @@ -22,20 +22,19 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; -import org.apache.shardingsphere.test.fixture.database.MockedDatabaseType; +import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.junit.jupiter.api.Test; -import java.util.Collections; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; class FunctionExpressionSegmentBinderTest { @Test void assertBindFunctionExpressionSegment() { FunctionSegment functionSegment = new FunctionSegment(0, 0, "CONCAT", "('%','abc','%')"); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(new ShardingSphereMetaData(), "foo_db", new MockedDatabaseType(), Collections.emptyList()); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(new ShardingSphereMetaData(), "foo_db", mock(SQLStatement.class)); FunctionSegment actual = FunctionExpressionSegmentBinder.bind(functionSegment, SegmentType.PROJECTION, binderContext, LinkedHashMultimap.create(), LinkedHashMultimap.create()); assertThat(actual.getStartIndex(), is(functionSegment.getStartIndex())); assertThat(actual.getStopIndex(), is(functionSegment.getStopIndex())); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java index 96fa3d2005521..f879f813eac35 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java @@ -23,11 +23,9 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; @@ -39,6 +37,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement; import org.junit.jupiter.api.Test; @@ -69,8 +68,7 @@ void assertBind() { ExpressionSegment whereExpressionSegment = new ColumnSegment(86, 91, new IdentifierValue("status")); mysqlSelectStatement.setWhere(new WhereSegment(80, 102, whereExpressionSegment)); SubquerySegment subquerySegment = new SubquerySegment(39, 103, mysqlSelectStatement, "order_id = (SELECT order_id FROM t_order WHERE status = 'SUBMIT')"); - SQLStatementBinderContext sqlStatementBinderContext = new SQLStatementBinderContext( - createMetaData(), "foo_db", TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), Collections.emptySet()); + SQLStatementBinderContext sqlStatementBinderContext = new SQLStatementBinderContext(createMetaData(), "foo_db", mock(SQLStatement.class)); ColumnSegment boundNameColumn = new ColumnSegment(7, 13, new IdentifierValue("user_id")); boundNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo( new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("t_order_item"), new IdentifierValue("user_id"))); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java index be8f8ad761323..785990cce8ef4 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java @@ -35,6 +35,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -42,7 +43,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; import static org.hamcrest.CoreMatchers.instanceOf; @@ -68,8 +68,9 @@ void assertBindWithAlias() { when(joinTableSegment.getRight()).thenReturn(rightTable); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - JoinTableSegment actual = JoinTableSegmentBinder.bind( - joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), tableBinderContexts, LinkedHashMultimap.create()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegments(actual.getDerivedJoinTableProjectionSegments()); @@ -106,8 +107,9 @@ void assertBindWithoutAlias() { when(joinTableSegment.getRight()).thenReturn(rightTable); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegments(actual.getDerivedJoinTableProjectionSegments()); @@ -128,8 +130,9 @@ void assertBindWithNaturalJoin() { when(joinTableSegment.getJoinType()).thenReturn(JoinType.RIGHT.name()); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegmentsWithNaturalJoin(actual.getDerivedJoinTableProjectionSegments()); @@ -164,8 +167,9 @@ void assertBindWithJoinUsing() { when(joinTableSegment.getUsing()).thenReturn(Arrays.asList(new ColumnSegment(0, 0, new IdentifierValue("status")), new ColumnSegment(0, 0, new IdentifierValue("order_id")))); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegmentsWithUsing(actual.getDerivedJoinTableProjectionSegments()); @@ -199,8 +203,9 @@ void assertBindWithMultiTableJoin() { when(joinTableSegment.getRight()).thenReturn(rightTable); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, - new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), tableBinderContexts, LinkedHashMultimap.create()); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(JoinTableSegment.class)); assertThat(((JoinTableSegment) actual.getLeft()).getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(((JoinTableSegment) actual.getLeft()).getRight(), instanceOf(SimpleTableSegment.class)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java index e99a256dfd88a..f49fa42d257bc 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java @@ -30,12 +30,12 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; import java.sql.Types; import java.util.Arrays; -import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -51,8 +51,9 @@ void assertBindTableNotExists() { SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new TableNameSegment(0, 10, new IdentifierValue("t_not_exists"))); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - assertThrows(TableNotFoundException.class, () -> SimpleTableSegmentBinder.bind( - simpleTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), tableBinderContexts)); + SelectStatement selectStatement = mock(SelectStatement.class); + when(selectStatement.getDatabaseType()).thenReturn(databaseType); + assertThrows(TableNotFoundException.class, () -> SimpleTableSegmentBinder.bind(simpleTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts)); } private ShardingSphereMetaData createMetaData() { diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java index 3fd70d8bbd1bd..8cacd05fe7661 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java @@ -44,7 +44,6 @@ import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -73,8 +72,8 @@ void assertBindWithSubqueryTableAlias() { subqueryTableSegment.setAlias(new AliasSegment(0, 0, new IdentifierValue("temp"))); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - SubqueryTableSegment actual = SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegment actual = + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertTrue(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString("temp"))); List projectionSegments = new ArrayList<>(tableBinderContexts.get(new CaseInsensitiveString("temp")).iterator().next().getProjectionSegments()); @@ -107,8 +106,8 @@ void assertBindWithSubqueryProjectionAlias() { subqueryTableSegment.setAlias(new AliasSegment(0, 0, new IdentifierValue("temp"))); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - SubqueryTableSegment actual = SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegment actual = + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertTrue(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString("temp"))); List projectionSegments = new ArrayList<>(tableBinderContexts.get(new CaseInsensitiveString("temp")).iterator().next().getProjectionSegments()); @@ -130,8 +129,8 @@ void assertBindWithoutSubqueryTableAlias() { SubqueryTableSegment subqueryTableSegment = new SubqueryTableSegment(0, 0, new SubquerySegment(0, 0, selectStatement, "")); ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); - SubqueryTableSegment actual = SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", databaseType, Collections.emptySet()), - tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegment actual = + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); assertFalse(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString(""))); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java index 76f5b0cc1cf6a..8f3dd0b072805 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java @@ -53,7 +53,7 @@ void assertBind() { deleteStatement.setTable(simpleTableSegment); deleteStatement.setWhere(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("status")), new LiteralExpressionSegment(0, 0, 0), "=", "status = 1"))); - DeleteStatement actual = new DeleteStatementBinder().bind(deleteStatement, new SQLStatementBinderContext(deleteStatement, createMetaData(), "foo_db")); + DeleteStatement actual = new DeleteStatementBinder().bind(deleteStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", deleteStatement)); assertThat(actual, not(deleteStatement)); assertThat(actual.getTable(), not(deleteStatement.getTable())); assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java index f830007032947..afd30cf79758a 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java @@ -61,7 +61,7 @@ void assertBindInsertValues() { new ColumnSegment(0, 0, new IdentifierValue("user_id")), new ColumnSegment(0, 0, new IdentifierValue("status"))))); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(insertStatement, createMetaData(), "foo_db")); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); @@ -106,7 +106,7 @@ void assertBindInsertSelectWithColumns() { insertStatement.setInsertSelect(new SubquerySegment(0, 0, subSelectStatement, "")); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(insertStatement, createMetaData(), "foo_db")); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); @@ -130,7 +130,7 @@ void assertBindInsertSelectWithoutColumns() { insertStatement.setInsertSelect(new SubquerySegment(0, 0, subSelectStatement, "")); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(insertStatement, createMetaData(), "foo_db")); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java index 8e9b71f140ba9..b1c7d2fa2a6db 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java @@ -66,7 +66,7 @@ void assertBind() { SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order"))); selectStatement.setFrom(simpleTableSegment); selectStatement.setWhere(mockWhereSegment()); - SelectStatement actual = new SelectStatementBinder().bind(selectStatement, new SQLStatementBinderContext(selectStatement, createMetaData(), "foo_db")); + SelectStatement actual = new SelectStatementBinder().bind(selectStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", selectStatement)); assertThat(actual, not(selectStatement)); assertTrue(actual.getFrom().isPresent()); assertThat(actual.getFrom().get(), not(simpleTableSegment)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java index 1f9ed80ba46f0..d0eddea62c550 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java @@ -53,7 +53,7 @@ void assertBind() { updateStatement.setTable(simpleTableSegment); updateStatement.setWhere(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("status")), new LiteralExpressionSegment(0, 0, 0), "=", "status = 1"))); - UpdateStatement actual = new UpdateStatementBinder().bind(updateStatement, new SQLStatementBinderContext(updateStatement, createMetaData(), "foo_db")); + UpdateStatement actual = new UpdateStatementBinder().bind(updateStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", updateStatement)); assertThat(actual, not(updateStatement)); assertThat(actual.getTable(), not(updateStatement.getTable())); assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class)); diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java index d56e58ebc63e2..a0510de5440a6 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.data.pipeline.core.metadata.generator; import com.google.common.base.Strings; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.data.pipeline.core.sqlbuilder.dialect.DialectPipelineSQLBuilder; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; @@ -32,6 +33,7 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.hint.HintValueContext; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment; @@ -55,11 +57,14 @@ /** * Pipeline DDL generator. */ +@RequiredArgsConstructor @Slf4j public final class PipelineDDLGenerator { private static final String SET_SEARCH_PATH_PREFIX = "set search_path"; + private final ShardingSphereMetaData metaData; + /** * Generate logic DDL. * @@ -129,7 +134,7 @@ private String decorateActualSQL(final String databaseName, final String targetT } private SQLStatementContext parseSQL(final String currentDatabaseName, final SQLParserEngine parserEngine, final String sql) { - return new SQLBindEngine(null, currentDatabaseName, new HintValueContext()).bind(parserEngine.parse(sql, true), Collections.emptyList()); + return new SQLBindEngine(metaData, currentDatabaseName, new HintValueContext()).bind(parserEngine.parse(sql, true), Collections.emptyList()); } private void appendFromIndexAndConstraint(final Map replaceMap, final String targetTableName, final SQLStatementContext sqlStatementContext) { diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java index 20f9928dd7f40..2901c6164427e 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java @@ -31,6 +31,7 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import javax.sql.DataSource; @@ -110,7 +111,7 @@ public void prepareTargetTables(final PrepareTargetTablesParameter param) throws final long startTimeMillis = System.currentTimeMillis(); PipelineDataSourceManager dataSourceManager = param.getDataSourceManager(); for (CreateTableConfiguration each : param.getCreateTableConfigurations()) { - List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager, param.getSqlParserEngine()); + List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager, param.getSqlParserEngine(), param.getMetaData()); try (Connection targetConnection = dataSourceManager.getDataSource(each.getTargetDataSourceConfig()).getConnection()) { for (String sql : createTargetTableSQL) { executeTargetTableSQL(targetConnection, addIfNotExistsForCreateTableSQL(sql)); @@ -120,14 +121,14 @@ public void prepareTargetTables(final PrepareTargetTablesParameter param) throws log.info("prepareTargetTables cost {} ms", System.currentTimeMillis() - startTimeMillis); } - private List getCreateTargetTableSQL(final CreateTableConfiguration createTableConfig, - final PipelineDataSourceManager dataSourceManager, final SQLParserEngine sqlParserEngine) throws SQLException { + private List getCreateTargetTableSQL(final CreateTableConfiguration createTableConfig, final PipelineDataSourceManager dataSourceManager, + final SQLParserEngine sqlParserEngine, final ShardingSphereMetaData metaData) throws SQLException { DatabaseType databaseType = createTableConfig.getSourceDataSourceConfig().getDatabaseType(); DataSource sourceDataSource = dataSourceManager.getDataSource(createTableConfig.getSourceDataSourceConfig()); String schemaName = createTableConfig.getSourceName().getSchemaName(); String sourceTableName = createTableConfig.getSourceName().getTableName(); String targetTableName = createTableConfig.getTargetName().getTableName(); - return new PipelineDDLGenerator().generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName, sqlParserEngine); + return new PipelineDDLGenerator(metaData).generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName, sqlParserEngine); } private void executeTargetTableSQL(final Connection targetConnection, final String sql) throws SQLException { diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java index 2648729988698..d9be8f69bdb2c 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import java.util.Collection; @@ -36,4 +37,6 @@ public final class PrepareTargetTablesParameter { private final PipelineDataSourceManager dataSourceManager; private final SQLParserEngine sqlParserEngine; + + private final ShardingSphereMetaData metaData; } diff --git a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java index 7661cff53cd16..06d26a8cf5e54 100644 --- a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java +++ b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetSchemasParameter; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetTablesParameter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.junit.jupiter.api.Test; @@ -48,7 +49,7 @@ void assertPrepareTargetTables() { CreateTableConfiguration createTableConfig = mock(CreateTableConfiguration.class, RETURNS_DEEP_STUBS); when(createTableConfig.getSourceDataSourceConfig().getDatabaseType()).thenReturn(databaseType); PrepareTargetTablesParameter parameter = new PrepareTargetTablesParameter( - Collections.singleton(createTableConfig), mock(PipelineDataSourceManager.class, RETURNS_DEEP_STUBS), mock(SQLParserEngine.class)); + Collections.singleton(createTableConfig), mock(PipelineDataSourceManager.class, RETURNS_DEEP_STUBS), mock(SQLParserEngine.class), mock(ShardingSphereMetaData.class)); assertDoesNotThrow(() -> new PipelineJobDataSourcePreparer(databaseType).prepareTargetTables(parameter)); } } diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index a8e7e6c85e628..110ff5ac616a8 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -161,7 +161,7 @@ private void prepareTarget(final MigrationJobItemContext jobItemContext, final D ShardingSphereMetaData metaData = contextManager.getMetaDataContexts().getMetaData(); SQLParserEngine sqlParserEngine = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class) .getSQLParserEngine(metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType()); - preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine)); + preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine, metaData)); } private void prepareIncremental(final MigrationJobItemContext jobItemContext) { diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java index d14c60b38c4ab..120096ee0723f 100644 --- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java +++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java @@ -215,7 +215,8 @@ void assertDecorateRouteContextWithMultiDataSource() throws SQLException { } private QueryContext createQueryContext() { - CreateTableStatement createTableStatement = new MySQLCreateTableStatement(false); + CreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); TableNameSegment tableNameSegment = new TableNameSegment(1, 2, new IdentifierValue("t_order")); tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema"))); createTableStatement.setTable(new SimpleTableSegment(tableNameSegment)); diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java index 0882a4dc1d0c0..0ed003fa0b611 100644 --- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java +++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java @@ -95,7 +95,9 @@ private Collection mockQualifiedTables() { @Test void assertRouteWithoutSingleRule() throws SQLException { - SingleRouteEngine engine = new SingleRouteEngine(mockQualifiedTables(), new MySQLCreateTableStatement(false), mock(HintValueContext.class)); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); + SingleRouteEngine engine = new SingleRouteEngine(mockQualifiedTables(), sqlStatement, mock(HintValueContext.class)); SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(), "foo_db", new MySQLDatabaseType(), createDataSourceMap(), Collections.emptyList()); RouteContext routeContext = new RouteContext(); engine.route(routeContext, singleRule); @@ -110,7 +112,9 @@ void assertRouteWithoutSingleRule() throws SQLException { @Test void assertRouteWithDefaultSingleRule() throws SQLException { - SingleRouteEngine engine = new SingleRouteEngine(mockQualifiedTables(), new MySQLCreateTableStatement(false), mock(HintValueContext.class)); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); + SingleRouteEngine engine = new SingleRouteEngine(mockQualifiedTables(), sqlStatement, mock(HintValueContext.class)); SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(Collections.emptyList(), "ds_0"), "foo_db", new MySQLDatabaseType(), createDataSourceMap(), Collections.emptyList()); RouteContext routeContext = new RouteContext(); @@ -149,7 +153,8 @@ void assertRouteIfNotExistsDuplicateSingleTable() { } private SQLStatement mockStatement(final boolean ifNotExists) { - MySQLCreateTableStatement result = new MySQLCreateTableStatement(ifNotExists); + MySQLCreateTableStatement result = new MySQLCreateTableStatement(); + result.setIfNotExists(ifNotExists); result.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); return result; } diff --git a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java index 249c5ec0efc8f..5890c64335935 100644 --- a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java +++ b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/util/AutoCommitUtilsTest.java @@ -41,7 +41,9 @@ void assertNeedOpenTransactionForSelectStatement() { @Test void assertNeedOpenTransactionForDDLOrDMLStatement() { - assertTrue(AutoCommitUtils.needOpenTransaction(new MySQLCreateTableStatement(true))); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(true); + assertTrue(AutoCommitUtils.needOpenTransaction(sqlStatement)); assertTrue(AutoCommitUtils.needOpenTransaction(new MySQLInsertStatement())); } diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java index aaaee7b031938..70609a7173230 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java @@ -253,8 +253,9 @@ public ASTNode visitDropDatabase(final DropDatabaseContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitCreateTable(final CreateTableContext ctx) { - DorisCreateTableStatement result = new DorisCreateTableStatement(null != ctx.ifNotExists()); + DorisCreateTableStatement result = new DorisCreateTableStatement(); result.setTable((SimpleTableSegment) visit(ctx.tableName())); + result.setIfNotExists(null != ctx.ifNotExists()); if (null != ctx.createDefinitionClause()) { CollectionValue createDefinitions = (CollectionValue) visit(ctx.createDefinitionClause()); for (CreateDefinitionSegment each : createDefinitions.getValue()) { diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java index cbad47bb37fd2..97188a7353d38 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java @@ -17,9 +17,9 @@ package org.apache.shardingsphere.sql.parser.mysql.visitor.statement.type; +import com.google.common.base.Preconditions; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.Interval; -import com.google.common.base.Preconditions; import org.apache.shardingsphere.sql.parser.api.ASTNode; import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AddColumnContext; @@ -254,8 +254,9 @@ public ASTNode visitDropDatabase(final DropDatabaseContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitCreateTable(final CreateTableContext ctx) { - MySQLCreateTableStatement result = new MySQLCreateTableStatement(null != ctx.ifNotExists()); + MySQLCreateTableStatement result = new MySQLCreateTableStatement(); result.setTable((SimpleTableSegment) visit(ctx.tableName())); + result.setIfNotExists(null != ctx.ifNotExists()); if (null != ctx.createDefinitionClause()) { CollectionValue createDefinitions = (CollectionValue) visit(ctx.createDefinitionClause()); for (CreateDefinitionSegment each : createDefinitions.getValue()) { diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java index 9561522a39b97..bc873d3a0b221 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java @@ -264,8 +264,9 @@ public final class OpenGaussDDLStatementVisitor extends OpenGaussStatementVisito @SuppressWarnings("unchecked") @Override public ASTNode visitCreateTable(final CreateTableContext ctx) { - OpenGaussCreateTableStatement result = new OpenGaussCreateTableStatement(null != ctx.ifNotExists()); + OpenGaussCreateTableStatement result = new OpenGaussCreateTableStatement(); result.setTable((SimpleTableSegment) visit(ctx.tableName())); + result.setIfNotExists(null != ctx.ifNotExists()); if (null != ctx.createDefinitionClause()) { CollectionValue createDefinitions = (CollectionValue) visit(ctx.createDefinitionClause()); for (CreateDefinitionSegment each : createDefinitions.getValue()) { diff --git a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java index c56f7b62f365a..dd5a0abf893ba 100644 --- a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java +++ b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java @@ -339,8 +339,9 @@ public final class PostgreSQLDDLStatementVisitor extends PostgreSQLStatementVisi @SuppressWarnings("unchecked") @Override public ASTNode visitCreateTable(final CreateTableContext ctx) { - PostgreSQLCreateTableStatement result = new PostgreSQLCreateTableStatement(null != ctx.ifNotExists()); + PostgreSQLCreateTableStatement result = new PostgreSQLCreateTableStatement(); result.setTable((SimpleTableSegment) visit(ctx.tableName())); + result.setIfNotExists(null != ctx.ifNotExists()); if (null != ctx.createDefinitionClause()) { CollectionValue createDefinitions = (CollectionValue) visit(ctx.createDefinitionClause()); for (CreateDefinitionSegment each : createDefinitions.getValue()) { diff --git a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java index 9aa313d94cf3c..2fe88595fb6f2 100644 --- a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java +++ b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java @@ -73,8 +73,9 @@ public ASTNode visitDropView(final DropViewContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitCreateTable(final CreateTableContext ctx) { - PrestoCreateTableStatement result = new PrestoCreateTableStatement(null != ctx.ifNotExists()); + PrestoCreateTableStatement result = new PrestoCreateTableStatement(); result.setTable((SimpleTableSegment) visit(ctx.tableName())); + result.setIfNotExists(null != ctx.ifNotExists()); if (null != ctx.createDefinitionClause()) { CollectionValue createDefinitions = (CollectionValue) visit(ctx.createDefinitionClause()); for (CreateDefinitionSegment each : createDefinitions.getValue()) { diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/AbstractSQLStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/AbstractSQLStatement.java index 66e9da993bf57..d01c935e48dc8 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/AbstractSQLStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/AbstractSQLStatement.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.sql.parser.statement.core.statement; +import com.cedarsoftware.util.CaseInsensitiveSet; import lombok.Getter; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.CommentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment; @@ -38,7 +39,7 @@ public abstract class AbstractSQLStatement implements SQLStatement { private final Collection commentSegments = new LinkedList<>(); - private final Collection variableNames = new HashSet<>(); + private final Collection variableNames = new CaseInsensitiveSet<>(); @Override public int getParameterCount() { diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateTableStatement.java index c33091986b029..2b46df95c9b0f 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateTableStatement.java @@ -66,6 +66,14 @@ public boolean isIfNotExists() { return false; } + /** + * Set if not exists. + * + * @param ifNotExists if not exists + */ + public void setIfNotExists(final boolean ifNotExists) { + } + /** * Get list of columns. * @@ -84,6 +92,14 @@ public Optional getLikeTable() { return Optional.empty(); } + /** + * Set like table. + * + * @param likeTable like table + */ + public void setLikeTable(final SimpleTableSegment likeTable) { + } + /** * Get create table option. * @@ -92,4 +108,12 @@ public Optional getLikeTable() { public Optional getCreateTableOption() { return Optional.empty(); } + + /** + * Set create table option. + * + * @param createTableOption create table option + */ + public void setCreateTableOption(final CreateTableOptionSegment createTableOption) { + } } diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisCreateTableStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisCreateTableStatement.java index 0f75e4347dd5a..ec4a2500ec743 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisCreateTableStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisCreateTableStatement.java @@ -35,7 +35,7 @@ @Setter public final class DorisCreateTableStatement extends CreateTableStatement implements DorisStatement { - private final boolean ifNotExists; + private boolean ifNotExists; private SimpleTableSegment likeTable; diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLCreateTableStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLCreateTableStatement.java index cc13a1e7bd4f6..38aa911998e94 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLCreateTableStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLCreateTableStatement.java @@ -35,7 +35,7 @@ @Setter public final class MySQLCreateTableStatement extends CreateTableStatement implements MySQLStatement { - private final boolean ifNotExists; + private boolean ifNotExists; private SimpleTableSegment likeTable; diff --git a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateTableStatement.java b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateTableStatement.java index f79148b1d5c7f..e8ce0ac457385 100644 --- a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateTableStatement.java +++ b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.opengauss.OpenGaussStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class OpenGaussCreateTableStatement extends CreateTableStatement implements OpenGaussStatement { - private final boolean ifNotExists; + private boolean ifNotExists; } diff --git a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateTableStatement.java b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateTableStatement.java index adc9f08a4621b..821aefa28312b 100644 --- a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateTableStatement.java +++ b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.postgresql.PostgreSQLStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class PostgreSQLCreateTableStatement extends CreateTableStatement implements PostgreSQLStatement { - private final boolean ifNotExists; + private boolean ifNotExists; } diff --git a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoCreateTableStatement.java b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoCreateTableStatement.java index a61a9f6f4e933..c591050c0e750 100644 --- a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoCreateTableStatement.java +++ b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoCreateTableStatement.java @@ -35,7 +35,7 @@ @Setter public final class PrestoCreateTableStatement extends CreateTableStatement implements PrestoStatement { - private final boolean ifNotExists; + private boolean ifNotExists; private SimpleTableSegment likeTable; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java index b2dbcc146d3fd..87bc4e883ed7a 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java @@ -238,7 +238,8 @@ void assertCheckExecutePrerequisitesWhenExecuteDDLNotInPostgreSQLTransaction() { } private CreateTableStatementContext createMySQLCreateTableStatementContext() { - MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(false); + MySQLCreateTableStatement sqlStatement = new MySQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); return new CreateTableStatementContext(sqlStatement); } @@ -274,7 +275,8 @@ private InsertStatementContext createMySQLInsertStatementContext() { } private CreateTableStatementContext createPostgreSQLCreateTableStatementContext() { - PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(false); + PostgreSQLCreateTableStatement sqlStatement = new PostgreSQLCreateTableStatement(); + sqlStatement.setIfNotExists(false); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); return new CreateTableStatementContext(sqlStatement); } diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java index a572cfe83ae67..223001a592daf 100644 --- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java +++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java @@ -84,10 +84,12 @@ class MySQLComStmtPrepareCheckerTest { @Test void assertIsStatementAllowed() { + MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); + createTableStatement.setIfNotExists(false); Collection sqlStatements = Arrays.asList( new MySQLAlterTableStatement(), new MySQLAlterUserStatement(), new MySQLAnalyzeTableStatement(), new MySQLCacheIndexStatement(), new MySQLCallStatement(), new MySQLChangeMasterStatement(), new MySQLChecksumTableStatement(), new MySQLCommitStatement(), new MySQLCreateIndexStatement(), - new MySQLDropIndexStatement(), new MySQLCreateDatabaseStatement(), new MySQLDropDatabaseStatement(), new MySQLCreateTableStatement(false), + new MySQLDropIndexStatement(), new MySQLCreateDatabaseStatement(), new MySQLDropDatabaseStatement(), createTableStatement, new MySQLDropTableStatement(false), new MySQLCreateUserStatement(), new MySQLRenameUserStatement(), new MySQLDropUserStatement(), new MySQLCreateViewStatement(), new MySQLDropViewStatement(), new MySQLDeleteStatement(), new MySQLDoStatement(), new MySQLFlushStatement(), new MySQLGrantStatement(), new MySQLInsertStatement(), new MySQLInstallPluginStatement(), new MySQLKillStatement(), diff --git a/test/it/binder/src/test/resources/cases/ddl/create-table.xml b/test/it/binder/src/test/resources/cases/ddl/create-table.xml new file mode 100644 index 0000000000000..59815b36015b0 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/create-table.xml @@ -0,0 +1,88 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml new file mode 100644 index 0000000000000..35e75c68f6121 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/ColumnBoundAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/ColumnBoundAssert.java new file mode 100644 index 0000000000000..55eb5a812176e --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/ColumnBoundAssert.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedColumnBoundInfo; + +/** + * Column bound assert. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ColumnBoundAssert { + + /** + * Assert actual column bound info is correct with expected column bound info. + * + * @param assertContext assert context + * @param actual actual column bound info + * @param expected expected column bound info + */ + public static void assertIs(final SQLCaseAssertContext assertContext, final ColumnSegmentBoundInfo actual, final ExpectedColumnBoundInfo expected) { + if (null == expected) { + return; + } + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalDatabase(), expected.getOriginalDatabase(), "Bound Database"); + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalSchema(), expected.getOriginalSchema(), "Bound Schema"); + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalTable(), expected.getOriginalTable(), "Bound Table"); + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalColumn(), expected.getOriginalColumn(), "Bound Column"); + } +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/TableBoundAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/TableBoundAssert.java new file mode 100644 index 0000000000000..c205660d69eac --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/bound/TableBoundAssert.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedTableBoundInfo; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Table bound assert. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class TableBoundAssert { + + /** + * Assert actual table bound info is correct with expected table bound info. + * + * @param assertContext assert context + * @param actual actual table bound info + * @param expected expected table bound info + */ + public static void assertIs(final SQLCaseAssertContext assertContext, final TableSegmentBoundInfo actual, final ExpectedTableBoundInfo expected) { + if (null == expected) { + assertNull(actual, assertContext.getText("Actual table bound should not exist.")); + } else { + assertNotNull(actual, assertContext.getText("Actual table bound should exist.")); + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalDatabase(), expected.getOriginalDatabase(), "Bound Database"); + IdentifierValueAssert.assertIs(assertContext, actual.getOriginalSchema(), expected.getOriginalSchema(), "Bound Schema"); + } + } +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java index fd29c2ea25b59..88670abce61a0 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java @@ -21,6 +21,7 @@ import lombok.NoArgsConstructor; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound.ColumnBoundAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.generic.DataTypeAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedColumnDefinition; @@ -44,7 +45,7 @@ public final class ColumnDefinitionAssert { * @param expected expected column definition */ public static void assertIs(final SQLCaseAssertContext assertContext, final ColumnDefinitionSegment actual, final ExpectedColumnDefinition expected) { - assertThat(assertContext.getText("Column definition name assertion error: "), actual.getColumnName().getIdentifier().getValue(), is(expected.getColumn().getName())); + assertColumnName(assertContext, actual, expected); if (null != expected.getType()) { assertNotNull(actual.getDataType(), assertContext.getText("Column definition data type should exist.")); assertThat(assertContext.getText("Column definition data type assertion error: "), actual.getDataType().getDataTypeName(), is(expected.getType())); @@ -63,4 +64,9 @@ public static void assertIs(final SQLCaseAssertContext assertContext, final Colu assertThat(assertContext.getText("Column definition not null assertion error: "), actual.isNotNull(), is(expected.isNotNull())); } } + + private static void assertColumnName(final SQLCaseAssertContext assertContext, final ColumnDefinitionSegment actual, final ExpectedColumnDefinition expected) { + assertThat(assertContext.getText("Column definition name assertion error: "), actual.getColumnName().getIdentifier().getValue(), is(expected.getColumn().getName())); + ColumnBoundAssert.assertIs(assertContext, actual.getColumnName().getColumnBoundInfo(), expected.getColumn().getColumnBound()); + } } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java index 1f091e7cec7f3..90b7ee46ea871 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/projection/ProjectionAssert.java @@ -32,6 +32,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.top.TopProjectionSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound.ColumnBoundAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.generic.ParenthesesAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; @@ -164,12 +165,7 @@ private static void assertColumnSegment(final SQLCaseAssertContext assertContext assertThat(assertContext.getText("Nested Object attributes assertion error: "), actual.getColumn().getExpression(), is(expected.getName())); } else { IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getIdentifier(), expected, "Column projection"); - if (null != expected.getColumnBound()) { - IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalDatabase(), expected.getColumnBound().getOriginalDatabase(), "Bound Database"); - IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalSchema(), expected.getColumnBound().getOriginalSchema(), "Bound Schema"); - IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalTable(), expected.getColumnBound().getOriginalTable(), "Bound Table"); - IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo().getOriginalColumn(), expected.getColumnBound().getOriginalColumn(), "Bound Column"); - } + ColumnBoundAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo(), expected.getColumnBound()); } } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java index a13e50f21a0d6..f2ec4a6b589cd 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/table/TableAssert.java @@ -32,6 +32,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound.TableBoundAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; @@ -251,12 +252,6 @@ private static void assertTableFunction(final SQLCaseAssertContext assertContext private static void assertTableNameSegment(final SQLCaseAssertContext assertContext, final SimpleTableSegment actual, final ExpectedSimpleTable expected) { IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getIdentifier(), expected, "Table"); - if (null == expected.getTableBound()) { - assertFalse(actual.getTableName().getTableBoundInfo().isPresent(), assertContext.getText("Actual table bound should not exist.")); - } else { - assertTrue(actual.getTableName().getTableBoundInfo().isPresent(), assertContext.getText("Actual table bound should exist.")); - IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getTableBoundInfo().get().getOriginalDatabase(), expected.getTableBound().getOriginalDatabase(), "Bound Database"); - IdentifierValueAssert.assertIs(assertContext, actual.getTableName().getTableBoundInfo().get().getOriginalSchema(), expected.getTableBound().getOriginalSchema(), "Bound Schema"); - } + TableBoundAssert.assertIs(assertContext, actual.getTableName().getTableBoundInfo().orElse(null), expected.getTableBound()); } } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/column/ExpectedColumn.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/column/ExpectedColumn.java index 1f03ad89c4c15..58bceb1d722bb 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/column/ExpectedColumn.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/column/ExpectedColumn.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedIdentifierSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedColumnBoundInfo; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedExpressionSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner; @@ -34,4 +35,7 @@ public final class ExpectedColumn extends AbstractExpectedIdentifierSQLSegment i @XmlElement private ExpectedOwner owner; + + @XmlElement(name = "column-bound") + private ExpectedColumnBoundInfo columnBound; } diff --git a/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/ddl/create/create-table.xml b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/ddl/create/create-table.xml index efad1b9e6d260..363a17f208d63 100644 --- a/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/ddl/create/create-table.xml +++ b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/ddl/create/create-table.xml @@ -18,12 +18,12 @@ - - + + - - + + diff --git a/test/it/rewriter/src/test/resources/scenario/encrypt/config/query-with-cipher.yaml b/test/it/rewriter/src/test/resources/scenario/encrypt/config/query-with-cipher.yaml index 7a0a5660d5512..c76e7e776bce9 100644 --- a/test/it/rewriter/src/test/resources/scenario/encrypt/config/query-with-cipher.yaml +++ b/test/it/rewriter/src/test/resources/scenario/encrypt/config/query-with-cipher.yaml @@ -76,6 +76,32 @@ rules: cipher: name: cipher_amount encryptorName: rewrite_normal_fixture + t_account_bak_for_create: + columns: + certificate_number: + cipher: + name: cipher_certificate_number + encryptorName: rewrite_normal_fixture + assistedQuery: + name: assisted_query_certificate_number + encryptorName: rewrite_assisted_query_fixture + likeQuery: + name: like_query_certificate_number + encryptorName: rewrite_like_query_fixture + password: + cipher: + name: cipher_password + encryptorName: rewrite_normal_fixture + assistedQuery: + name: assisted_query_password + encryptorName: rewrite_assisted_query_fixture + likeQuery: + name: like_query_password + encryptorName: rewrite_like_query_fixture + amount: + cipher: + name: cipher_amount + encryptorName: rewrite_normal_fixture t_account_detail: columns: certificate_number: From a3c8bbf7ddd33dc3e48e59810670e74c47ae386f Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 17 Dec 2024 21:59:06 +0800 Subject: [PATCH 093/192] Refactor ComputeNodeInstanceContext.getLockContext() (#34089) --- .../infra/instance/ComputeNodeInstanceContext.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index 4a3c708246170..302bc0d81b2ff 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -178,12 +178,11 @@ public Optional getComputeNodeInstanceById(final String ins } /** - * Get lock context. + * Get lock context. * * @return lock context - * @throws IllegalStateException if lock context is not initialized */ - public LockContext getLockContext() throws IllegalStateException { + public LockContext getLockContext() { return Optional.ofNullable(lockContext.get()).orElseThrow(() -> new IllegalStateException("Lock context is not initialized.")); } } From b77585d5af8971c4ee933a226869eb25bbd82152 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 17 Dec 2024 22:26:50 +0800 Subject: [PATCH 094/192] Unify constructor of ComputeNodeInstanceContext (#34090) * Refactor ComputeNodeInstanceContext.getLockContext() * Unify constructor of ComputeNodeInstanceContext * Unify constructor of ComputeNodeInstanceContext --- .../PrometheusPluginLifecycleServiceTest.java | 4 +- .../ShardingRouteCacheableCheckerTest.java | 5 +- .../instance/ComputeNodeInstanceContext.java | 9 +- .../ComputeNodeInstanceContextTest.java | 93 ++++++++++--------- .../StandaloneContextManagerBuilder.java | 8 +- .../queryable/ExportMetaDataExecutorTest.java | 4 +- .../SetDistVariableExecutorTest.java | 3 +- 7 files changed, 61 insertions(+), 65 deletions(-) diff --git a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java index b14d859f858c9..63a883710dd63 100644 --- a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java +++ b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java @@ -72,8 +72,8 @@ void assertStart() throws IOException { private ContextManager mockContextManager() { MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), - mock(LockContext.class), new EventBusContext()); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); return new ContextManager(metaDataContexts, computeNodeInstanceContext, mock(PersistRepository.class)); } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java index 391c25814ad13..1af0543e4fad6 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java @@ -112,8 +112,9 @@ private ShardingRule createShardingRule() { nonCacheableTableSharding.setTableShardingStrategy(new StandardShardingStrategyConfiguration("id", "table-inline")); ruleConfig.getTables().add(nonCacheableTableSharding); ruleConfig.setShardingCache(new ShardingCacheConfiguration(100, new ShardingCacheOptionsConfiguration(true, 0, 0))); - return new ShardingRule(ruleConfig, Maps.of("ds_0", new MockedDataSource(), "ds_1", new MockedDataSource()), - new ComputeNodeInstanceContext(mock(ComputeNodeInstance.class), props -> 0, null, null, null), Collections.emptyList()); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(mock(ComputeNodeInstance.class), null, null); + instanceContext.init(props -> 0, null); + return new ShardingRule(ruleConfig, Maps.of("ds_0", new MockedDataSource(), "ds_1", new MockedDataSource()), instanceContext, Collections.emptyList()); } private TimestampServiceRule createTimeServiceRule() { diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index 302bc0d81b2ff..47ed9440cd88c 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -54,19 +54,12 @@ public final class ComputeNodeInstanceContext { private final Collection allClusterInstances = new CopyOnWriteArrayList<>(); - public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final WorkerIdGenerator workerIdGenerator, - final ModeConfiguration modeConfig, final LockContext lockContext, final EventBusContext eventBusContext) { + public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfig, final EventBusContext eventBusContext) { this.instance = instance; - this.workerIdGenerator.set(workerIdGenerator); this.modeConfiguration = modeConfig; - this.lockContext.set(lockContext); this.eventBusContext = eventBusContext; } - public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfig, final EventBusContext eventBusContext) { - this(instance, null, modeConfig, null, eventBusContext); - } - /** * Initialize compute node instance context. * diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java index dfffac5f40bae..bd57e2b09e85d 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java @@ -54,100 +54,105 @@ void assertInit() { @Test void assertUpdateStatusWithInvalidInstanceState() { InstanceMetaData instanceMetaData = mock(InstanceMetaData.class); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(instanceMetaData), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.updateStatus("id", "INVALID"); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.updateStatus("id", "INVALID"); verify(instanceMetaData, times(0)).getId(); } @Test void assertUpdateStatusWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(instanceMetaData), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - context.updateStatus("foo_instance_id", InstanceState.CIRCUIT_BREAK.name()); - assertThat(context.getInstance().getState().getCurrentState(), is(InstanceState.CIRCUIT_BREAK)); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.updateStatus("foo_instance_id", InstanceState.CIRCUIT_BREAK.name()); + assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.CIRCUIT_BREAK)); } @Test void assertUpdateStatusWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(instanceMetaData), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - context.updateStatus("bar_instance_id", InstanceState.CIRCUIT_BREAK.name()); - assertThat(context.getInstance().getState().getCurrentState(), is(InstanceState.OK)); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.updateStatus("bar_instance_id", InstanceState.CIRCUIT_BREAK.name()); + assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.OK)); } @Test void assertUpdateLabelsWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(instanceMetaData), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.updateLabels("foo_instance_id", Arrays.asList("label_1", "label_2")); - assertThat(context.getInstance().getLabels(), is(Arrays.asList("label_1", "label_2"))); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.updateLabels("foo_instance_id", Arrays.asList("label_1", "label_2")); + assertThat(instanceContext.getInstance().getLabels(), is(Arrays.asList("label_1", "label_2"))); } @Test void assertUpdateLabelsWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(instanceMetaData), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - context.updateLabels("bar_instance_id", Arrays.asList("label_1", "label_2")); - assertTrue(context.getInstance().getLabels().isEmpty()); - assertThat(context.getAllClusterInstances().iterator().next().getLabels(), is(Arrays.asList("label_1", "label_2"))); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.updateLabels("bar_instance_id", Arrays.asList("label_1", "label_2")); + assertTrue(instanceContext.getInstance().getLabels().isEmpty()); + assertThat(instanceContext.getAllClusterInstances().iterator().next().getLabels(), is(Arrays.asList("label_1", "label_2"))); } @Test void assertUpdateWorkerIdWithCurrentInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(instance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.updateWorkerId("foo_instance_id", 10); - assertThat(context.getWorkerId(), is(10)); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.updateWorkerId("foo_instance_id", 10); + assertThat(instanceContext.getWorkerId(), is(10)); } @Test void assertUpdateWorkerIdWithOtherInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(instance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - context.updateWorkerId("bar_instance_id", 10); - assertThat(context.getWorkerId(), is(-1)); - assertThat(context.getAllClusterInstances().iterator().next().getWorkerId(), is(10)); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.updateWorkerId("bar_instance_id", 10); + assertThat(instanceContext.getWorkerId(), is(-1)); + assertThat(instanceContext.getAllClusterInstances().iterator().next().getWorkerId(), is(10)); } @Test void assertGenerateWorkerId() { - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - assertThat(context.generateWorkerId(new Properties()), is(0)); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + assertThat(instanceContext.generateWorkerId(new Properties()), is(0)); } @Test void assertAddComputeNodeInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(instance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - assertFalse(context.getAllClusterInstances().isEmpty()); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + assertFalse(instanceContext.getAllClusterInstances().isEmpty()); } @Test void assertDeleteComputeNodeInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(instance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - context.deleteComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - assertTrue(context.getAllClusterInstances().isEmpty()); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.deleteComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + assertTrue(instanceContext.getAllClusterInstances().isEmpty()); } @Test void assertGetComputeNodeInstanceById() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(instance, mock(WorkerIdGenerator.class), mock(ModeConfiguration.class), mock(LockContext.class), new EventBusContext()); - context.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - Optional actual = context.getComputeNodeInstanceById("bar_instance_id"); + ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + Optional actual = instanceContext.getComputeNodeInstanceById("bar_instance_id"); assertTrue(actual.isPresent()); assertThat(actual.get().getMetaData().getId(), is("bar_instance_id")); } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index f4229e584146e..627e268103922 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -46,16 +46,12 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev StandalonePersistRepository repository = TypedSPILoader.getService( StandalonePersistRepository.class, null == repositoryConfig ? null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() : repositoryConfig.getProps()); MetaDataPersistService persistService = new MetaDataPersistService(repository); - ComputeNodeInstanceContext computeNodeInstanceContext = buildComputeNodeInstanceContext(param, eventBusContext); + ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), param.getModeConfiguration(), eventBusContext); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new GlobalLockContext(null)); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, computeNodeInstanceContext); return new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); } - private ComputeNodeInstanceContext buildComputeNodeInstanceContext(final ContextManagerBuilderParameter param, final EventBusContext eventBusContext) { - return new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), - new StandaloneWorkerIdGenerator(), param.getModeConfiguration(), new GlobalLockContext(null), eventBusContext); - } - @Override public String getType() { return "Standalone"; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java index 2700c0fc35873..908fd91169ef7 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java @@ -168,8 +168,8 @@ private ContextManager mockContextManager() { new GlobalClockRule(new DefaultGlobalClockRuleConfigurationBuilder().build()))), new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), - mock(LockContext.class), new EventBusContext()); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java index 1c3d517bc2ade..0d0c811034f41 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java @@ -109,7 +109,8 @@ private ContextManager mockContextManager() { MetaDataPersistService metaDataPersistService = mock(MetaDataPersistService.class, RETURNS_DEEP_STUBS); when(metaDataPersistService.getPropsService()).thenReturn(mock(PropertiesPersistService.class)); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(WorkerIdGenerator.class), new ModeConfiguration("Standalone", null), mock(LockContext.class), new EventBusContext()); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); + computeNodeInstanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), computeNodeInstanceContext, mock(PersistRepository.class)); } } From cc27876d1c2d29afa384d2d45656539925439639 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 17 Dec 2024 23:01:02 +0800 Subject: [PATCH 095/192] Use @RequiredArgsConstructor on ComputeNodeInstanceContext (#34091) --- .../instance/ComputeNodeInstanceContext.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index 47ed9440cd88c..8f733d3c0e14a 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -19,6 +19,7 @@ import lombok.AccessLevel; import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; @@ -36,30 +37,25 @@ /** * Compute node instance context. */ +@RequiredArgsConstructor @Getter @ThreadSafe public final class ComputeNodeInstanceContext { private final ComputeNodeInstance instance; + private final ModeConfiguration modeConfiguration; + + private final EventBusContext eventBusContext; + @Getter(AccessLevel.NONE) private final AtomicReference workerIdGenerator = new AtomicReference<>(); - private final ModeConfiguration modeConfiguration; - @Getter(AccessLevel.NONE) private final AtomicReference> lockContext = new AtomicReference<>(); - private final EventBusContext eventBusContext; - private final Collection allClusterInstances = new CopyOnWriteArrayList<>(); - public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfig, final EventBusContext eventBusContext) { - this.instance = instance; - this.modeConfiguration = modeConfig; - this.eventBusContext = eventBusContext; - } - /** * Initialize compute node instance context. * From 0da2e1ca0073ea0e9c5c1b3b406336bb7816a72a Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Wed, 18 Dec 2024 00:21:52 +0800 Subject: [PATCH 096/192] Add ClusterInstanceRegistry (#34093) * Add ClusterInstanceRegistry --- .../instance/ClusterInstanceRegistry.java | 62 +++++++++++++++++++ .../instance/ComputeNodeInstanceContext.java | 53 +++++----------- .../instance/ClusterInstanceRegistryTest.java | 43 +++++++++++++ .../ComputeNodeInstanceContextTest.java | 44 ++----------- .../cluster/ClusterContextManagerBuilder.java | 3 +- .../type/ComputeNodeStateSubscriber.java | 5 +- .../type/ComputeNodeStateSubscriberTest.java | 4 +- .../queryable/ShowComputeNodesExecutor.java | 2 +- .../updatable/LabelComputeNodeExecutor.java | 2 +- .../SetComputeNodeStateExecutor.java | 7 ++- .../updatable/UnlabelComputeNodeExecutor.java | 2 +- .../ShowComputeNodesExecutorTest.java | 2 +- .../SetComputeNodeStateExecutorTest.java | 5 +- 13 files changed, 144 insertions(+), 90 deletions(-) create mode 100644 infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistry.java create mode 100644 infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistryTest.java diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistry.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistry.java new file mode 100644 index 0000000000000..1be97d6883db5 --- /dev/null +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistry.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.instance; + +import lombok.Getter; + +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Cluster instance registry. + */ +@Getter +public final class ClusterInstanceRegistry { + + private final Collection allClusterInstances = new CopyOnWriteArrayList<>(); + + /** + * Find compute node instance. + * + * @param instanceId instance ID + * @return compute node instance + */ + public Optional find(final String instanceId) { + return allClusterInstances.stream().filter(each -> instanceId.equals(each.getMetaData().getId())).findFirst(); + } + + /** + * Add compute node instance. + * + * @param instance compute node instance + */ + public void add(final ComputeNodeInstance instance) { + allClusterInstances.removeIf(each -> each.getMetaData().getId().equalsIgnoreCase(instance.getMetaData().getId())); + allClusterInstances.add(instance); + } + + /** + * Delete compute node instance. + * + * @param instance compute node instance + */ + public void delete(final ComputeNodeInstance instance) { + allClusterInstances.removeIf(each -> each.getMetaData().getId().equalsIgnoreCase(instance.getMetaData().getId())); + } +} diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index 8f733d3c0e14a..c1cbcd2d87737 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -19,7 +19,6 @@ import lombok.AccessLevel; import lombok.Getter; -import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; @@ -31,13 +30,11 @@ import java.util.Collection; import java.util.Optional; import java.util.Properties; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicReference; /** * Compute node instance context. */ -@RequiredArgsConstructor @Getter @ThreadSafe public final class ComputeNodeInstanceContext { @@ -49,12 +46,21 @@ public final class ComputeNodeInstanceContext { private final EventBusContext eventBusContext; @Getter(AccessLevel.NONE) - private final AtomicReference workerIdGenerator = new AtomicReference<>(); + private final AtomicReference workerIdGenerator; @Getter(AccessLevel.NONE) - private final AtomicReference> lockContext = new AtomicReference<>(); + private final AtomicReference> lockContext; - private final Collection allClusterInstances = new CopyOnWriteArrayList<>(); + private final ClusterInstanceRegistry clusterInstanceRegistry; + + public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfiguration, final EventBusContext eventBusContext) { + this.instance = instance; + this.modeConfiguration = modeConfiguration; + this.eventBusContext = eventBusContext; + workerIdGenerator = new AtomicReference<>(); + lockContext = new AtomicReference<>(); + clusterInstanceRegistry = new ClusterInstanceRegistry(); + } /** * Initialize compute node instance context. @@ -81,7 +87,7 @@ public void updateStatus(final String instanceId, final String status) { if (instance.getMetaData().getId().equals(instanceId)) { instance.switchState(instanceState.get()); } - allClusterInstances.stream().filter(each -> each.getMetaData().getId().equals(instanceId)).forEach(each -> each.switchState(instanceState.get())); + clusterInstanceRegistry.find(instanceId).ifPresent(optional -> optional.switchState(instanceState.get())); } /** @@ -94,7 +100,7 @@ public void updateLabels(final String instanceId, final Collection label if (instance.getMetaData().getId().equals(instanceId)) { updateLabels(instance, labels); } - allClusterInstances.stream().filter(each -> each.getMetaData().getId().equals(instanceId)).forEach(each -> updateLabels(each, labels)); + clusterInstanceRegistry.find(instanceId).ifPresent(optional -> updateLabels(optional, labels)); } private void updateLabels(final ComputeNodeInstance computeNodeInstance, final Collection labels) { @@ -112,7 +118,7 @@ public void updateWorkerId(final String instanceId, final Integer workerId) { if (instance.getMetaData().getId().equals(instanceId)) { instance.setWorkerId(workerId); } - allClusterInstances.stream().filter(each -> each.getMetaData().getId().equals(instanceId)).forEach(each -> each.setWorkerId(workerId)); + clusterInstanceRegistry.find(instanceId).ifPresent(optional -> optional.setWorkerId(workerId)); } /** @@ -137,35 +143,6 @@ public int generateWorkerId(final Properties props) { return result; } - /** - * Add compute node instance. - * - * @param instance compute node instance - */ - public void addComputeNodeInstance(final ComputeNodeInstance instance) { - allClusterInstances.removeIf(each -> each.getMetaData().getId().equalsIgnoreCase(instance.getMetaData().getId())); - allClusterInstances.add(instance); - } - - /** - * Delete compute node instance. - * - * @param instance compute node instance - */ - public void deleteComputeNodeInstance(final ComputeNodeInstance instance) { - allClusterInstances.removeIf(each -> each.getMetaData().getId().equalsIgnoreCase(instance.getMetaData().getId())); - } - - /** - * Get compute node instance. - * - * @param instanceId instance ID - * @return compute node instance - */ - public Optional getComputeNodeInstanceById(final String instanceId) { - return allClusterInstances.stream().filter(each -> instanceId.equals(each.getMetaData().getId())).findFirst(); - } - /** * Get lock context. * diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistryTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistryTest.java new file mode 100644 index 0000000000000..c150225c4a7f1 --- /dev/null +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ClusterInstanceRegistryTest.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.instance; + +import org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ClusterInstanceRegistryTest { + + @Test + void assertAdd() { + ClusterInstanceRegistry registry = new ClusterInstanceRegistry(); + registry.add(new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3307))); + assertTrue(registry.find("foo_instance_id").isPresent()); + } + + @Test + void assertDelete() { + ClusterInstanceRegistry registry = new ClusterInstanceRegistry(); + registry.add(new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3307))); + assertTrue(registry.find("foo_instance_id").isPresent()); + registry.delete(new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3307))); + assertFalse(registry.find("foo_instance_id").isPresent()); + } +} diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java index bd57e2b09e85d..9d757c3e2207a 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java @@ -27,12 +27,10 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; -import java.util.Optional; import java.util.Properties; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -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.times; @@ -65,7 +63,7 @@ void assertUpdateStatusWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("foo_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.CIRCUIT_BREAK)); } @@ -75,7 +73,7 @@ void assertUpdateStatusWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("bar_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.OK)); } @@ -94,10 +92,10 @@ void assertUpdateLabelsWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateLabels("bar_instance_id", Arrays.asList("label_1", "label_2")); assertTrue(instanceContext.getInstance().getLabels().isEmpty()); - assertThat(instanceContext.getAllClusterInstances().iterator().next().getLabels(), is(Arrays.asList("label_1", "label_2"))); + assertThat(instanceContext.getClusterInstanceRegistry().getAllClusterInstances().iterator().next().getLabels(), is(Arrays.asList("label_1", "label_2"))); } @Test @@ -114,10 +112,10 @@ void assertUpdateWorkerIdWithOtherInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); + instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateWorkerId("bar_instance_id", 10); assertThat(instanceContext.getWorkerId(), is(-1)); - assertThat(instanceContext.getAllClusterInstances().iterator().next().getWorkerId(), is(10)); + assertThat(instanceContext.getClusterInstanceRegistry().getAllClusterInstances().iterator().next().getWorkerId(), is(10)); } @Test @@ -126,34 +124,4 @@ void assertGenerateWorkerId() { instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); assertThat(instanceContext.generateWorkerId(new Properties()), is(0)); } - - @Test - void assertAddComputeNodeInstance() { - ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - assertFalse(instanceContext.getAllClusterInstances().isEmpty()); - } - - @Test - void assertDeleteComputeNodeInstance() { - ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - instanceContext.deleteComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - assertTrue(instanceContext.getAllClusterInstances().isEmpty()); - } - - @Test - void assertGetComputeNodeInstanceById() { - ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); - ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - instanceContext.addComputeNodeInstance(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); - Optional actual = instanceContext.getComputeNodeInstanceById("bar_instance_id"); - assertTrue(actual.isPresent()); - assertThat(actual.get().getMetaData().getId(), is("bar_instance_id")); - } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index 647a069209343..c34ae5186ae7e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -78,7 +78,8 @@ private ClusterPersistRepository getClusterPersistRepository(final ClusterPersis private void registerOnline(final ComputeNodeInstanceContext computeNodeInstanceContext, final ContextManagerBuilderParameter param, final ContextManager contextManager, final ClusterPersistRepository repository) { contextManager.getPersistServiceFacade().getComputeNodePersistService().registerOnline(computeNodeInstanceContext.getInstance()); - contextManager.getComputeNodeInstanceContext().getAllClusterInstances().addAll(contextManager.getPersistServiceFacade().getComputeNodePersistService().loadAllComputeNodeInstances()); + contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().getAllClusterInstances() + .addAll(contextManager.getPersistServiceFacade().getComputeNodePersistService().loadAllComputeNodeInstances()); new DataChangedEventListenerRegistry(contextManager, getDatabaseNames(param, contextManager.getPersistServiceFacade().getMetaDataPersistService())).register(); ClusterEventSubscriberRegistry eventSubscriberRegistry = new ClusterEventSubscriberRegistry(contextManager.getComputeNodeInstanceContext().getEventBusContext()); eventSubscriberRegistry.register(createDeliverEventSubscribers(repository)); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java index cf282f34c58ff..c01a1210caaa2 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java @@ -49,7 +49,8 @@ public ComputeNodeStateSubscriber(final ContextManager contextManager) { */ @Subscribe public synchronized void renew(final InstanceOnlineEvent event) { - computeNodeInstanceContext.addComputeNodeInstance(contextManager.getPersistServiceFacade().getComputeNodePersistService().loadComputeNodeInstance(event.getInstanceMetaData())); + computeNodeInstanceContext.getClusterInstanceRegistry() + .add(contextManager.getPersistServiceFacade().getComputeNodePersistService().loadComputeNodeInstance(event.getInstanceMetaData())); } /** @@ -59,7 +60,7 @@ public synchronized void renew(final InstanceOnlineEvent event) { */ @Subscribe public synchronized void renew(final InstanceOfflineEvent event) { - computeNodeInstanceContext.deleteComputeNodeInstance(new ComputeNodeInstance(event.getInstanceMetaData())); + computeNodeInstanceContext.getClusterInstanceRegistry().delete(new ComputeNodeInstance(event.getInstanceMetaData())); } /** diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java index 528f71cc98b7d..e2c76070bd9ed 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java @@ -58,13 +58,13 @@ void assertRenewWithInstanceOnlineEvent() { ComputeNodeInstance computeNodeInstance = mock(ComputeNodeInstance.class); when(contextManager.getPersistServiceFacade().getComputeNodePersistService().loadComputeNodeInstance(instanceMetaData)).thenReturn(computeNodeInstance); subscriber.renew(new InstanceOnlineEvent(instanceMetaData)); - verify(contextManager.getComputeNodeInstanceContext()).addComputeNodeInstance(computeNodeInstance); + verify(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry()).add(computeNodeInstance); } @Test void assertRenewWithInstanceOfflineEvent() { subscriber.renew(new InstanceOfflineEvent(mock(InstanceMetaData.class))); - verify(contextManager.getComputeNodeInstanceContext()).deleteComputeNodeInstance(any()); + verify(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry()).delete(any()); } @Test diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutor.java index c78adb2bb52f7..9493c1e4af370 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutor.java @@ -45,7 +45,7 @@ public Collection getRows(final ShowComputeNodesStateme String modeType = contextManager.getComputeNodeInstanceContext().getModeConfiguration().getType(); return "Standalone".equals(modeType) ? Collections.singleton(buildRow(contextManager.getComputeNodeInstanceContext().getInstance(), modeType)) - : contextManager.getComputeNodeInstanceContext().getAllClusterInstances().stream().map(each -> buildRow(each, modeType)).collect(Collectors.toList()); + : contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().getAllClusterInstances().stream().map(each -> buildRow(each, modeType)).collect(Collectors.toList()); } private LocalDataQueryResultRow buildRow(final ComputeNodeInstance instance, final String modeType) { diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeExecutor.java index 5528182ca2fe4..3c5a69e011c6a 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeExecutor.java @@ -38,7 +38,7 @@ public final class LabelComputeNodeExecutor implements DistSQLUpdateExecutor computeNodeInstance = contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById(instanceId); + Optional computeNodeInstance = contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find(instanceId); if (computeNodeInstance.isPresent()) { Collection labels = new LinkedHashSet<>(sqlStatement.getLabels()); if (!sqlStatement.isOverwrite()) { diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutor.java index eddb2e30b8462..7dd1e314a7a41 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutor.java @@ -43,16 +43,17 @@ public void executeUpdate(final SetComputeNodeStateStatement sqlStatement, final } private void checkEnablingIsValid(final ContextManager contextManager, final String instanceId) { - ShardingSpherePreconditions.checkState(contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById(instanceId).isPresent(), + ShardingSpherePreconditions.checkState(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find(instanceId).isPresent(), () -> new UnsupportedSQLOperationException(String.format("`%s` does not exist", instanceId))); } private void checkDisablingIsValid(final ContextManager contextManager, final String instanceId) { ShardingSpherePreconditions.checkState(!contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId().equals(instanceId), () -> new UnsupportedSQLOperationException(String.format("`%s` is the currently in use instance and cannot be disabled", instanceId))); - ShardingSpherePreconditions.checkState(contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById(instanceId).isPresent(), + ShardingSpherePreconditions.checkState(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find(instanceId).isPresent(), () -> new UnsupportedSQLOperationException(String.format("`%s` does not exist", instanceId))); - ShardingSpherePreconditions.checkState(InstanceState.CIRCUIT_BREAK != contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById(instanceId).get().getState().getCurrentState(), + ShardingSpherePreconditions.checkState( + InstanceState.CIRCUIT_BREAK != contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find(instanceId).get().getState().getCurrentState(), () -> new UnsupportedSQLOperationException(String.format("`%s` compute node has been disabled", instanceId))); } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeExecutor.java index 8ad01485fa44f..abc998d19565f 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeExecutor.java @@ -38,7 +38,7 @@ public final class UnlabelComputeNodeExecutor implements DistSQLUpdateExecutor computeNodeInstance = contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById(instanceId); + Optional computeNodeInstance = contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find(instanceId); if (computeNodeInstance.isPresent()) { Collection labels = new LinkedHashSet<>(computeNodeInstance.get().getLabels()); if (sqlStatement.getLabels().isEmpty()) { diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutorTest.java index 89d8fb6ca05d2..75e83399b2235 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowComputeNodesExecutorTest.java @@ -99,7 +99,7 @@ private ComputeNodeInstanceContext createClusterInstanceContext() { when(computeNodeInstance.getMetaData()).thenReturn(new ProxyInstanceMetaData("foo", "127.0.0.1@3309", "foo_version")); when(computeNodeInstance.getState()).thenReturn(new InstanceStateContext()); when(computeNodeInstance.getWorkerId()).thenReturn(1); - when(result.getAllClusterInstances()).thenReturn(Collections.singleton(computeNodeInstance)); + when(result.getClusterInstanceRegistry().getAllClusterInstances()).thenReturn(Collections.singleton(computeNodeInstance)); return result; } } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutorTest.java index 3de9510c90ec5..af62131be69ee 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetComputeNodeStateExecutorTest.java @@ -48,8 +48,9 @@ void assertExecuteUpdateWithCurrentUsingInstance() { void assertExecuteUpdateWithAlreadyDisableInstance() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId()).thenReturn("currentInstance"); - when(contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById("instanceID").isPresent()).thenReturn(true); - when(contextManager.getComputeNodeInstanceContext().getComputeNodeInstanceById("instanceID").get().getState().getCurrentState()).thenReturn(InstanceState.CIRCUIT_BREAK); + when(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find("instanceID").isPresent()).thenReturn(true); + when(contextManager.getComputeNodeInstanceContext().getClusterInstanceRegistry().find("instanceID").get().getState().getCurrentState()) + .thenReturn(InstanceState.CIRCUIT_BREAK); assertThrows(UnsupportedSQLOperationException.class, () -> executor.executeUpdate(new SetComputeNodeStateStatement("DISABLE", "instanceID"), contextManager)); } } From cc616ac6f0a44b4fdcfc4ece6a46d53834b5ec7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BF=B5=E5=90=9B=20Nianjun=20Sun?= Date: Wed, 18 Dec 2024 00:33:20 +0800 Subject: [PATCH 097/192] Refactor : disable maven remote resources plugin (#34092) --- distribution/agent/pom.xml | 1 + distribution/jdbc/pom.xml | 1 + distribution/proxy/pom.xml | 1 + distribution/src/pom.xml | 1 + pom.xml | 1 + 5 files changed, 5 insertions(+) diff --git a/distribution/agent/pom.xml b/distribution/agent/pom.xml index c24bbcb6d2a80..e08bfa3462203 100644 --- a/distribution/agent/pom.xml +++ b/distribution/agent/pom.xml @@ -59,6 +59,7 @@ release + false false false false diff --git a/distribution/jdbc/pom.xml b/distribution/jdbc/pom.xml index 929f04e9a12cb..f541193b1983c 100644 --- a/distribution/jdbc/pom.xml +++ b/distribution/jdbc/pom.xml @@ -62,6 +62,7 @@ release + false false false false diff --git a/distribution/proxy/pom.xml b/distribution/proxy/pom.xml index 2af70311a63e9..2340605978e80 100644 --- a/distribution/proxy/pom.xml +++ b/distribution/proxy/pom.xml @@ -68,6 +68,7 @@ release + false false false false diff --git a/distribution/src/pom.xml b/distribution/src/pom.xml index 47dd8d91631f2..07100e1b3fbf7 100644 --- a/distribution/src/pom.xml +++ b/distribution/src/pom.xml @@ -31,6 +31,7 @@ release + false false false false diff --git a/pom.xml b/pom.xml index cb4f22033b576..b92b8d15cf196 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,7 @@ 1.8 [3.0.4,) UTF-8 + true true false true From c9b8f99d07bec3bb63d1600ebd2f2e99661c9527 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Wed, 18 Dec 2024 11:16:59 +0800 Subject: [PATCH 098/192] Skip table exist validate when bind create table statement with skipMetaDadaValidate (#34095) --- .../infra/binder/engine/SQLBindEngine.java | 4 ++-- .../segment/combine/CombineSegmentBinder.java | 3 ++- .../expression/type/SubquerySegmentBinder.java | 3 ++- .../from/type/SimpleTableSegmentBinder.java | 4 ++-- .../from/type/SubqueryTableSegmentBinder.java | 3 ++- .../statement/SQLStatementBinderContext.java | 3 +++ .../engine/type/DDLStatementBindEngine.java | 5 ++++- .../engine/type/DMLStatementBindEngine.java | 5 ++++- .../expression/type/ColumnSegmentBinderTest.java | 11 ++++++----- .../type/ExistsSubqueryExpressionBinderTest.java | 3 ++- .../FunctionExpressionSegmentBinderTest.java | 3 ++- .../type/SubquerySegmentBinderTest.java | 3 ++- .../from/type/JoinTableSegmentBinderTest.java | 16 +++++++++++----- .../from/type/SimpleTableSegmentBinderTest.java | 4 +++- .../type/SubqueryTableSegmentBinderTest.java | 10 +++++++--- .../statement/dml/DeleteStatementBinderTest.java | 3 ++- .../statement/dml/InsertStatementBinderTest.java | 7 ++++--- .../statement/dml/SelectStatementBinderTest.java | 3 ++- .../statement/dml/UpdateStatementBinderTest.java | 3 ++- 19 files changed, 64 insertions(+), 32 deletions(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java index df2059e29ef0d..191d4b733820c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/SQLBindEngine.java @@ -61,10 +61,10 @@ private boolean isNeedBind() { private SQLStatement bindSQLStatement(final SQLStatement statement) { if (statement instanceof DMLStatement) { - return new DMLStatementBindEngine(metaData, currentDatabaseName).bind((DMLStatement) statement); + return new DMLStatementBindEngine(metaData, currentDatabaseName, hintValueContext).bind((DMLStatement) statement); } if (statement instanceof DDLStatement) { - return new DDLStatementBindEngine(metaData, currentDatabaseName).bind((DDLStatement) statement); + return new DDLStatementBindEngine(metaData, currentDatabaseName, hintValueContext).bind((DDLStatement) statement); } return statement; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java index d3d6180de958a..a818cd2860465 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java @@ -51,7 +51,8 @@ public static CombineSegment bind(final CombineSegment segment, final SQLStateme private static SubquerySegment bindSubquerySegment(final SubquerySegment segment, final SQLStatementBinderContext binderContext, final Multimap outerTableBinderContexts) { SubquerySegment result = new SubquerySegment(segment.getStartIndex(), segment.getStopIndex(), segment.getText()); - SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSelect()); + SQLStatementBinderContext subqueryBinderContext = + new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), binderContext.getHintValueContext(), segment.getSelect()); subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); result.setSelect(new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSelect(), subqueryBinderContext)); return result; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java index afaca7dbcdba4..63596a38eadf6 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java @@ -43,7 +43,8 @@ public final class SubquerySegmentBinder { */ public static SubquerySegment bind(final SubquerySegment segment, final SQLStatementBinderContext binderContext, final Multimap outerTableBinderContexts) { - SQLStatementBinderContext selectBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSelect()); + SQLStatementBinderContext selectBinderContext = + new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), binderContext.getHintValueContext(), segment.getSelect()); selectBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); SelectStatement boundSelectStatement = new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSelect(), selectBinderContext); return new SubquerySegment(segment.getStartIndex(), segment.getStopIndex(), boundSelectStatement, segment.getText()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java index 7c3e9c00a6874..eb57d97f82824 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java @@ -125,8 +125,8 @@ private static IdentifierValue getSchemaName(final SimpleTableSegment segment, f private static void checkTableExists(final SQLStatementBinderContext binderContext, final ShardingSphereSchema schema, final String schemaName, final String tableName) { if (binderContext.getSqlStatement() instanceof CreateTableStatement) { - CreateTableStatement sqlStatement = (CreateTableStatement) binderContext.getSqlStatement(); - ShardingSpherePreconditions.checkState(sqlStatement.isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() + || ((CreateTableStatement) binderContext.getSqlStatement()).isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; } if ("DUAL".equalsIgnoreCase(tableName)) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java index bd8b3ae73629f..3ab92e9a56e48 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java @@ -51,7 +51,8 @@ public static SubqueryTableSegment bind(final SubqueryTableSegment segment, fina final Multimap tableBinderContexts, final Multimap outerTableBinderContexts) { fillPivotColumnNamesInBinderContext(segment, binderContext); - SQLStatementBinderContext subqueryBinderContext = new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), segment.getSubquery().getSelect()); + SQLStatementBinderContext subqueryBinderContext = + new SQLStatementBinderContext(binderContext.getMetaData(), binderContext.getCurrentDatabaseName(), binderContext.getHintValueContext(), segment.getSubquery().getSelect()); subqueryBinderContext.getExternalTableBinderContexts().putAll(binderContext.getExternalTableBinderContexts()); SelectStatement boundSubSelect = new SelectStatementBinder(outerTableBinderContexts).bind(segment.getSubquery().getSelect(), subqueryBinderContext); SubquerySegment boundSubquerySegment = new SubquerySegment(segment.getSubquery().getStartIndex(), segment.getSubquery().getStopIndex(), boundSubSelect, segment.getSubquery().getText()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java index 172660b6ed5fc..9a0afe11c165f 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java @@ -24,6 +24,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; @@ -42,6 +43,8 @@ public final class SQLStatementBinderContext { private final String currentDatabaseName; + private final HintValueContext hintValueContext; + private final SQLStatement sqlStatement; private final Collection usingColumnNames = new CaseInsensitiveSet<>(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 66a5f0215532f..948a74bda03c7 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; @@ -36,6 +37,8 @@ public final class DDLStatementBindEngine { private final String currentDatabaseName; + private final HintValueContext hintValueContext; + /** * Bind DDL statement. * @@ -43,7 +46,7 @@ public final class DDLStatementBindEngine { * @return bound DDL statement */ public DDLStatement bind(final DDLStatement statement) { - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, statement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, statement); if (statement instanceof CursorStatement) { return new CursorStatementBinder().bind((CursorStatement) statement, binderContext); } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java index 00a1688655de2..b164c09bb4953 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.dml.InsertStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.UpdateStatementBinder; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; @@ -40,6 +41,8 @@ public final class DMLStatementBindEngine { private final String currentDatabaseName; + private final HintValueContext hintValueContext; + /** * Bind DML statement. * @@ -47,7 +50,7 @@ public final class DMLStatementBindEngine { * @return bound DML statement */ public DMLStatement bind(final DMLStatement statement) { - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, statement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(metaData, currentDatabaseName, hintValueContext, statement); if (statement instanceof SelectStatement) { return new SelectStatementBinder().bind((SelectStatement) statement, binderContext); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java index bfaddcd17ba37..48dc9a9734dcb 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.kernel.syntax.AmbiguousColumnException; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; @@ -66,7 +67,7 @@ void assertBindWithMultiTablesJoinAndNoOwner() { ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("order_id")); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), selectStatement); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.JOIN_ON, binderContext, tableBinderContexts, LinkedHashMultimap.create()); assertNotNull(actual.getColumnBoundInfo()); assertNull(actual.getOtherUsingColumnBoundInfo()); @@ -89,7 +90,7 @@ void assertBindFromOuterTable() { outerTableBinderContexts.put(new CaseInsensitiveString("t_order_item"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemStatusColumn)))); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, LinkedHashMultimap.create(), outerTableBinderContexts); assertNotNull(actual.getColumnBoundInfo()); @@ -113,7 +114,7 @@ void assertBindWithSameTableAliasAndSameProjection() { tableBinderContexts.put(new CaseInsensitiveString("temp"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemColumn)))); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("temp"))); assertThrows(AmbiguousColumnException.class, () -> ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, tableBinderContexts, LinkedHashMultimap.create())); @@ -132,7 +133,7 @@ void assertBindWithSameTableAliasAndDifferentProjection() { tableBinderContexts.put(new CaseInsensitiveString("temp"), new SimpleTableSegmentBinderContext(Collections.singleton(new ColumnProjectionSegment(boundOrderItemColumn)))); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), selectStatement); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("status")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("temp"))); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.PROJECTION, binderContext, tableBinderContexts, LinkedHashMultimap.create()); @@ -159,7 +160,7 @@ void assertBindOwner() { columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("t_order"))); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", selectStatement); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), selectStatement); ColumnSegment actual = ColumnSegmentBinder.bind(columnSegment, SegmentType.JOIN_ON, binderContext, tableBinderContexts, LinkedHashMultimap.create()); assertTrue(actual.getOwner().isPresent()); assertTrue(actual.getOwner().get().getTableBoundInfo().isPresent()); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java index ce3d1b7b2a28f..d5417af227cb8 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExistsSubqueryExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; @@ -38,7 +39,7 @@ void assertBindExistsSubqueryExpression() { MySQLSelectStatement selectStatement = new MySQLSelectStatement(); selectStatement.setProjections(new ProjectionsSegment(0, 0)); ExistsSubqueryExpression existsSubqueryExpression = new ExistsSubqueryExpression(0, 0, new SubquerySegment(0, 0, selectStatement, "t_test")); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", mock(SQLStatement.class)); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(mock(ShardingSphereMetaData.class), "foo_db", new HintValueContext(), mock(SQLStatement.class)); ExistsSubqueryExpression actual = ExistsSubqueryExpressionBinder.bind(existsSubqueryExpression, binderContext, LinkedHashMultimap.create()); assertThat(actual.getStartIndex(), is(existsSubqueryExpression.getStartIndex())); assertThat(actual.getStopIndex(), is(existsSubqueryExpression.getStopIndex())); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java index 699ad7cc12923..2fe99340671d6 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java @@ -20,6 +20,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; @@ -34,7 +35,7 @@ class FunctionExpressionSegmentBinderTest { @Test void assertBindFunctionExpressionSegment() { FunctionSegment functionSegment = new FunctionSegment(0, 0, "CONCAT", "('%','abc','%')"); - SQLStatementBinderContext binderContext = new SQLStatementBinderContext(new ShardingSphereMetaData(), "foo_db", mock(SQLStatement.class)); + SQLStatementBinderContext binderContext = new SQLStatementBinderContext(new ShardingSphereMetaData(), "foo_db", new HintValueContext(), mock(SQLStatement.class)); FunctionSegment actual = FunctionExpressionSegmentBinder.bind(functionSegment, SegmentType.PROJECTION, binderContext, LinkedHashMultimap.create(), LinkedHashMultimap.create()); assertThat(actual.getStartIndex(), is(functionSegment.getStartIndex())); assertThat(actual.getStopIndex(), is(functionSegment.getStopIndex())); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java index f879f813eac35..8e488801bae12 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -68,7 +69,7 @@ void assertBind() { ExpressionSegment whereExpressionSegment = new ColumnSegment(86, 91, new IdentifierValue("status")); mysqlSelectStatement.setWhere(new WhereSegment(80, 102, whereExpressionSegment)); SubquerySegment subquerySegment = new SubquerySegment(39, 103, mysqlSelectStatement, "order_id = (SELECT order_id FROM t_order WHERE status = 'SUBMIT')"); - SQLStatementBinderContext sqlStatementBinderContext = new SQLStatementBinderContext(createMetaData(), "foo_db", mock(SQLStatement.class)); + SQLStatementBinderContext sqlStatementBinderContext = new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), mock(SQLStatement.class)); ColumnSegment boundNameColumn = new ColumnSegment(7, 13, new IdentifierValue("user_id")); boundNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo( new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("t_order_item"), new IdentifierValue("user_id"))); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java index 785990cce8ef4..7829fcb95ba86 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -70,7 +71,8 @@ void assertBindWithAlias() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegments(actual.getDerivedJoinTableProjectionSegments()); @@ -109,7 +111,8 @@ void assertBindWithoutAlias() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegments(actual.getDerivedJoinTableProjectionSegments()); @@ -132,7 +135,8 @@ void assertBindWithNaturalJoin() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegmentsWithNaturalJoin(actual.getDerivedJoinTableProjectionSegments()); @@ -169,7 +173,8 @@ void assertBindWithJoinUsing() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(actual.getRight(), instanceOf(SimpleTableSegment.class)); assertJoinTableProjectionSegmentsWithUsing(actual.getDerivedJoinTableProjectionSegments()); @@ -205,7 +210,8 @@ void assertBindWithMultiTableJoin() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + JoinTableSegment actual = JoinTableSegmentBinder.bind(joinTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertThat(actual.getLeft(), instanceOf(JoinTableSegment.class)); assertThat(((JoinTableSegment) actual.getLeft()).getLeft(), instanceOf(SimpleTableSegment.class)); assertThat(((JoinTableSegment) actual.getLeft()).getRight(), instanceOf(SimpleTableSegment.class)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java index f49fa42d257bc..408d70f846612 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -53,7 +54,8 @@ void assertBindTableNotExists() { Multimap tableBinderContexts = LinkedHashMultimap.create(); SelectStatement selectStatement = mock(SelectStatement.class); when(selectStatement.getDatabaseType()).thenReturn(databaseType); - assertThrows(TableNotFoundException.class, () -> SimpleTableSegmentBinder.bind(simpleTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts)); + assertThrows(TableNotFoundException.class, + () -> SimpleTableSegmentBinder.bind(simpleTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts)); } private ShardingSphereMetaData createMetaData() { diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java index 8cacd05fe7661..62b74650288e2 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -73,7 +74,8 @@ void assertBindWithSubqueryTableAlias() { ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); SubqueryTableSegment actual = - SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertTrue(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString("temp"))); List projectionSegments = new ArrayList<>(tableBinderContexts.get(new CaseInsensitiveString("temp")).iterator().next().getProjectionSegments()); @@ -107,7 +109,8 @@ void assertBindWithSubqueryProjectionAlias() { ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); SubqueryTableSegment actual = - SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertTrue(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString("temp"))); List projectionSegments = new ArrayList<>(tableBinderContexts.get(new CaseInsensitiveString("temp")).iterator().next().getProjectionSegments()); @@ -130,7 +133,8 @@ void assertBindWithoutSubqueryTableAlias() { ShardingSphereMetaData metaData = createMetaData(); Multimap tableBinderContexts = LinkedHashMultimap.create(); SubqueryTableSegment actual = - SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", selectStatement), tableBinderContexts, LinkedHashMultimap.create()); + SubqueryTableSegmentBinder.bind(subqueryTableSegment, new SQLStatementBinderContext(metaData, "foo_db", new HintValueContext(), selectStatement), tableBinderContexts, + LinkedHashMultimap.create()); assertFalse(actual.getAlias().isPresent()); assertTrue(tableBinderContexts.containsKey(new CaseInsensitiveString(""))); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java index 8f3dd0b072805..da79a6e169583 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinderTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.statement.dml; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -53,7 +54,7 @@ void assertBind() { deleteStatement.setTable(simpleTableSegment); deleteStatement.setWhere(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("status")), new LiteralExpressionSegment(0, 0, 0), "=", "status = 1"))); - DeleteStatement actual = new DeleteStatementBinder().bind(deleteStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", deleteStatement)); + DeleteStatement actual = new DeleteStatementBinder().bind(deleteStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), deleteStatement)); assertThat(actual, not(deleteStatement)); assertThat(actual.getTable(), not(deleteStatement.getTable())); assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java index afd30cf79758a..b2c2463fd5fad 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinderTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.statement.dml; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -61,7 +62,7 @@ void assertBindInsertValues() { new ColumnSegment(0, 0, new IdentifierValue("user_id")), new ColumnSegment(0, 0, new IdentifierValue("status"))))); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); @@ -106,7 +107,7 @@ void assertBindInsertSelectWithColumns() { insertStatement.setInsertSelect(new SubquerySegment(0, 0, subSelectStatement, "")); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); @@ -130,7 +131,7 @@ void assertBindInsertSelectWithoutColumns() { insertStatement.setInsertSelect(new SubquerySegment(0, 0, subSelectStatement, "")); insertStatement.getValues().add(new InsertValuesSegment(0, 0, Arrays.asList(new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, 1), new LiteralExpressionSegment(0, 0, "OK")))); - InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", insertStatement)); + InsertStatement actual = new InsertStatementBinder().bind(insertStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), insertStatement)); assertThat(actual, not(insertStatement)); assertTrue(actual.getTable().isPresent()); assertTrue(insertStatement.getTable().isPresent()); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java index b1c7d2fa2a6db..c415b0ca0e4fb 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinderTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.statement.dml; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -66,7 +67,7 @@ void assertBind() { SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order"))); selectStatement.setFrom(simpleTableSegment); selectStatement.setWhere(mockWhereSegment()); - SelectStatement actual = new SelectStatementBinder().bind(selectStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", selectStatement)); + SelectStatement actual = new SelectStatementBinder().bind(selectStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), selectStatement)); assertThat(actual, not(selectStatement)); assertTrue(actual.getFrom().isPresent()); assertThat(actual.getFrom().get(), not(simpleTableSegment)); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java index d0eddea62c550..c83fcb32b8842 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinderTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.statement.dml; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -53,7 +54,7 @@ void assertBind() { updateStatement.setTable(simpleTableSegment); updateStatement.setWhere(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, new IdentifierValue("status")), new LiteralExpressionSegment(0, 0, 0), "=", "status = 1"))); - UpdateStatement actual = new UpdateStatementBinder().bind(updateStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", updateStatement)); + UpdateStatement actual = new UpdateStatementBinder().bind(updateStatement, new SQLStatementBinderContext(createMetaData(), "foo_db", new HintValueContext(), updateStatement)); assertThat(actual, not(updateStatement)); assertThat(actual.getTable(), not(updateStatement.getTable())); assertThat(actual.getTable(), instanceOf(SimpleTableSegment.class)); From d7685eb6ebde044df16b707b73cbb7d23363e33f Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Wed, 18 Dec 2024 18:57:57 +0800 Subject: [PATCH 099/192] Remove dispatch event builder for StandaloneMetaDataManagerPersistService (#34098) --- .../BroadcastTableChangedProcessor.java | 10 +- .../BroadcastTableChangedProcessorTest.java | 16 ++-- .../changed/EncryptTableChangedProcessor.java | 14 +-- .../EncryptTableChangedProcessorTest.java | 18 ++-- .../EncryptorChangedProcessorTest.java | 16 ++-- .../changed/MaskTableChangedProcessor.java | 14 +-- .../MaskAlgorithmChangedProcessorTest.java | 16 ++-- .../MaskTableChangedProcessorTest.java | 20 ++-- ...teSplittingDataSourceChangedProcessor.java | 18 ++-- ...littingDataSourceChangedProcessorTest.java | 28 +++--- ...ttingLoadBalancerChangedProcessorTest.java | 16 ++-- ...ltShadowAlgorithmNameChangedProcessor.java | 10 +- .../ShadowDataSourceChangedProcessor.java | 18 ++-- .../changed/ShadowTableChangedProcessor.java | 18 ++-- ...adowAlgorithmNameChangedProcessorTest.java | 16 ++-- .../ShadowAlgorithmChangedProcessorTest.java | 16 ++-- .../ShadowDataSourceChangedProcessorTest.java | 20 ++-- .../ShadowTableChangedProcessorTest.java | 20 ++-- ...abaseShardingStrategyChangedProcessor.java | 10 +- ...ltKeyGenerateStrategyChangedProcessor.java | 10 +- ...ardingAuditorStrategyChangedProcessor.java | 10 +- ...DefaultShardingColumnChangedProcessor.java | 10 +- ...TableShardingStrategyChangedProcessor.java | 10 +- .../ShardingAutoTableChangedProcessor.java | 18 ++-- .../ShardingCacheChangedProcessor.java | 10 +- .../ShardingTableChangedProcessor.java | 18 ++-- ...hardingTableReferenceChangedProcessor.java | 18 ++-- ...eShardingStrategyChangedProcessorTest.java | 16 ++-- ...yGenerateStrategyChangedProcessorTest.java | 16 ++-- ...ngAuditorStrategyChangedProcessorTest.java | 16 ++-- ...ultShardingColumnChangedProcessorTest.java | 16 ++-- ...eShardingStrategyChangedProcessorTest.java | 16 ++-- .../KeyGeneratorChangedProcessorTest.java | 16 ++-- ...ShardingAlgorithmChangedProcessorTest.java | 16 ++-- .../ShardingAuditorChangedProcessorTest.java | 16 ++-- ...ShardingAutoTableChangedProcessorTest.java | 20 ++-- .../ShardingCacheChangedProcessorTest.java | 16 ++-- .../ShardingTableChangedProcessorTest.java | 20 ++-- ...ingTableReferenceChangedProcessorTest.java | 20 ++-- .../processor/AlgorithmChangedProcessor.java | 18 ++-- .../AlgorithmChangedProcessorTest.java | 20 ++-- .../DefaultDataSourceChangedProcessor.java | 10 +- .../changed/SingleTableChangedProcessor.java | 10 +- ...DefaultDataSourceChangedProcessorTest.java | 16 ++-- .../SingleTableChangedProcessorTest.java | 16 ++-- ...RuleItemConfigurationChangedProcessor.java | 16 ++-- .../mode/spi/item/AlterNamedRuleItem.java | 39 ++++++++ .../mode/spi/item/AlterRuleItem.java | 45 +++++++++ .../mode/spi/item/AlterUniqueRuleItem.java | 37 ++++++++ .../mode/spi/item/DropNamedRuleItem.java | 35 +++++++ .../mode/spi/item/DropRuleItem.java | 31 ++++++ .../mode/spi/item/DropUniqueRuleItem.java | 33 +++++++ .../mode/spi/item/RuleItemChanged.java | 31 ++++++ .../manager/RuleItemChangedBuilder.java | 94 +++++++++++++++++++ .../metadata/manager/RuleItemManager.java | 33 ++++--- .../type/RuleItemChangedSubscriber.java | 34 ++++++- .../type/RuleItemChangedSubscriberTest.java | 13 ++- ...andaloneMetaDataManagerPersistService.java | 29 +++--- ...loneMetaDataManagerPersistServiceTest.java | 30 +++--- 59 files changed, 795 insertions(+), 417 deletions(-) create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/AlterNamedRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/AlterRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/AlterUniqueRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/DropNamedRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/DropRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/DropUniqueRuleItem.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/spi/item/RuleItemChanged.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemChangedBuilder.java diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessor.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessor.java index dd278cac2c1bc..5145b941137b4 100644 --- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessor.java +++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessor.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.broadcast.metadata.nodepath.BroadcastRuleNodePathProvider; import org.apache.shardingsphere.broadcast.rule.BroadcastRule; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import java.util.LinkedHashSet; @@ -36,7 +36,7 @@ public final class BroadcastTableChangedProcessor implements RuleItemConfigurati @SuppressWarnings("unchecked") @Override - public BroadcastRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public BroadcastRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new BroadcastRuleConfiguration(YamlEngine.unmarshal(yamlContent, LinkedHashSet.class)); } @@ -46,13 +46,13 @@ public BroadcastRuleConfiguration findRuleConfiguration(final ShardingSphereData } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final BroadcastRuleConfiguration currentRuleConfig, final BroadcastRuleConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final BroadcastRuleConfiguration currentRuleConfig, final BroadcastRuleConfiguration toBeChangedItemConfig) { currentRuleConfig.getTables().clear(); currentRuleConfig.getTables().addAll(toBeChangedItemConfig.getTables()); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final BroadcastRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final BroadcastRuleConfiguration currentRuleConfig) { currentRuleConfig.getTables().clear(); } diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessorTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessorTest.java index 408499af607a2..8c28e1eafb9c6 100644 --- a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessorTest.java +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/changed/BroadcastTableChangedProcessorTest.java @@ -22,8 +22,8 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.junit.jupiter.api.Test; @@ -44,8 +44,8 @@ class BroadcastTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - BroadcastRuleConfiguration actual = processor.swapRuleItemConfiguration(event, "- foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + BroadcastRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "- foo_tbl"); assertThat(actual.getTables(), is(Collections.singleton("foo_tbl"))); } @@ -65,18 +65,18 @@ private ShardingSphereDatabase mockDatabase(final BroadcastRuleConfiguration rul @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); BroadcastRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); BroadcastRuleConfiguration toBeChangedItemConfig = new BroadcastRuleConfiguration(new LinkedList<>(Collections.singleton("bar_tbl"))); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables(), is(Collections.singletonList("bar_tbl"))); } @Test void assertDropRuleItemConfiguration() { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); BroadcastRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessor.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessor.java index 57b652ab7ceb1..6101bcc4eb647 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessor.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessor.java @@ -24,10 +24,10 @@ import org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptTableRuleConfiguration; import org.apache.shardingsphere.encrypt.yaml.swapper.rule.YamlEncryptTableRuleConfigurationSwapper; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import java.util.LinkedHashMap; @@ -39,7 +39,7 @@ public final class EncryptTableChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public EncryptTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public EncryptTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlEncryptTableRuleConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlEncryptTableRuleConfiguration.class)); } @@ -50,15 +50,15 @@ public EncryptRuleConfiguration findRuleConfiguration(final ShardingSphereDataba } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final EncryptRuleConfiguration currentRuleConfig, final EncryptTableRuleConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final EncryptRuleConfiguration currentRuleConfig, final EncryptTableRuleConfiguration toBeChangedItemConfig) { // TODO refactor DistSQL to only persist config currentRuleConfig.getTables().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName())); currentRuleConfig.getTables().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final EncryptRuleConfiguration currentRuleConfig) { - currentRuleConfig.getTables().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final EncryptRuleConfiguration currentRuleConfig) { + currentRuleConfig.getTables().removeIf(each -> each.getName().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessorTest.java index dbf7962be265d..857b7fa7a7785 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptTableChangedProcessorTest.java @@ -29,9 +29,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -53,8 +53,8 @@ class EncryptTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - EncryptTableRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + EncryptTableRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new EncryptTableRuleConfiguration("foo_tbl", Collections.singletonList(new EncryptColumnRuleConfiguration("foo_col", new EncryptColumnItemRuleConfiguration("foo_col_cipher", "foo_algo")))))); } @@ -88,11 +88,11 @@ private ShardingSphereDatabase mockDatabase(final EncryptRuleConfiguration ruleC @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); EncryptRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); EncryptTableRuleConfiguration toBeChangedItemConfig = new EncryptTableRuleConfiguration("foo_tbl", Collections.singleton(new EncryptColumnRuleConfiguration("foo_col", new EncryptColumnItemRuleConfiguration("bar_col_cipher", "bar_algo")))); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getTables()).get(0).getColumns().size(), is(1)); assertThat(new ArrayList<>(new ArrayList<>(currentRuleConfig.getTables()).get(0).getColumns()).get(0).getCipher().getName(), is("bar_col_cipher")); @@ -101,10 +101,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); EncryptRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptorChangedProcessorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptorChangedProcessorTest.java index c25d3ae25c3d9..e830f32f3c98b 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptorChangedProcessorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/changed/EncryptorChangedProcessorTest.java @@ -22,9 +22,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -59,11 +59,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); EncryptRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getEncryptors().size(), is(2)); assertThat(currentRuleConfig.getEncryptors().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getEncryptors().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -71,10 +71,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); EncryptRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getEncryptors().isEmpty()); } diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessor.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessor.java index 8ee7950c8c106..eab4b8c0bc494 100644 --- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessor.java +++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessor.java @@ -25,9 +25,9 @@ import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfiguration; import org.apache.shardingsphere.mask.yaml.swapper.rule.YamlMaskTableRuleConfigurationSwapper; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import java.util.LinkedHashMap; @@ -39,7 +39,7 @@ public final class MaskTableChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public MaskTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public MaskTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlMaskTableRuleConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlMaskTableRuleConfiguration.class)); } @@ -49,15 +49,15 @@ public MaskRuleConfiguration findRuleConfiguration(final ShardingSphereDatabase } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final MaskRuleConfiguration currentRuleConfig, final MaskTableRuleConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final MaskRuleConfiguration currentRuleConfig, final MaskTableRuleConfiguration toBeChangedItemConfig) { // TODO refactor DistSQL to only persist config currentRuleConfig.getTables().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName())); currentRuleConfig.getTables().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final MaskRuleConfiguration currentRuleConfig) { - currentRuleConfig.getTables().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final MaskRuleConfiguration currentRuleConfig) { + currentRuleConfig.getTables().removeIf(each -> each.getName().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskAlgorithmChangedProcessorTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskAlgorithmChangedProcessorTest.java index 8334615594173..2a2ef3b39d230 100644 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskAlgorithmChangedProcessorTest.java +++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskAlgorithmChangedProcessorTest.java @@ -22,9 +22,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mask.config.MaskRuleConfiguration; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -59,11 +59,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); MaskRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getMaskAlgorithms().size(), is(2)); assertThat(currentRuleConfig.getMaskAlgorithms().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getMaskAlgorithms().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -71,10 +71,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); MaskRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getMaskAlgorithms().isEmpty()); } diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessorTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessorTest.java index 9844e0c5ddc41..aa5b5811cda63 100644 --- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessorTest.java +++ b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/changed/MaskTableChangedProcessorTest.java @@ -27,9 +27,9 @@ import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskColumnRuleConfiguration; import org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfiguration; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -51,8 +51,8 @@ class MaskTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - MaskTableRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + MaskTableRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new MaskTableRuleConfiguration("foo_tbl", Collections.singletonList(new MaskColumnRuleConfiguration("foo_col", "foo_algo"))))); } @@ -82,21 +82,21 @@ private ShardingSphereDatabase mockDatabase(final MaskRuleConfiguration ruleConf @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_tbl"); MaskRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); MaskTableRuleConfiguration toBeChangedItemConfig = new MaskTableRuleConfiguration("foo_tbl", Collections.singleton(mock(MaskColumnRuleConfiguration.class))); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getTables()).get(0).getColumns().size(), is(1)); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); MaskRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessor.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessor.java index da07516749626..b0c7d3c530fa1 100644 --- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessor.java +++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessor.java @@ -20,10 +20,10 @@ import com.google.common.base.Strings; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration; import org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration; @@ -43,9 +43,9 @@ public final class ReadwriteSplittingDataSourceChangedProcessor RuleItemConfigurationChangedProcessor { @Override - public ReadwriteSplittingDataSourceGroupRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ReadwriteSplittingDataSourceGroupRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { YamlReadwriteSplittingDataSourceGroupRuleConfiguration yamlDataSourceGroupRuleConfig = YamlEngine.unmarshal(yamlContent, YamlReadwriteSplittingDataSourceGroupRuleConfiguration.class); - return new ReadwriteSplittingDataSourceGroupRuleConfiguration(((AlterNamedRuleItemEvent) event).getItemName(), yamlDataSourceGroupRuleConfig.getWriteDataSourceName(), + return new ReadwriteSplittingDataSourceGroupRuleConfiguration(((AlterNamedRuleItem) alterRuleItem).getItemName(), yamlDataSourceGroupRuleConfig.getWriteDataSourceName(), yamlDataSourceGroupRuleConfig.getReadDataSourceNames(), getTransactionalReadQueryStrategy(yamlDataSourceGroupRuleConfig), yamlDataSourceGroupRuleConfig.getLoadBalancerName()); } @@ -62,7 +62,7 @@ public ReadwriteSplittingRuleConfiguration findRuleConfiguration(final ShardingS } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ReadwriteSplittingRuleConfiguration currentRuleConfig, + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ReadwriteSplittingDataSourceGroupRuleConfiguration toBeChangedItemConfig) { // TODO refactor DistSQL to only persist config currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName())); @@ -70,8 +70,8 @@ public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final Re } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ReadwriteSplittingRuleConfiguration currentRuleConfig) { - currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ReadwriteSplittingRuleConfiguration currentRuleConfig) { + currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessorTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessorTest.java index 1ed47ee1cf18e..f0d2f66585aed 100644 --- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessorTest.java +++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingDataSourceChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration; import org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration; import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule; @@ -50,17 +50,17 @@ class ReadwriteSplittingDataSourceChangedProcessorTest { @Test void assertSwapRuleItemConfigurationWithoutTransactionalReadQueryStrategy() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo"); - ReadwriteSplittingDataSourceGroupRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent(null)); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo"); + ReadwriteSplittingDataSourceGroupRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent(null)); assertThat(actual, deepEqual(new ReadwriteSplittingDataSourceGroupRuleConfiguration("foo", "write_ds", Collections.singletonList("read_ds"), "foo_balancer"))); } @Test void assertSwapRuleItemConfigurationWithTransactionalReadQueryStrategy() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo"); - ReadwriteSplittingDataSourceGroupRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent(TransactionalReadQueryStrategy.PRIMARY)); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo"); + ReadwriteSplittingDataSourceGroupRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent(TransactionalReadQueryStrategy.PRIMARY)); assertThat(actual, deepEqual(new ReadwriteSplittingDataSourceGroupRuleConfiguration( "foo", "write_ds", Collections.singletonList("read_ds"), TransactionalReadQueryStrategy.PRIMARY, "foo_balancer"))); } @@ -90,21 +90,21 @@ private ShardingSphereDatabase mockDatabase(final ReadwriteSplittingRuleConfigur @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo"); ReadwriteSplittingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ReadwriteSplittingDataSourceGroupRuleConfiguration toBeChangedItemConfig = new ReadwriteSplittingDataSourceGroupRuleConfiguration( "foo", "write_ds", Collections.singletonList("read_ds"), TransactionalReadQueryStrategy.FIXED, "foo_balancer"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(new ArrayList<>(currentRuleConfig.getDataSourceGroups()).get(0).getTransactionalReadQueryStrategy(), is(TransactionalReadQueryStrategy.FIXED)); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo"); ReadwriteSplittingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getDataSourceGroups().isEmpty()); } diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingLoadBalancerChangedProcessorTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingLoadBalancerChangedProcessorTest.java index 065bc88043019..92b132b24a9b1 100644 --- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingLoadBalancerChangedProcessorTest.java +++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/changed/ReadwriteSplittingLoadBalancerChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration; import org.junit.jupiter.api.Test; @@ -59,11 +59,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); ReadwriteSplittingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getLoadBalancers().size(), is(2)); assertThat(currentRuleConfig.getLoadBalancers().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getLoadBalancers().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -71,10 +71,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); ReadwriteSplittingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getLoadBalancers().isEmpty()); } diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessor.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessor.java index a8f365ad203f1..24e11c2fdd3ee 100644 --- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessor.java +++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessor.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.shadow.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.metadata.nodepath.ShadowRuleNodePathProvider; @@ -31,7 +31,7 @@ public final class DefaultShadowAlgorithmNameChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public String swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public String swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return yamlContent; } @@ -41,12 +41,12 @@ public ShadowRuleConfiguration findRuleConfiguration(final ShardingSphereDatabas } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShadowRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { currentRuleConfig.setDefaultShadowAlgorithmName(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShadowRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultShadowAlgorithmName(null); } diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessor.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessor.java index aec21bea9f0ca..d49863e4e9aa8 100644 --- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessor.java +++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessor.java @@ -18,11 +18,11 @@ package org.apache.shardingsphere.shadow.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.config.datasource.ShadowDataSourceConfiguration; @@ -36,9 +36,9 @@ public final class ShadowDataSourceChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShadowDataSourceConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShadowDataSourceConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { YamlShadowDataSourceConfiguration yamlConfig = YamlEngine.unmarshal(yamlContent, YamlShadowDataSourceConfiguration.class); - return new ShadowDataSourceConfiguration(((AlterNamedRuleItemEvent) event).getItemName(), yamlConfig.getProductionDataSourceName(), yamlConfig.getShadowDataSourceName()); + return new ShadowDataSourceConfiguration(((AlterNamedRuleItem) alterRuleItem).getItemName(), yamlConfig.getProductionDataSourceName(), yamlConfig.getShadowDataSourceName()); } @Override @@ -47,15 +47,15 @@ public ShadowRuleConfiguration findRuleConfiguration(final ShardingSphereDatabas } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig, final ShadowDataSourceConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShadowRuleConfiguration currentRuleConfig, final ShadowDataSourceConfiguration toBeChangedItemConfig) { // TODO refactor DistSQL to only persist config currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName())); currentRuleConfig.getDataSources().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig) { - currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShadowRuleConfiguration currentRuleConfig) { + currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessor.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessor.java index 819a7acd54d9f..acf835f74c27d 100644 --- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessor.java +++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessor.java @@ -18,11 +18,11 @@ package org.apache.shardingsphere.shadow.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.config.table.ShadowTableConfiguration; @@ -37,7 +37,7 @@ public final class ShadowTableChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShadowTableConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShadowTableConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShadowTableConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShadowTableConfiguration.class)); } @@ -47,13 +47,13 @@ public ShadowRuleConfiguration findRuleConfiguration(final ShardingSphereDatabas } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig, final ShadowTableConfiguration toBeChangedItemConfig) { - currentRuleConfig.getTables().put(((AlterNamedRuleItemEvent) event).getItemName(), toBeChangedItemConfig); + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShadowRuleConfiguration currentRuleConfig, final ShadowTableConfiguration toBeChangedItemConfig) { + currentRuleConfig.getTables().put(((AlterNamedRuleItem) alterRuleItem).getItemName(), toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig) { - currentRuleConfig.getTables().remove(((DropNamedRuleItemEvent) event).getItemName()); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShadowRuleConfiguration currentRuleConfig) { + currentRuleConfig.getTables().remove(((DropNamedRuleItem) dropRuleItem).getItemName()); } @Override diff --git a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessorTest.java b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessorTest.java index 755655258cc8c..1a2d198f99095 100644 --- a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessorTest.java +++ b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/DefaultShadowAlgorithmNameChangedProcessorTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.rule.ShadowRule; import org.junit.jupiter.api.Test; @@ -43,8 +43,8 @@ class DefaultShadowAlgorithmNameChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - String actual = processor.swapRuleItemConfiguration(event, "foo_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + String actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "foo_algo"); assertThat(actual, is("foo_algo")); } @@ -64,19 +64,19 @@ private ShardingSphereDatabase mockDatabase(final ShadowRuleConfiguration ruleCo @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); String toBeChangedItemConfig = "bar_algo"; - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultShadowAlgorithmName(), is("bar_algo")); } @Test void assertDropRuleItemConfiguration() { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); currentRuleConfig.setDefaultShadowAlgorithmName("foo_algo"); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultShadowAlgorithmName()); } diff --git a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowAlgorithmChangedProcessorTest.java b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowAlgorithmChangedProcessorTest.java index a17e8711b0f59..c169b465c2a55 100644 --- a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowAlgorithmChangedProcessorTest.java +++ b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowAlgorithmChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.junit.jupiter.api.Test; @@ -56,11 +56,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getShadowAlgorithms().size(), is(2)); assertThat(currentRuleConfig.getShadowAlgorithms().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getShadowAlgorithms().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -68,10 +68,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getShadowAlgorithms().isEmpty()); } diff --git a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessorTest.java b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessorTest.java index 26644475dc777..3cc3662b9c0a4 100644 --- a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessorTest.java +++ b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowDataSourceChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.config.datasource.ShadowDataSourceConfiguration; import org.apache.shardingsphere.shadow.rule.ShadowRule; @@ -48,9 +48,9 @@ class ShadowDataSourceChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_ds"); - ShadowDataSourceConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_ds"); + ShadowDataSourceConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShadowDataSourceConfiguration("foo_ds", "prod_ds", "shadow_ds"))); } @@ -77,10 +77,10 @@ private ShardingSphereDatabase mockDatabase(final ShadowRuleConfiguration ruleCo @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShadowDataSourceConfiguration toBeChangedItemConfig = new ShadowDataSourceConfiguration("foo_ds", "new_prod_ds", "new_shadow_ds"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDataSources().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getDataSources()).get(0).getProductionDataSourceName(), is("new_prod_ds")); assertThat(new ArrayList<>(currentRuleConfig.getDataSources()).get(0).getShadowDataSourceName(), is("new_shadow_ds")); @@ -88,10 +88,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessorTest.java b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessorTest.java index 8766a5aaafd1b..a934d87bdd9ac 100644 --- a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessorTest.java +++ b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/rule/changed/ShadowTableChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration; import org.apache.shardingsphere.shadow.config.table.ShadowTableConfiguration; import org.apache.shardingsphere.shadow.rule.ShadowRule; @@ -47,8 +47,8 @@ class ShadowTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShadowTableConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShadowTableConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShadowTableConfiguration(Collections.singletonList("foo_ds"), Collections.singletonList("foo_algo")))); } @@ -75,11 +75,11 @@ private ShardingSphereDatabase mockDatabase(final ShadowRuleConfiguration ruleCo @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShadowTableConfiguration toBeChangedItemConfig = new ShadowTableConfiguration(Collections.singletonList("bar_ds"), Collections.singletonList("bar_algo")); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables().size(), is(1)); assertThat(currentRuleConfig.getTables().get("foo_tbl").getDataSourceNames(), is(Collections.singletonList("bar_ds"))); assertThat(currentRuleConfig.getTables().get("foo_tbl").getShadowAlgorithmNames(), is(Collections.singletonList("bar_algo"))); @@ -87,10 +87,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShadowRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessor.java index 7050e71236937..6d18cf0fe4b4d 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration; @@ -35,7 +35,7 @@ public final class DefaultDatabaseShardingStrategyChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingStrategyConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShardingStrategyConfiguration.class)); } @@ -45,12 +45,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingStrategyConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingStrategyConfiguration toBeChangedItemConfig) { currentRuleConfig.setDefaultDatabaseShardingStrategy(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultDatabaseShardingStrategy(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessor.java index fb8efef752a91..ea63593d7f9ad 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; @@ -35,7 +35,7 @@ public final class DefaultKeyGenerateStrategyChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public KeyGenerateStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public KeyGenerateStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlKeyGenerateStrategyConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlKeyGenerateStrategyConfiguration.class)); } @@ -45,12 +45,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final KeyGenerateStrategyConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final KeyGenerateStrategyConfiguration toBeChangedItemConfig) { currentRuleConfig.setDefaultKeyGenerateStrategy(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultKeyGenerateStrategy(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessor.java index f9f51c42726fe..bb3df192e2ab6 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration; @@ -35,7 +35,7 @@ public final class DefaultShardingAuditorStrategyChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingAuditStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingAuditStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingAuditStrategyConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShardingAuditStrategyConfiguration.class)); } @@ -45,12 +45,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingAuditStrategyConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingAuditStrategyConfiguration toBeChangedItemConfig) { currentRuleConfig.setDefaultAuditStrategy(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultAuditStrategy(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessor.java index fb6abbdbf4d11..32e4f748ba98d 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessor.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.metadata.nodepath.ShardingRuleNodePathProvider; @@ -31,7 +31,7 @@ public final class DefaultShardingColumnChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public String swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public String swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return yamlContent; } @@ -41,12 +41,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { currentRuleConfig.setDefaultShardingColumn(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultShardingColumn(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessor.java index c272c476bb91a..75901a5abab7b 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration; @@ -35,7 +35,7 @@ public final class DefaultTableShardingStrategyChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingStrategyConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingStrategyConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShardingStrategyConfiguration.class)); } @@ -45,12 +45,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingStrategyConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingStrategyConfiguration toBeChangedItemConfig) { currentRuleConfig.setDefaultTableShardingStrategy(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultTableShardingStrategy(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessor.java index 672449bbc1470..6474b8fadff4e 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessor.java @@ -18,11 +18,11 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration; @@ -37,7 +37,7 @@ public final class ShardingAutoTableChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingAutoTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingAutoTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingAutoTableRuleConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShardingAutoTableRuleConfiguration.class)); } @@ -47,14 +47,14 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingAutoTableRuleConfiguration toBeChangedItemConfig) { - currentRuleConfig.getAutoTables().removeIf(each -> each.getLogicTable().equals(((AlterNamedRuleItemEvent) event).getItemName())); + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingAutoTableRuleConfiguration toBeChangedItemConfig) { + currentRuleConfig.getAutoTables().removeIf(each -> each.getLogicTable().equals(((AlterNamedRuleItem) alterRuleItem).getItemName())); currentRuleConfig.getAutoTables().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { - currentRuleConfig.getAutoTables().removeIf(each -> each.getLogicTable().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { + currentRuleConfig.getAutoTables().removeIf(each -> each.getLogicTable().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessor.java index 3a31029c7fe8a..f54ef5851d5fc 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheConfiguration; @@ -35,7 +35,7 @@ public final class ShardingCacheChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingCacheConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingCacheConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingCacheConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlShardingCacheConfiguration.class)); } @@ -45,12 +45,12 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingCacheConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingCacheConfiguration toBeChangedItemConfig) { currentRuleConfig.setShardingCache(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { currentRuleConfig.setShardingCache(null); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessor.java index 0029fa907dd15..6065236c3a358 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessor.java @@ -18,11 +18,11 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; @@ -37,7 +37,7 @@ public final class ShardingTableChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingTableRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlShardingTableRuleConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlTableRuleConfiguration.class)); } @@ -47,14 +47,14 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingTableRuleConfiguration toBeChangedItemConfig) { - currentRuleConfig.getTables().removeIf(each -> each.getLogicTable().equals(((AlterNamedRuleItemEvent) event).getItemName())); + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingTableRuleConfiguration toBeChangedItemConfig) { + currentRuleConfig.getTables().removeIf(each -> each.getLogicTable().equals(((AlterNamedRuleItem) alterRuleItem).getItemName())); currentRuleConfig.getTables().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { - currentRuleConfig.getTables().removeIf(each -> each.getLogicTable().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { + currentRuleConfig.getTables().removeIf(each -> each.getLogicTable().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessor.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessor.java index cc70702e9992e..cf6ee35c658ff 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessor.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessor.java @@ -18,10 +18,10 @@ package org.apache.shardingsphere.sharding.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration; @@ -35,7 +35,7 @@ public final class ShardingTableReferenceChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public ShardingTableReferenceRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public ShardingTableReferenceRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return YamlShardingTableReferenceRuleConfigurationConverter.convertToObject(yamlContent); } @@ -45,14 +45,14 @@ public ShardingRuleConfiguration findRuleConfiguration(final ShardingSphereDatab } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig, final ShardingTableReferenceRuleConfiguration toBeChangedItemConfig) { - currentRuleConfig.getBindingTableGroups().removeIf(each -> each.getName().equals(((AlterNamedRuleItemEvent) event).getItemName())); + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final ShardingRuleConfiguration currentRuleConfig, final ShardingTableReferenceRuleConfiguration toBeChangedItemConfig) { + currentRuleConfig.getBindingTableGroups().removeIf(each -> each.getName().equals(((AlterNamedRuleItem) alterRuleItem).getItemName())); currentRuleConfig.getBindingTableGroups().add(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShardingRuleConfiguration currentRuleConfig) { - currentRuleConfig.getBindingTableGroups().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName())); + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final ShardingRuleConfiguration currentRuleConfig) { + currentRuleConfig.getBindingTableGroups().removeIf(each -> each.getName().equals(((DropNamedRuleItem) dropRuleItem).getItemName())); } @Override diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessorTest.java index 4d43303d33572..77c7598baf98e 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultDatabaseShardingStrategyChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.HintShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration; @@ -50,8 +50,8 @@ class DefaultDatabaseShardingStrategyChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingStrategyConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingStrategyConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new NoneShardingStrategyConfiguration())); } @@ -77,18 +77,18 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingStrategyConfiguration toBeChangedItemConfig = new HintShardingStrategyConfiguration("foo_algo"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultDatabaseShardingStrategy().getShardingAlgorithmName(), is("foo_algo")); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultDatabaseShardingStrategy()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessorTest.java index bc349b7c70e73..6f0bfc116bd72 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultKeyGenerateStrategyChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -47,8 +47,8 @@ class DefaultKeyGenerateStrategyChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - KeyGenerateStrategyConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + KeyGenerateStrategyConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new KeyGenerateStrategyConfiguration("foo_col", "foo_algo"))); } @@ -75,18 +75,18 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); KeyGenerateStrategyConfiguration toBeChangedItemConfig = new KeyGenerateStrategyConfiguration("foo_col", "bar_algo"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultKeyGenerateStrategy().getKeyGeneratorName(), is("bar_algo")); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultKeyGenerateStrategy()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessorTest.java index 42182a26faa4e..fbd78abd4495c 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingAuditorStrategyChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -48,8 +48,8 @@ class DefaultShardingAuditorStrategyChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingAuditStrategyConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingAuditStrategyConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShardingAuditStrategyConfiguration(Collections.singletonList("foo_algo"), true))); } @@ -75,19 +75,19 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingAuditStrategyConfiguration toBeChangedItemConfig = new ShardingAuditStrategyConfiguration(Collections.singleton("bar_algo"), true); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultAuditStrategy().getAuditorNames(), is(Collections.singleton("bar_algo"))); assertTrue(currentRuleConfig.getDefaultAuditStrategy().isAllowHintDisable()); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultAuditStrategy()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessorTest.java index 5d020a2b62ed3..c023a85e6fa5d 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultShardingColumnChangedProcessorTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.junit.jupiter.api.Test; @@ -43,8 +43,8 @@ class DefaultShardingColumnChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - String actual = processor.swapRuleItemConfiguration(event, "foo_col"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + String actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "foo_col"); assertThat(actual, is("foo_col")); } @@ -64,19 +64,19 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); String toBeChangedItemConfig = "bar_col"; - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultShardingColumn(), is("bar_col")); } @Test void assertDropRuleItemConfiguration() { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); currentRuleConfig.setDefaultShardingColumn("foo_col"); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultShardingColumn()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessorTest.java index c5039f9443fc7..72c6624cde1ee 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/DefaultTableShardingStrategyChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.HintShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration; @@ -50,8 +50,8 @@ class DefaultTableShardingStrategyChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingStrategyConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingStrategyConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new NoneShardingStrategyConfiguration())); } @@ -77,18 +77,18 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingStrategyConfiguration toBeChangedItemConfig = new HintShardingStrategyConfiguration("foo_algo"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultTableShardingStrategy().getShardingAlgorithmName(), is("foo_algo")); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getDefaultTableShardingStrategy()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGeneratorChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGeneratorChangedProcessorTest.java index a2cd6e36d27c1..aba58d8dee8cc 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGeneratorChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGeneratorChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.junit.jupiter.api.Test; @@ -56,11 +56,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getKeyGenerators().size(), is(2)); assertThat(currentRuleConfig.getKeyGenerators().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getKeyGenerators().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -68,10 +68,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getKeyGenerators().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAlgorithmChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAlgorithmChangedProcessorTest.java index d3ae6c720b971..abea0fa847ff9 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAlgorithmChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAlgorithmChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.junit.jupiter.api.Test; @@ -56,11 +56,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getShardingAlgorithms().size(), is(2)); assertThat(currentRuleConfig.getShardingAlgorithms().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getShardingAlgorithms().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -68,10 +68,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getShardingAlgorithms().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAuditorChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAuditorChangedProcessorTest.java index 5ba4bb81f848b..f45b928c86846 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAuditorChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAuditorChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.junit.jupiter.api.Test; @@ -56,11 +56,11 @@ private ShardingSphereDatabase mockDatabase() { @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getAuditors().size(), is(2)); assertThat(currentRuleConfig.getAuditors().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getAuditors().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -68,10 +68,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getAuditors().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessorTest.java index 80bac9209f826..34721acdee7f2 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingAutoTableChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -48,8 +48,8 @@ class ShardingAutoTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingAutoTableRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingAutoTableRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShardingAutoTableRuleConfiguration("foo_tbl", "foo_ds"))); } @@ -76,21 +76,21 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingAutoTableRuleConfiguration toBeChangedItemConfig = new ShardingAutoTableRuleConfiguration("foo_tbl", "bar_ds"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getAutoTables().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getAutoTables()).get(0).getActualDataSources(), is("bar_ds")); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getAutoTables().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessorTest.java index fe25dfde0ab50..8bb32d9ded14c 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingCacheChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheConfiguration; import org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheOptionsConfiguration; @@ -50,8 +50,8 @@ class ShardingCacheChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingCacheConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingCacheConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShardingCacheConfiguration(1, new ShardingCacheOptionsConfiguration(true, 128, 1024)))); } @@ -82,10 +82,10 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingCacheConfiguration toBeChangedItemConfig = new ShardingCacheConfiguration(2, new ShardingCacheOptionsConfiguration(false, 1280, 10240)); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getShardingCache().getAllowedMaxSqlLength(), is(2)); assertFalse(currentRuleConfig.getShardingCache().getRouteCache().isSoftValues()); assertThat(currentRuleConfig.getShardingCache().getRouteCache().getInitialCapacity(), is(1280)); @@ -94,9 +94,9 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertNull(currentRuleConfig.getShardingCache()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessorTest.java index 671e450b48404..2d6f291e635b1 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableChangedProcessorTest.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -48,8 +48,8 @@ class ShardingTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingTableRuleConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingTableRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new ShardingTableRuleConfiguration("foo_tbl", "foo_ds.foo_tbl"))); } @@ -76,21 +76,21 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingTableRuleConfiguration toBeChangedItemConfig = new ShardingTableRuleConfiguration("foo_tbl", "bar_ds.bar_tbl"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getTables()).get(0).getActualDataNodes(), is("bar_ds.bar_tbl")); } @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_tbl"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_tbl"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessorTest.java index b78b740bffa78..b44f822dcfc49 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/ShardingTableReferenceChangedProcessorTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -46,8 +46,8 @@ class ShardingTableReferenceChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - ShardingTableReferenceRuleConfiguration actual = processor.swapRuleItemConfiguration(event, "foo_ref:foo_tbl_0,foo_tbl_1"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + ShardingTableReferenceRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "foo_ref:foo_tbl_0,foo_tbl_1"); assertThat(actual, deepEqual(new ShardingTableReferenceRuleConfiguration("foo_ref", "foo_tbl_0,foo_tbl_1"))); } @@ -67,11 +67,11 @@ private ShardingSphereDatabase mockDatabase(final ShardingRuleConfiguration rule @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_ref"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("foo_ref"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); ShardingTableReferenceRuleConfiguration toBeChangedItemConfig = new ShardingTableReferenceRuleConfiguration("foo_ref", "bar_tbl_0,bar_tbl_1"); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getBindingTableGroups().size(), is(1)); assertThat(new ArrayList<>(currentRuleConfig.getBindingTableGroups()).get(0).getName(), is("foo_ref")); assertThat(new ArrayList<>(currentRuleConfig.getBindingTableGroups()).get(0).getReference(), is("bar_tbl_0,bar_tbl_1")); @@ -79,10 +79,10 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_ref"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_ref"); ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration(); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getBindingTableGroups().isEmpty()); } diff --git a/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessor.java b/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessor.java index 16bccca49accd..2a811a20314b8 100644 --- a/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessor.java +++ b/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessor.java @@ -25,10 +25,10 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import java.util.Map; @@ -44,7 +44,7 @@ public abstract class AlgorithmChangedProcessor imp private final Class ruleClass; @Override - public final AlgorithmConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public final AlgorithmConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new YamlAlgorithmConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent, YamlAlgorithmConfiguration.class)); } @@ -55,13 +55,13 @@ public final T findRuleConfiguration(final ShardingSphereDatabase database) { } @Override - public final void changeRuleItemConfiguration(final AlterRuleItemEvent event, final T currentRuleConfig, final AlgorithmConfiguration toBeChangedItemConfig) { - getAlgorithmConfigurations(currentRuleConfig).put(((AlterNamedRuleItemEvent) event).getItemName(), toBeChangedItemConfig); + public final void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final T currentRuleConfig, final AlgorithmConfiguration toBeChangedItemConfig) { + getAlgorithmConfigurations(currentRuleConfig).put(((AlterNamedRuleItem) alterRuleItem).getItemName(), toBeChangedItemConfig); } @Override - public final void dropRuleItemConfiguration(final DropRuleItemEvent event, final T currentRuleConfig) { - getAlgorithmConfigurations(currentRuleConfig).remove(((DropNamedRuleItemEvent) event).getItemName()); + public final void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final T currentRuleConfig) { + getAlgorithmConfigurations(currentRuleConfig).remove(((DropNamedRuleItem) dropRuleItem).getItemName()); } protected abstract T createEmptyRuleConfiguration(); diff --git a/infra/algorithm/core/src/test/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessorTest.java b/infra/algorithm/core/src/test/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessorTest.java index d6c3dae120418..3e2021b195a71 100644 --- a/infra/algorithm/core/src/test/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessorTest.java +++ b/infra/algorithm/core/src/test/java/org/apache/shardingsphere/infra/algorithm/core/processor/AlgorithmChangedProcessorTest.java @@ -25,9 +25,9 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -48,8 +48,8 @@ class AlgorithmChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - AlgorithmConfiguration actual = processor.swapRuleItemConfiguration(event, createYAMLContent()); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + AlgorithmConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, createYAMLContent()); assertThat(actual, deepEqual(new AlgorithmConfiguration("foo_algo", new Properties()))); } @@ -73,12 +73,12 @@ private ShardingSphereDatabase mockDatabase(final AlgorithmChangedProcessorFixtu @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("bar_algo"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + when(alterNamedRuleItem.getItemName()).thenReturn("bar_algo"); AlgorithmChangedProcessorFixtureRuleConfiguration currentRuleConfig = new AlgorithmChangedProcessorFixtureRuleConfiguration(); currentRuleConfig.getAlgorithmConfigurations().put("foo_algo", new AlgorithmConfiguration("FOO_FIXTURE", new Properties())); AlgorithmConfiguration toBeChangedItemConfig = new AlgorithmConfiguration("BAR_FIXTURE", new Properties()); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getAlgorithmConfigurations().size(), is(2)); assertThat(currentRuleConfig.getAlgorithmConfigurations().get("foo_algo").getType(), is("FOO_FIXTURE")); assertThat(currentRuleConfig.getAlgorithmConfigurations().get("bar_algo").getType(), is("BAR_FIXTURE")); @@ -86,11 +86,11 @@ void assertChangeRuleItemConfiguration() { @Test void assertDropRuleItemConfiguration() { - DropNamedRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - when(event.getItemName()).thenReturn("foo_algo"); + DropNamedRuleItem dropNamedRuleItem = mock(DropNamedRuleItem.class); + when(dropNamedRuleItem.getItemName()).thenReturn("foo_algo"); AlgorithmChangedProcessorFixtureRuleConfiguration currentRuleConfig = new AlgorithmChangedProcessorFixtureRuleConfiguration(); currentRuleConfig.getAlgorithmConfigurations().put("foo_algo", new AlgorithmConfiguration("FOO_FIXTURE", new Properties())); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropNamedRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getAlgorithmConfigurations().isEmpty()); } } diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessor.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessor.java index 13a63a23a03f5..276c4104d820d 100644 --- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessor.java +++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessor.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.single.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.metadata.nodepath.SingleRuleNodePathProvider; @@ -31,7 +31,7 @@ public final class DefaultDataSourceChangedProcessor implements RuleItemConfigurationChangedProcessor { @Override - public String swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public String swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return yamlContent; } @@ -41,12 +41,12 @@ public SingleRuleConfiguration findRuleConfiguration(final ShardingSphereDatabas } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final SingleRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final SingleRuleConfiguration currentRuleConfig, final String toBeChangedItemConfig) { currentRuleConfig.setDefaultDataSource(toBeChangedItemConfig); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final SingleRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final SingleRuleConfiguration currentRuleConfig) { currentRuleConfig.setDefaultDataSource(null); } diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessor.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessor.java index 099c95af387ca..70015c5b7d250 100644 --- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessor.java +++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessor.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.single.rule.changed; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.metadata.nodepath.SingleRuleNodePathProvider; @@ -35,7 +35,7 @@ public final class SingleTableChangedProcessor implements RuleItemConfigurationC @SuppressWarnings("unchecked") @Override - public SingleRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) { + public SingleRuleConfiguration swapRuleItemConfiguration(final AlterRuleItem alterRuleItem, final String yamlContent) { return new SingleRuleConfiguration(YamlEngine.unmarshal(yamlContent, LinkedHashSet.class), null); } @@ -45,13 +45,13 @@ public SingleRuleConfiguration findRuleConfiguration(final ShardingSphereDatabas } @Override - public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final SingleRuleConfiguration currentRuleConfig, final SingleRuleConfiguration toBeChangedItemConfig) { + public void changeRuleItemConfiguration(final AlterRuleItem alterRuleItem, final SingleRuleConfiguration currentRuleConfig, final SingleRuleConfiguration toBeChangedItemConfig) { currentRuleConfig.getTables().clear(); currentRuleConfig.getTables().addAll(toBeChangedItemConfig.getTables()); } @Override - public void dropRuleItemConfiguration(final DropRuleItemEvent event, final SingleRuleConfiguration currentRuleConfig) { + public void dropRuleItemConfiguration(final DropRuleItem dropRuleItem, final SingleRuleConfiguration currentRuleConfig) { currentRuleConfig.getTables().clear(); } diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessorTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessorTest.java index 1902e210c4299..0ac65fe4370ce 100644 --- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessorTest.java +++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/DefaultDataSourceChangedProcessorTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.rule.SingleRule; import org.junit.jupiter.api.Test; @@ -44,8 +44,8 @@ class DefaultDataSourceChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - String actual = processor.swapRuleItemConfiguration(event, "foo_ds"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + String actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "foo_ds"); assertThat(actual, is("foo_ds")); } @@ -65,18 +65,18 @@ private ShardingSphereDatabase mockDatabase(final SingleRuleConfiguration ruleCo @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); SingleRuleConfiguration currentRuleConfig = new SingleRuleConfiguration(Collections.emptyList(), "foo_ds"); String toBeChangedItemConfig = "bar_ds"; - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getDefaultDataSource(), is(Optional.of("bar_ds"))); } @Test void assertDropRuleItemConfiguration() { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); SingleRuleConfiguration currentRuleConfig = new SingleRuleConfiguration(Collections.emptyList(), "foo_ds"); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); assertFalse(currentRuleConfig.getDefaultDataSource().isPresent()); } } diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessorTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessorTest.java index bd258dbb129ab..dc6abf3934972 100644 --- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessorTest.java +++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/changed/SingleTableChangedProcessorTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.rule.SingleRule; import org.junit.jupiter.api.Test; @@ -44,8 +44,8 @@ class SingleTableChangedProcessorTest { @Test void assertSwapRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - SingleRuleConfiguration actual = processor.swapRuleItemConfiguration(event, "- foo_tbl"); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); + SingleRuleConfiguration actual = processor.swapRuleItemConfiguration(alterNamedRuleItem, "- foo_tbl"); assertThat(actual.getTables(), is(Collections.singleton("foo_tbl"))); } @@ -65,18 +65,18 @@ private ShardingSphereDatabase mockDatabase(final SingleRuleConfiguration ruleCo @Test void assertChangeRuleItemConfiguration() { - AlterNamedRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + AlterNamedRuleItem alterNamedRuleItem = mock(AlterNamedRuleItem.class); SingleRuleConfiguration currentRuleConfig = new SingleRuleConfiguration(new LinkedList<>(Collections.singleton("foo_tbl")), null); SingleRuleConfiguration toBeChangedItemConfig = new SingleRuleConfiguration(new LinkedList<>(Collections.singleton("bar_tbl")), null); - processor.changeRuleItemConfiguration(event, currentRuleConfig, toBeChangedItemConfig); + processor.changeRuleItemConfiguration(alterNamedRuleItem, currentRuleConfig, toBeChangedItemConfig); assertThat(currentRuleConfig.getTables(), is(Collections.singletonList("bar_tbl"))); } @Test void assertDropRuleItemConfiguration() { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); SingleRuleConfiguration currentRuleConfig = new SingleRuleConfiguration(new LinkedList<>(Collections.singleton("foo_tbl")), null); - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); assertTrue(currentRuleConfig.getTables().isEmpty()); } } diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RuleItemConfigurationChangedProcessor.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RuleItemConfigurationChangedProcessor.java index 0a147aef73bd9..d12f0fa1684c4 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RuleItemConfigurationChangedProcessor.java +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RuleItemConfigurationChangedProcessor.java @@ -19,10 +19,10 @@ import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; /** * Rule item configuration changed processor. @@ -36,11 +36,11 @@ public interface RuleItemConfigurationChangedProcessor build(final String databaseName, final String activeVersionKey, final String activeVersion, final Type changedType) { + for (RuleNodePathProvider each : ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) { + Optional result = build(each.getRuleNodePath(), databaseName, activeVersionKey, activeVersion, changedType); + if (result.isPresent()) { + return result; + } + } + return Optional.empty(); + } + + private Optional build(final RuleNodePath ruleNodePath, final String databaseName, final String activeVersionKey, final String activeVersion, final Type changedType) { + if (!ruleNodePath.getRoot().isValidatedPath(activeVersionKey) || Type.DELETED != changedType && Strings.isNullOrEmpty(activeVersion)) { + return Optional.empty(); + } + for (Entry entry : ruleNodePath.getNamedItems().entrySet()) { + Optional itemName; + if (Type.ADDED == changedType || Type.UPDATED == changedType) { + itemName = entry.getValue().getNameByActiveVersion(activeVersionKey); + } else { + itemName = entry.getValue().getNameByItemPath(activeVersionKey); + } + if (itemName.isPresent()) { + return Optional.of(create(databaseName, itemName.get(), activeVersionKey, activeVersion, changedType, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); + } + } + for (Entry entry : ruleNodePath.getUniqueItems().entrySet()) { + if (entry.getValue().isActiveVersionPath(activeVersionKey)) { + return Optional.of(create(databaseName, activeVersionKey, activeVersion, changedType, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); + } + } + return Optional.empty(); + } + + private RuleItemChanged create(final String databaseName, final String itemName, final String activeVersionKey, final String activeVersion, final Type changedType, final String type) { + return Type.ADDED == changedType || Type.UPDATED == changedType + ? new AlterNamedRuleItem(databaseName, itemName, activeVersionKey, activeVersion, type) + : new DropNamedRuleItem(databaseName, itemName, type); + } + + private RuleItemChanged create(final String databaseName, final String activeVersionKey, final String activeVersion, final Type changedType, final String type) { + return Type.ADDED == changedType || Type.UPDATED == changedType + ? new AlterUniqueRuleItem(databaseName, activeVersionKey, activeVersion, type) + : new DropUniqueRuleItem(databaseName, type); + } +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java index 4af0ebe9bc295..6d3adafe72378 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java @@ -19,11 +19,11 @@ import com.google.common.base.Preconditions; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; @@ -50,20 +50,20 @@ public RuleItemManager(final AtomicReference metaDataContexts, /** * Alter with rule item. * - * @param event alter rule item event + * @param alterRuleItem alter rule item * @throws SQLException SQL Exception */ - @SuppressWarnings({"rawtypes", "unchecked"}) - public void alterRuleItem(final AlterRuleItemEvent event) throws SQLException { - Preconditions.checkArgument(event.getActiveVersion().equals(metaDataPersistService.getMetaDataVersionPersistService() - .getActiveVersionByFullPath(event.getActiveVersionKey())), "Invalid active version: {} of key: {}", event.getActiveVersion(), event.getActiveVersionKey()); - RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, event.getType()); + public void alterRuleItem(final AlterRuleItem alterRuleItem) throws SQLException { + Preconditions.checkArgument(alterRuleItem.getActiveVersion().equals(metaDataPersistService.getMetaDataVersionPersistService() + .getActiveVersionByFullPath(alterRuleItem.getActiveVersionKey())), "Invalid active version: {} of key: {}", + alterRuleItem.getActiveVersion(), alterRuleItem.getActiveVersionKey()); + RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, alterRuleItem.getType()); String yamlContent = metaDataPersistService.getMetaDataVersionPersistService() - .getVersionPathByActiveVersion(event.getActiveVersionKey(), event.getActiveVersion()); - String databaseName = event.getDatabaseName(); + .getVersionPathByActiveVersion(alterRuleItem.getActiveVersionKey(), alterRuleItem.getActiveVersion()); + String databaseName = alterRuleItem.getDatabaseName(); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { - processor.changeRuleItemConfiguration(event, currentRuleConfig, processor.swapRuleItemConfiguration(event, yamlContent)); + processor.changeRuleItemConfiguration(alterRuleItem, currentRuleConfig, processor.swapRuleItemConfiguration(alterRuleItem, yamlContent)); ruleConfigManager.alterRuleConfiguration(databaseName, currentRuleConfig); } } @@ -71,17 +71,16 @@ public void alterRuleItem(final AlterRuleItemEvent event) throws SQLException { /** * Drop with rule item. * - * @param event drop rule item event + * @param dropRuleItem drop rule item * @throws SQLException SQL Exception */ - @SuppressWarnings({"rawtypes", "unchecked"}) - public void dropRuleItem(final DropRuleItemEvent event) throws SQLException { - String databaseName = event.getDatabaseName(); + public void dropRuleItem(final DropRuleItem dropRuleItem) throws SQLException { + String databaseName = dropRuleItem.getDatabaseName(); Preconditions.checkState(metaDataContexts.get().getMetaData().containsDatabase(databaseName), "No database '%s' exists.", databaseName); - RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, event.getType()); + RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, dropRuleItem.getType()); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { - processor.dropRuleItemConfiguration(event, currentRuleConfig); + processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); ruleConfigManager.dropRuleConfiguration(databaseName, currentRuleConfig); } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java index de4bcd1c403fc..9db8351b9dd3a 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java @@ -19,11 +19,21 @@ import com.google.common.eventbus.Subscribe; import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem; import java.sql.SQLException; @@ -47,7 +57,8 @@ public RuleItemChangedSubscriber(final ContextManager contextManager) { */ @Subscribe public void renew(final AlterRuleItemEvent event) throws SQLException { - ruleItemManager.alterRuleItem(event); + // TODO remove the event and this subscriber + ruleItemManager.alterRuleItem(convertToAlterRuleItem(event)); } /** @@ -58,6 +69,25 @@ public void renew(final AlterRuleItemEvent event) throws SQLException { */ @Subscribe public void renew(final DropRuleItemEvent event) throws SQLException { - ruleItemManager.dropRuleItem(event); + // TODO remove the event and this subscriber + ruleItemManager.dropRuleItem(convertToDropRuleItem(event)); + } + + private AlterRuleItem convertToAlterRuleItem(final AlterRuleItemEvent event) { + if (event instanceof AlterNamedRuleItemEvent) { + AlterNamedRuleItemEvent alterNamedRuleItemEvent = (AlterNamedRuleItemEvent) event; + return new AlterNamedRuleItem(alterNamedRuleItemEvent.getDatabaseName(), alterNamedRuleItemEvent.getItemName(), event.getActiveVersionKey(), event.getActiveVersion(), event.getType()); + } + AlterUniqueRuleItemEvent alterUniqueRuleItemEvent = (AlterUniqueRuleItemEvent) event; + return new AlterUniqueRuleItem(alterUniqueRuleItemEvent.getDatabaseName(), alterUniqueRuleItemEvent.getActiveVersionKey(), event.getActiveVersion(), event.getType()); + } + + private DropRuleItem convertToDropRuleItem(final DropRuleItemEvent event) { + if (event instanceof DropNamedRuleItemEvent) { + DropNamedRuleItemEvent dropNamedRuleItemEvent = (DropNamedRuleItemEvent) event; + return new DropNamedRuleItem(dropNamedRuleItemEvent.getDatabaseName(), dropNamedRuleItemEvent.getItemName(), event.getType()); + } + DropUniqueRuleItemEvent dropUniqueRuleItemEvent = (DropUniqueRuleItemEvent) event; + return new DropUniqueRuleItem(dropUniqueRuleItemEvent.getDatabaseName(), event.getType()); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java index a4b209a94270a..5f04a35b00a69 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java @@ -17,9 +17,13 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,6 +33,7 @@ import java.sql.SQLException; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -47,15 +52,15 @@ void setUp() { @Test void assertRenewWithAlterRuleItemEvent() throws SQLException { - AlterRuleItemEvent event = mock(AlterRuleItemEvent.class); + AlterRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); subscriber.renew(event); - verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(event); + verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); } @Test void assertRenewWithDropRuleItemEvent() throws SQLException { - DropRuleItemEvent event = mock(DropRuleItemEvent.class); + DropRuleItemEvent event = mock(DropNamedRuleItemEvent.class); subscriber.renew(event); - verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(event); + verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); } } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java index ce64a55aaf50a..7d067d5e4ce60 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java @@ -34,19 +34,18 @@ import org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.metadata.persist.service.config.database.DataSourceUnitPersistService; -import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.builder.RuleConfigurationChangedEventBuilder; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.spi.item.RuleItemChanged; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import java.sql.SQLException; @@ -68,12 +67,12 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa private final MetaDataContextManager metaDataContextManager; - private final RuleConfigurationChangedEventBuilder ruleConfigChangedEventBuilder; + private final RuleItemChangedBuilder ruleItemChangedBuilder; public StandaloneMetaDataManagerPersistService(final PersistRepository repository, final MetaDataContextManager metaDataContextManager) { metaDataPersistService = new MetaDataPersistService(repository); this.metaDataContextManager = metaDataContextManager; - ruleConfigChangedEventBuilder = new RuleConfigurationChangedEventBuilder(); + ruleItemChangedBuilder = new RuleItemChangedBuilder(); } @Override @@ -294,16 +293,16 @@ public void alterRuleConfiguration(final String databaseName, final RuleConfigur metaDataPersistService.getMetaDataVersionPersistService().switchActiveVersion(metaDataVersions); for (MetaDataVersion each : metaDataVersions) { // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran - Optional ruleItemEvent = buildAlterRuleItemEvent(databaseName, each, Type.UPDATED); - if (ruleItemEvent.isPresent() && ruleItemEvent.get() instanceof AlterRuleItemEvent) { - metaDataContextManager.getRuleItemManager().alterRuleItem((AlterRuleItemEvent) ruleItemEvent.get()); + Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, each, Type.UPDATED); + if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof AlterRuleItem) { + metaDataContextManager.getRuleItemManager().alterRuleItem((AlterRuleItem) ruleItemChanged.get()); } } clearServiceCache(); } - private Optional buildAlterRuleItemEvent(final String databaseName, final MetaDataVersion metaDataVersion, final Type type) { - return ruleConfigChangedEventBuilder.build(databaseName, new DataChangedEvent(metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), type)); + private Optional buildAlterRuleItemChanged(final String databaseName, final MetaDataVersion metaDataVersion, final Type type) { + return ruleItemChangedBuilder.build(databaseName, metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), type); } @Override @@ -313,10 +312,10 @@ public void removeRuleConfigurationItem(final String databaseName, final RuleCon } Collection metaDataVersions = metaDataPersistService.getDatabaseRulePersistService().delete(databaseName, Collections.singleton(toBeRemovedRuleConfig)); for (MetaDataVersion metaDataVersion : metaDataVersions) { - Optional ruleItemEvent = buildAlterRuleItemEvent(databaseName, metaDataVersion, Type.DELETED); + Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, metaDataVersion, Type.DELETED); // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran - if (ruleItemEvent.isPresent() && ruleItemEvent.get() instanceof DropRuleItemEvent) { - metaDataContextManager.getRuleItemManager().dropRuleItem((DropRuleItemEvent) ruleItemEvent.get()); + if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof DropRuleItem) { + metaDataContextManager.getRuleItemManager().dropRuleItem((DropRuleItem) ruleItemChanged.get()); } } clearServiceCache(); diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java index cfb6314040c97..d86ffedcd0dc6 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java @@ -30,11 +30,11 @@ import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.metadata.persist.service.metadata.DatabaseMetaDataPersistFacade; -import org.apache.shardingsphere.mode.event.dispatch.builder.RuleConfigurationChangedEventBuilder; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -172,13 +172,13 @@ void assertAlterRuleConfiguration() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().persist("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); - AlterRuleItemEvent event = mock(AlterRuleItemEvent.class); - RuleConfigurationChangedEventBuilder ruleConfigChangedEventBuilder = mock(RuleConfigurationChangedEventBuilder.class); - when(ruleConfigChangedEventBuilder.build(eq("foo_db"), any())).thenReturn(Optional.of(event)); - setRuleConfigurationEventBuilder(ruleConfigChangedEventBuilder); + AlterRuleItem alterRuleItem = mock(AlterRuleItem.class); + RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); + when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(alterRuleItem)); + setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.alterRuleConfiguration("foo_db", ruleConfig); verify(metaDataPersistService.getMetaDataVersionPersistService()).switchActiveVersion(metaDataVersion); - verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(event); + verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); } @Test @@ -192,12 +192,12 @@ void assertRemoveRuleConfigurationItem() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().delete("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); - RuleConfigurationChangedEventBuilder ruleConfigChangedEventBuilder = mock(RuleConfigurationChangedEventBuilder.class); - DropRuleItemEvent event = mock(DropRuleItemEvent.class); - when(ruleConfigChangedEventBuilder.build(eq("foo_db"), any())).thenReturn(Optional.of(event)); - setRuleConfigurationEventBuilder(ruleConfigChangedEventBuilder); + RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); + when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(dropRuleItem)); + setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.removeRuleConfigurationItem("foo_db", ruleConfig); - verify(metaDataContextManager.getRuleItemManager()).dropRuleItem(event); + verify(metaDataContextManager.getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); } @Test @@ -236,7 +236,7 @@ void assertDropTables() { } @SneakyThrows(ReflectiveOperationException.class) - private void setRuleConfigurationEventBuilder(final RuleConfigurationChangedEventBuilder ruleConfigurationEventBuilder) { - Plugins.getMemberAccessor().set(StandaloneMetaDataManagerPersistService.class.getDeclaredField("ruleConfigChangedEventBuilder"), metaDataManagerPersistService, ruleConfigurationEventBuilder); + private void setRuleConfigurationEventBuilder(final RuleItemChangedBuilder ruleItemChangedBuilder) { + Plugins.getMemberAccessor().set(StandaloneMetaDataManagerPersistService.class.getDeclaredField("ruleItemChangedBuilder"), metaDataManagerPersistService, ruleItemChangedBuilder); } } From 04a5302eb3703f7faebbb125333eca9efb51abd1 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 19 Dec 2024 10:45:51 +0800 Subject: [PATCH 100/192] Minor refactor for EncryptProjectionTokenGenerator (#34100) --- .../encrypt/rewrite/token/EncryptTokenGenerateBuilder.java | 2 +- .../generator/projection/EncryptProjectionTokenGenerator.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java index 35b742671646f..eaaaee9c05e51 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/EncryptTokenGenerateBuilder.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.encrypt.rewrite.token; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptConditionsAware; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; import org.apache.shardingsphere.encrypt.rewrite.token.generator.assignment.EncryptInsertAssignmentTokenGenerator; @@ -42,6 +41,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.SQLTokenGenerator; +import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.builder.SQLTokenGeneratorBuilder; import java.util.Collection; diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java index b21c0a186bee0..03bde3d645dd0 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java @@ -68,8 +68,9 @@ public final class EncryptProjectionTokenGenerator { * @return generated SQL tokens */ public Collection generateSQLTokens(final SelectStatementContext selectStatementContext) { - Collection result = new LinkedList<>(generateSelectSQLTokens(selectStatementContext)); + Collection result = new LinkedList<>(); selectStatementContext.getSubqueryContexts().values().stream().map(this::generateSQLTokens).forEach(result::addAll); + result.addAll(generateSelectSQLTokens(selectStatementContext)); return result; } From 0b8df9800de7d8866f4e571ddebc9aa3f9ff9ee3 Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Thu, 19 Dec 2024 11:33:05 +0800 Subject: [PATCH 101/192] Remove RuleItemChangedSubscriber and RuleItemEvent (#34099) --- .../dispatch/rule/RuleItemChangedEvent.java | 33 ----- .../rule/alter/AlterNamedRuleItemEvent.java | 39 ------ .../rule/alter/AlterRuleItemEvent.java | 47 ------- .../rule/alter/AlterUniqueRuleItemEvent.java | 37 ------ .../rule/drop/DropNamedRuleItemEvent.java | 35 ----- .../dispatch/rule/drop/DropRuleItemEvent.java | 33 ----- .../rule/drop/DropUniqueRuleItemEvent.java | 33 ----- .../RuleConfigurationChangedEventBuilder.java | 94 ------------- .../metadata/manager/RuleItemManager.java | 65 +++++---- ...eConfigurationChangedEventBuilderTest.java | 125 ------------------ .../DataChangedEventListenerRegistry.java | 6 +- .../type/DatabaseMetaDataChangedListener.java | 18 ++- ...lusterDispatchEventSubscriberRegistry.java | 3 +- .../type/ListenerAssistedSubscriber.java | 3 +- .../type/RuleItemChangedSubscriber.java | 93 ------------- .../DatabaseMetaDataChangedListenerTest.java | 6 +- .../type/RuleItemChangedSubscriberTest.java | 66 --------- ...andaloneMetaDataManagerPersistService.java | 23 +--- ...loneMetaDataManagerPersistServiceTest.java | 21 +-- 19 files changed, 71 insertions(+), 709 deletions(-) delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java delete mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java delete mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java delete mode 100644 mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java delete mode 100644 mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java delete mode 100644 mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java deleted file mode 100644 index 42aefc77aee10..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule; - -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; - -/** - * Rule item changed event. - */ -public interface RuleItemChangedEvent extends DispatchEvent { - - /** - * Get rule item type. - * - * @return rule item type - */ - String getType(); -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java deleted file mode 100644 index 237c00e0b3748..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Alter named rule item event. - */ -@RequiredArgsConstructor -@Getter -public final class AlterNamedRuleItemEvent implements AlterRuleItemEvent { - - private final String databaseName; - - private final String itemName; - - private final String activeVersionKey; - - private final String activeVersion; - - private final String type; -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java deleted file mode 100644 index 55e4780a6c4a0..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; - -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; - -/** - * Alter rule item event. - */ -public interface AlterRuleItemEvent extends RuleItemChangedEvent { - - /** - * Get database name. - * - * @return database name - */ - String getDatabaseName(); - - /** - * Get active version key. - * - * @return active version key - */ - String getActiveVersionKey(); - - /** - * Get active version. - * - * @return active version - */ - String getActiveVersion(); -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java deleted file mode 100644 index 5bda761cae676..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Alter unique rule item event. - */ -@RequiredArgsConstructor -@Getter -public final class AlterUniqueRuleItemEvent implements AlterRuleItemEvent { - - private final String databaseName; - - private final String activeVersionKey; - - private final String activeVersion; - - private final String type; -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java deleted file mode 100644 index 6783a26c75e67..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Drop named rule item event. - */ -@RequiredArgsConstructor -@Getter -public final class DropNamedRuleItemEvent implements DropRuleItemEvent { - - private final String databaseName; - - private final String itemName; - - private final String type; -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java deleted file mode 100644 index 7a0413f92bd7b..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; - -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; - -/** - * Drop rule item event. - */ -public interface DropRuleItemEvent extends RuleItemChangedEvent { - - /** - * Get database name. - * - * @return database name - */ - String getDatabaseName(); -} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java deleted file mode 100644 index 561be2372c69b..0000000000000 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Drop unique rule item event. - */ -@RequiredArgsConstructor -@Getter -public final class DropUniqueRuleItemEvent implements DropRuleItemEvent { - - private final String databaseName; - - private final String type; -} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java deleted file mode 100644 index 11c39e6f454ee..0000000000000 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.builder; - -import com.google.common.base.Strings; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; -import org.apache.shardingsphere.mode.event.DataChangedEvent; -import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.path.rule.RuleNodePath; -import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath; -import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath; -import org.apache.shardingsphere.mode.spi.RuleNodePathProvider; - -import java.util.Map.Entry; -import java.util.Optional; - -/** - * Rule configuration changed event builder. - */ -public final class RuleConfigurationChangedEventBuilder { - - /** - * Build rule changed event. - * - * @param databaseName database name - * @param event data changed event - * @return built event - */ - public Optional build(final String databaseName, final DataChangedEvent event) { - for (RuleNodePathProvider each : ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) { - Optional result = build(each.getRuleNodePath(), databaseName, event); - if (result.isPresent()) { - return result; - } - } - return Optional.empty(); - } - - private Optional build(final RuleNodePath ruleNodePath, final String databaseName, final DataChangedEvent event) { - if (!ruleNodePath.getRoot().isValidatedPath(event.getKey()) || Type.DELETED != event.getType() && Strings.isNullOrEmpty(event.getValue())) { - return Optional.empty(); - } - for (Entry entry : ruleNodePath.getNamedItems().entrySet()) { - Optional itemName; - if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) { - itemName = entry.getValue().getNameByActiveVersion(event.getKey()); - } else { - itemName = entry.getValue().getNameByItemPath(event.getKey()); - } - if (itemName.isPresent()) { - return Optional.of(create(databaseName, itemName.get(), event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); - } - } - for (Entry entry : ruleNodePath.getUniqueItems().entrySet()) { - if (entry.getValue().isActiveVersionPath(event.getKey())) { - return Optional.of(create(databaseName, event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); - } - } - return Optional.empty(); - } - - private RuleItemChangedEvent create(final String databaseName, final String itemName, final DataChangedEvent event, final String type) { - return Type.ADDED == event.getType() || Type.UPDATED == event.getType() - ? new AlterNamedRuleItemEvent(databaseName, itemName, event.getKey(), event.getValue(), type) - : new DropNamedRuleItemEvent(databaseName, itemName, type); - } - - private RuleItemChangedEvent create(final String databaseName, final DataChangedEvent event, final String type) { - return Type.ADDED == event.getType() || Type.UPDATED == event.getType() - ? new AlterUniqueRuleItemEvent(databaseName, event.getKey(), event.getValue(), type) - : new DropUniqueRuleItemEvent(databaseName, type); - } -} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java index 6d3adafe72378..08877b0526282 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java @@ -18,21 +18,26 @@ package org.apache.shardingsphere.mode.metadata.manager; import com.google.common.base.Preconditions; +import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; +import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; -import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; +import org.apache.shardingsphere.mode.spi.item.RuleItemChanged; import java.sql.SQLException; +import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; /** * Rule item manager. */ +@Slf4j public class RuleItemManager { private final AtomicReference metaDataContexts; @@ -41,47 +46,61 @@ public class RuleItemManager { private final MetaDataPersistService metaDataPersistService; + private final RuleItemChangedBuilder ruleItemChangedBuilder; + public RuleItemManager(final AtomicReference metaDataContexts, final PersistRepository repository, final DatabaseRuleConfigurationManager ruleConfigManager) { this.metaDataContexts = metaDataContexts; this.ruleConfigManager = ruleConfigManager; metaDataPersistService = new MetaDataPersistService(repository); + ruleItemChangedBuilder = new RuleItemChangedBuilder(); } /** * Alter with rule item. * - * @param alterRuleItem alter rule item - * @throws SQLException SQL Exception + * @param databaseName database name + * @param activeVersionKey active version key + * @param activeVersion active version + * @param changeType change type */ - public void alterRuleItem(final AlterRuleItem alterRuleItem) throws SQLException { - Preconditions.checkArgument(alterRuleItem.getActiveVersion().equals(metaDataPersistService.getMetaDataVersionPersistService() - .getActiveVersionByFullPath(alterRuleItem.getActiveVersionKey())), "Invalid active version: {} of key: {}", - alterRuleItem.getActiveVersion(), alterRuleItem.getActiveVersionKey()); - RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, alterRuleItem.getType()); - String yamlContent = metaDataPersistService.getMetaDataVersionPersistService() - .getVersionPathByActiveVersion(alterRuleItem.getActiveVersionKey(), alterRuleItem.getActiveVersion()); - String databaseName = alterRuleItem.getDatabaseName(); + public void alterRuleItem(final String databaseName, final String activeVersionKey, final String activeVersion, final Type changeType) { + Optional ruleItemChanged = ruleItemChangedBuilder.build(databaseName, activeVersionKey, activeVersion, changeType); + if (!ruleItemChanged.isPresent()) { + return; + } + RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, ruleItemChanged.get().getType()); + if (ruleItemChanged.get() instanceof AlterRuleItem) { + alter(databaseName, activeVersionKey, activeVersion, (AlterRuleItem) ruleItemChanged.get(), processor); + } else if (ruleItemChanged.get() instanceof DropRuleItem) { + drop(databaseName, (DropRuleItem) ruleItemChanged.get(), processor); + } + } + + private void alter(final String databaseName, final String activeVersionKey, final String activeVersion, final AlterRuleItem alterRuleItem, final RuleItemConfigurationChangedProcessor processor) { + Preconditions.checkArgument(activeVersion.equals(metaDataPersistService.getMetaDataVersionPersistService() + .getActiveVersionByFullPath(activeVersionKey)), "Invalid active version: {} of key: {}", activeVersion, activeVersionKey); + String yamlContent = metaDataPersistService.getMetaDataVersionPersistService().getVersionPathByActiveVersion(activeVersionKey, activeVersion); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { processor.changeRuleItemConfiguration(alterRuleItem, currentRuleConfig, processor.swapRuleItemConfiguration(alterRuleItem, yamlContent)); - ruleConfigManager.alterRuleConfiguration(databaseName, currentRuleConfig); + try { + ruleConfigManager.alterRuleConfiguration(databaseName, currentRuleConfig); + } catch (final SQLException ex) { + log.error("Alter rule configuration failed, databaseName:{}, key:{}, version:{}", databaseName, activeVersionKey, activeVersion, ex); + } } } - /** - * Drop with rule item. - * - * @param dropRuleItem drop rule item - * @throws SQLException SQL Exception - */ - public void dropRuleItem(final DropRuleItem dropRuleItem) throws SQLException { - String databaseName = dropRuleItem.getDatabaseName(); + private void drop(final String databaseName, final DropRuleItem dropRuleItem, final RuleItemConfigurationChangedProcessor processor) { Preconditions.checkState(metaDataContexts.get().getMetaData().containsDatabase(databaseName), "No database '%s' exists.", databaseName); - RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, dropRuleItem.getType()); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); - ruleConfigManager.dropRuleConfiguration(databaseName, currentRuleConfig); + try { + ruleConfigManager.dropRuleConfiguration(databaseName, currentRuleConfig); + } catch (final SQLException ex) { + log.error("Drop rule configuration failed, databaseName:{}, type:{}", databaseName, dropRuleItem.getType(), ex); + } } } } diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java deleted file mode 100644 index bd4de594750d2..0000000000000 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.event.dispatch.builder; - -import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; -import org.apache.shardingsphere.mode.event.DataChangedEvent; -import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.path.rule.RuleNodePath; -import org.apache.shardingsphere.mode.spi.RuleNodePathProvider; -import org.apache.shardingsphere.test.mock.AutoMockExtension; -import org.apache.shardingsphere.test.mock.StaticMockSettings; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; - -import java.util.Collections; -import java.util.Optional; -import java.util.stream.Stream; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ShardingSphereServiceLoader.class) -class RuleConfigurationChangedEventBuilderTest { - - @Test - void assertBuildWithoutRuleNodePathProvider() { - when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.emptyList()); - assertFalse(new RuleConfigurationChangedEventBuilder().build("foo_db", new DataChangedEvent("k", "v", Type.IGNORED)).isPresent()); - } - - @ParameterizedTest(name = "{0}") - @ArgumentsSource(TestCaseArgumentsProvider.class) - void assertBuild(final String name, final String eventKey, final String eventValue, final Type type, final boolean isEventPresent, final Class dispatchEventClass) { - RuleNodePathProvider ruleNodePathProvider = mock(RuleNodePathProvider.class, RETURNS_DEEP_STUBS); - when(ruleNodePathProvider.getRuleNodePath()).thenReturn(new RuleNodePath("fixture", Collections.singleton("named"), Collections.singleton("unique"))); - when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.singleton(ruleNodePathProvider)); - Optional actual = new RuleConfigurationChangedEventBuilder().build("foo_db", new DataChangedEvent(eventKey, eventValue, type)); - assertThat(actual.isPresent(), is(isEventPresent)); - if (actual.isPresent()) { - if (dispatchEventClass == AlterNamedRuleItemEvent.class) { - assertDispatchEvent((AlterNamedRuleItemEvent) actual.get()); - } else if (dispatchEventClass == DropNamedRuleItemEvent.class) { - assertDispatchEvent((DropNamedRuleItemEvent) actual.get()); - } else if (dispatchEventClass == AlterUniqueRuleItemEvent.class) { - assertDispatchEvent((AlterUniqueRuleItemEvent) actual.get()); - } else if (dispatchEventClass == DropUniqueRuleItemEvent.class) { - assertDispatchEvent((DropUniqueRuleItemEvent) actual.get()); - } else { - fail("No such event type."); - } - } - } - - private void assertDispatchEvent(final AlterNamedRuleItemEvent actual) { - assertThat(actual.getDatabaseName(), is("foo_db")); - assertThat(actual.getItemName(), is("xxx")); - assertThat(actual.getType(), is("fixture.named")); - } - - private void assertDispatchEvent(final DropNamedRuleItemEvent actual) { - assertThat(actual.getDatabaseName(), is("foo_db")); - assertThat(actual.getItemName(), is("xxx")); - assertThat(actual.getType(), is("fixture.named")); - } - - private void assertDispatchEvent(final AlterUniqueRuleItemEvent actual) { - assertThat(actual.getDatabaseName(), is("foo_db")); - assertThat(actual.getActiveVersionKey(), is("/metadata/fixture/rules/fixture/unique/active_version")); - assertThat(actual.getActiveVersion(), is("foo")); - assertThat(actual.getType(), is("fixture.unique")); - } - - private void assertDispatchEvent(final DropUniqueRuleItemEvent actual) { - assertThat(actual.getDatabaseName(), is("foo_db")); - assertThat(actual.getType(), is("fixture.unique")); - } - - private static class TestCaseArgumentsProvider implements ArgumentsProvider { - - @Override - public Stream provideArguments(final ExtensionContext extensionContext) { - return Stream.of( - Arguments.of("InvalidPath", "/metadata/invalid/rules/fixture", "foo", Type.ADDED, false, null), - Arguments.of("AddEventWithEmptyValue", "/metadata/fixture/rules/fixture/versions/0", "", Type.ADDED, false, null), - Arguments.of("PathNotFound", "/metadata/fixture/rules/fixture/versions/0", "foo", Type.ADDED, false, null), - Arguments.of("AddEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", Type.ADDED, true, AlterNamedRuleItemEvent.class), - Arguments.of("UpdateEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", Type.UPDATED, true, AlterNamedRuleItemEvent.class), - Arguments.of("DeleteEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx", "foo", Type.DELETED, true, DropNamedRuleItemEvent.class), - Arguments.of("AddEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.ADDED, true, AlterUniqueRuleItemEvent.class), - Arguments.of("UpdateEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.UPDATED, true, AlterUniqueRuleItemEvent.class), - Arguments.of("DeleteEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.DELETED, true, DropUniqueRuleItemEvent.class)); - } - } -} diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java index 7daeb327d3471..3bfed6eff42d7 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.GlobalMetaDataChangedListener; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import java.util.Collection; @@ -39,10 +40,13 @@ public final class DataChangedEventListenerRegistry { private final Collection databaseNames; + private final RuleItemManager ruleItemManager; + public DataChangedEventListenerRegistry(final ContextManager contextManager, final Collection databaseNames) { repository = (ClusterPersistRepository) contextManager.getPersistServiceFacade().getRepository(); eventBusContext = contextManager.getComputeNodeInstanceContext().getEventBusContext(); this.databaseNames = databaseNames; + ruleItemManager = contextManager.getMetaDataContextManager().getRuleItemManager(); } /** @@ -54,7 +58,7 @@ public void register() { } private void registerDatabaseListeners(final String databaseName) { - repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(databaseName), new DatabaseMetaDataChangedListener(eventBusContext)); + repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(databaseName), new DatabaseMetaDataChangedListener(eventBusContext, ruleItemManager)); } private void registerGlobalListeners(final DispatchEventBuilder builder) { diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java index 9fa7a4f77b374..8cdbfa1809a2d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.builder.MetaDataChangedEventBuilder; -import org.apache.shardingsphere.mode.event.dispatch.builder.RuleConfigurationChangedEventBuilder; import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.event.dispatch.builder.MetaDataChangedEventBuilder; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; import org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener; import java.util.Optional; @@ -36,18 +36,24 @@ public final class DatabaseMetaDataChangedListener implements DataChangedEventLi private final EventBusContext eventBusContext; + private final RuleItemManager ruleItemManager; + @Override public void onChange(final DataChangedEvent event) { - createDispatchEvent(event).ifPresent(eventBusContext::post); + handleDataChangedEvent(event); } - private Optional createDispatchEvent(final DataChangedEvent event) { + private void handleDataChangedEvent(final DataChangedEvent event) { String key = event.getKey(); Optional databaseName = DatabaseMetaDataNode.getDatabaseNameBySchemaNode(key); if (!databaseName.isPresent()) { - return Optional.empty(); + return; } Optional metaDataChangedEvent = new MetaDataChangedEventBuilder().build(databaseName.get(), event); - return metaDataChangedEvent.isPresent() ? metaDataChangedEvent : new RuleConfigurationChangedEventBuilder().build(databaseName.get(), event); + if (metaDataChangedEvent.isPresent()) { + eventBusContext.post(metaDataChangedEvent.get()); + } else { + ruleItemManager.alterRuleItem(databaseName.get(), event.getKey(), event.getValue(), event.getType()); + } } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java index efe9292425a27..78f9260fb24b0 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java @@ -29,7 +29,6 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.ProcessListChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.PropertiesEventSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.QualifiedDataSourceSubscriber; -import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.RuleItemChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StateChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StorageUnitEventSubscriber; @@ -45,7 +44,7 @@ public final class ClusterDispatchEventSubscriberRegistry { private final Collection subscribers; public ClusterDispatchEventSubscriberRegistry(final ContextManager contextManager) { - subscribers = Arrays.asList(new RuleItemChangedSubscriber(contextManager), + subscribers = Arrays.asList( new MetaDataChangedSubscriber(contextManager), new ListenerAssistedSubscriber(contextManager), new StateChangedSubscriber(contextManager), diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index c2d5b80768fd5..26e2ea21c381c 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -53,7 +53,8 @@ public ListenerAssistedSubscriber(final ContextManager contextManager) { */ @Subscribe public synchronized void renew(final CreateDatabaseListenerAssistedEvent event) { - repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(event.getDatabaseName()), new DatabaseMetaDataChangedListener(contextManager.getComputeNodeInstanceContext().getEventBusContext())); + repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(event.getDatabaseName()), new DatabaseMetaDataChangedListener(contextManager.getComputeNodeInstanceContext().getEventBusContext(), + contextManager.getMetaDataContextManager().getRuleItemManager())); contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addDatabase(event.getDatabaseName()); contextManager.getPersistServiceFacade().getListenerAssistedPersistService().deleteDatabaseNameListenerAssisted(event.getDatabaseName()); refreshStatisticsData(); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java deleted file mode 100644 index 9db8351b9dd3a..0000000000000 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; - -import com.google.common.eventbus.Subscribe; -import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; -import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; -import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; -import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem; - -import java.sql.SQLException; - -/** - * Rule item changed subscriber. - */ -@RequiredArgsConstructor -public final class RuleItemChangedSubscriber implements DispatchEventSubscriber { - - private final RuleItemManager ruleItemManager; - - public RuleItemChangedSubscriber(final ContextManager contextManager) { - ruleItemManager = contextManager.getMetaDataContextManager().getRuleItemManager(); - } - - /** - * Renew with alter rule item. - * - * @param event alter rule item event - * @throws SQLException SQL Exception - */ - @Subscribe - public void renew(final AlterRuleItemEvent event) throws SQLException { - // TODO remove the event and this subscriber - ruleItemManager.alterRuleItem(convertToAlterRuleItem(event)); - } - - /** - * Renew with drop rule item. - * - * @param event drop rule item event - * @throws SQLException SQL Exception - */ - @Subscribe - public void renew(final DropRuleItemEvent event) throws SQLException { - // TODO remove the event and this subscriber - ruleItemManager.dropRuleItem(convertToDropRuleItem(event)); - } - - private AlterRuleItem convertToAlterRuleItem(final AlterRuleItemEvent event) { - if (event instanceof AlterNamedRuleItemEvent) { - AlterNamedRuleItemEvent alterNamedRuleItemEvent = (AlterNamedRuleItemEvent) event; - return new AlterNamedRuleItem(alterNamedRuleItemEvent.getDatabaseName(), alterNamedRuleItemEvent.getItemName(), event.getActiveVersionKey(), event.getActiveVersion(), event.getType()); - } - AlterUniqueRuleItemEvent alterUniqueRuleItemEvent = (AlterUniqueRuleItemEvent) event; - return new AlterUniqueRuleItem(alterUniqueRuleItemEvent.getDatabaseName(), alterUniqueRuleItemEvent.getActiveVersionKey(), event.getActiveVersion(), event.getType()); - } - - private DropRuleItem convertToDropRuleItem(final DropRuleItemEvent event) { - if (event instanceof DropNamedRuleItemEvent) { - DropNamedRuleItemEvent dropNamedRuleItemEvent = (DropNamedRuleItemEvent) event; - return new DropNamedRuleItem(dropNamedRuleItemEvent.getDatabaseName(), dropNamedRuleItemEvent.getItemName(), event.getType()); - } - DropUniqueRuleItemEvent dropUniqueRuleItemEvent = (DropUniqueRuleItemEvent) event; - return new DropUniqueRuleItem(dropUniqueRuleItemEvent.getDatabaseName(), event.getType()); - } -} diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java index d1cdabd4faa51..d396a02320a1e 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java @@ -20,6 +20,7 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -38,9 +39,12 @@ class DatabaseMetaDataChangedListenerTest { @Mock private EventBusContext eventBusContext; + @Mock + private RuleItemManager ruleItemManager; + @BeforeEach void setUp() { - listener = new DatabaseMetaDataChangedListener(eventBusContext); + listener = new DatabaseMetaDataChangedListener(eventBusContext, ruleItemManager); } @Test diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java deleted file mode 100644 index 5f04a35b00a69..0000000000000 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; - -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropRuleItem; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.sql.SQLException; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -@ExtendWith(MockitoExtension.class) -class RuleItemChangedSubscriberTest { - - private RuleItemChangedSubscriber subscriber; - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private ContextManager contextManager; - - @BeforeEach - void setUp() { - subscriber = new RuleItemChangedSubscriber(contextManager); - } - - @Test - void assertRenewWithAlterRuleItemEvent() throws SQLException { - AlterRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); - subscriber.renew(event); - verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); - } - - @Test - void assertRenewWithDropRuleItemEvent() throws SQLException { - DropRuleItemEvent event = mock(DropNamedRuleItemEvent.class); - subscriber.renew(event); - verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); - } -} diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java index 7d067d5e4ce60..59e61d04f2ef1 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java @@ -38,14 +38,10 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; -import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; -import org.apache.shardingsphere.mode.spi.item.RuleItemChanged; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import java.sql.SQLException; @@ -67,12 +63,9 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa private final MetaDataContextManager metaDataContextManager; - private final RuleItemChangedBuilder ruleItemChangedBuilder; - public StandaloneMetaDataManagerPersistService(final PersistRepository repository, final MetaDataContextManager metaDataContextManager) { metaDataPersistService = new MetaDataPersistService(repository); this.metaDataContextManager = metaDataContextManager; - ruleItemChangedBuilder = new RuleItemChangedBuilder(); } @Override @@ -292,19 +285,11 @@ public void alterRuleConfiguration(final String databaseName, final RuleConfigur .persist(metaDataContextManager.getMetaDataContexts().get().getMetaData().getDatabase(databaseName).getName(), Collections.singleton(toBeAlteredRuleConfig)); metaDataPersistService.getMetaDataVersionPersistService().switchActiveVersion(metaDataVersions); for (MetaDataVersion each : metaDataVersions) { - // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran - Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, each, Type.UPDATED); - if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof AlterRuleItem) { - metaDataContextManager.getRuleItemManager().alterRuleItem((AlterRuleItem) ruleItemChanged.get()); - } + metaDataContextManager.getRuleItemManager().alterRuleItem(databaseName, each.getActiveVersionNodePath(), each.getNextActiveVersion(), Type.UPDATED); } clearServiceCache(); } - private Optional buildAlterRuleItemChanged(final String databaseName, final MetaDataVersion metaDataVersion, final Type type) { - return ruleItemChangedBuilder.build(databaseName, metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), type); - } - @Override public void removeRuleConfigurationItem(final String databaseName, final RuleConfiguration toBeRemovedRuleConfig) throws SQLException { if (null == toBeRemovedRuleConfig) { @@ -312,11 +297,7 @@ public void removeRuleConfigurationItem(final String databaseName, final RuleCon } Collection metaDataVersions = metaDataPersistService.getDatabaseRulePersistService().delete(databaseName, Collections.singleton(toBeRemovedRuleConfig)); for (MetaDataVersion metaDataVersion : metaDataVersions) { - Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, metaDataVersion, Type.DELETED); - // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran - if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof DropRuleItem) { - metaDataContextManager.getRuleItemManager().dropRuleItem((DropRuleItem) ruleItemChanged.get()); - } + metaDataContextManager.getRuleItemManager().alterRuleItem(databaseName, metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), Type.DELETED); } clearServiceCache(); } diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java index d86ffedcd0dc6..2469b29646b9e 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java @@ -31,10 +31,7 @@ import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.metadata.persist.service.metadata.DatabaseMetaDataPersistFacade; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.spi.PersistRepository; -import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; -import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -49,7 +46,6 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; -import java.util.Optional; import java.util.Properties; import static org.mockito.ArgumentMatchers.any; @@ -172,13 +168,9 @@ void assertAlterRuleConfiguration() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().persist("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); - AlterRuleItem alterRuleItem = mock(AlterRuleItem.class); - RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); - when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(alterRuleItem)); - setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.alterRuleConfiguration("foo_db", ruleConfig); verify(metaDataPersistService.getMetaDataVersionPersistService()).switchActiveVersion(metaDataVersion); - verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); + verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(eq("foo_db"), any(), any(), any()); } @Test @@ -192,12 +184,8 @@ void assertRemoveRuleConfigurationItem() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().delete("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); - RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); - DropRuleItem dropRuleItem = mock(DropRuleItem.class); - when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(dropRuleItem)); - setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.removeRuleConfigurationItem("foo_db", ruleConfig); - verify(metaDataContextManager.getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); + verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(eq("foo_db"), any(), any(), any()); } @Test @@ -234,9 +222,4 @@ void assertDropTables() { metaDataManagerPersistService.dropTables("foo_db", "foo_schema", Collections.singleton("foo_tbl")); verify(metaDataPersistService.getDatabaseMetaDataFacade().getTable()).drop("foo_db", "foo_schema", "foo_tbl"); } - - @SneakyThrows(ReflectiveOperationException.class) - private void setRuleConfigurationEventBuilder(final RuleItemChangedBuilder ruleItemChangedBuilder) { - Plugins.getMemberAccessor().set(StandaloneMetaDataManagerPersistService.class.getDeclaredField("ruleItemChangedBuilder"), metaDataManagerPersistService, ruleItemChangedBuilder); - } } From b16d38ba9784e471e0a9dd99180febd1164cf310 Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Thu, 19 Dec 2024 13:17:17 +0800 Subject: [PATCH 102/192] Revert "Remove RuleItemChangedSubscriber and RuleItemEvent (#34099)" (#34102) This reverts commit 0b8df9800de7d8866f4e571ddebc9aa3f9ff9ee3. --- .../dispatch/rule/RuleItemChangedEvent.java | 33 +++++ .../rule/alter/AlterNamedRuleItemEvent.java | 39 ++++++ .../rule/alter/AlterRuleItemEvent.java | 47 +++++++ .../rule/alter/AlterUniqueRuleItemEvent.java | 37 ++++++ .../rule/drop/DropNamedRuleItemEvent.java | 35 +++++ .../dispatch/rule/drop/DropRuleItemEvent.java | 33 +++++ .../rule/drop/DropUniqueRuleItemEvent.java | 33 +++++ .../RuleConfigurationChangedEventBuilder.java | 94 +++++++++++++ .../metadata/manager/RuleItemManager.java | 65 ++++----- ...eConfigurationChangedEventBuilderTest.java | 125 ++++++++++++++++++ .../DataChangedEventListenerRegistry.java | 6 +- .../type/DatabaseMetaDataChangedListener.java | 18 +-- ...lusterDispatchEventSubscriberRegistry.java | 3 +- .../type/ListenerAssistedSubscriber.java | 3 +- .../type/RuleItemChangedSubscriber.java | 93 +++++++++++++ .../DatabaseMetaDataChangedListenerTest.java | 6 +- .../type/RuleItemChangedSubscriberTest.java | 66 +++++++++ ...andaloneMetaDataManagerPersistService.java | 23 +++- ...loneMetaDataManagerPersistServiceTest.java | 21 ++- 19 files changed, 709 insertions(+), 71 deletions(-) create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java create mode 100644 mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java create mode 100644 mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java create mode 100644 mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java create mode 100644 mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java new file mode 100644 index 0000000000000..42aefc77aee10 --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule; + +import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; + +/** + * Rule item changed event. + */ +public interface RuleItemChangedEvent extends DispatchEvent { + + /** + * Get rule item type. + * + * @return rule item type + */ + String getType(); +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java new file mode 100644 index 0000000000000..237c00e0b3748 --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.alter; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Alter named rule item event. + */ +@RequiredArgsConstructor +@Getter +public final class AlterNamedRuleItemEvent implements AlterRuleItemEvent { + + private final String databaseName; + + private final String itemName; + + private final String activeVersionKey; + + private final String activeVersion; + + private final String type; +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java new file mode 100644 index 0000000000000..55e4780a6c4a0 --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.alter; + +import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; + +/** + * Alter rule item event. + */ +public interface AlterRuleItemEvent extends RuleItemChangedEvent { + + /** + * Get database name. + * + * @return database name + */ + String getDatabaseName(); + + /** + * Get active version key. + * + * @return active version key + */ + String getActiveVersionKey(); + + /** + * Get active version. + * + * @return active version + */ + String getActiveVersion(); +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java new file mode 100644 index 0000000000000..5bda761cae676 --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.alter; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Alter unique rule item event. + */ +@RequiredArgsConstructor +@Getter +public final class AlterUniqueRuleItemEvent implements AlterRuleItemEvent { + + private final String databaseName; + + private final String activeVersionKey; + + private final String activeVersion; + + private final String type; +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java new file mode 100644 index 0000000000000..6783a26c75e67 --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.drop; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Drop named rule item event. + */ +@RequiredArgsConstructor +@Getter +public final class DropNamedRuleItemEvent implements DropRuleItemEvent { + + private final String databaseName; + + private final String itemName; + + private final String type; +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java new file mode 100644 index 0000000000000..7a0413f92bd7b --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.drop; + +import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; + +/** + * Drop rule item event. + */ +public interface DropRuleItemEvent extends RuleItemChangedEvent { + + /** + * Get database name. + * + * @return database name + */ + String getDatabaseName(); +} diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java new file mode 100644 index 0000000000000..561be2372c69b --- /dev/null +++ b/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.rule.drop; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Drop unique rule item event. + */ +@RequiredArgsConstructor +@Getter +public final class DropUniqueRuleItemEvent implements DropRuleItemEvent { + + private final String databaseName; + + private final String type; +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java new file mode 100644 index 0000000000000..11c39e6f454ee --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.builder; + +import com.google.common.base.Strings; +import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; +import org.apache.shardingsphere.mode.event.DataChangedEvent; +import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; +import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.path.rule.RuleNodePath; +import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath; +import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath; +import org.apache.shardingsphere.mode.spi.RuleNodePathProvider; + +import java.util.Map.Entry; +import java.util.Optional; + +/** + * Rule configuration changed event builder. + */ +public final class RuleConfigurationChangedEventBuilder { + + /** + * Build rule changed event. + * + * @param databaseName database name + * @param event data changed event + * @return built event + */ + public Optional build(final String databaseName, final DataChangedEvent event) { + for (RuleNodePathProvider each : ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) { + Optional result = build(each.getRuleNodePath(), databaseName, event); + if (result.isPresent()) { + return result; + } + } + return Optional.empty(); + } + + private Optional build(final RuleNodePath ruleNodePath, final String databaseName, final DataChangedEvent event) { + if (!ruleNodePath.getRoot().isValidatedPath(event.getKey()) || Type.DELETED != event.getType() && Strings.isNullOrEmpty(event.getValue())) { + return Optional.empty(); + } + for (Entry entry : ruleNodePath.getNamedItems().entrySet()) { + Optional itemName; + if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) { + itemName = entry.getValue().getNameByActiveVersion(event.getKey()); + } else { + itemName = entry.getValue().getNameByItemPath(event.getKey()); + } + if (itemName.isPresent()) { + return Optional.of(create(databaseName, itemName.get(), event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); + } + } + for (Entry entry : ruleNodePath.getUniqueItems().entrySet()) { + if (entry.getValue().isActiveVersionPath(event.getKey())) { + return Optional.of(create(databaseName, event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey())); + } + } + return Optional.empty(); + } + + private RuleItemChangedEvent create(final String databaseName, final String itemName, final DataChangedEvent event, final String type) { + return Type.ADDED == event.getType() || Type.UPDATED == event.getType() + ? new AlterNamedRuleItemEvent(databaseName, itemName, event.getKey(), event.getValue(), type) + : new DropNamedRuleItemEvent(databaseName, itemName, type); + } + + private RuleItemChangedEvent create(final String databaseName, final DataChangedEvent event, final String type) { + return Type.ADDED == event.getType() || Type.UPDATED == event.getType() + ? new AlterUniqueRuleItemEvent(databaseName, event.getKey(), event.getValue(), type) + : new DropUniqueRuleItemEvent(databaseName, type); + } +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java index 08877b0526282..6d3adafe72378 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java @@ -18,26 +18,21 @@ package org.apache.shardingsphere.mode.metadata.manager; import com.google.common.base.Preconditions; -import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; -import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; -import org.apache.shardingsphere.mode.spi.PersistRepository; -import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; import org.apache.shardingsphere.mode.spi.item.DropRuleItem; -import org.apache.shardingsphere.mode.spi.item.RuleItemChanged; +import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor; import java.sql.SQLException; -import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; /** * Rule item manager. */ -@Slf4j public class RuleItemManager { private final AtomicReference metaDataContexts; @@ -46,61 +41,47 @@ public class RuleItemManager { private final MetaDataPersistService metaDataPersistService; - private final RuleItemChangedBuilder ruleItemChangedBuilder; - public RuleItemManager(final AtomicReference metaDataContexts, final PersistRepository repository, final DatabaseRuleConfigurationManager ruleConfigManager) { this.metaDataContexts = metaDataContexts; this.ruleConfigManager = ruleConfigManager; metaDataPersistService = new MetaDataPersistService(repository); - ruleItemChangedBuilder = new RuleItemChangedBuilder(); } /** * Alter with rule item. * - * @param databaseName database name - * @param activeVersionKey active version key - * @param activeVersion active version - * @param changeType change type + * @param alterRuleItem alter rule item + * @throws SQLException SQL Exception */ - public void alterRuleItem(final String databaseName, final String activeVersionKey, final String activeVersion, final Type changeType) { - Optional ruleItemChanged = ruleItemChangedBuilder.build(databaseName, activeVersionKey, activeVersion, changeType); - if (!ruleItemChanged.isPresent()) { - return; - } - RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, ruleItemChanged.get().getType()); - if (ruleItemChanged.get() instanceof AlterRuleItem) { - alter(databaseName, activeVersionKey, activeVersion, (AlterRuleItem) ruleItemChanged.get(), processor); - } else if (ruleItemChanged.get() instanceof DropRuleItem) { - drop(databaseName, (DropRuleItem) ruleItemChanged.get(), processor); - } - } - - private void alter(final String databaseName, final String activeVersionKey, final String activeVersion, final AlterRuleItem alterRuleItem, final RuleItemConfigurationChangedProcessor processor) { - Preconditions.checkArgument(activeVersion.equals(metaDataPersistService.getMetaDataVersionPersistService() - .getActiveVersionByFullPath(activeVersionKey)), "Invalid active version: {} of key: {}", activeVersion, activeVersionKey); - String yamlContent = metaDataPersistService.getMetaDataVersionPersistService().getVersionPathByActiveVersion(activeVersionKey, activeVersion); + public void alterRuleItem(final AlterRuleItem alterRuleItem) throws SQLException { + Preconditions.checkArgument(alterRuleItem.getActiveVersion().equals(metaDataPersistService.getMetaDataVersionPersistService() + .getActiveVersionByFullPath(alterRuleItem.getActiveVersionKey())), "Invalid active version: {} of key: {}", + alterRuleItem.getActiveVersion(), alterRuleItem.getActiveVersionKey()); + RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, alterRuleItem.getType()); + String yamlContent = metaDataPersistService.getMetaDataVersionPersistService() + .getVersionPathByActiveVersion(alterRuleItem.getActiveVersionKey(), alterRuleItem.getActiveVersion()); + String databaseName = alterRuleItem.getDatabaseName(); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { processor.changeRuleItemConfiguration(alterRuleItem, currentRuleConfig, processor.swapRuleItemConfiguration(alterRuleItem, yamlContent)); - try { - ruleConfigManager.alterRuleConfiguration(databaseName, currentRuleConfig); - } catch (final SQLException ex) { - log.error("Alter rule configuration failed, databaseName:{}, key:{}, version:{}", databaseName, activeVersionKey, activeVersion, ex); - } + ruleConfigManager.alterRuleConfiguration(databaseName, currentRuleConfig); } } - private void drop(final String databaseName, final DropRuleItem dropRuleItem, final RuleItemConfigurationChangedProcessor processor) { + /** + * Drop with rule item. + * + * @param dropRuleItem drop rule item + * @throws SQLException SQL Exception + */ + public void dropRuleItem(final DropRuleItem dropRuleItem) throws SQLException { + String databaseName = dropRuleItem.getDatabaseName(); Preconditions.checkState(metaDataContexts.get().getMetaData().containsDatabase(databaseName), "No database '%s' exists.", databaseName); + RuleItemConfigurationChangedProcessor processor = TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, dropRuleItem.getType()); RuleConfiguration currentRuleConfig = processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName)); synchronized (this) { processor.dropRuleItemConfiguration(dropRuleItem, currentRuleConfig); - try { - ruleConfigManager.dropRuleConfiguration(databaseName, currentRuleConfig); - } catch (final SQLException ex) { - log.error("Drop rule configuration failed, databaseName:{}, type:{}", databaseName, dropRuleItem.getType(), ex); - } + ruleConfigManager.dropRuleConfiguration(databaseName, currentRuleConfig); } } } diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java new file mode 100644 index 0000000000000..bd4de594750d2 --- /dev/null +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.event.dispatch.builder; + +import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; +import org.apache.shardingsphere.mode.event.DataChangedEvent; +import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; +import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.path.rule.RuleNodePath; +import org.apache.shardingsphere.mode.spi.RuleNodePathProvider; +import org.apache.shardingsphere.test.mock.AutoMockExtension; +import org.apache.shardingsphere.test.mock.StaticMockSettings; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import java.util.Collections; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(AutoMockExtension.class) +@StaticMockSettings(ShardingSphereServiceLoader.class) +class RuleConfigurationChangedEventBuilderTest { + + @Test + void assertBuildWithoutRuleNodePathProvider() { + when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.emptyList()); + assertFalse(new RuleConfigurationChangedEventBuilder().build("foo_db", new DataChangedEvent("k", "v", Type.IGNORED)).isPresent()); + } + + @ParameterizedTest(name = "{0}") + @ArgumentsSource(TestCaseArgumentsProvider.class) + void assertBuild(final String name, final String eventKey, final String eventValue, final Type type, final boolean isEventPresent, final Class dispatchEventClass) { + RuleNodePathProvider ruleNodePathProvider = mock(RuleNodePathProvider.class, RETURNS_DEEP_STUBS); + when(ruleNodePathProvider.getRuleNodePath()).thenReturn(new RuleNodePath("fixture", Collections.singleton("named"), Collections.singleton("unique"))); + when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.singleton(ruleNodePathProvider)); + Optional actual = new RuleConfigurationChangedEventBuilder().build("foo_db", new DataChangedEvent(eventKey, eventValue, type)); + assertThat(actual.isPresent(), is(isEventPresent)); + if (actual.isPresent()) { + if (dispatchEventClass == AlterNamedRuleItemEvent.class) { + assertDispatchEvent((AlterNamedRuleItemEvent) actual.get()); + } else if (dispatchEventClass == DropNamedRuleItemEvent.class) { + assertDispatchEvent((DropNamedRuleItemEvent) actual.get()); + } else if (dispatchEventClass == AlterUniqueRuleItemEvent.class) { + assertDispatchEvent((AlterUniqueRuleItemEvent) actual.get()); + } else if (dispatchEventClass == DropUniqueRuleItemEvent.class) { + assertDispatchEvent((DropUniqueRuleItemEvent) actual.get()); + } else { + fail("No such event type."); + } + } + } + + private void assertDispatchEvent(final AlterNamedRuleItemEvent actual) { + assertThat(actual.getDatabaseName(), is("foo_db")); + assertThat(actual.getItemName(), is("xxx")); + assertThat(actual.getType(), is("fixture.named")); + } + + private void assertDispatchEvent(final DropNamedRuleItemEvent actual) { + assertThat(actual.getDatabaseName(), is("foo_db")); + assertThat(actual.getItemName(), is("xxx")); + assertThat(actual.getType(), is("fixture.named")); + } + + private void assertDispatchEvent(final AlterUniqueRuleItemEvent actual) { + assertThat(actual.getDatabaseName(), is("foo_db")); + assertThat(actual.getActiveVersionKey(), is("/metadata/fixture/rules/fixture/unique/active_version")); + assertThat(actual.getActiveVersion(), is("foo")); + assertThat(actual.getType(), is("fixture.unique")); + } + + private void assertDispatchEvent(final DropUniqueRuleItemEvent actual) { + assertThat(actual.getDatabaseName(), is("foo_db")); + assertThat(actual.getType(), is("fixture.unique")); + } + + private static class TestCaseArgumentsProvider implements ArgumentsProvider { + + @Override + public Stream provideArguments(final ExtensionContext extensionContext) { + return Stream.of( + Arguments.of("InvalidPath", "/metadata/invalid/rules/fixture", "foo", Type.ADDED, false, null), + Arguments.of("AddEventWithEmptyValue", "/metadata/fixture/rules/fixture/versions/0", "", Type.ADDED, false, null), + Arguments.of("PathNotFound", "/metadata/fixture/rules/fixture/versions/0", "foo", Type.ADDED, false, null), + Arguments.of("AddEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", Type.ADDED, true, AlterNamedRuleItemEvent.class), + Arguments.of("UpdateEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", Type.UPDATED, true, AlterNamedRuleItemEvent.class), + Arguments.of("DeleteEventWithNamedRuleItemNodePath", "/metadata/fixture/rules/fixture/named/xxx", "foo", Type.DELETED, true, DropNamedRuleItemEvent.class), + Arguments.of("AddEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.ADDED, true, AlterUniqueRuleItemEvent.class), + Arguments.of("UpdateEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.UPDATED, true, AlterUniqueRuleItemEvent.class), + Arguments.of("DeleteEventWithUniqueRuleItemNodePath", "/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.DELETED, true, DropUniqueRuleItemEvent.class)); + } + } +} diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java index 3bfed6eff42d7..7daeb327d3471 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/DataChangedEventListenerRegistry.java @@ -24,7 +24,6 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.GlobalMetaDataChangedListener; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import java.util.Collection; @@ -40,13 +39,10 @@ public final class DataChangedEventListenerRegistry { private final Collection databaseNames; - private final RuleItemManager ruleItemManager; - public DataChangedEventListenerRegistry(final ContextManager contextManager, final Collection databaseNames) { repository = (ClusterPersistRepository) contextManager.getPersistServiceFacade().getRepository(); eventBusContext = contextManager.getComputeNodeInstanceContext().getEventBusContext(); this.databaseNames = databaseNames; - ruleItemManager = contextManager.getMetaDataContextManager().getRuleItemManager(); } /** @@ -58,7 +54,7 @@ public void register() { } private void registerDatabaseListeners(final String databaseName) { - repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(databaseName), new DatabaseMetaDataChangedListener(eventBusContext, ruleItemManager)); + repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(databaseName), new DatabaseMetaDataChangedListener(eventBusContext)); } private void registerGlobalListeners(final DispatchEventBuilder builder) { diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java index 8cdbfa1809a2d..9fa7a4f77b374 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; import org.apache.shardingsphere.mode.event.dispatch.builder.MetaDataChangedEventBuilder; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; +import org.apache.shardingsphere.mode.event.dispatch.builder.RuleConfigurationChangedEventBuilder; +import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; import org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener; import java.util.Optional; @@ -36,24 +36,18 @@ public final class DatabaseMetaDataChangedListener implements DataChangedEventLi private final EventBusContext eventBusContext; - private final RuleItemManager ruleItemManager; - @Override public void onChange(final DataChangedEvent event) { - handleDataChangedEvent(event); + createDispatchEvent(event).ifPresent(eventBusContext::post); } - private void handleDataChangedEvent(final DataChangedEvent event) { + private Optional createDispatchEvent(final DataChangedEvent event) { String key = event.getKey(); Optional databaseName = DatabaseMetaDataNode.getDatabaseNameBySchemaNode(key); if (!databaseName.isPresent()) { - return; + return Optional.empty(); } Optional metaDataChangedEvent = new MetaDataChangedEventBuilder().build(databaseName.get(), event); - if (metaDataChangedEvent.isPresent()) { - eventBusContext.post(metaDataChangedEvent.get()); - } else { - ruleItemManager.alterRuleItem(databaseName.get(), event.getKey(), event.getValue(), event.getType()); - } + return metaDataChangedEvent.isPresent() ? metaDataChangedEvent : new RuleConfigurationChangedEventBuilder().build(databaseName.get(), event); } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java index 78f9260fb24b0..efe9292425a27 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java @@ -29,6 +29,7 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.ProcessListChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.PropertiesEventSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.QualifiedDataSourceSubscriber; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.RuleItemChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StateChangedSubscriber; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StorageUnitEventSubscriber; @@ -44,7 +45,7 @@ public final class ClusterDispatchEventSubscriberRegistry { private final Collection subscribers; public ClusterDispatchEventSubscriberRegistry(final ContextManager contextManager) { - subscribers = Arrays.asList( + subscribers = Arrays.asList(new RuleItemChangedSubscriber(contextManager), new MetaDataChangedSubscriber(contextManager), new ListenerAssistedSubscriber(contextManager), new StateChangedSubscriber(contextManager), diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index 26e2ea21c381c..c2d5b80768fd5 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -53,8 +53,7 @@ public ListenerAssistedSubscriber(final ContextManager contextManager) { */ @Subscribe public synchronized void renew(final CreateDatabaseListenerAssistedEvent event) { - repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(event.getDatabaseName()), new DatabaseMetaDataChangedListener(contextManager.getComputeNodeInstanceContext().getEventBusContext(), - contextManager.getMetaDataContextManager().getRuleItemManager())); + repository.watch(DatabaseMetaDataNode.getDatabaseNamePath(event.getDatabaseName()), new DatabaseMetaDataChangedListener(contextManager.getComputeNodeInstanceContext().getEventBusContext())); contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addDatabase(event.getDatabaseName()); contextManager.getPersistServiceFacade().getListenerAssistedPersistService().deleteDatabaseNameListenerAssisted(event.getDatabaseName()); refreshStatisticsData(); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java new file mode 100644 index 0000000000000..9db8351b9dd3a --- /dev/null +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; + +import com.google.common.eventbus.Subscribe; +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; +import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem; + +import java.sql.SQLException; + +/** + * Rule item changed subscriber. + */ +@RequiredArgsConstructor +public final class RuleItemChangedSubscriber implements DispatchEventSubscriber { + + private final RuleItemManager ruleItemManager; + + public RuleItemChangedSubscriber(final ContextManager contextManager) { + ruleItemManager = contextManager.getMetaDataContextManager().getRuleItemManager(); + } + + /** + * Renew with alter rule item. + * + * @param event alter rule item event + * @throws SQLException SQL Exception + */ + @Subscribe + public void renew(final AlterRuleItemEvent event) throws SQLException { + // TODO remove the event and this subscriber + ruleItemManager.alterRuleItem(convertToAlterRuleItem(event)); + } + + /** + * Renew with drop rule item. + * + * @param event drop rule item event + * @throws SQLException SQL Exception + */ + @Subscribe + public void renew(final DropRuleItemEvent event) throws SQLException { + // TODO remove the event and this subscriber + ruleItemManager.dropRuleItem(convertToDropRuleItem(event)); + } + + private AlterRuleItem convertToAlterRuleItem(final AlterRuleItemEvent event) { + if (event instanceof AlterNamedRuleItemEvent) { + AlterNamedRuleItemEvent alterNamedRuleItemEvent = (AlterNamedRuleItemEvent) event; + return new AlterNamedRuleItem(alterNamedRuleItemEvent.getDatabaseName(), alterNamedRuleItemEvent.getItemName(), event.getActiveVersionKey(), event.getActiveVersion(), event.getType()); + } + AlterUniqueRuleItemEvent alterUniqueRuleItemEvent = (AlterUniqueRuleItemEvent) event; + return new AlterUniqueRuleItem(alterUniqueRuleItemEvent.getDatabaseName(), alterUniqueRuleItemEvent.getActiveVersionKey(), event.getActiveVersion(), event.getType()); + } + + private DropRuleItem convertToDropRuleItem(final DropRuleItemEvent event) { + if (event instanceof DropNamedRuleItemEvent) { + DropNamedRuleItemEvent dropNamedRuleItemEvent = (DropNamedRuleItemEvent) event; + return new DropNamedRuleItem(dropNamedRuleItemEvent.getDatabaseName(), dropNamedRuleItemEvent.getItemName(), event.getType()); + } + DropUniqueRuleItemEvent dropUniqueRuleItemEvent = (DropUniqueRuleItemEvent) event; + return new DropUniqueRuleItem(dropUniqueRuleItemEvent.getDatabaseName(), event.getType()); + } +} diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java index d396a02320a1e..d1cdabd4faa51 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java @@ -20,7 +20,6 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -39,12 +38,9 @@ class DatabaseMetaDataChangedListenerTest { @Mock private EventBusContext eventBusContext; - @Mock - private RuleItemManager ruleItemManager; - @BeforeEach void setUp() { - listener = new DatabaseMetaDataChangedListener(eventBusContext, ruleItemManager); + listener = new DatabaseMetaDataChangedListener(eventBusContext); } @Test diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java new file mode 100644 index 0000000000000..5f04a35b00a69 --- /dev/null +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; + +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.sql.SQLException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class RuleItemChangedSubscriberTest { + + private RuleItemChangedSubscriber subscriber; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ContextManager contextManager; + + @BeforeEach + void setUp() { + subscriber = new RuleItemChangedSubscriber(contextManager); + } + + @Test + void assertRenewWithAlterRuleItemEvent() throws SQLException { + AlterRuleItemEvent event = mock(AlterNamedRuleItemEvent.class); + subscriber.renew(event); + verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); + } + + @Test + void assertRenewWithDropRuleItemEvent() throws SQLException { + DropRuleItemEvent event = mock(DropNamedRuleItemEvent.class); + subscriber.renew(event); + verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); + } +} diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java index 59e61d04f2ef1..7d067d5e4ce60 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java @@ -38,10 +38,14 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.spi.item.RuleItemChanged; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import java.sql.SQLException; @@ -63,9 +67,12 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa private final MetaDataContextManager metaDataContextManager; + private final RuleItemChangedBuilder ruleItemChangedBuilder; + public StandaloneMetaDataManagerPersistService(final PersistRepository repository, final MetaDataContextManager metaDataContextManager) { metaDataPersistService = new MetaDataPersistService(repository); this.metaDataContextManager = metaDataContextManager; + ruleItemChangedBuilder = new RuleItemChangedBuilder(); } @Override @@ -285,11 +292,19 @@ public void alterRuleConfiguration(final String databaseName, final RuleConfigur .persist(metaDataContextManager.getMetaDataContexts().get().getMetaData().getDatabase(databaseName).getName(), Collections.singleton(toBeAlteredRuleConfig)); metaDataPersistService.getMetaDataVersionPersistService().switchActiveVersion(metaDataVersions); for (MetaDataVersion each : metaDataVersions) { - metaDataContextManager.getRuleItemManager().alterRuleItem(databaseName, each.getActiveVersionNodePath(), each.getNextActiveVersion(), Type.UPDATED); + // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran + Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, each, Type.UPDATED); + if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof AlterRuleItem) { + metaDataContextManager.getRuleItemManager().alterRuleItem((AlterRuleItem) ruleItemChanged.get()); + } } clearServiceCache(); } + private Optional buildAlterRuleItemChanged(final String databaseName, final MetaDataVersion metaDataVersion, final Type type) { + return ruleItemChangedBuilder.build(databaseName, metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), type); + } + @Override public void removeRuleConfigurationItem(final String databaseName, final RuleConfiguration toBeRemovedRuleConfig) throws SQLException { if (null == toBeRemovedRuleConfig) { @@ -297,7 +312,11 @@ public void removeRuleConfigurationItem(final String databaseName, final RuleCon } Collection metaDataVersions = metaDataPersistService.getDatabaseRulePersistService().delete(databaseName, Collections.singleton(toBeRemovedRuleConfig)); for (MetaDataVersion metaDataVersion : metaDataVersions) { - metaDataContextManager.getRuleItemManager().alterRuleItem(databaseName, metaDataVersion.getActiveVersionNodePath(), metaDataVersion.getNextActiveVersion(), Type.DELETED); + Optional ruleItemChanged = buildAlterRuleItemChanged(databaseName, metaDataVersion, Type.DELETED); + // TODO double check here, when ruleItemEvent not existed or not AlterRuleItemEvent @haoran + if (ruleItemChanged.isPresent() && ruleItemChanged.get() instanceof DropRuleItem) { + metaDataContextManager.getRuleItemManager().dropRuleItem((DropRuleItem) ruleItemChanged.get()); + } } clearServiceCache(); } diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java index 2469b29646b9e..d86ffedcd0dc6 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java @@ -31,7 +31,10 @@ import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.metadata.persist.service.metadata.DatabaseMetaDataPersistFacade; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; +import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; +import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,6 +49,7 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; +import java.util.Optional; import java.util.Properties; import static org.mockito.ArgumentMatchers.any; @@ -168,9 +172,13 @@ void assertAlterRuleConfiguration() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().persist("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); + AlterRuleItem alterRuleItem = mock(AlterRuleItem.class); + RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); + when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(alterRuleItem)); + setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.alterRuleConfiguration("foo_db", ruleConfig); verify(metaDataPersistService.getMetaDataVersionPersistService()).switchActiveVersion(metaDataVersion); - verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(eq("foo_db"), any(), any(), any()); + verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class)); } @Test @@ -184,8 +192,12 @@ void assertRemoveRuleConfigurationItem() throws SQLException { RuleConfiguration ruleConfig = mock(RuleConfiguration.class, RETURNS_DEEP_STUBS); Collection metaDataVersion = Collections.singleton(mock(MetaDataVersion.class)); when(metaDataPersistService.getDatabaseRulePersistService().delete("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion); + RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class); + DropRuleItem dropRuleItem = mock(DropRuleItem.class); + when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(dropRuleItem)); + setRuleConfigurationEventBuilder(ruleItemChangedBuilder); metaDataManagerPersistService.removeRuleConfigurationItem("foo_db", ruleConfig); - verify(metaDataContextManager.getRuleItemManager()).alterRuleItem(eq("foo_db"), any(), any(), any()); + verify(metaDataContextManager.getRuleItemManager()).dropRuleItem(any(DropRuleItem.class)); } @Test @@ -222,4 +234,9 @@ void assertDropTables() { metaDataManagerPersistService.dropTables("foo_db", "foo_schema", Collections.singleton("foo_tbl")); verify(metaDataPersistService.getDatabaseMetaDataFacade().getTable()).drop("foo_db", "foo_schema", "foo_tbl"); } + + @SneakyThrows(ReflectiveOperationException.class) + private void setRuleConfigurationEventBuilder(final RuleItemChangedBuilder ruleItemChangedBuilder) { + Plugins.getMemberAccessor().set(StandaloneMetaDataManagerPersistService.class.getDeclaredField("ruleItemChangedBuilder"), metaDataManagerPersistService, ruleItemChangedBuilder); + } } From 055041f15e88100d2865d5ad41b505c724db2136 Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Thu, 19 Dec 2024 14:15:28 +0800 Subject: [PATCH 103/192] Fix sonar issues (#34103) --- .../shardingsphere/mode/metadata/manager/RuleItemManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java index 6d3adafe72378..5e48f7ccf3cff 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/RuleItemManager.java @@ -53,6 +53,7 @@ public RuleItemManager(final AtomicReference metaDataContexts, * @param alterRuleItem alter rule item * @throws SQLException SQL Exception */ + @SuppressWarnings({"rawtypes", "unchecked"}) public void alterRuleItem(final AlterRuleItem alterRuleItem) throws SQLException { Preconditions.checkArgument(alterRuleItem.getActiveVersion().equals(metaDataPersistService.getMetaDataVersionPersistService() .getActiveVersionByFullPath(alterRuleItem.getActiveVersionKey())), "Invalid active version: {} of key: {}", @@ -74,6 +75,7 @@ public void alterRuleItem(final AlterRuleItem alterRuleItem) throws SQLException * @param dropRuleItem drop rule item * @throws SQLException SQL Exception */ + @SuppressWarnings({"rawtypes", "unchecked"}) public void dropRuleItem(final DropRuleItem dropRuleItem) throws SQLException { String databaseName = dropRuleItem.getDatabaseName(); Preconditions.checkState(metaDataContexts.get().getMetaData().containsDatabase(databaseName), "No database '%s' exists.", databaseName); From c506346676b1e021d04c40f97bdf0b7129c75ea4 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 20 Dec 2024 09:59:46 +0800 Subject: [PATCH 104/192] Refactor get column to get column segment in encrypt condition (#34107) --- .../rewrite/condition/EncryptCondition.java | 8 +++++--- .../condition/EncryptConditionEngine.java | 16 +++++++++------- .../condition/impl/EncryptBinaryCondition.java | 8 +++++--- .../condition/impl/EncryptInCondition.java | 7 ++++--- .../EncryptSQLRewriteContextDecorator.java | 7 ++++--- .../EncryptPredicateParameterRewriter.java | 4 ++-- ...InsertPredicateRightValueTokenGenerator.java | 2 +- ...ncryptPredicateRightValueTokenGenerator.java | 17 ++++++++++------- .../impl/EncryptBinaryConditionTest.java | 10 ++++++---- .../condition/impl/EncryptInConditionTest.java | 4 +++- 10 files changed, 49 insertions(+), 34 deletions(-) diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptCondition.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptCondition.java index af320e1ff41ea..848bf03b225fe 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptCondition.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptCondition.java @@ -17,6 +17,8 @@ package org.apache.shardingsphere.encrypt.rewrite.condition; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; + import java.util.Map; /** @@ -25,11 +27,11 @@ public interface EncryptCondition { /** - * Get column name. + * Get column segment. * - * @return column name + * @return column segment */ - String getColumnName(); + ColumnSegment getColumnSegment(); /** * Get table name. diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java index b44cb42d32e1e..ecee22e14e1ae 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java @@ -30,6 +30,8 @@ import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; @@ -41,8 +43,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.AndPredicate; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import java.util.Collection; import java.util.HashSet; @@ -122,7 +123,8 @@ private void addEncryptConditions(final Collection encryptCond return; } for (ColumnSegment each : ColumnExtractor.extract(expression)) { - String tableName = expressionTableNames.getOrDefault(each.getExpression(), ""); + ColumnSegmentBoundInfo columnBoundInfo = each.getColumnBoundInfo(); + String tableName = columnBoundInfo.getOriginalTable().getValue().isEmpty() ? expressionTableNames.getOrDefault(each.getExpression(), "") : columnBoundInfo.getOriginalTable().getValue(); Optional encryptTable = rule.findEncryptTable(tableName); if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) { createEncryptCondition(expression, tableName).ifPresent(encryptConditions::add); @@ -184,8 +186,8 @@ private Optional createCompareEncryptCondition(final String ta } private EncryptBinaryCondition createEncryptBinaryOperationCondition(final String tableName, final BinaryOperationExpression expression, final ExpressionSegment compareRightValue) { - String columnName = ((ColumnSegment) expression.getLeft()).getIdentifier().getValue(); - return new EncryptBinaryCondition(columnName, tableName, expression.getOperator(), compareRightValue.getStartIndex(), expression.getStopIndex(), compareRightValue); + ColumnSegment columnSegment = (ColumnSegment) expression.getLeft(); + return new EncryptBinaryCondition(columnSegment, tableName, expression.getOperator(), compareRightValue.getStartIndex(), expression.getStopIndex(), compareRightValue); } private static Optional createInEncryptCondition(final String tableName, final InExpression inExpression, final ExpressionSegment inRightValue) { @@ -201,7 +203,7 @@ private static Optional createInEncryptCondition(final String if (expressionSegments.isEmpty()) { return Optional.empty(); } - String columnName = ((ColumnSegment) inExpression.getLeft()).getIdentifier().getValue(); - return Optional.of(new EncryptInCondition(columnName, tableName, inRightValue.getStartIndex(), inRightValue.getStopIndex(), expressionSegments)); + ColumnSegment columnSegment = (ColumnSegment) inExpression.getLeft(); + return Optional.of(new EncryptInCondition(columnSegment, tableName, inRightValue.getStartIndex(), inRightValue.getStopIndex(), expressionSegments)); } } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java index a345ef0d7c6bb..16572e68993db 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.ToString; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; @@ -37,7 +38,7 @@ @ToString public final class EncryptBinaryCondition implements EncryptCondition { - private final String columnName; + private final ColumnSegment columnSegment; private final String tableName; @@ -53,8 +54,9 @@ public final class EncryptBinaryCondition implements EncryptCondition { private final Map positionValueMap = new LinkedHashMap<>(); - public EncryptBinaryCondition(final String columnName, final String tableName, final String operator, final int startIndex, final int stopIndex, final ExpressionSegment expressionSegment) { - this.columnName = columnName; + public EncryptBinaryCondition(final ColumnSegment columnSegment, final String tableName, final String operator, final int startIndex, final int stopIndex, + final ExpressionSegment expressionSegment) { + this.columnSegment = columnSegment; this.tableName = tableName; this.operator = operator; this.startIndex = startIndex; diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInCondition.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInCondition.java index 7f6801f6d2af2..4a47a0261d5d5 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInCondition.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInCondition.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.ToString; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; @@ -37,7 +38,7 @@ @ToString public final class EncryptInCondition implements EncryptCondition { - private final String columnName; + private final ColumnSegment columnSegment; private final String tableName; @@ -49,8 +50,8 @@ public final class EncryptInCondition implements EncryptCondition { private final Map positionValueMap = new LinkedHashMap<>(); - public EncryptInCondition(final String columnName, final String tableName, final int startIndex, final int stopIndex, final List expressionSegments) { - this.columnName = columnName; + public EncryptInCondition(final ColumnSegment columnSegment, final String tableName, final int startIndex, final int stopIndex, final List expressionSegments) { + this.columnSegment = columnSegment; this.tableName = tableName; this.startIndex = startIndex; this.stopIndex = stopIndex; diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java index c79fe379b8a7e..045a014ba0094 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java @@ -86,15 +86,16 @@ private Collection createEncryptConditions(final EncryptRule r return createEncryptConditions(rule, sqlRewriteContext, sqlStatementContext); } - private Collection createEncryptConditions(final EncryptRule rule, final SQLRewriteContext sqlRewriteContext, final SQLStatementContext sqlStatementContext) { + private Collection createEncryptConditions(final EncryptRule rule, final SQLRewriteContext sqlRewriteContext, + final SQLStatementContext sqlStatementContext) { if (!(sqlStatementContext instanceof WhereAvailable)) { return Collections.emptyList(); } Collection allSubqueryContexts = SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext); Collection whereSegments = SQLStatementContextExtractor.getWhereSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); Collection columnSegments = SQLStatementContextExtractor.getColumnSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); - return new EncryptConditionEngine( - rule, sqlRewriteContext.getDatabase()).createEncryptConditions(whereSegments, columnSegments, sqlStatementContext, sqlRewriteContext.getDatabase().getName()); + return new EncryptConditionEngine(rule, sqlRewriteContext.getDatabase()).createEncryptConditions(whereSegments, columnSegments, sqlStatementContext, + sqlRewriteContext.getDatabase().getName()); } private void rewriteParameters(final SQLRewriteContext sqlRewriteContext, final Collection parameterRewriters) { diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java index ffe18e38314e1..54d8ad7127a45 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptPredicateParameterRewriter.java @@ -84,8 +84,8 @@ public void rewrite(final ParameterBuilder paramBuilder, final SQLStatementConte } private List getEncryptedValues(final String schemaName, final EncryptCondition encryptCondition, final List originalValues) { - String tableName = encryptCondition.getTableName(); - String columnName = encryptCondition.getColumnName(); + String tableName = encryptCondition.getColumnSegment().getColumnBoundInfo().getOriginalTable().getValue(); + String columnName = encryptCondition.getColumnSegment().getIdentifier().getValue(); EncryptTable encryptTable = rule.getEncryptTable(tableName); EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName); if (encryptCondition instanceof EncryptBinaryCondition && "LIKE".equals(((EncryptBinaryCondition) encryptCondition).getOperator()) && encryptColumn.getLikeQuery().isPresent()) { diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java index 9f1681ec853f0..b067040abaa0b 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateRightValueTokenGenerator.java @@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptConditionsAware; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; import org.apache.shardingsphere.encrypt.rule.EncryptRule; @@ -28,6 +27,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; +import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.ParametersAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java index 91309f39c480c..01c815b1ee007 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java @@ -20,7 +20,6 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import org.apache.shardingsphere.encrypt.exception.metadata.MissingMatchedEncryptQueryAlgorithmException; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptConditionsAware; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptCondition; import org.apache.shardingsphere.encrypt.rewrite.condition.EncryptConditionValues; @@ -40,6 +39,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; +import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.DatabaseAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.ParametersAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; @@ -49,6 +49,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; /** * Predicate right value token generator for encrypt. @@ -77,7 +78,8 @@ public Collection generateSQLTokens(final SQLStatementContext sqlState String schemaName = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName() .orElseGet(() -> new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(database.getName())); for (EncryptCondition each : encryptConditions) { - rule.findEncryptTable(each.getTableName()).ifPresent(optional -> result.add(generateSQLToken(schemaName, optional, each))); + Optional encryptTable = rule.findEncryptTable(each.getTableName()); + encryptTable.ifPresent(optional -> result.add(generateSQLToken(schemaName, optional, each))); } return result; } @@ -98,15 +100,16 @@ private SQLToken generateSQLToken(final String schemaName, final EncryptTable en } private List getEncryptedValues(final String schemaName, final EncryptTable encryptTable, final EncryptCondition encryptCondition, final List originalValues) { - EncryptColumn encryptColumn = encryptTable.getEncryptColumn(encryptCondition.getColumnName()); + EncryptColumn encryptColumn = encryptTable.getEncryptColumn(encryptCondition.getColumnSegment().getIdentifier().getValue()); if (encryptCondition instanceof EncryptBinaryCondition && "LIKE".equalsIgnoreCase(((EncryptBinaryCondition) encryptCondition).getOperator())) { LikeQueryColumnItem likeQueryColumnItem = encryptColumn.getLikeQuery() - .orElseThrow(() -> new MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(), encryptCondition.getColumnName(), "LIKE")); - return likeQueryColumnItem.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues); + .orElseThrow(() -> new MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(), encryptCondition.getColumnSegment().getIdentifier().getValue(), "LIKE")); + return likeQueryColumnItem.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues); } return encryptColumn.getAssistedQuery() - .map(optional -> optional.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues)) - .orElseGet(() -> encryptColumn.getCipher().encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnName(), originalValues)); + .map(optional -> optional.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues)) + .orElseGet(() -> encryptColumn.getCipher().encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), + originalValues)); } private Map getPositionValues(final Collection valuePositions, final List encryptValues) { diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryConditionTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryConditionTest.java index 9a18fef1b8529..a12da4dac89f1 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryConditionTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryConditionTest.java @@ -17,10 +17,12 @@ package org.apache.shardingsphere.encrypt.rewrite.condition.impl; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -34,14 +36,14 @@ class EncryptBinaryConditionTest { @Test void assertNewInstanceWithParameterMarkerExpression() { - EncryptBinaryCondition actual = new EncryptBinaryCondition("col", null, null, 0, 0, new ParameterMarkerExpressionSegment(0, 0, 1)); + EncryptBinaryCondition actual = new EncryptBinaryCondition(new ColumnSegment(0, 0, new IdentifierValue("col")), null, null, 0, 0, new ParameterMarkerExpressionSegment(0, 0, 1)); assertThat(actual.getPositionIndexMap(), is(Collections.singletonMap(0, 1))); assertTrue(actual.getPositionValueMap().isEmpty()); } @Test void assertNewInstanceWithLiteralExpression() { - EncryptBinaryCondition actual = new EncryptBinaryCondition("col", null, null, 0, 0, new LiteralExpressionSegment(0, 0, "foo")); + EncryptBinaryCondition actual = new EncryptBinaryCondition(new ColumnSegment(0, 0, new IdentifierValue("col")), null, null, 0, 0, new LiteralExpressionSegment(0, 0, "foo")); assertTrue(actual.getPositionIndexMap().isEmpty()); assertThat(actual.getPositionValueMap(), is(Collections.singletonMap(0, "foo"))); } @@ -52,7 +54,7 @@ void assertNewInstanceWithConcatFunctionExpression() { functionSegment.getParameters().add(new LiteralExpressionSegment(0, 0, "foo")); functionSegment.getParameters().add(new ParameterMarkerExpressionSegment(0, 0, 1)); functionSegment.getParameters().add(mock(ExpressionSegment.class)); - EncryptBinaryCondition actual = new EncryptBinaryCondition("col", null, null, 0, 0, functionSegment); + EncryptBinaryCondition actual = new EncryptBinaryCondition(new ColumnSegment(0, 0, new IdentifierValue("col")), null, null, 0, 0, functionSegment); assertThat(actual.getPositionIndexMap(), is(Collections.singletonMap(1, 1))); assertThat(actual.getPositionValueMap(), is(Collections.singletonMap(0, "foo"))); } @@ -63,7 +65,7 @@ void assertNewInstanceWithNotConcatFunctionExpression() { functionSegment.getParameters().add(new LiteralExpressionSegment(0, 0, "foo")); functionSegment.getParameters().add(new ParameterMarkerExpressionSegment(0, 0, 1)); functionSegment.getParameters().add(mock(ExpressionSegment.class)); - EncryptBinaryCondition actual = new EncryptBinaryCondition("col", null, null, 0, 0, functionSegment); + EncryptBinaryCondition actual = new EncryptBinaryCondition(new ColumnSegment(0, 0, new IdentifierValue("col")), null, null, 0, 0, functionSegment); assertTrue(actual.getPositionIndexMap().isEmpty()); assertTrue(actual.getPositionValueMap().isEmpty()); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInConditionTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInConditionTest.java index 8653a506c331b..31ae4bc80dd37 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInConditionTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptInConditionTest.java @@ -17,9 +17,11 @@ package org.apache.shardingsphere.encrypt.rewrite.condition.impl; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.ParameterMarkerExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -35,7 +37,7 @@ class EncryptInConditionTest { @Test void assertNewInstance() { List expressions = Arrays.asList(new ParameterMarkerExpressionSegment(0, 0, 0), new LiteralExpressionSegment(0, 0, "foo"), mock(ExpressionSegment.class)); - EncryptInCondition actual = new EncryptInCondition("foo_col", null, 0, 0, expressions); + EncryptInCondition actual = new EncryptInCondition(new ColumnSegment(0, 0, new IdentifierValue("foo_col")), null, 0, 0, expressions); assertThat(actual.getPositionIndexMap(), is(Collections.singletonMap(0, 0))); assertThat(actual.getPositionValueMap(), is(Collections.singletonMap(1, "foo"))); } From e56531c5a5e1f1e1fae60b22f1b68e00842bdba2 Mon Sep 17 00:00:00 2001 From: jiangML <1060319118@qq.com> Date: Fri, 20 Dec 2024 10:21:40 +0800 Subject: [PATCH 105/192] Fix query some system data error when there are multiple logical database (#34106) --- .../executor/AbstractDatabaseMetaDataExecutor.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java index dbbe100f99650..95f16274eb8c6 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java @@ -29,6 +29,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow; import org.apache.shardingsphere.infra.merge.result.MergedResult; import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.user.Grantee; @@ -144,9 +145,13 @@ public static class DefaultDatabaseMetaDataExecutor extends AbstractDatabaseMeta @Override protected Collection getDatabaseNames(final ConnectionSession connectionSession) { - Optional database = ProxyContext.getInstance().getAllDatabaseNames().stream().filter(each -> isAuthorized(each, connectionSession.getConnectionContext().getGrantee())) - .filter(AbstractDatabaseMetaDataExecutor::hasDataSource).findFirst(); - return database.map(Collections::singletonList).orElse(Collections.emptyList()); + ShardingSphereDatabase database = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName()); + if (null != database && isAuthorized(database.getName(), connectionSession.getConnectionContext().getGrantee()) && AbstractDatabaseMetaDataExecutor.hasDataSource(database.getName())) { + return Collections.singleton(database.getName()); + } + Collection databaseNames = ProxyContext.getInstance().getAllDatabaseNames().stream().filter(each -> isAuthorized(each, connectionSession.getConnectionContext().getGrantee())) + .filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList()); + return databaseNames.isEmpty() ? Collections.emptyList() : Collections.singletonList(databaseNames.iterator().next()); } @Override From c629e8386392301d0a275d6527c2baad4ac54967 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 20 Dec 2024 10:34:54 +0800 Subject: [PATCH 106/192] Refactor duplicate column names usage --- .../EncryptPredicateRightValueTokenGenerator.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java index 01c815b1ee007..a10c04592493c 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGenerator.java @@ -100,15 +100,16 @@ private SQLToken generateSQLToken(final String schemaName, final EncryptTable en } private List getEncryptedValues(final String schemaName, final EncryptTable encryptTable, final EncryptCondition encryptCondition, final List originalValues) { - EncryptColumn encryptColumn = encryptTable.getEncryptColumn(encryptCondition.getColumnSegment().getIdentifier().getValue()); + String columnName = encryptCondition.getColumnSegment().getIdentifier().getValue(); + EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName); if (encryptCondition instanceof EncryptBinaryCondition && "LIKE".equalsIgnoreCase(((EncryptBinaryCondition) encryptCondition).getOperator())) { LikeQueryColumnItem likeQueryColumnItem = encryptColumn.getLikeQuery() - .orElseThrow(() -> new MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(), encryptCondition.getColumnSegment().getIdentifier().getValue(), "LIKE")); - return likeQueryColumnItem.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues); + .orElseThrow(() -> new MissingMatchedEncryptQueryAlgorithmException(encryptTable.getTable(), columnName, "LIKE")); + return likeQueryColumnItem.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), columnName, originalValues); } return encryptColumn.getAssistedQuery() - .map(optional -> optional.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), originalValues)) - .orElseGet(() -> encryptColumn.getCipher().encrypt(database.getName(), schemaName, encryptCondition.getTableName(), encryptCondition.getColumnSegment().getIdentifier().getValue(), + .map(optional -> optional.encrypt(database.getName(), schemaName, encryptCondition.getTableName(), columnName, originalValues)) + .orElseGet(() -> encryptColumn.getCipher().encrypt(database.getName(), schemaName, encryptCondition.getTableName(), columnName, originalValues)); } From af96795f05c8d7c646bc5df666d4fa7ba446dd04 Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Fri, 20 Dec 2024 11:20:53 +0800 Subject: [PATCH 107/192] Fix pipeline e2e for MySQL (#34108) --- .../generator/PipelineDDLGenerator.java | 19 ++++++------- .../PipelineJobDataSourcePreparer.java | 27 ++++++++++++++----- .../param/PrepareTargetTablesParameter.java | 5 +++- .../PipelineJobDataSourcePreparerTest.java | 13 ++++++++- .../preparer/MigrationJobPreparer.java | 7 ++--- 5 files changed, 48 insertions(+), 23 deletions(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java index a0510de5440a6..95b8b3b85ef61 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java @@ -43,7 +43,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; import javax.sql.DataSource; -import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; @@ -74,15 +73,17 @@ public final class PipelineDDLGenerator { * @param sourceTableName source table name * @param targetTableName target table name * @param parserEngine parser engine + * @param targetDatabaseName target database name * @return DDL SQL * @throws SQLException SQL exception */ public List generateLogicDDL(final DatabaseType databaseType, final DataSource sourceDataSource, - final String schemaName, final String sourceTableName, final String targetTableName, final SQLParserEngine parserEngine) throws SQLException { + final String schemaName, final String sourceTableName, final String targetTableName, + final SQLParserEngine parserEngine, final String targetDatabaseName) throws SQLException { long startTimeMillis = System.currentTimeMillis(); List result = new ArrayList<>(); for (String each : DatabaseTypedSPILoader.getService(DialectPipelineSQLBuilder.class, databaseType).buildCreateTableSQLs(sourceDataSource, schemaName, sourceTableName)) { - Optional queryContext = decorate(databaseType, sourceDataSource, schemaName, targetTableName, parserEngine, each); + Optional queryContext = decorate(databaseType, targetDatabaseName, schemaName, targetTableName, parserEngine, each); queryContext.ifPresent(sql -> { String trimmedSql = sql.trim(); if (!Strings.isNullOrEmpty(trimmedSql)) { @@ -95,19 +96,15 @@ public List generateLogicDDL(final DatabaseType databaseType, final Data return result; } - private Optional decorate(final DatabaseType databaseType, final DataSource dataSource, final String schemaName, final String targetTableName, - final SQLParserEngine parserEngine, final String sql) throws SQLException { + private Optional decorate(final DatabaseType databaseType, final String targetDatabaseName, final String schemaName, final String targetTableName, + final SQLParserEngine parserEngine, final String sql) { if (Strings.isNullOrEmpty(sql)) { return Optional.empty(); } - String databaseName; - try (Connection connection = dataSource.getConnection()) { - databaseName = connection.getCatalog(); - } - String result = decorateActualSQL(databaseName, targetTableName, parserEngine, sql.trim()); + String result = decorateActualSQL(targetDatabaseName, targetTableName, parserEngine, sql.trim()); // TODO remove it after set search_path is supported. if ("openGauss".equals(databaseType.getType())) { - return decorateOpenGauss(databaseName, schemaName, result, parserEngine); + return decorateOpenGauss(targetDatabaseName, schemaName, result, parserEngine); } return Optional.of(result); } diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java index 2901c6164427e..c256c37ae2a14 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetSchemasParameter; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetTablesParameter; import org.apache.shardingsphere.data.pipeline.core.sqlbuilder.sql.PipelinePrepareSQLBuilder; +import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection; import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; @@ -40,8 +41,10 @@ import java.sql.Statement; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; @@ -62,14 +65,16 @@ public final class PipelineJobDataSourcePreparer { * Prepare target schemas. * * @param param prepare target schemas parameter + * @return target schemas * @throws SQLException if prepare target schema fail */ - public void prepareTargetSchemas(final PrepareTargetSchemasParameter param) throws SQLException { + public Map prepareTargetSchemas(final PrepareTargetSchemasParameter param) throws SQLException { DatabaseType targetDatabaseType = param.getTargetDatabaseType(); DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(targetDatabaseType).getDialectDatabaseMetaData(); if (!dialectDatabaseMetaData.isSchemaAvailable()) { - return; + return Collections.emptyMap(); } + Map result = new HashMap<>(param.getCreateTableConfigurations().size(), 1F); String defaultSchema = dialectDatabaseMetaData.getDefaultSchema().orElse(null); PipelinePrepareSQLBuilder pipelineSQLBuilder = new PipelinePrepareSQLBuilder(targetDatabaseType); Collection createdSchemaNames = new HashSet<>(param.getCreateTableConfigurations().size(), 1F); @@ -80,18 +85,21 @@ public void prepareTargetSchemas(final PrepareTargetSchemasParameter param) thro } Optional sql = pipelineSQLBuilder.buildCreateSchemaSQL(targetSchemaName); if (sql.isPresent()) { - executeCreateSchema(param.getDataSourceManager(), each.getTargetDataSourceConfig(), sql.get()); + executeCreateSchema(param.getDataSourceManager(), each.getTargetDataSourceConfig(), sql.get()).ifPresent(metaData -> result.put(targetSchemaName, metaData)); createdSchemaNames.add(targetSchemaName); } } + return result; } - private void executeCreateSchema(final PipelineDataSourceManager dataSourceManager, final PipelineDataSourceConfiguration targetDataSourceConfig, final String sql) throws SQLException { + private Optional executeCreateSchema(final PipelineDataSourceManager dataSourceManager, + final PipelineDataSourceConfiguration targetDataSourceConfig, final String sql) throws SQLException { log.info("Prepare target schemas SQL: {}", sql); try ( Connection connection = dataSourceManager.getDataSource(targetDataSourceConfig).getConnection(); Statement statement = connection.createStatement()) { statement.execute(sql); + return Optional.of(((ShardingSphereConnection) connection).getContextManager().getMetaDataContexts().getMetaData()); } catch (final SQLException ex) { if (DatabaseTypedSPILoader.findService(DialectPipelineJobDataSourcePrepareOption.class, databaseType) .map(DialectPipelineJobDataSourcePrepareOption::isSupportIfNotExistsOnCreateSchema).orElse(true)) { @@ -99,6 +107,7 @@ private void executeCreateSchema(final PipelineDataSourceManager dataSourceManag } log.warn("Create schema failed", ex); } + return Optional.empty(); } /** @@ -111,8 +120,12 @@ public void prepareTargetTables(final PrepareTargetTablesParameter param) throws final long startTimeMillis = System.currentTimeMillis(); PipelineDataSourceManager dataSourceManager = param.getDataSourceManager(); for (CreateTableConfiguration each : param.getCreateTableConfigurations()) { - List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager, param.getSqlParserEngine(), param.getMetaData()); try (Connection targetConnection = dataSourceManager.getDataSource(each.getTargetDataSourceConfig()).getConnection()) { + ShardingSphereMetaData metaData = param.getTargetSchemaMetaData().get(each.getTargetName().getSchemaName()); + if (null == metaData) { + metaData = ((ShardingSphereConnection) targetConnection).getContextManager().getMetaDataContexts().getMetaData(); + } + List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager, param.getSqlParserEngine(), metaData, param.getTargetDatabaseName()); for (String sql : createTargetTableSQL) { executeTargetTableSQL(targetConnection, addIfNotExistsForCreateTableSQL(sql)); } @@ -122,13 +135,13 @@ public void prepareTargetTables(final PrepareTargetTablesParameter param) throws } private List getCreateTargetTableSQL(final CreateTableConfiguration createTableConfig, final PipelineDataSourceManager dataSourceManager, - final SQLParserEngine sqlParserEngine, final ShardingSphereMetaData metaData) throws SQLException { + final SQLParserEngine sqlParserEngine, final ShardingSphereMetaData metaData, final String targetDatabaseName) throws SQLException { DatabaseType databaseType = createTableConfig.getSourceDataSourceConfig().getDatabaseType(); DataSource sourceDataSource = dataSourceManager.getDataSource(createTableConfig.getSourceDataSourceConfig()); String schemaName = createTableConfig.getSourceName().getSchemaName(); String sourceTableName = createTableConfig.getSourceName().getTableName(); String targetTableName = createTableConfig.getTargetName().getTableName(); - return new PipelineDDLGenerator(metaData).generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName, sqlParserEngine); + return new PipelineDDLGenerator(metaData).generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName, sqlParserEngine, targetDatabaseName); } private void executeTargetTableSQL(final Connection targetConnection, final String sql) throws SQLException { diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java index d9be8f69bdb2c..f14bb707ff0d7 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.parser.SQLParserEngine; import java.util.Collection; +import java.util.Map; /** * Prepare target tables parameter. @@ -38,5 +39,7 @@ public final class PrepareTargetTablesParameter { private final SQLParserEngine sqlParserEngine; - private final ShardingSphereMetaData metaData; + private final Map targetSchemaMetaData; + + private final String targetDatabaseName; } diff --git a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java index 06d26a8cf5e54..73013470e88e8 100644 --- a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java +++ b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java @@ -17,19 +17,24 @@ package org.apache.shardingsphere.data.pipeline.core.preparer.datasource; +import lombok.SneakyThrows; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.CreateTableConfiguration; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetSchemasParameter; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.PrepareTargetTablesParameter; +import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.junit.jupiter.api.Test; +import java.sql.SQLException; import java.util.Collections; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -45,11 +50,17 @@ void assertPrepareTargetSchemasWithSchemaNotAvailable() { } @Test + @SneakyThrows(SQLException.class) void assertPrepareTargetTables() { CreateTableConfiguration createTableConfig = mock(CreateTableConfiguration.class, RETURNS_DEEP_STUBS); when(createTableConfig.getSourceDataSourceConfig().getDatabaseType()).thenReturn(databaseType); + PipelineDataSourceManager pipelineDataSourceManager = mock(PipelineDataSourceManager.class, RETURNS_DEEP_STUBS); + ShardingSphereConnection connection = mock(ShardingSphereConnection.class, RETURNS_DEEP_STUBS); + when(pipelineDataSourceManager.getDataSource(any()).getConnection()).thenReturn(connection); + when(connection.getContextManager().getMetaDataContexts().getMetaData()).thenReturn(mock(ShardingSphereMetaData.class)); PrepareTargetTablesParameter parameter = new PrepareTargetTablesParameter( - Collections.singleton(createTableConfig), mock(PipelineDataSourceManager.class, RETURNS_DEEP_STUBS), mock(SQLParserEngine.class), mock(ShardingSphereMetaData.class)); + Collections.singleton(createTableConfig), pipelineDataSourceManager, + mock(SQLParserEngine.class), mock(Map.class), "foo_db"); assertDoesNotThrow(() -> new PipelineJobDataSourcePreparer(databaseType).prepareTargetTables(parameter)); } } diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 110ff5ac616a8..ecb2df8815d92 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -24,8 +24,8 @@ import org.apache.shardingsphere.data.pipeline.core.checker.PipelineDataSourceCheckEngine; import org.apache.shardingsphere.data.pipeline.core.context.PipelineContextKey; import org.apache.shardingsphere.data.pipeline.core.context.PipelineContextManager; -import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSource; +import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; import org.apache.shardingsphere.data.pipeline.core.exception.PipelineJobCancelingException; import org.apache.shardingsphere.data.pipeline.core.exception.job.PrepareJobWithGetBinlogPositionException; import org.apache.shardingsphere.data.pipeline.core.execute.PipelineExecuteEngine; @@ -77,6 +77,7 @@ import java.sql.SQLException; import java.util.Collection; import java.util.Collections; +import java.util.Map; /** * Migration job preparer. @@ -157,11 +158,11 @@ private void prepareTarget(final MigrationJobItemContext jobItemContext, final D Collection createTableConfigs = jobItemContext.getTaskConfig().getCreateTableConfigurations(); PipelineDataSourceManager dataSourceManager = jobItemContext.getDataSourceManager(); PipelineJobDataSourcePreparer preparer = new PipelineJobDataSourcePreparer(targetDatabaseType); - preparer.prepareTargetSchemas(new PrepareTargetSchemasParameter(targetDatabaseType, createTableConfigs, dataSourceManager)); + Map targetSchemaMetaData = preparer.prepareTargetSchemas(new PrepareTargetSchemasParameter(targetDatabaseType, createTableConfigs, dataSourceManager)); ShardingSphereMetaData metaData = contextManager.getMetaDataContexts().getMetaData(); SQLParserEngine sqlParserEngine = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class) .getSQLParserEngine(metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType()); - preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine, metaData)); + preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine, targetSchemaMetaData, jobConfig.getTargetDatabaseName())); } private void prepareIncremental(final MigrationJobItemContext jobItemContext) { From 49b2896c43c54329ce07db2afc5e12f02367bc8e Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 20 Dec 2024 13:47:47 +0800 Subject: [PATCH 108/192] Use sql bind info in EncryptInsertPredicateColumnTokenGenerator to avoid wrong column table mapping (#34110) * Use sql bind info in EncryptInsertPredicateColumnTokenGenerator to avoid wrong column table mapping * update release note --- RELEASE-NOTES.md | 1 + ...ptInsertPredicateColumnTokenGenerator.java | 11 +------- .../EncryptPredicateColumnTokenGenerator.java | 27 ++++++------------- .../EncryptGeneratorFixtureBuilder.java | 12 ++++++--- ...ryptPredicateColumnTokenGeneratorTest.java | 3 --- .../cases/dql/e2e-dql-select-sub-query.xml | 8 ++++++ 6 files changed, 26 insertions(+), 36 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 15249fef963f4..edc87b648e8d2 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -56,6 +56,7 @@ 1. Encrypt: Fixes merge exception without encrypt rule in database - [#33708](https://github.com/apache/shardingsphere/pull/33708) 1. SQL Binder: Fixes the expression segment cannot find the outer table when binding - [#34015](https://github.com/apache/shardingsphere/pull/34015) 1. Proxy: Fixes "ALL PRIVILEGES ON `DB`.*" is not recognized during SELECT privilege verification for MySQL - [#34037](https://github.com/apache/shardingsphere/pull/34037) +1. Encrypt: Use sql bind info in EncryptInsertPredicateColumnTokenGenerator to avoid wrong column table mapping - [#34110](https://github.com/apache/shardingsphere/pull/34110) ### Change Logs diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java index 609c050a10d90..d93fc96219038 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptInsertPredicateColumnTokenGenerator.java @@ -23,13 +23,10 @@ import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.SchemaMetaDataAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; import java.util.Collection; -import java.util.Map; /** * Insert predicate column token generator for encrypt. @@ -37,14 +34,10 @@ @HighFrequencyInvocation @RequiredArgsConstructor @Setter -public final class EncryptInsertPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator, SchemaMetaDataAware { +public final class EncryptInsertPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator { private final EncryptRule rule; - private Map schemas; - - private ShardingSphereSchema defaultSchema; - @Override public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof InsertStatementContext && null != ((InsertStatementContext) sqlStatementContext).getInsertSelectContext() @@ -54,8 +47,6 @@ public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) @Override public Collection generateSQLTokens(final SQLStatementContext sqlStatementContext) { EncryptPredicateColumnTokenGenerator generator = new EncryptPredicateColumnTokenGenerator(rule); - generator.setSchemas(schemas); - generator.setDefaultSchema(defaultSchema); return generator.generateSQLTokens(((InsertStatementContext) sqlStatementContext).getInsertSelectContext().getSelectStatementContext()); } } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java index 191380747b5c8..af41bb328b9e6 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGenerator.java @@ -30,27 +30,23 @@ import org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.SchemaMetaDataAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstitutableColumnNameToken; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.AndPredicate; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; -import java.util.Map; import java.util.Optional; /** @@ -59,14 +55,10 @@ @HighFrequencyInvocation @RequiredArgsConstructor @Setter -public final class EncryptPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator, SchemaMetaDataAware { +public final class EncryptPredicateColumnTokenGenerator implements CollectionSQLTokenGenerator { private final EncryptRule rule; - private Map schemas; - - private ShardingSphereSchema defaultSchema; - @Override public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof WhereAvailable && !((WhereAvailable) sqlStatementContext).getWhereSegments().isEmpty(); @@ -77,19 +69,16 @@ public Collection generateSQLTokens(final SQLStatementContext sqlState Collection allSubqueryContexts = SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext); Collection whereSegments = SQLStatementContextExtractor.getWhereSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); Collection columnSegments = SQLStatementContextExtractor.getColumnSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); - ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> defaultSchema); - Map columnExpressionTableNames = ((TableAvailable) sqlStatementContext).getTablesContext().findTableNames(columnSegments, schema); - return generateSQLTokens(columnSegments, columnExpressionTableNames, whereSegments, sqlStatementContext.getDatabaseType()); + return generateSQLTokens(columnSegments, whereSegments, sqlStatementContext.getDatabaseType()); } - private Collection generateSQLTokens(final Collection columnSegments, final Map columnExpressionTableNames, - final Collection whereSegments, final DatabaseType databaseType) { + private Collection generateSQLTokens(final Collection columnSegments, final Collection whereSegments, final DatabaseType databaseType) { Collection result = new LinkedList<>(); for (ColumnSegment each : columnSegments) { - String tableName = columnExpressionTableNames.getOrDefault(each.getExpression(), ""); - Optional encryptTable = rule.findEncryptTable(tableName); - if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) { - result.add(buildSubstitutableColumnNameToken(encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()), each, whereSegments, databaseType)); + Optional encryptTable = rule.findEncryptTable(each.getColumnBoundInfo().getOriginalTable().getValue()); + if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue())) { + EncryptColumn encryptColumn = encryptTable.get().getEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue()); + result.add(buildSubstitutableColumnNameToken(encryptColumn, each, whereSegments, databaseType)); } } return result; diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java index 5befae4ed0535..5ee1eb212fbee 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/fixture/EncryptGeneratorFixtureBuilder.java @@ -168,10 +168,14 @@ public static UpdateStatementContext createUpdateStatementContext() { } private static WhereSegment createWhereSegment() { - BinaryOperationExpression nameExpression = new BinaryOperationExpression(10, 24, - new ColumnSegment(10, 13, new IdentifierValue("name")), new LiteralExpressionSegment(18, 22, "LiLei"), "=", "name = 'LiLei'"); - BinaryOperationExpression pwdExpression = new BinaryOperationExpression(30, 44, - new ColumnSegment(30, 32, new IdentifierValue("pwd")), new LiteralExpressionSegment(40, 45, "123456"), "=", "pwd = '123456'"); + ColumnSegment nameColumnSegment = new ColumnSegment(10, 13, new IdentifierValue("name")); + nameColumnSegment.setColumnBoundInfo( + new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("t_user"), new IdentifierValue("name"))); + BinaryOperationExpression nameExpression = new BinaryOperationExpression(10, 24, nameColumnSegment, new LiteralExpressionSegment(18, 22, "LiLei"), "=", "name = 'LiLei'"); + ColumnSegment pwdColumnSegment = new ColumnSegment(30, 32, new IdentifierValue("pwd")); + pwdColumnSegment.setColumnBoundInfo( + new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("t_user"), new IdentifierValue("pwd"))); + BinaryOperationExpression pwdExpression = new BinaryOperationExpression(30, 44, pwdColumnSegment, new LiteralExpressionSegment(40, 45, "123456"), "=", "pwd = '123456'"); return new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, nameExpression, pwdExpression, "AND", "name = 'LiLei' AND pwd = '123456'")); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java index 5d9dd2c6a185a..1599403278ce1 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateColumnTokenGeneratorTest.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.Test; import java.util.Collection; -import java.util.Collections; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -41,13 +40,11 @@ void setup() { @Test void assertIsGenerateSQLToken() { - generator.setSchemas(Collections.emptyMap()); assertTrue(generator.isGenerateSQLToken(EncryptGeneratorFixtureBuilder.createUpdateStatementContext())); } @Test void assertGenerateSQLTokenFromGenerateNewSQLToken() { - generator.setSchemas(Collections.emptyMap()); Collection substitutableColumnNameTokens = generator.generateSQLTokens(EncryptGeneratorFixtureBuilder.createUpdateStatementContext()); assertThat(substitutableColumnNameTokens.size(), is(1)); assertThat(((SubstitutableColumnNameToken) substitutableColumnNameTokens.iterator().next()).toString(null), is("pwd_assist")); diff --git a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-sub-query.xml b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-sub-query.xml index 09b2c507e1a98..0c89bae490a99 100644 --- a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-sub-query.xml +++ b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-sub-query.xml @@ -86,4 +86,12 @@ scenario-comments="Test join contains some encrypt columns in multi tables when use encrypt feature."> + + + + + + + + From c2e05d94592ccfabc153c96e27b28beaa2d4fb69 Mon Sep 17 00:00:00 2001 From: Ling Hengqian Date: Fri, 20 Dec 2024 14:00:45 +0800 Subject: [PATCH 109/192] Add documentation for P6Spy support (#34059) --- .../graalvm-native-image/_index.cn.md | 6 +- .../graalvm-native-image/_index.en.md | 6 +- .../optional-plugins/clickhouse/_index.cn.md | 12 ++ .../optional-plugins/clickhouse/_index.en.md | 12 ++ .../optional-plugins/hiveserver2/_index.cn.md | 4 +- .../optional-plugins/hiveserver2/_index.en.md | 4 +- .../special-api/transaction/seata.cn.md | 12 ++ .../special-api/transaction/seata.en.md | 12 ++ .../_index.cn.md} | 0 .../_index.en.md} | 0 .../unsupported/p6spy/_index.cn.md | 154 ++++++++++++++ .../unsupported/p6spy/_index.en.md | 156 ++++++++++++++ .../optional-plugins/seata-at/_index.cn.md | 33 +-- .../optional-plugins/seata-at/_index.en.md | 2 +- .../startup/graalvm-native-image.cn.md | 29 +++ .../startup/graalvm-native-image.en.md | 29 +++ .../reflect-config.json | 190 +++++++++++++----- .../resource-config.json | 40 +--- .../reflect-config.json | 4 +- pom.xml | 2 +- test/native/pom.xml | 5 - .../jdbc/databases/ClickHouseTest.java | 12 +- .../natived/jdbc/databases/MySQLTest.java | 11 +- .../natived/jdbc/databases/OpenGaussTest.java | 12 +- .../hive/ZookeeperServiceDiscoveryTest.java | 12 +- .../yaml/jdbc/databases/mysql.yaml | 6 +- .../yaml/jdbc/databases/opengauss.yaml | 6 +- 27 files changed, 598 insertions(+), 173 deletions(-) rename docs/document/content/user-manual/shardingsphere-jdbc/{unsupported.cn.md => unsupported/_index.cn.md} (100%) rename docs/document/content/user-manual/shardingsphere-jdbc/{unsupported.en.md => unsupported/_index.en.md} (100%) create mode 100644 docs/document/content/user-manual/shardingsphere-jdbc/unsupported/p6spy/_index.cn.md create mode 100644 docs/document/content/user-manual/shardingsphere-jdbc/unsupported/p6spy/_index.en.md diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.cn.md index ac678804be491..ed2a75dbc6937 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.cn.md @@ -47,7 +47,7 @@ java.beans.Introspector was unintentionally initialized at build time. To see wh org.graalvm.buildtools native-maven-plugin - 0.10.3 + 0.10.4 true @@ -85,12 +85,12 @@ java.beans.Introspector was unintentionally initialized at build time. To see wh ```groovy plugins { - id 'org.graalvm.buildtools.native' version '0.10.3' + id 'org.graalvm.buildtools.native' version '0.10.4' } dependencies { implementation 'org.apache.shardingsphere:shardingsphere-jdbc:${shardingsphere.version}' - implementation(group: 'org.graalvm.buildtools', name: 'graalvm-reachability-metadata', version: '0.10.3', classifier: 'repository', ext: 'zip') + implementation(group: 'org.graalvm.buildtools', name: 'graalvm-reachability-metadata', version: '0.10.4', classifier: 'repository', ext: 'zip') } graalvmNative { diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.en.md index 680f492bd3fa3..e0bd4a94c10a3 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/graalvm-native-image/_index.en.md @@ -49,7 +49,7 @@ and the documentation of GraalVM Native Build Tools shall prevail. org.graalvm.buildtools native-maven-plugin - 0.10.3 + 0.10.4 true @@ -89,12 +89,12 @@ Reference https://github.com/graalvm/native-build-tools/issues/572 . ```groovy plugins { - id 'org.graalvm.buildtools.native' version '0.10.3' + id 'org.graalvm.buildtools.native' version '0.10.4' } dependencies { implementation 'org.apache.shardingsphere:shardingsphere-jdbc:${shardingsphere.version}' - implementation(group: 'org.graalvm.buildtools', name: 'graalvm-reachability-metadata', version: '0.10.3', classifier: 'repository', ext: 'zip') + implementation(group: 'org.graalvm.buildtools', name: 'graalvm-reachability-metadata', version: '0.10.4', classifier: 'repository', ext: 'zip') } graalvmNative { diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.cn.md index 4c92ac01f1975..9e12705225b84 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.cn.md @@ -98,14 +98,20 @@ dataSources: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_0 + username: default + password: ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_1 + username: default + password: ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_2 + username: default + password: rules: - !SHARDING tables: @@ -305,14 +311,20 @@ dataSources: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_0?transactionSupport=true + username: default + password: ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_1?transactionSupport=true + username: default + password: ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_2?transactionSupport=true + username: default + password: rules: - !SHARDING tables: diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.en.md index 9b46f250e9b8d..0e81b12074829 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/clickhouse/_index.en.md @@ -100,14 +100,20 @@ dataSources: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_0 + username: default + password: ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_1 + username: default + password: ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_2 + username: default + password: rules: - !SHARDING tables: @@ -311,14 +317,20 @@ dataSources: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_0?transactionSupport=true + username: default + password: ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_1?transactionSupport=true + username: default + password: ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.clickhouse.jdbc.ClickHouseDriver jdbcUrl: jdbc:ch://localhost:8123/demo_ds_2?transactionSupport=true + username: default + password: rules: - !SHARDING tables: diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.cn.md index 808b529cb5090..28637148be326 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.cn.md @@ -554,8 +554,8 @@ public class ExampleUtils { assert null == System.getProperty("fixture.hive.ds2.jdbc-url"); String absolutePath = Paths.get("src/test/resources/init.sql").toAbsolutePath().toString(); System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_0;initFile=" + absolutePath); - System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_1;initFile=" + absolutePath); - System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_2;initFile=" + absolutePath); + System.setProperty("fixture.hive.ds1.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_1;initFile=" + absolutePath); + System.setProperty("fixture.hive.ds2.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_2;initFile=" + absolutePath); return new HikariDataSource(config); } finally { System.clearProperty("fixture.hive.ds0.jdbc-url"); diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.en.md index 6f1dd74cd3964..4bc6a90939d63 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/optional-plugins/hiveserver2/_index.en.md @@ -562,8 +562,8 @@ public class ExampleUtils { assert null == System.getProperty("fixture.hive.ds2.jdbc-url"); String absolutePath = Paths.get("src/test/resources/init.sql").toAbsolutePath().toString(); System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_0;initFile=" + absolutePath); - System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_1;initFile=" + absolutePath); - System.setProperty("fixture.hive.ds0.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_2;initFile=" + absolutePath); + System.setProperty("fixture.hive.ds1.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_1;initFile=" + absolutePath); + System.setProperty("fixture.hive.ds2.jdbc-url", "jdbc:hive2://localhost:10000/demo_ds_2;initFile=" + absolutePath); return new HikariDataSource(config); } finally { System.clearProperty("fixture.hive.ds0.jdbc-url"); diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md index de095f278039c..1584e879375d3 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.cn.md @@ -609,3 +609,15 @@ public class CustomWebMvcConfigurer implements WebMvcConfigurer { 5. 微服务实例 `a-service` 和 `b-service` 均为 Spring Boot 微服务,但使用的组件是 Spring WebFlux 而非 Spring WebMVC。 在反应式编程 API 下 ShardingSphere JDBC 无法处理 R2DBC DataSource,仅可处理 JDBC DataSource。 在使用 WebFlux 组件的 Spring Boot 微服务中应避免创建 ShardingSphere JDBC DataSource。 + +### Log 配置 + +在业务项目启动 Seata Client 后,可能看到如下的 Error Log。 + +```shell +[ERROR] 2024-12-20 11:46:43.878 [ForkJoinPool.commonPool-worker-1] o.a.s.config.ConfigurationFactory - failed to load non-spring configuration :not found service provider for : org.apache.seata.config.ConfigurationProvider +org.apache.seata.common.loader.EnhancedServiceNotFoundException: not found service provider for : org.apache.seata.config.ConfigurationProvider +``` + +根据 https://github.com/apache/incubator-seata/issues/6886 ,抛出此异常是 Seata Client 的预期行为。 +用户可通过在业务项目的 classpath 放置 `logback.xml` 对 Seata Client 的日志加以配置。 diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md index b34d4c8af9ccf..0f860f011675f 100644 --- a/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md +++ b/docs/document/content/user-manual/shardingsphere-jdbc/special-api/transaction/seata.en.md @@ -641,3 +641,15 @@ public class CustomWebMvcConfigurer implements WebMvcConfigurer { 5. Both microservice instances `a-service` and `b-service` are Spring Boot microservices, but the components used are Spring WebFlux instead of Spring WebMVC. ShardingSphere JDBC cannot handle R2DBC DataSource under the reactive programming API, only JDBC DataSource. Avoid creating ShardingSphere JDBC DataSource in Spring Boot microservices using WebFlux components. + +### Log Configuration + +After starting Seata Client in a business project, you may see the following Error Log. + +```shell +[ERROR] 2024-12-20 11:46:43.878 [ForkJoinPool.commonPool-worker-1] o.a.s.config.ConfigurationFactory - failed to load non-spring configuration :not found service provider for : org.apache.seata.config.ConfigurationProvider +org.apache.seata.common.loader.EnhancedServiceNotFoundException: not found service provider for : org.apache.seata.config.ConfigurationProvider +``` + +According to https://github.com/apache/incubator-seata/issues/6886 , throwing this exception is the expected behavior of Seata Client. +Users can configure the log of Seata Client by placing `logback.xml` in the classpath of the business project. diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/unsupported.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/unsupported/_index.cn.md similarity index 100% rename from docs/document/content/user-manual/shardingsphere-jdbc/unsupported.cn.md rename to docs/document/content/user-manual/shardingsphere-jdbc/unsupported/_index.cn.md diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/unsupported.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/unsupported/_index.en.md similarity index 100% rename from docs/document/content/user-manual/shardingsphere-jdbc/unsupported.en.md rename to docs/document/content/user-manual/shardingsphere-jdbc/unsupported/_index.en.md diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/unsupported/p6spy/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/unsupported/p6spy/_index.cn.md new file mode 100644 index 0000000000000..dd5418d15faee --- /dev/null +++ b/docs/document/content/user-manual/shardingsphere-jdbc/unsupported/p6spy/_index.cn.md @@ -0,0 +1,154 @@ ++++ +title = "P6Spy" +weight = 6 ++++ + +## 背景信息 + +ShardingSphere 通过 `org.apache.shardingsphere:shardingsphere-infra-database-p6spy` 模块, +对 `com.p6spy.engine.spy.P6SpyDriver` 提供部分支持。 + +## 前提条件 + +要在 ShardingSphere 的配置文件为 MySQL Server 数据节点使用 P6Spy, 可能的 Maven 依赖关系如下, + +```xml + + + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere.version} + + + p6spy + p6spy + 3.9.1 + + + com.mysql + mysql-connector-j + 9.1.0 + + +``` + +## 配置示例 + +### 启动 MySQL Server + +编写 Docker Compose 文件来启动 MySQL Server。 + +```yaml +services: + mysql: + image: mysql:9.1.0 + environment: + MYSQL_ROOT_PASSWORD: example + volumes: + - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + ports: + - "3306:3306" +``` + +`./docker-entrypoint-initdb.d` 文件夹包含文件为 `init.sh`,内容如下, + +```shell +#!/bin/bash +set -e + +mysql -uroot -p"$MYSQL_ROOT_PASSWORD" < + + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere.version} + + + p6spy + p6spy + 3.9.1 + + + com.mysql + mysql-connector-j + 9.1.0 + + +``` + +## Configuration Example + +### Start MySQL Server + +Write a Docker Compose file to start MySQL Server. + +```yaml +services: + mysql: + image: mysql:9.1.0 + environment: + MYSQL_ROOT_PASSWORD: example + volumes: + - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + ports: + - "3306:3306" +``` + +The `./docker-entrypoint-initdb.d` folder contains the file `init.sh`, the content is as follows, + +```shell +#!/bin/bash +set -e + +mysql -uroot -p"$MYSQL_ROOT_PASSWORD" < - - - org.apache.shardingsphere - shardingsphere-transaction-base-seata-at - ${shardingsphere.version} - - - org.apache.seata - seata-all - 2.2.0 - - - org.antlr - antlr4-runtime - - - - - -``` diff --git a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md index 9876c84742da6..cac93bf05dc93 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/optional-plugins/seata-at/_index.en.md @@ -14,7 +14,7 @@ but there are some differences, 1. If the user uses ShardingSphere JDBC in a hybrid deployment architecture, this scenario does not directly interact with ShardingSphere Proxy and is therefore not relevant to this article. This article only discusses the scenario where the business project does not use ShardingSphere JDBC 2. Seata Client only exists in ShardingSphere Proxy, and the business project does not need to rely on Seata Client -3. The R2BDC DataSource of the business project can be normally connected to the ShardingSphere Proxy with Seata integration turned on +3. The R2DBC DataSource of the business project can be normally connected to the ShardingSphere Proxy with Seata integration turned on 4. For ShardingSphere Proxy with Seata integration turned on, it is not possible to establish a `transaction propagation across services` operation to propagate transactions to other ShardingSphere Proxy instances using Seata integration or other microservices using Seata integration. If users have such needs, they should consider submitting a PR for ShardingSphere 5. The assumptions made by ShardingSphere JDBC on Seata's TCC mode are invalid on ShardingSphere Proxy diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md index 3b1a0f5267e94..272a3b41fece0 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md @@ -178,3 +178,32 @@ services: 用户需要关注尚未关闭的 https://github.com/oracle/graal/issues/8177 。 若用户期望在 ShardingSphere Proxy Native 下使用这类 Java Agent,则需要关注 https://github.com/oracle/graal/pull/8077 涉及的变动。 + +## Seata AT 模式集成 + +对于 GraalVM Native Image 形态的 ShardingSphere Proxy Native, +用户始终需要修改 ShardingSphere 源代码以添加 Seata Client 和 Seata 集成的 Maven 模块,并编译为 GraalVM Native Image。 +GraalVM Native Image 形态的 ShardingSphere Proxy Native 无法识别额外添加的 JAR 文件。 + +```xml + + + + org.apache.shardingsphere + shardingsphere-transaction-base-seata-at + ${shardingsphere.version} + + + org.apache.seata + seata-all + 2.2.0 + + + org.antlr + antlr4-runtime + + + + + +``` diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md index 392407cf5f658..f03450ba001e7 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md @@ -185,3 +185,32 @@ For Java Agents such as `ShardingSphere Agent`, the `native-image` component of Users need to pay attention to https://github.com/oracle/graal/issues/8177 which has not been closed. If users expect to use such Java Agents under ShardingSphere Proxy Native, they need to pay attention to the changes involved in https://github.com/oracle/graal/pull/8077 . + +## Seata AT mode integration + +For ShardingSphere Proxy Native in GraalVM Native Image, +Users always need to modify the ShardingSphere source code to add the Seata Client and Seata integrated Maven modules and compile them into GraalVM Native Image. +ShardingSphere Proxy Native in GraalVM Native Image cannot recognize the additional JAR files. + +```xml + + + + org.apache.shardingsphere + shardingsphere-transaction-base-seata-at + ${shardingsphere.version} + + + org.apache.seata + seata-all + 2.2.0 + + + org.antlr + antlr4-runtime + + + + + +``` diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json index dfa0c21e71fb5..4c06eb6ee0f01 100644 --- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json +++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/reflect-config.json @@ -3,6 +3,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource"}, "name":"JdkLogger" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine"}, + "name":"JdkLogger" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"}, "name":"[Lcom.fasterxml.jackson.databind.deser.BeanDeserializerModifier;" @@ -24,7 +28,7 @@ "name":"[Lcom.github.dockerjava.api.model.VolumesFrom;" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager$$Lambda/0x00007faf37e08000"}, + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager$$Lambda/0x00007f30b7e11630"}, "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, { @@ -68,11 +72,11 @@ "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory"}, + "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService"}, "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder"}, "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, { @@ -87,6 +91,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, + "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource"}, "name":"[Ljava.lang.String;" @@ -95,6 +103,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.DatabaseTypeEngine"}, "name":"[Ljava.sql.Statement;" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry"}, + "name":"[Ljava.sql.Statement;" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.mysql.checker.MySQLDatabasePrivilegeChecker"}, "name":"[Ljava.sql.Statement;" @@ -103,6 +115,14 @@ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository"}, "name":"[Ljava.sql.Statement;" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, + "name":"[Ljava.sql.Statement;" +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, + "name":"[Ljava.sql.Statement;" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.hive.metadata.data.loader.HiveMetaDataLoader"}, "name":"com.sun.security.auth.UnixPrincipal" @@ -253,10 +273,6 @@ "name":"java.lang.ClassLoader", "queryAllDeclaredMethods":true }, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "name":"java.lang.ClassLoader" -}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "name":"java.lang.Cloneable", @@ -300,6 +316,11 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "name":"java.lang.Number" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.algorithm.core.processor.AlgorithmChangedProcessor"}, + "name":"java.lang.Object", + "allDeclaredFields":true +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.hive.metadata.data.loader.HiveMetaDataLoader"}, "name":"java.lang.Object", @@ -356,7 +377,7 @@ "allDeclaredFields":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"java.lang.Object", "allDeclaredFields":true }, @@ -365,11 +386,6 @@ "name":"java.lang.Object", "allDeclaredFields":true }, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.mode.processor.AlgorithmChangedProcessor"}, - "name":"java.lang.Object", - "allDeclaredFields":true -}, { "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.changed.DefaultDatabaseShardingStrategyChangedProcessor"}, "name":"java.lang.Object", @@ -671,12 +687,12 @@ "name":"java.util.OptionalLong" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.algorithm.core.processor.AlgorithmChangedProcessor"}, "name":"java.util.Properties", "methods":[{"name":"","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.processor.AlgorithmChangedProcessor"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, "name":"java.util.Properties", "methods":[{"name":"","parameterTypes":[] }] }, @@ -733,6 +749,11 @@ "queryAllPublicConstructors":true, "methods":[{"name":"","parameterTypes":[] }, {"name":"add","parameterTypes":["long"] }, {"name":"sum","parameterTypes":[] }] }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask"}, + "name":"java.util.concurrent.atomic.Striped64$Cell", + "fields":[{"name":"value"}] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "name":"java.util.function.DoubleFunction", @@ -788,10 +809,6 @@ "name":"java.util.function.ToLongFunction", "queryAllPublicMethods":true }, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "name":"java.util.logging.Logger" -}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "name":"java.util.regex.Matcher" @@ -946,7 +963,7 @@ "allDeclaredFields":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration", "allDeclaredFields":true }, @@ -1087,6 +1104,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.DatabaseTypeEngine"}, "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry"}, + "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.mysql.checker.MySQLDatabasePrivilegeChecker"}, "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" @@ -1096,8 +1117,12 @@ "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, - "name":"org.apache.shardingsphere.driver.executor.engine.facade.standard.StandardDriverExecutorFacadeFactory" + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, + "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, + "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, @@ -1307,29 +1332,29 @@ "name":"org.apache.shardingsphere.globalclock.yaml.config.YamlGlobalClockRuleConfigurationCustomizer" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.algorithm.core.processor.AlgorithmChangedProcessor"}, "name":"org.apache.shardingsphere.infra.algorithm.core.yaml.YamlAlgorithmConfiguration", "allDeclaredFields":true, - "queryAllPublicMethods":true, "methods":[{"name":"","parameterTypes":[] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setType","parameterTypes":["java.lang.String"] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.MetaDataPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, "name":"org.apache.shardingsphere.infra.algorithm.core.yaml.YamlAlgorithmConfiguration", "allDeclaredFields":true, - "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setType","parameterTypes":["java.lang.String"] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.MetaDataPersistService"}, "name":"org.apache.shardingsphere.infra.algorithm.core.yaml.YamlAlgorithmConfiguration", "allDeclaredFields":true, "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.processor.AlgorithmChangedProcessor"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.infra.algorithm.core.yaml.YamlAlgorithmConfiguration", "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setType","parameterTypes":["java.lang.String"] }] + "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, @@ -1401,6 +1426,18 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.props.TypedPropertyValue"}, "name":"org.apache.shardingsphere.infra.database.clickhouse.type.ClickHouseDatabaseType" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, + "name":"org.apache.shardingsphere.infra.database.firebird.connector.FirebirdConnectionPropertiesParser" +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry"}, + "name":"org.apache.shardingsphere.infra.database.firebird.metadata.database.FirebirdDatabaseMetaData" +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.props.TypedPropertyValue"}, + "name":"org.apache.shardingsphere.infra.database.firebird.type.FirebirdDatabaseType" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, "name":"org.apache.shardingsphere.infra.database.h2.checker.H2DatabasePrivilegeChecker" @@ -1573,6 +1610,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.props.TypedPropertyValue"}, "name":"org.apache.shardingsphere.infra.database.testcontainers.type.TcClickHouseDatabaseType" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.props.TypedPropertyValue"}, + "name":"org.apache.shardingsphere.infra.database.testcontainers.type.TcFirebirdDatabaseType" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.props.TypedPropertyValue"}, "name":"org.apache.shardingsphere.infra.database.testcontainers.type.TcMariaDBDatabaseType" @@ -2066,83 +2107,88 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, "name":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfigurationCustomizer" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, + "name":"org.apache.shardingsphere.mode.event.deliver.DeliverEventSubscriber", + "queryAllDeclaredMethods":true +}, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "name":"org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.deliver.DeliverQualifiedDataSourceSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.CacheEvictedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.CacheEvictedSubscriber", "queryAllDeclaredMethods":true, "methods":[{"name":"cleanCache","parameterTypes":["org.apache.shardingsphere.mode.event.dispatch.DispatchEvent"] }] }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.ComputeNodeStateSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.ComputeNodeStateSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.DatabaseDataChangedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.DatabaseDataChangedSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.GlobalRuleConfigurationEventSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.GlobalRuleConfigurationEventSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.ListenerAssistedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.ListenerAssistedSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.MetaDataChangedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.MetaDataChangedSubscriber", "queryAllDeclaredMethods":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.listener.DatabaseMetaDataChangedListener$$Lambda/0x00007faf37cad3a8"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.MetaDataChangedSubscriber" + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener$$Lambda/0x00007f30b7cb7388"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.MetaDataChangedSubscriber" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.ProcessListChangedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.ProcessListChangedSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.PropertiesEventSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.PropertiesEventSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.QualifiedDataSourceSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.QualifiedDataSourceSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.RuleItemChangedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.RuleItemChangedSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.StateChangedSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StateChangedSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.StorageUnitEventSubscriber", + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.StorageUnitEventSubscriber", "queryAllDeclaredMethods":true }, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.persist.PersistServiceFacade"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.persist.ClusterPersistServiceBuilder", + "name":"org.apache.shardingsphere.mode.manager.cluster.persist.builder.ClusterPersistServiceBuilder", "methods":[{"name":"","parameterTypes":[] }] }, { @@ -2155,7 +2201,7 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.persist.PersistServiceFacade"}, - "name":"org.apache.shardingsphere.mode.manager.standalone.persist.StandalonePersistServiceBuilder", + "name":"org.apache.shardingsphere.mode.manager.standalone.persist.builder.StandalonePersistServiceBuilder", "methods":[{"name":"","parameterTypes":[] }] }, { @@ -2454,6 +2500,15 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader"}, "name":"org.apache.shardingsphere.readwritesplitting.checker.ReadwriteSplittingRuleConfigurationChecker" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, + "name":"org.apache.shardingsphere.readwritesplitting.cluster.ReadwriteSplittingQualifiedDataSourceDeletedSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder"}, + "name":"org.apache.shardingsphere.readwritesplitting.cluster.ReadwriteSplittingQualifiedDataSourceDeletedSubscriber" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, "name":"org.apache.shardingsphere.readwritesplitting.distsql.handler.update.AlterReadwriteSplittingRuleExecutor" @@ -2990,7 +3045,7 @@ "allDeclaredFields":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration", "allDeclaredFields":true }, @@ -3027,7 +3082,7 @@ "methods":[{"name":"getActualDataNodes","parameterTypes":[] }, {"name":"getAuditStrategy","parameterTypes":[] }, {"name":"getDatabaseStrategy","parameterTypes":[] }, {"name":"getKeyGenerateStrategy","parameterTypes":[] }, {"name":"getLogicTable","parameterTypes":[] }, {"name":"getTableStrategy","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.sharding.yaml.config.rule.YamlTableRuleConfiguration", "allDeclaredFields":true, "methods":[{"name":"getActualDataNodes","parameterTypes":[] }, {"name":"getAuditStrategy","parameterTypes":[] }, {"name":"getDatabaseStrategy","parameterTypes":[] }, {"name":"getKeyGenerateStrategy","parameterTypes":[] }, {"name":"getLogicTable","parameterTypes":[] }, {"name":"getTableStrategy","parameterTypes":[] }] @@ -3097,7 +3152,7 @@ "methods":[{"name":"getComplex","parameterTypes":[] }, {"name":"getHint","parameterTypes":[] }, {"name":"getNone","parameterTypes":[] }, {"name":"getStandard","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration", "allDeclaredFields":true, "methods":[{"name":"getComplex","parameterTypes":[] }, {"name":"getHint","parameterTypes":[] }, {"name":"getNone","parameterTypes":[] }, {"name":"getStandard","parameterTypes":[] }] @@ -3218,7 +3273,7 @@ "allDeclaredFields":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.StandaloneMetaDataManagerPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService"}, "name":"org.apache.shardingsphere.single.yaml.config.YamlSingleRuleConfiguration", "allDeclaredFields":true }, @@ -3246,6 +3301,11 @@ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.cache.ParseTreeCacheBuilder"}, "name":"org.apache.shardingsphere.sql.parser.core.database.cache.ParseTreeCacheLoader" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"}, + "name":"org.apache.shardingsphere.sql.parser.firebird.visitor.statement.FirebirdStatementVisitorFacade", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"}, "name":"org.apache.shardingsphere.sql.parser.hive.visitor.statement.HiveStatementVisitorFacade", @@ -3416,6 +3476,16 @@ "name":"org.apache.shardingsphere.sql.parser.statement.hive.dml.HiveSelectStatement", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, + "name":"org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory"}, + "name":"org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory"}, "name":"org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLDeleteStatement", @@ -3446,6 +3516,11 @@ "name":"org.apache.shardingsphere.sql.parser.statement.mysql.dml.MySQLSelectStatement", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, + "name":"org.apache.shardingsphere.sql.parser.statement.opengauss.ddl.OpenGaussCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement"}, "name":"org.apache.shardingsphere.sql.parser.statement.opengauss.dml.OpenGaussInsertStatement", @@ -3461,6 +3536,16 @@ "name":"org.apache.shardingsphere.sql.parser.statement.opengauss.dml.OpenGaussSelectStatement", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, + "name":"org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.parse.PostgreSQLComParseExecutor"}, + "name":"org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.parse.PostgreSQLComParseExecutor"}, "name":"org.apache.shardingsphere.sql.parser.statement.postgresql.dml.PostgreSQLDeleteStatement", @@ -3491,6 +3576,11 @@ "name":"org.apache.shardingsphere.sql.parser.statement.postgresql.dml.PostgreSQLSelectStatement", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, + "name":"org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.SQLServerCreateTableStatement", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement"}, "name":"org.apache.shardingsphere.sql.parser.statement.sqlserver.dml.SQLServerInsertStatement", diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json index ea846a4d3982c..6b0205ad0ab81 100644 --- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json +++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/generated-reachability-metadata/resource-config.json @@ -3,9 +3,6 @@ "includes":[{ "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "pattern":"\\QMETA-INF/dgminfo\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/druid-driver.properties\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"}, "pattern":"\\QMETA-INF/groovy/org.codehaus.groovy.runtime.ExtensionModule\\E" @@ -21,9 +18,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/seata/io.seata.core.auth.AuthSigner\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/seata/io.seata.core.context.ContextCore\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/seata/io.seata.core.model.ResourceManager\\E" @@ -45,9 +39,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/seata/org.apache.seata.core.auth.AuthSigner\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/seata/org.apache.seata.core.context.ContextCore\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/seata/org.apache.seata.core.model.ResourceManager\\E" @@ -66,9 +57,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/seata/org.apache.seata.rm.datasource.exec.InsertExecutor\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/seata/org.apache.seata.rm.datasource.undo.UndoLogManager\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/seata/org.apache.seata.rm.datasource.undo.UndoLogParser\\E" @@ -87,9 +75,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/seata/org.apache.seata.sqlparser.struct.TableMetaCache\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/seata/org.apache.seata.sqlparser.util.DbTypeParser\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.transaction.xa.atomikos.manager.AtomikosTransactionManagerProvider"}, "pattern":"\\QMETA-INF/services/com.atomikos.icatch.TransactionServicePlugin\\E" @@ -106,7 +91,7 @@ "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager"}, "pattern":"\\QMETA-INF/services/com.clickhouse.client.ClickHouseClient\\E" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager$$Lambda/0x00007faf37cb8640"}, + "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.connection.DriverDatabaseConnectionManager$$Lambda/0x00007f30b7cc6cb8"}, "pattern":"\\QMETA-INF/services/com.clickhouse.client.ClickHouseClient\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource"}, @@ -123,9 +108,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/io.seata.core.auth.AuthSigner\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/services/io.seata.core.context.ContextCore\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/io.seata.core.model.ResourceManager\\E" @@ -180,9 +162,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/org.apache.seata.core.auth.AuthSigner\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/services/org.apache.seata.core.context.ContextCore\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/org.apache.seata.core.model.ResourceManager\\E" @@ -201,9 +180,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/services/org.apache.seata.rm.datasource.exec.InsertExecutor\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/services/org.apache.seata.rm.datasource.undo.UndoLogManager\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/services/org.apache.seata.rm.datasource.undo.UndoLogParser\\E" @@ -222,9 +198,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.backend.connector.StandardDatabaseConnector"}, "pattern":"\\QMETA-INF/services/org.apache.seata.sqlparser.struct.TableMetaCache\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\QMETA-INF/services/org.apache.seata.sqlparser.util.DbTypeParser\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.authority.rule.AuthorityRule"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.authority.spi.PrivilegeProvider\\E" @@ -246,9 +219,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.parse.PostgreSQLComParseExecutor"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.distsql.parser.engine.spi.DistSQLParserFacade\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"}, - "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.driver.executor.engine.facade.DriverExecutorFacadeFactory\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm\\E" @@ -298,7 +268,7 @@ "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.executor.checker.SQLExecutionChecker\\E" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.executor.sql.hook.SQLExecutionHook\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.executor.sql.prepare.AbstractExecutionPrepareEngine"}, @@ -351,6 +321,9 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.logging.spi.ShardingSphereLogBuilder\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder"}, + "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.event.deliver.DeliverEventSubscriber\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.proxy.initializer.BootstrapInitializer"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder\\E" @@ -474,9 +447,6 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.transaction.xa.atomikos.manager.AtomikosTransactionManagerProvider"}, "pattern":"\\Qjta.properties\\E" - }, { - "condition":{"typeReachable":"org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingSphereTransactionManager"}, - "pattern":"\\Qlib/sqlparser/druid.jar\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.hive.metadata.data.loader.HiveMetaDataLoader"}, "pattern":"\\Qmapred-default.xml\\E" diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json index 4597bf4a5967c..f6b28429413e3 100644 --- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json +++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json @@ -239,8 +239,8 @@ "allPublicMethods":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, - "name":"org.apache.shardingsphere.mode.manager.cluster.event.subscriber.dispatch.MetaDataChangedSubscriber", + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.MetaDataChangedSubscriber", "allPublicMethods":true }, { diff --git a/pom.xml b/pom.xml index b92b8d15cf196..8851b93a3b2be 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,7 @@ 0.6.1 1.4.13 0.3.1 - 0.10.3 + 0.10.4 1.0.0 diff --git a/test/native/pom.xml b/test/native/pom.xml index 61b583aabeb56..ae1954a51d30a 100644 --- a/test/native/pom.xml +++ b/test/native/pom.xml @@ -216,11 +216,6 @@ mssqlserver test - - org.testcontainers - clickhouse - test - org.apache.curator curator-test diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/ClickHouseTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/ClickHouseTest.java index f54f3db5c5a9f..1b4863d203624 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/ClickHouseTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/ClickHouseTest.java @@ -25,7 +25,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledInNativeImage; -import org.testcontainers.clickhouse.ClickHouseContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.junit.jupiter.Container; @@ -66,11 +65,12 @@ class ClickHouseTest { .withNetworkAliases("clickhouse-keeper-01"); @Container - public static final ClickHouseContainer CONTAINER = new ClickHouseContainer("clickhouse/clickhouse-server:24.11.1.2557") + public static final GenericContainer CONTAINER = new GenericContainer<>("clickhouse/clickhouse-server:24.11.1.2557") .withCopyFileToContainer( MountableFile.forHostPath(Paths.get("src/test/resources/test-native/xml/transactions.xml").toAbsolutePath()), "/etc/clickhouse-server/config.d/transactions.xml") .withNetwork(NETWORK) + .withExposedPorts(8123) .dependsOn(CLICKHOUSE_KEEPER_CONTAINER); private static final String SYSTEM_PROP_KEY_PREFIX = "fixture.test-native.yaml.database.clickhouse."; @@ -102,18 +102,18 @@ void assertShardingInLocalTransactions() throws SQLException { private Connection openConnection(final String databaseName) throws SQLException { Properties props = new Properties(); - props.setProperty("user", CONTAINER.getUsername()); - props.setProperty("password", CONTAINER.getPassword()); + props.setProperty("user", "default"); + props.setProperty("password", ""); return DriverManager.getConnection(jdbcUrlPrefix + databaseName, props); } private DataSource createDataSource() throws SQLException { Awaitility.await().atMost(Duration.ofMinutes(1L)).ignoreExceptions().until(() -> { - openConnection(CONTAINER.getDatabaseName()).close(); + openConnection("default").close(); return true; }); try ( - Connection connection = openConnection(CONTAINER.getDatabaseName()); + Connection connection = openConnection("default"); Statement statement = connection.createStatement()) { statement.executeUpdate("CREATE DATABASE demo_ds_0"); statement.executeUpdate("CREATE DATABASE demo_ds_1"); diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java index 876c2659d2fd9..55e49ad0cebe7 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java @@ -52,16 +52,11 @@ class MySQLTest { private static final String SYSTEM_PROP_KEY_PREFIX = "fixture.test-native.yaml.database.mysql."; - private static final String USERNAME = "root"; - - private static final String PASSWORD = "123456"; - - private static final String DATABASE = "test"; + private static final String PASSWORD = "example"; @SuppressWarnings("resource") @Container public static final GenericContainer CONTAINER = new GenericContainer<>("mysql:9.1.0-oraclelinux9") - .withEnv("MYSQL_DATABASE", DATABASE) .withEnv("MYSQL_ROOT_PASSWORD", PASSWORD) .withExposedPorts(3306); @@ -104,9 +99,9 @@ private void initEnvironment() throws SQLException { private Connection openConnection() throws SQLException { Properties props = new Properties(); - props.setProperty("user", USERNAME); + props.setProperty("user", "root"); props.setProperty("password", PASSWORD); - return DriverManager.getConnection(jdbcUrlPrefix + DATABASE, props); + return DriverManager.getConnection(jdbcUrlPrefix, props); } @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"}) diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java index cd818a9014551..81e0396a8932f 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java @@ -47,15 +47,11 @@ class OpenGaussTest { private static final String SYSTEM_PROP_KEY_PREFIX = "fixture.test-native.yaml.database.opengauss."; - private static final String USERNAME = "gaussdb"; - - private static final String PASSWORD = "openGauss@123"; - - private static final String DATABASE = "postgres"; + private static final String PASSWORD = "Enmo@123"; @SuppressWarnings("resource") @Container - public static final GenericContainer CONTAINER = new GenericContainer<>("opengauss/opengauss:5.0.0") + public static final GenericContainer CONTAINER = new GenericContainer<>("enmotech/opengauss-lite:5.1.0") .withEnv("GS_PASSWORD", PASSWORD) .withExposedPorts(5432); @@ -98,9 +94,9 @@ private void initEnvironment() throws SQLException { private Connection openConnection() throws SQLException { Properties props = new Properties(); - props.setProperty("user", USERNAME); + props.setProperty("user", "gaussdb"); props.setProperty("password", PASSWORD); - return DriverManager.getConnection(jdbcUrlPrefix + DATABASE, props); + return DriverManager.getConnection(jdbcUrlPrefix + "postgres", props); } @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"}) diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/hive/ZookeeperServiceDiscoveryTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/hive/ZookeeperServiceDiscoveryTest.java index 9bcaf48dc3a16..8123ef8a8a0c3 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/hive/ZookeeperServiceDiscoveryTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/hive/ZookeeperServiceDiscoveryTest.java @@ -65,11 +65,10 @@ class ZookeeperServiceDiscoveryTest { .withExposedPorts(2181); /** - * TODO Maybe we should be able to find a better solution than {@link InstanceSpec#getRandomPort()} to use a random available port on the host. - * It is not a good practice to use {@link FixedHostPortGenericContainer}. - * See testcontainers/testcontainers-java#9553 . + * Due to the design flaw of testcontainers-java, + * starting HiveServer2 using Zookeeper service discovery can only be done through the deprecated {@link FixedHostPortGenericContainer}. + * See testcontainers/testcontainers-java#9553. */ - @SuppressWarnings("unused") @Container private static final GenericContainer HS2_1_CONTAINER = new FixedHostPortGenericContainer<>("apache/hive:4.0.1") .withNetwork(NETWORK) @@ -105,11 +104,6 @@ static void afterAll() { System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds2.jdbc-url"); } - /** - * TODO Same problem {@link InstanceSpec#getRandomPort()} as {@code HIVE_SERVER2_1_CONTAINER}. - * - * @throws SQLException SQL exception. - */ @Test void assertShardingInLocalTransactions() throws SQLException { jdbcUrlPrefix = "jdbc:hive2://" + ZOOKEEPER_CONTAINER.getHost() + ":" + ZOOKEEPER_CONTAINER.getMappedPort(2181) + "/"; diff --git a/test/native/src/test/resources/test-native/yaml/jdbc/databases/mysql.yaml b/test/native/src/test/resources/test-native/yaml/jdbc/databases/mysql.yaml index 78a812a4f06c3..dfe0be5515778 100644 --- a/test/native/src/test/resources/test-native/yaml/jdbc/databases/mysql.yaml +++ b/test/native/src/test/resources/test-native/yaml/jdbc/databases/mysql.yaml @@ -21,19 +21,19 @@ dataSources: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds0.jdbc-url::} username: root - password: 123456 + password: example ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds1.jdbc-url::} username: root - password: 123456 + password: example ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds2.jdbc-url::} username: root - password: 123456 + password: example rules: - !SHARDING diff --git a/test/native/src/test/resources/test-native/yaml/jdbc/databases/opengauss.yaml b/test/native/src/test/resources/test-native/yaml/jdbc/databases/opengauss.yaml index 38f5051da17cb..96290024a73c5 100644 --- a/test/native/src/test/resources/test-native/yaml/jdbc/databases/opengauss.yaml +++ b/test/native/src/test/resources/test-native/yaml/jdbc/databases/opengauss.yaml @@ -21,19 +21,19 @@ dataSources: driverClassName: org.opengauss.Driver jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds0.jdbc-url::} username: gaussdb - password: openGauss@123 + password: Enmo@123 ds_1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: org.opengauss.Driver jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds1.jdbc-url::} username: gaussdb - password: openGauss@123 + password: Enmo@123 ds_2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: org.opengauss.Driver jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds2.jdbc-url::} username: gaussdb - password: openGauss@123 + password: Enmo@123 rules: - !SHARDING From 3a9a490d28979b5640c5f9d3178ed0d016368321 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 20 Dec 2024 18:22:10 +0800 Subject: [PATCH 110/192] Add prepared statement query for xml assertions (#34111) --- .../e2e/engine/type/dql/GeneralDQLE2EIT.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java index 4d5dc311b0912..3fb3f146b528c 100644 --- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java +++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java @@ -69,6 +69,14 @@ private void assertExecuteQueryWithXmlExpected(final AssertionTestParameter test || "proxy".equals(testParam.getAdapter()) && "empty_storage_units".equalsIgnoreCase(testParam.getScenario())) { return; } + if (SQLExecuteType.LITERAL == context.getSqlExecuteType()) { + assertQueryForStatementWithXmlExpected(context); + } else { + assertQueryForPreparedStatementWithXmlExpected(context); + } + } + + private void assertQueryForStatementWithXmlExpected(final E2ETestContext context) throws SQLException { try ( Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); Statement statement = connection.createStatement(); @@ -77,6 +85,19 @@ private void assertExecuteQueryWithXmlExpected(final AssertionTestParameter test } } + private void assertQueryForPreparedStatementWithXmlExpected(final E2ETestContext context) throws SQLException { + try ( + Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(context.getSQL())) { + for (SQLValue each : context.getAssertion().getSQLValues()) { + preparedStatement.setObject(each.getIndex(), each.getValue()); + } + try (ResultSet resultSet = preparedStatement.executeQuery()) { + assertResultSet(context, resultSet); + } + } + } + private void assertExecuteQueryWithExpectedDataSource(final AssertionTestParameter testParam, final E2ETestContext context) throws SQLException { try ( Connection actualConnection = getEnvironmentEngine().getTargetDataSource().getConnection(); @@ -143,6 +164,14 @@ private void assertExecuteWithXmlExpected(final AssertionTestParameter testParam if ("jdbc".equals(testParam.getAdapter())) { return; } + if (SQLExecuteType.LITERAL == context.getSqlExecuteType()) { + assertExecuteForStatementWithXmlExpected(context); + } else { + assertExecuteForPreparedStatementWithXmlExpected(context); + } + } + + private void assertExecuteForStatementWithXmlExpected(final E2ETestContext context) throws SQLException { try ( Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); Statement statement = connection.createStatement()) { @@ -152,6 +181,20 @@ private void assertExecuteWithXmlExpected(final AssertionTestParameter testParam } } + private void assertExecuteForPreparedStatementWithXmlExpected(final E2ETestContext context) throws SQLException { + try ( + Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(context.getSQL())) { + for (SQLValue each : context.getAssertion().getSQLValues()) { + preparedStatement.setObject(each.getIndex(), each.getValue()); + } + assertTrue(preparedStatement.execute(), "Not a query preparedStatement."); + try (ResultSet resultSet = preparedStatement.getResultSet()) { + assertResultSet(context, resultSet); + } + } + } + private void assertExecuteWithExpectedDataSource(final AssertionTestParameter testParam, final E2ETestContext context) throws SQLException { try ( Connection actualConnection = getEnvironmentEngine().getTargetDataSource().getConnection(); From d093932b0ca42a1b39dbbf60fb0b322ba213a87b Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 21 Dec 2024 17:06:01 +0800 Subject: [PATCH 111/192] Move GlobalLockContext to global package (#34113) --- .../scenario/migration/preparer/MigrationJobPreparer.java | 2 +- .../globalclock/executor/GlobalClockTransactionHook.java | 2 +- .../core/job/statistics/collect/StatisticsCollectJob.java | 2 +- .../mode/lock/{ => global}/GlobalLockContext.java | 3 ++- .../mode/lock/{ => global}/GlobalLockDefinition.java | 2 +- .../refresher/ShardingSphereStatisticsRefreshEngine.java | 4 ++-- .../mode/lock/{ => global}/GlobalLockContextTest.java | 3 ++- .../mode/lock/{ => global}/GlobalLockDefinitionTest.java | 2 +- .../refresher/ShardingSphereStatisticsRefreshEngineTest.java | 2 +- .../mode/manager/cluster/ClusterContextManagerBuilder.java | 2 +- .../dispatch/subscriber/type/ListenerAssistedSubscriber.java | 2 +- .../dispatch/subscriber/type/MetaDataChangedSubscriber.java | 2 +- .../cluster/persist/service/GlobalLockPersistService.java | 2 +- .../cluster/persist/service/GlobalLockPersistServiceTest.java | 2 +- .../manager/standalone/StandaloneContextManagerBuilder.java | 2 +- .../handler/distsql/ral/updatable/LockClusterExecutor.java | 2 +- .../handler/distsql/ral/updatable/UnlockClusterExecutor.java | 2 +- 17 files changed, 20 insertions(+), 18 deletions(-) rename mode/core/src/main/java/org/apache/shardingsphere/mode/lock/{ => global}/GlobalLockContext.java (92%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/lock/{ => global}/GlobalLockDefinition.java (95%) rename mode/core/src/test/java/org/apache/shardingsphere/mode/lock/{ => global}/GlobalLockContextTest.java (94%) rename mode/core/src/test/java/org/apache/shardingsphere/mode/lock/{ => global}/GlobalLockDefinitionTest.java (95%) diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index ecb2df8815d92..77a1ed49a710c 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -70,7 +70,7 @@ import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.rule.SQLParserRule; diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 87a0ba3f06752..8d5e9c7b93aee 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel; import org.apache.shardingsphere.transaction.spi.TransactionHook; diff --git a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java index df146a3d67dc7..d24a581797ff6 100644 --- a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java +++ b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java @@ -20,7 +20,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.elasticjob.api.ShardingContext; import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockContext.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java similarity index 92% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockContext.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java index 59d07d24d6d56..266a1a704048b 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockContext.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java @@ -15,10 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.lock; +package org.apache.shardingsphere.mode.lock.global; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.lock.LockContext; +import org.apache.shardingsphere.mode.lock.LockPersistService; /** * Global lock context. diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java similarity index 95% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinition.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index 7edf9a883222e..43cc3a02154f8 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.lock; +package org.apache.shardingsphere.mode.lock.global; import lombok.Getter; import org.apache.shardingsphere.infra.lock.LockDefinition; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index df64f20982df9..9730c6bd5ffc8 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -34,8 +34,8 @@ import org.apache.shardingsphere.infra.metadata.statistics.collector.ShardingSphereStatisticsCollector; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.metadata.persist.data.AlteredShardingSphereDatabaseData; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockContextTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java similarity index 94% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockContextTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java index e89c8e2233d53..b281c8e4e0da3 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockContextTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.lock; +package org.apache.shardingsphere.mode.lock.global; +import org.apache.shardingsphere.mode.lock.LockPersistService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinitionTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java similarity index 95% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinitionTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java index 2a27eb5f8077d..8f28aeafd0667 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/GlobalLockDefinitionTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.lock; +package org.apache.shardingsphere.mode.lock.global; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java index 5070cbeb49ce2..eb3d204419c89 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaData; import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics; import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereTableData; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index c34ae5186ae7e..b64d4b56d2420 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.util.eventbus.EventSubscriber; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.event.deliver.DeliverEventSubscriber; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.ContextManagerBuilder; import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index c2d5b80768fd5..f97d84c338316 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java index 7ed94f407b9f7..a688874202a53 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java @@ -28,7 +28,7 @@ import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java index 2c6e43d96f2e0..f20366e5e52a5 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java index cf68d00d9fdc1..690d86303cc7f 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index 627e268103922..335256ca580d2 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; -import org.apache.shardingsphere.mode.lock.GlobalLockContext; +import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.ContextManagerBuilder; import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 706e925c19a7f..52e4f65591daf 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -28,7 +28,7 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.LockedClusterException; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.lock.spi.ClusterLockStrategy; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index fb5dab9870ae0..ff314edf85c1b 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -25,7 +25,7 @@ import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.NotLockedClusterException; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; /** From 652d22ddb979db1fc2d8245938d291cf7c9f576e Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Sat, 21 Dec 2024 17:38:01 +0800 Subject: [PATCH 112/192] Support create index statement sql bind (#34112) * Support create index statement sql bind * update release note * update binder expected file * fix checkstyle --- RELEASE-NOTES.md | 1 + ...ardingCreateIndexSupportedCheckerTest.java | 14 ++--- .../ddl/CreateIndexStatementBinder.java | 60 +++++++++++++++++++ .../engine/type/DDLStatementBindEngine.java | 5 ++ .../type/OpenGaussDDLStatementVisitor.java | 3 +- .../type/PostgreSQLDDLStatementVisitor.java | 3 +- .../statement/ddl/CreateIndexStatement.java | 32 ++++++++++ .../ddl/OpenGaussCreateIndexStatement.java | 2 +- .../ddl/PostgreSQLCreateIndexStatement.java | 2 +- .../dialect/opengauss/OpenGaussBinderIT.java | 25 ++++++++ .../postgresql/PostgreSQLBinderIT.java | 25 ++++++++ .../test/resources/cases/ddl/create-index.xml | 40 +++++++++++++ .../test/resources/sqls/ddl/create-index.xml | 21 +++++++ 13 files changed, 222 insertions(+), 11 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java create mode 100644 test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/opengauss/OpenGaussBinderIT.java create mode 100644 test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/postgresql/PostgreSQLBinderIT.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/create-index.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/create-index.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index edc87b648e8d2..298ef5e59adf9 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -35,6 +35,7 @@ 1. Agent: Simplify the use of Agent's Docker Image - [#33356](https://github.com/apache/shardingsphere/pull/33356) 1. Metadata: Add load-table-metadata-batch-size props to concurrent load table metadata - [#34009](https://github.com/apache/shardingsphere/pull/34009) 1. SQL Binder: Add sql bind logic for create table statement - [#34074](https://github.com/apache/shardingsphere/pull/34074) +1. SQL Binder: Support create index statement sql bind - [#34112](https://github.com/apache/shardingsphere/pull/34112) ### Bug Fixes diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java index 1fedc80468e83..20a4daaa6536e 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateIndexSupportedCheckerTest.java @@ -19,9 +19,9 @@ import org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateIndexStatementContext; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.exception.kernel.metadata.DuplicateIndexException; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; @@ -52,7 +52,7 @@ class ShardingCreateIndexSupportedCheckerTest { @Test void assertCheckWhenTableExistIndexNotExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index")))); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); @@ -62,7 +62,7 @@ void assertCheckWhenTableExistIndexNotExistForPostgreSQL() { @Test void assertCheckWhenTableNotExistIndexNotExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index")))); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); @@ -72,7 +72,7 @@ void assertCheckWhenTableNotExistIndexNotExistForPostgreSQL() { @Test void assertCheckWhenTableExistIndexExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.setIndex(new IndexSegment(0, 0, new IndexNameSegment(0, 0, new IdentifierValue("t_order_index")))); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); @@ -83,7 +83,7 @@ void assertCheckWhenTableExistIndexExistForPostgreSQL() { @Test void assertCheckWithoutIndexNameWhenTableExistIndexNotExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.getColumns().add(new ColumnSegment(0, 0, new IdentifierValue("content"))); sqlStatement.setGeneratedIndexStartIndex(10); @@ -94,7 +94,7 @@ void assertCheckWithoutIndexNameWhenTableExistIndexNotExistForPostgreSQL() { @Test void assertCheckWithoutIndexNameWhenTableNotExistIndexNotExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.getColumns().add(new ColumnSegment(0, 0, new IdentifierValue("content"))); sqlStatement.setGeneratedIndexStartIndex(10); @@ -105,7 +105,7 @@ void assertCheckWithoutIndexNameWhenTableNotExistIndexNotExistForPostgreSQL() { @Test void assertCheckWithoutIndexNameWhenTableExistIndexExistForPostgreSQL() { - PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(false); + PostgreSQLCreateIndexStatement sqlStatement = new PostgreSQLCreateIndexStatement(); sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); sqlStatement.getColumns().add(new ColumnSegment(0, 0, new IdentifierValue("content"))); sqlStatement.setGeneratedIndexStartIndex(10); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java new file mode 100644 index 0000000000000..6fb91821bc6d4 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; + +/** + * Create index statement binder. + */ +public final class CreateIndexStatementBinder implements SQLStatementBinder { + + @Override + public CreateIndexStatement bind(final CreateIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { + CreateIndexStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTable(SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts)); + sqlStatement.getColumns() + .forEach(each -> result.getColumns().add(ColumnSegmentBinder.bind(each, SegmentType.DEFINITION_COLUMNS, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static CreateIndexStatement copy(final CreateIndexStatement sqlStatement) { + CreateIndexStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setIndex(sqlStatement.getIndex()); + sqlStatement.getGeneratedIndexStartIndex().ifPresent(result::setGeneratedIndexStartIndex); + result.setIfNotExists(sqlStatement.isIfNotExists()); + sqlStatement.getAlgorithmType().ifPresent(result::setAlgorithmType); + sqlStatement.getLockTable().ifPresent(result::setLockTable); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 948a74bda03c7..6665fc27ec50e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -19,10 +19,12 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; @@ -53,6 +55,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof CreateTableStatement) { return new CreateTableStatementBinder().bind((CreateTableStatement) statement, binderContext); } + if (statement instanceof CreateIndexStatement) { + return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java index bc873d3a0b221..f0940ad4a0d17 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java @@ -528,7 +528,8 @@ public ASTNode visitTruncateTable(final TruncateTableContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitCreateIndex(final CreateIndexContext ctx) { - OpenGaussCreateIndexStatement result = new OpenGaussCreateIndexStatement(null != ctx.ifNotExists()); + OpenGaussCreateIndexStatement result = new OpenGaussCreateIndexStatement(); + result.setIfNotExists(null != ctx.ifNotExists()); result.setTable((SimpleTableSegment) visit(ctx.tableName())); result.getColumns().addAll(((CollectionValue) visit(ctx.indexParams())).getValue()); if (null == ctx.indexName()) { diff --git a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java index dd5a0abf893ba..6a23b13361f77 100644 --- a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java +++ b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java @@ -668,7 +668,8 @@ public ASTNode visitDropSubscription(final DropSubscriptionContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitCreateIndex(final CreateIndexContext ctx) { - PostgreSQLCreateIndexStatement result = new PostgreSQLCreateIndexStatement(null != ctx.ifNotExists()); + PostgreSQLCreateIndexStatement result = new PostgreSQLCreateIndexStatement(); + result.setIfNotExists(null != ctx.ifNotExists()); result.setTable((SimpleTableSegment) visit(ctx.tableName())); result.getColumns().addAll(((CollectionValue) visit(ctx.indexParams())).getValue()); if (null != ctx.indexName()) { diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateIndexStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateIndexStatement.java index d40abeb5f0856..e1b800c0847e8 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateIndexStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/CreateIndexStatement.java @@ -52,6 +52,14 @@ public Optional getGeneratedIndexStartIndex() { return Optional.empty(); } + /** + * Set generated index start index. + * + * @param generatedIndexStartIndex generated index start index + */ + public void setGeneratedIndexStartIndex(final Integer generatedIndexStartIndex) { + } + /** * Judge whether contains if not exists or not. * @@ -61,6 +69,14 @@ public boolean isIfNotExists() { return false; } + /** + * Set if not exists or not. + * + * @param ifNotExists if not exists or not + */ + public void setIfNotExists(final boolean ifNotExists) { + } + /** * Get algorithm type. * @@ -70,6 +86,14 @@ public Optional getAlgorithmType() { return Optional.empty(); } + /** + * Set algorithm type. + * + * @param algorithmType algorithm type + */ + public void setAlgorithmType(final AlgorithmTypeSegment algorithmType) { + } + /** * Get lock table. * @@ -78,4 +102,12 @@ public Optional getAlgorithmType() { public Optional getLockTable() { return Optional.empty(); } + + /** + * Set lock table. + * + * @param lockTable lock table + */ + public void setLockTable(final LockTableSegment lockTable) { + } } diff --git a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateIndexStatement.java b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateIndexStatement.java index bf8e5a11925b3..131156afc2e49 100644 --- a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateIndexStatement.java +++ b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussCreateIndexStatement.java @@ -33,7 +33,7 @@ @Setter public final class OpenGaussCreateIndexStatement extends CreateIndexStatement implements OpenGaussStatement { - private final boolean ifNotExists; + private boolean ifNotExists; private Integer generatedIndexStartIndex; diff --git a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateIndexStatement.java b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateIndexStatement.java index 8abc8d050f941..4a5403a512845 100644 --- a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateIndexStatement.java +++ b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLCreateIndexStatement.java @@ -33,7 +33,7 @@ @Setter public final class PostgreSQLCreateIndexStatement extends CreateIndexStatement implements PostgreSQLStatement { - private final boolean ifNotExists; + private boolean ifNotExists; private Integer generatedIndexStartIndex; diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/opengauss/OpenGaussBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/opengauss/OpenGaussBinderIT.java new file mode 100644 index 0000000000000..e9477b0029636 --- /dev/null +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/opengauss/OpenGaussBinderIT.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.binder.dialect.opengauss; + +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings; + +@SQLBinderITSettings("openGauss") +class OpenGaussBinderIT extends SQLBinderIT { +} diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/postgresql/PostgreSQLBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/postgresql/PostgreSQLBinderIT.java new file mode 100644 index 0000000000000..4256eb33f95a5 --- /dev/null +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/postgresql/PostgreSQLBinderIT.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.binder.dialect.postgresql; + +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings; + +@SQLBinderITSettings("PostgreSQL") +class PostgreSQLBinderIT extends SQLBinderIT { +} diff --git a/test/it/binder/src/test/resources/cases/ddl/create-index.xml b/test/it/binder/src/test/resources/cases/ddl/create-index.xml new file mode 100644 index 0000000000000..ae7c22542bbce --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/create-index.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + +
+ + + + + + + + + +
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-index.xml b/test/it/binder/src/test/resources/sqls/ddl/create-index.xml new file mode 100644 index 0000000000000..4e6253c22108a --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/create-index.xml @@ -0,0 +1,21 @@ + + + + + + From af4d881081a4b62f7f2eab8cbc6cc02330fc6b46 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 21 Dec 2024 20:55:26 +0800 Subject: [PATCH 113/192] Move GlobalLockNames to mode-core module (#34114) --- .../scenario/migration/preparer/MigrationJobPreparer.java | 2 +- .../globalclock/executor/GlobalClockTransactionHook.java | 2 +- .../shardingsphere/mode/lock/global}/GlobalLockNames.java | 5 ++++- .../refresher/ShardingSphereStatisticsRefreshEngine.java | 2 +- .../handler/distsql/ral/updatable/LockClusterExecutor.java | 2 +- .../handler/distsql/ral/updatable/UnlockClusterExecutor.java | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) rename {infra/common/src/main/java/org/apache/shardingsphere/infra/lock => mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global}/GlobalLockNames.java (93%) diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 77a1ed49a710c..3f07a53380f02 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -65,7 +65,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 8d5e9c7b93aee..295d2f1beb8df 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.globalclock.rule.constant.GlobalClockOrder; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/GlobalLockNames.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java similarity index 93% rename from infra/common/src/main/java/org/apache/shardingsphere/infra/lock/GlobalLockNames.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java index 24e7da3605065..1656c137889e3 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/GlobalLockNames.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java @@ -15,11 +15,14 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.lock; +package org.apache.shardingsphere.mode.lock.global; import lombok.Getter; import lombok.RequiredArgsConstructor; +/** + * Global lock names. + */ @RequiredArgsConstructor @Getter public enum GlobalLockNames { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index 9730c6bd5ffc8..28457721b475c 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; import org.apache.shardingsphere.infra.executor.kernel.thread.ExecutorThreadFactoryBuilder; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 52e4f65591daf..075b9ada22656 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.algorithm.core.exception.MissingRequiredAlgorithmException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index ff314edf85c1b..318311e4dc2fa 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired; import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.NotLockedClusterException; From 2f7dfcd711e0db06fac5d94472bd692973535c6e Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 21 Dec 2024 22:10:26 +0800 Subject: [PATCH 114/192] Add StandaloneLockContext and ClusterLockContext (#34115) * Add StandaloneLockContext and ClusterLockContext * Add StandaloneLockContext and ClusterLockContext --- .../collect/StatisticsCollectJob.java | 4 +- ...ShardingSphereStatisticsRefreshEngine.java | 12 ++-- ...dingSphereStatisticsRefreshEngineTest.java | 8 +-- .../cluster/ClusterContextManagerBuilder.java | 4 +- .../type/ListenerAssistedSubscriber.java | 4 +- .../type/MetaDataChangedSubscriber.java | 4 +- .../cluster/lock/ClusterLockContext.java | 42 ++++++++++++++ .../cluster/lock/ClusterLockContextTest.java | 58 +++++++++++++++++++ .../StandaloneContextManagerBuilder.java | 4 +- .../lock/StandaloneLockContext.java | 36 ++++++++++++ 10 files changed, 156 insertions(+), 20 deletions(-) create mode 100644 mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java create mode 100644 mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java create mode 100644 mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java diff --git a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java index d24a581797ff6..bd5537db7201f 100644 --- a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java +++ b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java @@ -20,8 +20,8 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.elasticjob.api.ShardingContext; import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; @@ -39,7 +39,7 @@ public final class StatisticsCollectJob implements SimpleJob { public void execute(final ShardingContext shardingContext) { PersistRepository repository = contextManager.getPersistServiceFacade().getRepository(); if (repository instanceof ClusterPersistRepository) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new GlobalLockContext(new GlobalLockPersistService((ClusterPersistRepository) repository))).refresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService((ClusterPersistRepository) repository))).refresh(); } } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index 28457721b475c..c87b8e1904379 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; import org.apache.shardingsphere.infra.executor.kernel.thread.ExecutorThreadFactoryBuilder; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -34,10 +34,10 @@ import org.apache.shardingsphere.infra.metadata.statistics.collector.ShardingSphereStatisticsCollector; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; +import org.apache.shardingsphere.metadata.persist.data.AlteredShardingSphereDatabaseData; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.metadata.persist.data.AlteredShardingSphereDatabaseData; import java.util.ArrayList; import java.util.Map; @@ -59,7 +59,7 @@ public final class ShardingSphereStatisticsRefreshEngine { private final ContextManager contextManager; - private final GlobalLockContext globalLockContext; + private final LockContext lockContext; /** * Async refresh. @@ -85,7 +85,7 @@ public void refresh() { private void collectAndRefresh() { GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.STATISTICS.getLockName()); - if (globalLockContext.tryLock(lockDefinition, 5000L)) { + if (lockContext.tryLock(lockDefinition, 5000L)) { try { ShardingSphereStatistics statistics = contextManager.getMetaDataContexts().getStatistics(); ShardingSphereMetaData metaData = contextManager.getMetaDataContexts().getMetaData(); @@ -97,7 +97,7 @@ private void collectAndRefresh() { } compareAndUpdate(changedStatistics); } finally { - globalLockContext.unlock(lockDefinition); + lockContext.unlock(lockDefinition); } } } diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java index eb3d204419c89..ffc7a4e17d082 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java @@ -20,6 +20,7 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; @@ -29,7 +30,6 @@ import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaData; import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics; import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereTableData; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; @@ -59,9 +59,9 @@ void assertRefresh() { when(contextManager.getMetaDataContexts().getMetaData().getProps()).thenReturn(new ConfigurationProperties(new Properties())); when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps()).thenReturn(new TemporaryConfigurationProperties( PropertiesBuilder.build(new Property(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED.getKey(), Boolean.TRUE.toString())))); - GlobalLockContext globalLockContext = mock(GlobalLockContext.class); - when(globalLockContext.tryLock(any(), anyLong())).thenReturn(true); - new ShardingSphereStatisticsRefreshEngine(contextManager, globalLockContext).refresh(); + LockContext lockContext = mock(LockContext.class); + when(lockContext.tryLock(any(), anyLong())).thenReturn(true); + new ShardingSphereStatisticsRefreshEngine(contextManager, lockContext).refresh(); verify(contextManager.getPersistServiceFacade().getMetaDataPersistService().getShardingSphereDataPersistService()).update(any()); } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index b64d4b56d2420..becc43ad29f63 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -29,7 +29,6 @@ import org.apache.shardingsphere.infra.util.eventbus.EventSubscriber; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.event.deliver.DeliverEventSubscriber; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.ContextManagerBuilder; import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter; @@ -37,6 +36,7 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.DataChangedEventListenerRegistry; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.ClusterDispatchEventSubscriberRegistry; import org.apache.shardingsphere.mode.manager.cluster.exception.MissingRequiredClusterRepositoryConfigurationException; +import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.manager.cluster.workerid.ClusterWorkerIdGenerator; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; @@ -59,7 +59,7 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev ClusterPersistRepositoryConfiguration config = (ClusterPersistRepositoryConfiguration) modeConfig.getRepository(); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData(), param.getLabels()), modeConfig, eventBusContext); ClusterPersistRepository repository = getClusterPersistRepository(config, computeNodeInstanceContext); - LockContext lockContext = new GlobalLockContext(new GlobalLockPersistService(repository)); + LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), lockContext); MetaDataPersistService metaDataPersistService = new MetaDataPersistService(repository); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(metaDataPersistService, param, computeNodeInstanceContext); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index f97d84c338316..0f09b38c08662 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -23,10 +23,10 @@ import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; +import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; @@ -75,7 +75,7 @@ public synchronized void renew(final DropDatabaseListenerAssistedEvent event) { private void refreshStatisticsData() { if (contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster() && InstanceType.PROXY == contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getType()) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new GlobalLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); } } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java index a688874202a53..a3cc283ef21fb 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java @@ -28,9 +28,9 @@ import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; +import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; @@ -128,7 +128,7 @@ public synchronized void renew(final ViewDroppedEvent event) { private void refreshStatisticsData() { if (contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster() && InstanceType.PROXY == contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getType()) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new GlobalLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); } } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java new file mode 100644 index 0000000000000..533642f862d21 --- /dev/null +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.lock; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.lock.LockContext; +import org.apache.shardingsphere.mode.lock.LockPersistService; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; + +/** + * Cluster global lock context. + */ +@RequiredArgsConstructor +public final class ClusterLockContext implements LockContext { + + private final LockPersistService globalLockPersistService; + + @Override + public boolean tryLock(final GlobalLockDefinition lockDefinition, final long timeoutMillis) { + return globalLockPersistService.tryLock(lockDefinition, timeoutMillis); + } + + @Override + public void unlock(final GlobalLockDefinition lockDefinition) { + globalLockPersistService.unlock(lockDefinition); + } +} diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java new file mode 100644 index 0000000000000..e9c5a39d9a0fd --- /dev/null +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.lock; + +import org.apache.shardingsphere.mode.lock.LockPersistService; +import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ClusterLockContextTest { + + private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition("foo_lock"); + + @Mock + private LockPersistService lockPersistService; + + private ClusterLockContext lockContext; + + @BeforeEach + void init() { + lockContext = new ClusterLockContext(lockPersistService); + } + + @Test + void assertTryLock() { + when(lockPersistService.tryLock(lockDefinition, 3000L)).thenReturn(true); + assertTrue(lockContext.tryLock(lockDefinition, 3000L)); + } + + @Test + void assertUnlock() { + lockContext.unlock(lockDefinition); + verify(lockPersistService).unlock(lockDefinition); + } +} diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index 335256ca580d2..d7f51278f9a78 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -23,10 +23,10 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; -import org.apache.shardingsphere.mode.lock.global.GlobalLockContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.ContextManagerBuilder; import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter; +import org.apache.shardingsphere.mode.manager.standalone.lock.StandaloneLockContext; import org.apache.shardingsphere.mode.manager.standalone.workerid.StandaloneWorkerIdGenerator; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; @@ -47,7 +47,7 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev StandalonePersistRepository.class, null == repositoryConfig ? null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() : repositoryConfig.getProps()); MetaDataPersistService persistService = new MetaDataPersistService(repository); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), param.getModeConfiguration(), eventBusContext); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new GlobalLockContext(null)); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new StandaloneLockContext()); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, computeNodeInstanceContext); return new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java new file mode 100644 index 0000000000000..f790342744e1b --- /dev/null +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.standalone.lock; + +import org.apache.shardingsphere.infra.lock.LockContext; +import org.apache.shardingsphere.infra.lock.LockDefinition; + +/** + * Standalone global lock context. + */ +public final class StandaloneLockContext implements LockContext { + + @Override + public boolean tryLock(final LockDefinition lockDefinition, final long timeoutMillis) { + return false; + } + + @Override + public void unlock(final LockDefinition lockDefinition) { + } +} From 95bb5aa631e30895f7a70b8606c7d376267e62a6 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 21 Dec 2024 22:31:54 +0800 Subject: [PATCH 115/192] Remove useless GlobalLockContext (#34116) --- .../mode/lock/global/GlobalLockContext.java | 41 ------------- .../lock/global/GlobalLockContextTest.java | 57 ------------------- 2 files changed, 98 deletions(-) delete mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java delete mode 100644 mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java deleted file mode 100644 index 266a1a704048b..0000000000000 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContext.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.lock.global; - -import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.lock.LockContext; -import org.apache.shardingsphere.mode.lock.LockPersistService; - -/** - * Global lock context. - */ -@RequiredArgsConstructor -public final class GlobalLockContext implements LockContext { - - private final LockPersistService globalLockPersistService; - - @Override - public boolean tryLock(final GlobalLockDefinition lockDefinition, final long timeoutMillis) { - return globalLockPersistService.tryLock(lockDefinition, timeoutMillis); - } - - @Override - public void unlock(final GlobalLockDefinition lockDefinition) { - globalLockPersistService.unlock(lockDefinition); - } -} diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java deleted file mode 100644 index b281c8e4e0da3..0000000000000 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockContextTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.lock.global; - -import org.apache.shardingsphere.mode.lock.LockPersistService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class GlobalLockContextTest { - - private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition("foo_lock"); - - @Mock - private LockPersistService lockPersistService; - - private GlobalLockContext lockContext; - - @BeforeEach - void init() { - lockContext = new GlobalLockContext(lockPersistService); - } - - @Test - void assertTryLock() { - when(lockPersistService.tryLock(lockDefinition, 3000L)).thenReturn(true); - assertTrue(lockContext.tryLock(lockDefinition, 3000L)); - } - - @Test - void assertUnlock() { - lockContext.unlock(lockDefinition); - verify(lockPersistService).unlock(lockDefinition); - } -} From bfde8d8dd6aa3d52db5beb5fb897b3e5b37d5e11 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 22 Dec 2024 00:23:32 +0800 Subject: [PATCH 116/192] Rename ConnectionResourceLock (#34117) --- .../connector/ProxyDatabaseConnectionManager.java | 4 ++-- ...sourceLock.java => ConnectionResourceLock.java} | 4 ++-- ...ckTest.java => ConnectionResourceLockTest.java} | 14 +++++++------- .../netty/FrontendChannelInboundHandler.java | 2 +- .../mysql/command/MySQLCommandExecuteEngine.java | 2 +- .../command/PostgreSQLCommandExecuteEngine.java | 2 +- .../PostgreSQLCommandExecuteEngineTest.java | 8 ++++---- 7 files changed, 18 insertions(+), 18 deletions(-) rename proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/{ResourceLock.java => ConnectionResourceLock.java} (96%) rename proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/{ResourceLockTest.java => ConnectionResourceLockTest.java} (84%) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java index 9ff69eb0ccd18..c82dd4c01abc2 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManager.java @@ -28,7 +28,7 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; import org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ConnectionPostProcessor; -import org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ResourceLock; +import org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ConnectionResourceLock; import org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.exception.BackendConnectionException; @@ -67,7 +67,7 @@ public final class ProxyDatabaseConnectionManager implements DatabaseConnectionM private final Collection connectionPostProcessors = new LinkedList<>(); - private final ResourceLock resourceLock = new ResourceLock(); + private final ConnectionResourceLock connectionResourceLock = new ConnectionResourceLock(); private final AtomicBoolean closed = new AtomicBoolean(false); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLock.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLock.java similarity index 96% rename from proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLock.java rename to proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLock.java index 2eaf8c17ffb25..6a8a04312e014 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLock.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLock.java @@ -26,9 +26,9 @@ import java.util.concurrent.locks.ReentrantLock; /** - * Resource lock. + * Connection resource lock. */ -public final class ResourceLock { +public final class ConnectionResourceLock { private static final long DEFAULT_TIMEOUT_MILLISECONDS = 200L; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLockTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLockTest.java similarity index 84% rename from proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLockTest.java rename to proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLockTest.java index 7d3ac0719146e..fae1d2924ae04 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ResourceLockTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/connection/ConnectionResourceLockTest.java @@ -40,7 +40,7 @@ @ExtendWith(AutoMockExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) -class ResourceLockTest { +class ConnectionResourceLockTest { @Mock private ChannelHandlerContext channelHandlerContext; @@ -49,7 +49,7 @@ class ResourceLockTest { private Channel channel; @Mock - private ResourceLock resourceLock; + private ConnectionResourceLock connectionResourceLock; @Test void assertDoAwait() throws NoSuchFieldException, IllegalAccessException { @@ -57,10 +57,10 @@ void assertDoAwait() throws NoSuchFieldException, IllegalAccessException { when(channel.isActive()).thenReturn(true); when(channelHandlerContext.channel()).thenReturn(channel); ExecutorService executorService = Executors.newFixedThreadPool(1); - executorService.submit(() -> resourceLock.doAwait(channelHandlerContext)); + executorService.submit(() -> connectionResourceLock.doAwait(channelHandlerContext)); Awaitility.await().pollDelay(200L, TimeUnit.MILLISECONDS).until(() -> true); - Plugins.getMemberAccessor().set(ResourceLock.class.getDeclaredField("condition"), resourceLock, new ReentrantLock().newCondition()); - verify(resourceLock, times(1)).doAwait(channelHandlerContext); + Plugins.getMemberAccessor().set(ConnectionResourceLock.class.getDeclaredField("condition"), connectionResourceLock, new ReentrantLock().newCondition()); + verify(connectionResourceLock, times(1)).doAwait(channelHandlerContext); } @Test @@ -72,9 +72,9 @@ void assertDoNotify() { ExecutorService executorService = Executors.newFixedThreadPool(1); executorService.submit(() -> { Awaitility.await().pollDelay(50L, TimeUnit.MILLISECONDS).until(() -> true); - resourceLock.doNotify(); + connectionResourceLock.doNotify(); }); - resourceLock.doAwait(channelHandlerContext); + connectionResourceLock.doAwait(channelHandlerContext); assertTrue(System.currentTimeMillis() >= startTime); } } diff --git a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java index fcfb4300252dd..d3ea1b3a4b0d5 100644 --- a/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java +++ b/proxy/frontend/core/src/main/java/org/apache/shardingsphere/proxy/frontend/netty/FrontendChannelInboundHandler.java @@ -113,7 +113,7 @@ private void closeAllResources() { @Override public void channelWritabilityChanged(final ChannelHandlerContext context) { if (context.channel().isWritable()) { - connectionSession.getDatabaseConnectionManager().getResourceLock().doNotify(); + connectionSession.getDatabaseConnectionManager().getConnectionResourceLock().doNotify(); } } } diff --git a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecuteEngine.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecuteEngine.java index 2782618fb8199..6d508b7447791 100644 --- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecuteEngine.java +++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecuteEngine.java @@ -74,7 +74,7 @@ public void writeQueryData(final ChannelHandlerContext context, int flushThreshold = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.PROXY_FRONTEND_FLUSH_THRESHOLD); while (queryCommandExecutor.next()) { count++; - databaseConnectionManager.getResourceLock().doAwait(context); + databaseConnectionManager.getConnectionResourceLock().doAwait(context); DatabasePacket dataValue = queryCommandExecutor.getQueryRowPacket(); context.write(dataValue); if (flushThreshold == count) { diff --git a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngine.java b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngine.java index 3ac5579faee7a..bb086836d66e7 100644 --- a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngine.java +++ b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngine.java @@ -108,7 +108,7 @@ private long writeDataPackets(final ChannelHandlerContext context, final ProxyDa .getContextManager().getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.PROXY_FRONTEND_FLUSH_THRESHOLD); while (queryCommandExecutor.next()) { flushCount++; - databaseConnectionManager.getResourceLock().doAwait(context); + databaseConnectionManager.getConnectionResourceLock().doAwait(context); DatabasePacket resultValue = queryCommandExecutor.getQueryRowPacket(); context.write(resultValue); if (proxyFrontendFlushThreshold == flushCount) { diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java index 0d7481105e735..7171cbedbca94 100644 --- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java +++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager; -import org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ResourceLock; +import org.apache.shardingsphere.proxy.backend.connector.jdbc.connection.ConnectionResourceLock; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.proxy.backend.session.transaction.TransactionStatus; @@ -114,9 +114,9 @@ void assertWriteQueryDataWithHasNextResult() throws SQLException { when(channel.isActive()).thenReturn(true); when(queryCommandExecutor.next()).thenReturn(true, false); when(channel.isWritable()).thenReturn(false, true); - ResourceLock resourceLock = mock(ResourceLock.class); + ConnectionResourceLock connectionResourceLock = mock(ConnectionResourceLock.class); ProxyDatabaseConnectionManager databaseConnectionManager = mock(ProxyDatabaseConnectionManager.class); - when(databaseConnectionManager.getResourceLock()).thenReturn(resourceLock); + when(databaseConnectionManager.getConnectionResourceLock()).thenReturn(connectionResourceLock); when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession); PostgreSQLPacket packet = mock(PostgreSQLPacket.class); when(queryCommandExecutor.getQueryRowPacket()).thenReturn(packet); @@ -127,7 +127,7 @@ void assertWriteQueryDataWithHasNextResult() throws SQLException { new ShardingSphereMetaData()), computeNodeInstanceContext, mock(PersistRepository.class)); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); commandExecuteEngine.writeQueryData(channelHandlerContext, databaseConnectionManager, queryCommandExecutor, 0); - verify(resourceLock).doAwait(channelHandlerContext); + verify(connectionResourceLock).doAwait(channelHandlerContext); verify(channelHandlerContext).write(packet); verify(channelHandlerContext).write(isA(PostgreSQLCommandCompletePacket.class)); verify(channelHandlerContext).write(isA(PostgreSQLReadyForQueryPacket.class)); From e65efa3457769afe163cb96aff745d807f83f679 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 22 Dec 2024 11:59:16 +0800 Subject: [PATCH 117/192] Refactor ClusterLockContext (#34118) --- .../manager/cluster/lock/ClusterLockContext.java | 13 +++++++------ .../standalone/lock/StandaloneLockContext.java | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java index 533642f862d21..10e978989b8d0 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java @@ -19,24 +19,25 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.lock.LockContext; +import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; /** - * Cluster global lock context. + * Cluster lock context. */ @RequiredArgsConstructor -public final class ClusterLockContext implements LockContext { +public final class ClusterLockContext implements LockContext { private final LockPersistService globalLockPersistService; @Override - public boolean tryLock(final GlobalLockDefinition lockDefinition, final long timeoutMillis) { - return globalLockPersistService.tryLock(lockDefinition, timeoutMillis); + public boolean tryLock(final LockDefinition lockDefinition, final long timeoutMillis) { + return globalLockPersistService.tryLock((GlobalLockDefinition) lockDefinition, timeoutMillis); } @Override - public void unlock(final GlobalLockDefinition lockDefinition) { - globalLockPersistService.unlock(lockDefinition); + public void unlock(final LockDefinition lockDefinition) { + globalLockPersistService.unlock((GlobalLockDefinition) lockDefinition); } } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java index f790342744e1b..6b5e5a603dff1 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.lock.LockDefinition; /** - * Standalone global lock context. + * Standalone lock context. */ public final class StandaloneLockContext implements LockContext { From 646d4d83b1f4ff82b737269c7367d3f2ae8a83d8 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 22 Dec 2024 13:26:37 +0800 Subject: [PATCH 118/192] Remove useless generic type of LockContext (#34119) * Remove useless generic type of LockContext * Remove useless generic type of LockContext --- .../infra/instance/ComputeNodeInstanceContext.java | 6 +++--- .../org/apache/shardingsphere/infra/lock/LockContext.java | 8 +++----- .../infra/instance/ComputeNodeInstanceContextTest.java | 2 +- .../scenario/migration/preparer/MigrationJobPreparer.java | 1 - .../globalclock/executor/GlobalClockTransactionHook.java | 2 -- .../executor/GlobalClockTransactionHookTest.java | 4 ---- .../shardingsphere/transaction/spi/TransactionHook.java | 2 -- .../manager/cluster/ClusterContextManagerBuilder.java | 2 +- .../mode/manager/cluster/lock/ClusterLockContext.java | 2 +- .../manager/standalone/lock/StandaloneLockContext.java | 2 +- .../distsql/ral/updatable/LockClusterExecutor.java | 1 - .../distsql/ral/updatable/UnlockClusterExecutor.java | 1 - 12 files changed, 10 insertions(+), 23 deletions(-) diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index c1cbcd2d87737..a3d8cb81b6eaa 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -49,7 +49,7 @@ public final class ComputeNodeInstanceContext { private final AtomicReference workerIdGenerator; @Getter(AccessLevel.NONE) - private final AtomicReference> lockContext; + private final AtomicReference lockContext; private final ClusterInstanceRegistry clusterInstanceRegistry; @@ -68,7 +68,7 @@ public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final Mode * @param workerIdGenerator worker id generator * @param lockContext lock context */ - public void init(final WorkerIdGenerator workerIdGenerator, final LockContext lockContext) { + public void init(final WorkerIdGenerator workerIdGenerator, final LockContext lockContext) { this.workerIdGenerator.set(workerIdGenerator); this.lockContext.set(lockContext); } @@ -148,7 +148,7 @@ public int generateWorkerId(final Properties props) { * * @return lock context */ - public LockContext getLockContext() { + public LockContext getLockContext() { return Optional.ofNullable(lockContext.get()).orElseThrow(() -> new IllegalStateException("Lock context is not initialized.")); } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java index a74f1411e3c4e..eb39e3b60f0b5 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/lock/LockContext.java @@ -19,10 +19,8 @@ /** * Lock context. - * - * @param type of lock definition */ -public interface LockContext { +public interface LockContext { /** * Try Lock. @@ -31,12 +29,12 @@ public interface LockContext { * @param timeoutMillis timeout milliseconds * @return is locked or not */ - boolean tryLock(T lockDefinition, long timeoutMillis); + boolean tryLock(LockDefinition lockDefinition, long timeoutMillis); /** * Unlock. * * @param lockDefinition lock definition */ - void unlock(T lockDefinition); + void unlock(LockDefinition lockDefinition); } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java index 9d757c3e2207a..e0c39e3b0b51c 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java @@ -42,7 +42,7 @@ class ComputeNodeInstanceContextTest { void assertInit() { ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class); - LockContext lockContext = mock(LockContext.class); + LockContext lockContext = mock(LockContext.class); context.init(workerIdGenerator, lockContext); context.generateWorkerId(new Properties()); verify(workerIdGenerator).generate(new Properties()); diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 3f07a53380f02..e8d29bf89e2ce 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -110,7 +110,6 @@ public void prepare(final MigrationJobItemContext jobItemContext) throws SQLExce jobItemContext.getJobId(), jobItemContext.getShardingItem(), jobItemContext.getInventoryTasks(), jobItemContext.getIncrementalTasks()); } - @SuppressWarnings({"unchecked", "rawtypes"}) private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItemContext) throws SQLException { MigrationJobConfiguration jobConfig = jobItemContext.getJobConfig(); String jobId = jobConfig.getJobId(); diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 295d2f1beb8df..abe1f6436c5a1 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -80,7 +80,6 @@ public void beforeExecuteSQL(final GlobalClockRule rule, final DatabaseType data } @Override - @SuppressWarnings({"unchecked", "rawtypes"}) public void beforeCommit(final GlobalClockRule rule, final DatabaseType databaseType, final Collection connections, final TransactionConnectionContext transactionContext, final LockContext lockContext) throws SQLException { if (!rule.getConfiguration().isEnabled()) { @@ -98,7 +97,6 @@ public void beforeCommit(final GlobalClockRule rule, final DatabaseType database } @Override - @SuppressWarnings({"unchecked", "rawtypes"}) public void afterCommit(final GlobalClockRule rule, final DatabaseType databaseType, final Collection connections, final TransactionConnectionContext transactionContext, final LockContext lockContext) { Optional globalClockProvider = rule.getGlobalClockProvider(); diff --git a/kernel/global-clock/core/src/test/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHookTest.java b/kernel/global-clock/core/src/test/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHookTest.java index 1a5a16c0486f1..6e092cfd2bfbb 100644 --- a/kernel/global-clock/core/src/test/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHookTest.java +++ b/kernel/global-clock/core/src/test/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHookTest.java @@ -145,7 +145,6 @@ void assertBeforeExecuteSQLWhenNullTransactionIsolationLevel() throws SQLExcepti verify(globalClockTransactionExecutor).sendSnapshotTimestamp(Collections.emptyList(), 10L); } - @SuppressWarnings({"rawtypes", "unchecked"}) @Test void assertBeforeCommitWhenDisabledGlobalClockRule() throws SQLException { LockContext lockContext = mock(LockContext.class); @@ -153,7 +152,6 @@ void assertBeforeCommitWhenDisabledGlobalClockRule() throws SQLException { verify(lockContext, times(0)).tryLock(any(), anyLong()); } - @SuppressWarnings("rawtypes") @Test void assertBeforeCommitWhenTryLockFailed() throws SQLException { when(rule.getConfiguration().isEnabled()).thenReturn(true); @@ -162,7 +160,6 @@ void assertBeforeCommitWhenTryLockFailed() throws SQLException { verify(globalClockTransactionExecutor, times(0)).sendCommitTimestamp(any(), anyLong()); } - @SuppressWarnings({"rawtypes", "unchecked"}) @Test void assertBeforeCommitWhenGlobalClockTransactionExecutorAbsent() throws SQLException { when(rule.getConfiguration().isEnabled()).thenReturn(true); @@ -173,7 +170,6 @@ void assertBeforeCommitWhenGlobalClockTransactionExecutorAbsent() throws SQLExce verify(globalClockTransactionExecutor, times(0)).sendCommitTimestamp(any(), anyLong()); } - @SuppressWarnings({"rawtypes", "unchecked"}) @Test void assertBeforeCommit() throws SQLException { when(rule.getConfiguration().isEnabled()).thenReturn(true); diff --git a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java index 656a4821397a0..a02673b8d2767 100644 --- a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java +++ b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/TransactionHook.java @@ -89,7 +89,6 @@ void beforeExecuteSQL(T rule, DatabaseType databaseType, Collection * @param lockContext lock context * @throws SQLException SQL exception */ - @SuppressWarnings("rawtypes") void beforeCommit(T rule, DatabaseType databaseType, Collection connections, TransactionConnectionContext transactionContext, LockContext lockContext) throws SQLException; /** @@ -102,7 +101,6 @@ void beforeExecuteSQL(T rule, DatabaseType databaseType, Collection * @param lockContext lock context * @throws SQLException SQL exception */ - @SuppressWarnings("rawtypes") void afterCommit(T rule, DatabaseType databaseType, Collection connections, TransactionConnectionContext transactionContext, LockContext lockContext) throws SQLException; /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index becc43ad29f63..cdca1a7fdab09 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -59,7 +59,7 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev ClusterPersistRepositoryConfiguration config = (ClusterPersistRepositoryConfiguration) modeConfig.getRepository(); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData(), param.getLabels()), modeConfig, eventBusContext); ClusterPersistRepository repository = getClusterPersistRepository(config, computeNodeInstanceContext); - LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); + LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), lockContext); MetaDataPersistService metaDataPersistService = new MetaDataPersistService(repository); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(metaDataPersistService, param, computeNodeInstanceContext); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java index 10e978989b8d0..7bac7d79e6175 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java @@ -27,7 +27,7 @@ * Cluster lock context. */ @RequiredArgsConstructor -public final class ClusterLockContext implements LockContext { +public final class ClusterLockContext implements LockContext { private final LockPersistService globalLockPersistService; diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java index 6b5e5a603dff1..45580b850ad22 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/lock/StandaloneLockContext.java @@ -23,7 +23,7 @@ /** * Standalone lock context. */ -public final class StandaloneLockContext implements LockContext { +public final class StandaloneLockContext implements LockContext { @Override public boolean tryLock(final LockDefinition lockDefinition, final long timeoutMillis) { diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 075b9ada22656..7316f5405c5c4 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -39,7 +39,6 @@ public final class LockClusterExecutor implements DistSQLUpdateExecutor { @Override - @SuppressWarnings({"unchecked", "rawtypes"}) public void executeUpdate(final LockClusterStatement sqlStatement, final ContextManager contextManager) { checkState(contextManager); checkAlgorithm(sqlStatement); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index 318311e4dc2fa..a32b2e650fd2d 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -35,7 +35,6 @@ public final class UnlockClusterExecutor implements DistSQLUpdateExecutor { @Override - @SuppressWarnings({"unchecked", "rawtypes"}) public void executeUpdate(final UnlockClusterStatement sqlStatement, final ContextManager contextManager) { checkState(contextManager); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); From 1f3af26cae639689f318d096b32802d393f9a602 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Mon, 23 Dec 2024 09:13:29 +0800 Subject: [PATCH 119/192] Fix mysql longblob wrong column type returned by proxy protocol (#34121) * Fix mysql longblob wrong column type returned by proxy protocol * update release note * remove sphereex comment * only open mysql passthrough columnType assert --- RELEASE-NOTES.md | 1 + .../mysql/constant/MySQLBinaryColumnType.java | 6 +- .../mysql/constant/MySQLCharacterSet.java | 1 + .../constant/MySQLBinaryColumnTypeTest.java | 6 +- .../query/builder/ResponsePacketBuilder.java | 14 +++- .../e2e/engine/type/dql/BaseDQLE2EIT.java | 7 +- .../dql/e2e-dql-select-with-data-types.xml | 31 +++++++ .../data/actual/dataset/mysql/dataset.xml | 81 +++++++++++++++++++ .../actual/init-sql/mysql/01-actual-init.sql | 3 + .../data/expected/dataset/mysql/dataset.xml | 81 +++++++++++++++++++ .../init-sql/mysql/01-expected-init.sql | 3 + 11 files changed, 223 insertions(+), 11 deletions(-) create mode 100644 test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-with-data-types.xml create mode 100644 test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/dataset/mysql/dataset.xml create mode 100644 test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/dataset/mysql/dataset.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 298ef5e59adf9..35d084add1452 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -58,6 +58,7 @@ 1. SQL Binder: Fixes the expression segment cannot find the outer table when binding - [#34015](https://github.com/apache/shardingsphere/pull/34015) 1. Proxy: Fixes "ALL PRIVILEGES ON `DB`.*" is not recognized during SELECT privilege verification for MySQL - [#34037](https://github.com/apache/shardingsphere/pull/34037) 1. Encrypt: Use sql bind info in EncryptInsertPredicateColumnTokenGenerator to avoid wrong column table mapping - [#34110](https://github.com/apache/shardingsphere/pull/34110) +1. Proxy: Fix mysql longblob wrong column type returned by proxy protocol - [#34121](https://github.com/apache/shardingsphere/pull/34121) ### Change Logs diff --git a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnType.java b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnType.java index 069948f196155..5289927a84bea 100644 --- a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnType.java +++ b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnType.java @@ -125,9 +125,9 @@ public enum MySQLBinaryColumnType implements BinaryColumnType { JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.DATE, DATE); JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.TIME, TIME); JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.TIMESTAMP, TIMESTAMP); - JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BINARY, STRING); - JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.VARBINARY, VAR_STRING); - JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.LONGVARBINARY, VAR_STRING); + JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BINARY, LONG_BLOB); + JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.VARBINARY, TINY_BLOB); + JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.LONGVARBINARY, BLOB); JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.NULL, NULL); JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BLOB, BLOB); for (MySQLBinaryColumnType each : values()) { diff --git a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLCharacterSet.java b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLCharacterSet.java index 749938c4e01b4..f96994fff8e48 100644 --- a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLCharacterSet.java +++ b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLCharacterSet.java @@ -101,6 +101,7 @@ public enum MySQLCharacterSet { UTF32_GENERAL_CI(60, () -> Charset.forName("utf32")), UTF32_BIN(61, () -> Charset.forName("utf32")), UTF16LE_BIN(62, () -> StandardCharsets.UTF_16LE), + BINARY(63, () -> Charset.forName("binary")), ARMSCII8_BIN(64, () -> Charset.forName("armscii8")), ASCII_BIN(65, () -> StandardCharsets.US_ASCII), CP1250_BIN(66, () -> Charset.forName("cp1250")), diff --git a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnTypeTest.java b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnTypeTest.java index 6e387c6135ee5..5670137cc6793 100644 --- a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnTypeTest.java +++ b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinaryColumnTypeTest.java @@ -45,9 +45,9 @@ void assertValueOfJDBC() { assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.DATE), is(MySQLBinaryColumnType.DATE)); assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.TIME), is(MySQLBinaryColumnType.TIME)); assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.TIMESTAMP), is(MySQLBinaryColumnType.TIMESTAMP)); - assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.BINARY), is(MySQLBinaryColumnType.STRING)); - assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.VARBINARY), is(MySQLBinaryColumnType.VAR_STRING)); - assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.LONGVARBINARY), is(MySQLBinaryColumnType.VAR_STRING)); + assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.BINARY), is(MySQLBinaryColumnType.LONG_BLOB)); + assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.VARBINARY), is(MySQLBinaryColumnType.TINY_BLOB)); + assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.LONGVARBINARY), is(MySQLBinaryColumnType.BLOB)); assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.NULL), is(MySQLBinaryColumnType.NULL)); assertThat(MySQLBinaryColumnType.valueOfJDBCType(Types.BLOB), is(MySQLBinaryColumnType.BLOB)); } diff --git a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilder.java b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilder.java index d244835efb673..ba6b0dc8239d1 100644 --- a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilder.java +++ b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilder.java @@ -20,6 +20,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLBinaryColumnType; +import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLCharacterSet; import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.MySQLColumnDefinition41Packet; import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.MySQLColumnDefinitionFlag; import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.MySQLFieldCountPacket; @@ -30,8 +31,11 @@ import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader; import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader; +import java.sql.Types; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -45,19 +49,22 @@ public final class ResponsePacketBuilder { private static final String BLOB_COLUMN_TYPE_KEYWORD = "BLOB"; + private static final Collection BINARY_TYPES = new HashSet<>(Arrays.asList(Types.BINARY, Types.VARBINARY, Types.LONGVARBINARY)); + /** * Build query response packets. * * @param queryResponseHeader query response header - * @param characterSet MySQL character set id + * @param sessionCharacterSet MySQL character set id * @param statusFlags server status flags * @return query response packets */ - public static Collection buildQueryResponsePackets(final QueryResponseHeader queryResponseHeader, final int characterSet, final int statusFlags) { + public static Collection buildQueryResponsePackets(final QueryResponseHeader queryResponseHeader, final int sessionCharacterSet, final int statusFlags) { Collection result = new LinkedList<>(); List queryHeaders = queryResponseHeader.getQueryHeaders(); result.add(new MySQLFieldCountPacket(queryHeaders.size())); for (QueryHeader each : queryHeaders) { + int characterSet = BINARY_TYPES.contains(each.getColumnType()) ? MySQLCharacterSet.BINARY.getId() : sessionCharacterSet; result.add(new MySQLColumnDefinition41Packet(characterSet, getColumnDefinitionFlag(each), each.getSchema(), each.getTable(), each.getTable(), each.getColumnLabel(), each.getColumnName(), each.getColumnLength(), MySQLBinaryColumnType.valueOfJDBCType(each.getColumnType()), each.getDecimals(), false)); } @@ -82,6 +89,9 @@ private static int getColumnDefinitionFlag(final QueryHeader header) { if (header.getColumnTypeName().contains(BINARY_COLUMN_TYPE_KEYWORD) || header.getColumnTypeName().contains(BLOB_COLUMN_TYPE_KEYWORD)) { result += MySQLColumnDefinitionFlag.BINARY_COLLATION.getValue(); } + if (BINARY_TYPES.contains(header.getColumnType())) { + result += MySQLColumnDefinitionFlag.BLOB.getValue(); + } return result; } diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java index 63bf12a0f084c..00ed262e06910 100644 --- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java +++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/BaseDQLE2EIT.java @@ -23,10 +23,10 @@ import org.apache.shardingsphere.test.e2e.cases.dataset.metadata.DataSetColumn; import org.apache.shardingsphere.test.e2e.cases.dataset.metadata.DataSetMetaData; import org.apache.shardingsphere.test.e2e.cases.dataset.row.DataSetRow; -import org.apache.shardingsphere.test.e2e.env.E2EEnvironmentAware; -import org.apache.shardingsphere.test.e2e.env.E2EEnvironmentEngine; import org.apache.shardingsphere.test.e2e.engine.context.E2ETestContext; import org.apache.shardingsphere.test.e2e.env.DataSetEnvironmentManager; +import org.apache.shardingsphere.test.e2e.env.E2EEnvironmentAware; +import org.apache.shardingsphere.test.e2e.env.E2EEnvironmentEngine; import org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath; import org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath.Type; import org.apache.shardingsphere.test.e2e.framework.param.model.AssertionTestParameter; @@ -136,7 +136,8 @@ private void assertMetaData(final ResultSetMetaData actualResultSetMetaData, fin if ("db_tbl_sql_federation".equals(testParam.getScenario())) { continue; } - if ("jdbc".equals(testParam.getAdapter()) && "Cluster".equals(testParam.getMode()) && "encrypt".equals(testParam.getScenario())) { + if ("jdbc".equals(testParam.getAdapter()) && "Cluster".equals(testParam.getMode()) && "encrypt".equals(testParam.getScenario()) + || "MySQL".equals(testParam.getDatabaseType().getType()) && "passthrough".equals(testParam.getScenario())) { // FIXME correct columnType with proxy adapter and other jdbc scenario assertThat(actualResultSetMetaData.getColumnType(i + 1), is(expectedResultSetMetaData.getColumnType(i + 1))); } diff --git a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-with-data-types.xml b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-with-data-types.xml new file mode 100644 index 0000000000000..916ad75ef22ea --- /dev/null +++ b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-with-data-types.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/dataset/mysql/dataset.xml b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/dataset/mysql/dataset.xml new file mode 100644 index 0000000000000..0353531c0a8a1 --- /dev/null +++ b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/dataset/mysql/dataset.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/init-sql/mysql/01-actual-init.sql b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/init-sql/mysql/01-actual-init.sql index 8d3c9dad53b0d..350af11696813 100644 --- a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/init-sql/mysql/01-actual-init.sql +++ b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/actual/init-sql/mysql/01-actual-init.sql @@ -29,3 +29,6 @@ CREATE TABLE passthrough.t_data_type_money (id INT PRIMARY KEY, val NUMERIC(16, CREATE TABLE passthrough.t_data_type_bytea (id INT PRIMARY KEY, val BLOB NOT NULL); CREATE TABLE passthrough.t_data_type_date (id INT PRIMARY KEY, creation_date DATE NOT NULL, update_date DATETIME NOT NULL); CREATE TABLE passthrough.t_data_type_uuid (id INT PRIMARY KEY, val VARCHAR(36) NOT NULL); +CREATE TABLE passthrough.t_data_type_binary (id INT PRIMARY KEY, val BINARY(10) NOT NULL); +CREATE TABLE passthrough.t_data_type_varbinary (id INT PRIMARY KEY, val VARBINARY(10) NOT NULL); +CREATE TABLE passthrough.t_data_type_longblob (id INT PRIMARY KEY, val LONGBLOB NOT NULL); diff --git a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/dataset/mysql/dataset.xml b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/dataset/mysql/dataset.xml new file mode 100644 index 0000000000000..358c0b93bb4df --- /dev/null +++ b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/dataset/mysql/dataset.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/init-sql/mysql/01-expected-init.sql b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/init-sql/mysql/01-expected-init.sql index 2e2c97ea4a871..3c5fc3aa0f307 100644 --- a/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/init-sql/mysql/01-expected-init.sql +++ b/test/e2e/sql/src/test/resources/env/scenario/passthrough/data/expected/init-sql/mysql/01-expected-init.sql @@ -29,3 +29,6 @@ CREATE TABLE expected_dataset.t_data_type_money (id INT PRIMARY KEY, val NUMERI CREATE TABLE expected_dataset.t_data_type_bytea (id INT PRIMARY KEY, val BLOB NOT NULL); CREATE TABLE expected_dataset.t_data_type_date (id INT PRIMARY KEY, creation_date DATE NOT NULL, update_date DATETIME NOT NULL); CREATE TABLE expected_dataset.t_data_type_uuid (id INT PRIMARY KEY, val VARCHAR(36) NOT NULL); +CREATE TABLE expected_dataset.t_data_type_binary (id INT PRIMARY KEY, val BINARY(10) NOT NULL); +CREATE TABLE expected_dataset.t_data_type_varbinary (id INT PRIMARY KEY, val VARBINARY(10) NOT NULL); +CREATE TABLE expected_dataset.t_data_type_longblob (id INT PRIMARY KEY, val LONGBLOB NOT NULL); From f246711e6c21a973a70574031016dccad45f5cdc Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Mon, 23 Dec 2024 13:04:58 +0800 Subject: [PATCH 120/192] Fix pipeline e2e for PostgresSQL (#34125) * Fix pipeline e2e for PostgresSQL * Fix checkstyle --- .../generator/PipelineDDLDecorator.java | 177 ++++++++++++++++++ .../generator/PipelineDDLGenerator.java | 156 +-------------- .../PipelineJobDataSourcePreparer.java | 44 ++--- .../param/PrepareTargetTablesParameter.java | 4 - .../PipelineJobDataSourcePreparerTest.java | 3 +- .../preparer/MigrationJobPreparer.java | 7 +- 6 files changed, 208 insertions(+), 183 deletions(-) create mode 100644 kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java new file mode 100644 index 0000000000000..d66f840447c67 --- /dev/null +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLDecorator.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.data.pipeline.core.metadata.generator; + +import com.google.common.base.Strings; +import lombok.AllArgsConstructor; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.ddl.AlterTableStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.ddl.CommentStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateIndexStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateTableStatementContext; +import org.apache.shardingsphere.infra.binder.context.type.ConstraintAvailable; +import org.apache.shardingsphere.infra.binder.context.type.IndexAvailable; +import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; +import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine; +import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.hint.HintValueContext; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; +import org.apache.shardingsphere.infra.parser.SQLParserEngine; +import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; + +import java.util.Collections; +import java.util.Comparator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.TreeMap; + +/** + * Pipeline DDL decorator. + */ +@AllArgsConstructor +public final class PipelineDDLDecorator { + + private static final String SET_SEARCH_PATH_PREFIX = "set search_path"; + + private final ShardingSphereMetaData metaData; + + /** + * Decorate SQL. + * + * @param databaseType database type + * @param targetDatabaseName target database name + * @param schemaName schema name + * @param targetTableName target table name + * @param parserEngine parser engine + * @param sql SQL + * @return decorated SQL + */ + public Optional decorate(final DatabaseType databaseType, final String targetDatabaseName, final String schemaName, final String targetTableName, + final SQLParserEngine parserEngine, final String sql) { + if (Strings.isNullOrEmpty(sql)) { + return Optional.empty(); + } + String result = decorateActualSQL(targetDatabaseName, targetTableName, parserEngine, sql.trim()); + // TODO remove it after set search_path is supported. + if ("openGauss".equals(databaseType.getType())) { + return decorateOpenGauss(targetDatabaseName, schemaName, result, parserEngine); + } + return Optional.of(result); + } + + private String decorateActualSQL(final String databaseName, final String targetTableName, final SQLParserEngine parserEngine, final String sql) { + SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql); + Map replaceMap = new TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex)); + if (sqlStatementContext instanceof CreateTableStatementContext) { + appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); + appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); + } + if (sqlStatementContext instanceof CommentStatementContext) { + appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); + } + if (sqlStatementContext instanceof CreateIndexStatementContext) { + appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); + appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); + } + if (sqlStatementContext instanceof AlterTableStatementContext) { + appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); + appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); + } + return doDecorateActualTable(replaceMap, sql); + } + + private SQLStatementContext parseSQL(final String currentDatabaseName, final SQLParserEngine parserEngine, final String sql) { + return new SQLBindEngine(metaData, currentDatabaseName, new HintValueContext()).bind(parserEngine.parse(sql, true), Collections.emptyList()); + } + + private void appendFromIndexAndConstraint(final Map replaceMap, final String targetTableName, final SQLStatementContext sqlStatementContext) { + if (!(sqlStatementContext instanceof TableAvailable) || ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().isEmpty()) { + return; + } + TableNameSegment tableNameSegment = ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName(); + if (!tableNameSegment.getIdentifier().getValue().equals(targetTableName)) { + if (sqlStatementContext instanceof IndexAvailable) { + for (IndexSegment each : ((IndexAvailable) sqlStatementContext).getIndexes()) { + String logicIndexName = IndexMetaDataUtils.getLogicIndexName(each.getIndexName().getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); + replaceMap.put(each.getIndexName(), logicIndexName); + } + } + if (sqlStatementContext instanceof ConstraintAvailable) { + for (ConstraintSegment each : ((ConstraintAvailable) sqlStatementContext).getConstraints()) { + String logicConstraint = IndexMetaDataUtils.getLogicIndexName(each.getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); + replaceMap.put(each, logicConstraint); + } + } + } + } + + private void appendFromTable(final Map replaceMap, final String targetTableName, final TableAvailable sqlStatementContext) { + for (SimpleTableSegment each : sqlStatementContext.getTablesContext().getSimpleTables()) { + if (!targetTableName.equals(each.getTableName().getIdentifier().getValue())) { + replaceMap.put(each.getTableName(), targetTableName); + } + } + } + + private String doDecorateActualTable(final Map replaceMap, final String sql) { + StringBuilder result = new StringBuilder(); + int lastStopIndex = 0; + for (Entry entry : replaceMap.entrySet()) { + result.append(sql, lastStopIndex, entry.getKey().getStartIndex()); + result.append(entry.getValue()); + lastStopIndex = entry.getKey().getStopIndex() + 1; + } + if (lastStopIndex < sql.length()) { + result.append(sql, lastStopIndex, sql.length()); + } + return result.toString(); + } + + // TODO remove it after set search_path is supported. + private Optional decorateOpenGauss(final String databaseName, final String schemaName, final String queryContext, + final SQLParserEngine parserEngine) { + if (queryContext.toLowerCase().startsWith(SET_SEARCH_PATH_PREFIX)) { + return Optional.empty(); + } + return Optional.of(replaceTableNameWithPrefix(queryContext, schemaName + ".", databaseName, parserEngine)); + } + + private String replaceTableNameWithPrefix(final String sql, final String prefix, final String databaseName, final SQLParserEngine parserEngine) { + SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql); + if (sqlStatementContext instanceof CreateTableStatementContext || sqlStatementContext instanceof CommentStatementContext + || sqlStatementContext instanceof CreateIndexStatementContext || sqlStatementContext instanceof AlterTableStatementContext) { + if (((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().isEmpty()) { + return sql; + } + if (((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().isPresent()) { + return sql; + } + Map replaceMap = new TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex)); + TableNameSegment tableNameSegment = ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName(); + replaceMap.put(tableNameSegment, prefix + tableNameSegment.getIdentifier().getValue()); + return doDecorateActualTable(replaceMap, sql); + } + return sql; + } +} diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java index 95b8b3b85ef61..37d281e4da6a7 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java @@ -17,41 +17,16 @@ package org.apache.shardingsphere.data.pipeline.core.metadata.generator; -import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.data.pipeline.core.sqlbuilder.dialect.DialectPipelineSQLBuilder; -import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; -import org.apache.shardingsphere.infra.binder.context.statement.ddl.AlterTableStatementContext; -import org.apache.shardingsphere.infra.binder.context.statement.ddl.CommentStatementContext; -import org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateIndexStatementContext; -import org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateTableStatementContext; -import org.apache.shardingsphere.infra.binder.context.type.ConstraintAvailable; -import org.apache.shardingsphere.infra.binder.context.type.IndexAvailable; -import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; -import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.hint.HintValueContext; -import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; -import org.apache.shardingsphere.infra.parser.SQLParserEngine; -import org.apache.shardingsphere.sql.parser.statement.core.segment.SQLSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; import javax.sql.DataSource; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.TreeMap; /** * Pipeline DDL generator. @@ -60,10 +35,6 @@ @Slf4j public final class PipelineDDLGenerator { - private static final String SET_SEARCH_PATH_PREFIX = "set search_path"; - - private final ShardingSphereMetaData metaData; - /** * Generate logic DDL. * @@ -72,135 +43,16 @@ public final class PipelineDDLGenerator { * @param schemaName schema name * @param sourceTableName source table name * @param targetTableName target table name - * @param parserEngine parser engine - * @param targetDatabaseName target database name * @return DDL SQL * @throws SQLException SQL exception */ - public List generateLogicDDL(final DatabaseType databaseType, final DataSource sourceDataSource, - final String schemaName, final String sourceTableName, final String targetTableName, - final SQLParserEngine parserEngine, final String targetDatabaseName) throws SQLException { + public static List generateLogicDDL(final DatabaseType databaseType, final DataSource sourceDataSource, + final String schemaName, final String sourceTableName, final String targetTableName) throws SQLException { long startTimeMillis = System.currentTimeMillis(); - List result = new ArrayList<>(); - for (String each : DatabaseTypedSPILoader.getService(DialectPipelineSQLBuilder.class, databaseType).buildCreateTableSQLs(sourceDataSource, schemaName, sourceTableName)) { - Optional queryContext = decorate(databaseType, targetDatabaseName, schemaName, targetTableName, parserEngine, each); - queryContext.ifPresent(sql -> { - String trimmedSql = sql.trim(); - if (!Strings.isNullOrEmpty(trimmedSql)) { - result.add(trimmedSql); - } - }); - } + List result = new ArrayList<>(DatabaseTypedSPILoader.getService(DialectPipelineSQLBuilder.class, databaseType) + .buildCreateTableSQLs(sourceDataSource, schemaName, sourceTableName)); log.info("generateLogicDDL, databaseType={}, schemaName={}, sourceTableName={}, targetTableName={}, cost {} ms", databaseType.getType(), schemaName, sourceTableName, targetTableName, System.currentTimeMillis() - startTimeMillis); return result; } - - private Optional decorate(final DatabaseType databaseType, final String targetDatabaseName, final String schemaName, final String targetTableName, - final SQLParserEngine parserEngine, final String sql) { - if (Strings.isNullOrEmpty(sql)) { - return Optional.empty(); - } - String result = decorateActualSQL(targetDatabaseName, targetTableName, parserEngine, sql.trim()); - // TODO remove it after set search_path is supported. - if ("openGauss".equals(databaseType.getType())) { - return decorateOpenGauss(targetDatabaseName, schemaName, result, parserEngine); - } - return Optional.of(result); - } - - private String decorateActualSQL(final String databaseName, final String targetTableName, final SQLParserEngine parserEngine, final String sql) { - SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql); - Map replaceMap = new TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex)); - if (sqlStatementContext instanceof CreateTableStatementContext) { - appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); - appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); - } - if (sqlStatementContext instanceof CommentStatementContext) { - appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); - } - if (sqlStatementContext instanceof CreateIndexStatementContext) { - appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); - appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); - } - if (sqlStatementContext instanceof AlterTableStatementContext) { - appendFromIndexAndConstraint(replaceMap, targetTableName, sqlStatementContext); - appendFromTable(replaceMap, targetTableName, (TableAvailable) sqlStatementContext); - } - return doDecorateActualTable(replaceMap, sql); - } - - private SQLStatementContext parseSQL(final String currentDatabaseName, final SQLParserEngine parserEngine, final String sql) { - return new SQLBindEngine(metaData, currentDatabaseName, new HintValueContext()).bind(parserEngine.parse(sql, true), Collections.emptyList()); - } - - private void appendFromIndexAndConstraint(final Map replaceMap, final String targetTableName, final SQLStatementContext sqlStatementContext) { - if (!(sqlStatementContext instanceof TableAvailable) || ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().isEmpty()) { - return; - } - TableNameSegment tableNameSegment = ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName(); - if (!tableNameSegment.getIdentifier().getValue().equals(targetTableName)) { - if (sqlStatementContext instanceof IndexAvailable) { - for (IndexSegment each : ((IndexAvailable) sqlStatementContext).getIndexes()) { - String logicIndexName = IndexMetaDataUtils.getLogicIndexName(each.getIndexName().getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); - replaceMap.put(each.getIndexName(), logicIndexName); - } - } - if (sqlStatementContext instanceof ConstraintAvailable) { - for (ConstraintSegment each : ((ConstraintAvailable) sqlStatementContext).getConstraints()) { - String logicConstraint = IndexMetaDataUtils.getLogicIndexName(each.getIdentifier().getValue(), tableNameSegment.getIdentifier().getValue()); - replaceMap.put(each, logicConstraint); - } - } - } - } - - private void appendFromTable(final Map replaceMap, final String targetTableName, final TableAvailable sqlStatementContext) { - for (SimpleTableSegment each : sqlStatementContext.getTablesContext().getSimpleTables()) { - if (!targetTableName.equals(each.getTableName().getIdentifier().getValue())) { - replaceMap.put(each.getTableName(), targetTableName); - } - } - } - - private String doDecorateActualTable(final Map replaceMap, final String sql) { - StringBuilder result = new StringBuilder(); - int lastStopIndex = 0; - for (Entry entry : replaceMap.entrySet()) { - result.append(sql, lastStopIndex, entry.getKey().getStartIndex()); - result.append(entry.getValue()); - lastStopIndex = entry.getKey().getStopIndex() + 1; - } - if (lastStopIndex < sql.length()) { - result.append(sql, lastStopIndex, sql.length()); - } - return result.toString(); - } - - // TODO remove it after set search_path is supported. - private Optional decorateOpenGauss(final String databaseName, final String schemaName, final String queryContext, - final SQLParserEngine parserEngine) { - if (queryContext.toLowerCase().startsWith(SET_SEARCH_PATH_PREFIX)) { - return Optional.empty(); - } - return Optional.of(replaceTableNameWithPrefix(queryContext, schemaName + ".", databaseName, parserEngine)); - } - - private String replaceTableNameWithPrefix(final String sql, final String prefix, final String databaseName, final SQLParserEngine parserEngine) { - SQLStatementContext sqlStatementContext = parseSQL(databaseName, parserEngine, sql); - if (sqlStatementContext instanceof CreateTableStatementContext || sqlStatementContext instanceof CommentStatementContext - || sqlStatementContext instanceof CreateIndexStatementContext || sqlStatementContext instanceof AlterTableStatementContext) { - if (((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().isEmpty()) { - return sql; - } - if (((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().isPresent()) { - return sql; - } - Map replaceMap = new TreeMap<>(Comparator.comparing(SQLSegment::getStartIndex)); - TableNameSegment tableNameSegment = ((TableAvailable) sqlStatementContext).getTablesContext().getSimpleTables().iterator().next().getTableName(); - replaceMap.put(tableNameSegment, prefix + tableNameSegment.getIdentifier().getValue()); - return doDecorateActualTable(replaceMap, sql); - } - return sql; - } } diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java index c256c37ae2a14..9d127680312e9 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparer.java @@ -17,10 +17,12 @@ package org.apache.shardingsphere.data.pipeline.core.preparer.datasource; +import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.data.pipeline.api.PipelineDataSourceConfiguration; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; +import org.apache.shardingsphere.data.pipeline.core.metadata.generator.PipelineDDLDecorator; import org.apache.shardingsphere.data.pipeline.core.metadata.generator.PipelineDDLGenerator; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.option.DialectPipelineJobDataSourcePrepareOption; import org.apache.shardingsphere.data.pipeline.core.preparer.datasource.param.CreateTableConfiguration; @@ -41,10 +43,8 @@ import java.sql.Statement; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; @@ -65,16 +65,14 @@ public final class PipelineJobDataSourcePreparer { * Prepare target schemas. * * @param param prepare target schemas parameter - * @return target schemas * @throws SQLException if prepare target schema fail */ - public Map prepareTargetSchemas(final PrepareTargetSchemasParameter param) throws SQLException { + public void prepareTargetSchemas(final PrepareTargetSchemasParameter param) throws SQLException { DatabaseType targetDatabaseType = param.getTargetDatabaseType(); DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(targetDatabaseType).getDialectDatabaseMetaData(); if (!dialectDatabaseMetaData.isSchemaAvailable()) { - return Collections.emptyMap(); + return; } - Map result = new HashMap<>(param.getCreateTableConfigurations().size(), 1F); String defaultSchema = dialectDatabaseMetaData.getDefaultSchema().orElse(null); PipelinePrepareSQLBuilder pipelineSQLBuilder = new PipelinePrepareSQLBuilder(targetDatabaseType); Collection createdSchemaNames = new HashSet<>(param.getCreateTableConfigurations().size(), 1F); @@ -85,21 +83,19 @@ public Map prepareTargetSchemas(final PrepareTar } Optional sql = pipelineSQLBuilder.buildCreateSchemaSQL(targetSchemaName); if (sql.isPresent()) { - executeCreateSchema(param.getDataSourceManager(), each.getTargetDataSourceConfig(), sql.get()).ifPresent(metaData -> result.put(targetSchemaName, metaData)); + executeCreateSchema(param.getDataSourceManager(), each.getTargetDataSourceConfig(), sql.get()); createdSchemaNames.add(targetSchemaName); } } - return result; } - private Optional executeCreateSchema(final PipelineDataSourceManager dataSourceManager, - final PipelineDataSourceConfiguration targetDataSourceConfig, final String sql) throws SQLException { + private void executeCreateSchema(final PipelineDataSourceManager dataSourceManager, + final PipelineDataSourceConfiguration targetDataSourceConfig, final String sql) throws SQLException { log.info("Prepare target schemas SQL: {}", sql); try ( Connection connection = dataSourceManager.getDataSource(targetDataSourceConfig).getConnection(); Statement statement = connection.createStatement()) { statement.execute(sql); - return Optional.of(((ShardingSphereConnection) connection).getContextManager().getMetaDataContexts().getMetaData()); } catch (final SQLException ex) { if (DatabaseTypedSPILoader.findService(DialectPipelineJobDataSourcePrepareOption.class, databaseType) .map(DialectPipelineJobDataSourcePrepareOption::isSupportIfNotExistsOnCreateSchema).orElse(true)) { @@ -107,7 +103,6 @@ private Optional executeCreateSchema(final PipelineDataS } log.warn("Create schema failed", ex); } - return Optional.empty(); } /** @@ -121,27 +116,34 @@ public void prepareTargetTables(final PrepareTargetTablesParameter param) throws PipelineDataSourceManager dataSourceManager = param.getDataSourceManager(); for (CreateTableConfiguration each : param.getCreateTableConfigurations()) { try (Connection targetConnection = dataSourceManager.getDataSource(each.getTargetDataSourceConfig()).getConnection()) { - ShardingSphereMetaData metaData = param.getTargetSchemaMetaData().get(each.getTargetName().getSchemaName()); - if (null == metaData) { - metaData = ((ShardingSphereConnection) targetConnection).getContextManager().getMetaDataContexts().getMetaData(); - } - List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager, param.getSqlParserEngine(), metaData, param.getTargetDatabaseName()); + List createTargetTableSQL = getCreateTargetTableSQL(each, dataSourceManager); for (String sql : createTargetTableSQL) { - executeTargetTableSQL(targetConnection, addIfNotExistsForCreateTableSQL(sql)); + ShardingSphereMetaData metaData = ((ShardingSphereConnection) targetConnection).getContextManager().getMetaDataContexts().getMetaData(); + Optional decoratedSQL = decorateTargetTableSQL(each, param.getSqlParserEngine(), metaData, param.getTargetDatabaseName(), sql); + if (decoratedSQL.isPresent()) { + executeTargetTableSQL(targetConnection, addIfNotExistsForCreateTableSQL(decoratedSQL.get())); + } } } } log.info("prepareTargetTables cost {} ms", System.currentTimeMillis() - startTimeMillis); } - private List getCreateTargetTableSQL(final CreateTableConfiguration createTableConfig, final PipelineDataSourceManager dataSourceManager, - final SQLParserEngine sqlParserEngine, final ShardingSphereMetaData metaData, final String targetDatabaseName) throws SQLException { + private List getCreateTargetTableSQL(final CreateTableConfiguration createTableConfig, final PipelineDataSourceManager dataSourceManager) throws SQLException { DatabaseType databaseType = createTableConfig.getSourceDataSourceConfig().getDatabaseType(); DataSource sourceDataSource = dataSourceManager.getDataSource(createTableConfig.getSourceDataSourceConfig()); String schemaName = createTableConfig.getSourceName().getSchemaName(); String sourceTableName = createTableConfig.getSourceName().getTableName(); String targetTableName = createTableConfig.getTargetName().getTableName(); - return new PipelineDDLGenerator(metaData).generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName, sqlParserEngine, targetDatabaseName); + return PipelineDDLGenerator.generateLogicDDL(databaseType, sourceDataSource, schemaName, sourceTableName, targetTableName); + } + + private Optional decorateTargetTableSQL(final CreateTableConfiguration createTableConfig, final SQLParserEngine sqlParserEngine, + final ShardingSphereMetaData metaData, final String targetDatabaseName, final String sql) { + String schemaName = createTableConfig.getSourceName().getSchemaName(); + String targetTableName = createTableConfig.getTargetName().getTableName(); + Optional decoratedSQL = new PipelineDDLDecorator(metaData).decorate(databaseType, targetDatabaseName, schemaName, targetTableName, sqlParserEngine, sql); + return decoratedSQL.map(String::trim).filter(trimmedSql -> !Strings.isNullOrEmpty(trimmedSql)); } private void executeTargetTableSQL(final Connection targetConnection, final String sql) throws SQLException { diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java index f14bb707ff0d7..e0c6cdccfd327 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/param/PrepareTargetTablesParameter.java @@ -20,11 +20,9 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceManager; -import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import java.util.Collection; -import java.util.Map; /** * Prepare target tables parameter. @@ -39,7 +37,5 @@ public final class PrepareTargetTablesParameter { private final SQLParserEngine sqlParserEngine; - private final Map targetSchemaMetaData; - private final String targetDatabaseName; } diff --git a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java index 73013470e88e8..6eec79b803b78 100644 --- a/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java +++ b/kernel/data-pipeline/core/src/test/java/org/apache/shardingsphere/data/pipeline/core/preparer/datasource/PipelineJobDataSourcePreparerTest.java @@ -31,7 +31,6 @@ import java.sql.SQLException; import java.util.Collections; -import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.any; @@ -60,7 +59,7 @@ void assertPrepareTargetTables() { when(connection.getContextManager().getMetaDataContexts().getMetaData()).thenReturn(mock(ShardingSphereMetaData.class)); PrepareTargetTablesParameter parameter = new PrepareTargetTablesParameter( Collections.singleton(createTableConfig), pipelineDataSourceManager, - mock(SQLParserEngine.class), mock(Map.class), "foo_db"); + mock(SQLParserEngine.class), "foo_db"); assertDoesNotThrow(() -> new PipelineJobDataSourcePreparer(databaseType).prepareTargetTables(parameter)); } } diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index e8d29bf89e2ce..6f88bce5f3ff4 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -65,19 +65,18 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.rule.SQLParserRule; import java.sql.SQLException; import java.util.Collection; import java.util.Collections; -import java.util.Map; /** * Migration job preparer. @@ -157,11 +156,11 @@ private void prepareTarget(final MigrationJobItemContext jobItemContext, final D Collection createTableConfigs = jobItemContext.getTaskConfig().getCreateTableConfigurations(); PipelineDataSourceManager dataSourceManager = jobItemContext.getDataSourceManager(); PipelineJobDataSourcePreparer preparer = new PipelineJobDataSourcePreparer(targetDatabaseType); - Map targetSchemaMetaData = preparer.prepareTargetSchemas(new PrepareTargetSchemasParameter(targetDatabaseType, createTableConfigs, dataSourceManager)); + preparer.prepareTargetSchemas(new PrepareTargetSchemasParameter(targetDatabaseType, createTableConfigs, dataSourceManager)); ShardingSphereMetaData metaData = contextManager.getMetaDataContexts().getMetaData(); SQLParserEngine sqlParserEngine = metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class) .getSQLParserEngine(metaData.getDatabase(jobConfig.getTargetDatabaseName()).getProtocolType()); - preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine, targetSchemaMetaData, jobConfig.getTargetDatabaseName())); + preparer.prepareTargetTables(new PrepareTargetTablesParameter(createTableConfigs, dataSourceManager, sqlParserEngine, jobConfig.getTargetDatabaseName())); } private void prepareIncremental(final MigrationJobItemContext jobItemContext) { From 7dec6c676c999c2b684997e9d04fb6497bf00f81 Mon Sep 17 00:00:00 2001 From: duanzhengqiang Date: Mon, 23 Dec 2024 17:02:28 +0800 Subject: [PATCH 121/192] Support MySQL update with statement parse --- .../mysql/visitor/statement/MySQLStatementVisitor.java | 3 +++ .../parser/statement/mysql/dml/MySQLUpdateStatement.java | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java index 28fb3b1022bb4..c7d56d971a903 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java @@ -1552,6 +1552,9 @@ public ASTNode visitUpdate(final UpdateContext ctx) { if (null != ctx.limitClause()) { result.setLimit((LimitSegment) visit(ctx.limitClause())); } + if (null != ctx.withClause()) { + result.setWithSegment((WithSegment) visit(ctx.withClause())); + } result.addParameterMarkerSegments(getParameterMarkerSegments()); return result; } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLUpdateStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLUpdateStatement.java index 57aea84c4d28b..8677efa3dfa2c 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLUpdateStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLUpdateStatement.java @@ -20,6 +20,7 @@ import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; @@ -31,10 +32,17 @@ @Setter public final class MySQLUpdateStatement extends UpdateStatement implements MySQLStatement { + private WithSegment withSegment; + private OrderBySegment orderBy; private LimitSegment limit; + @Override + public Optional getWithSegment() { + return Optional.ofNullable(withSegment); + } + @Override public Optional getOrderBy() { return Optional.ofNullable(orderBy); From fc259368375867a12678c94a082b081484d19df0 Mon Sep 17 00:00:00 2001 From: duanzhengqiang Date: Mon, 23 Dec 2024 17:04:21 +0800 Subject: [PATCH 122/192] update release note --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 35d084add1452..b1f96d7cd956d 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -36,6 +36,7 @@ 1. Metadata: Add load-table-metadata-batch-size props to concurrent load table metadata - [#34009](https://github.com/apache/shardingsphere/pull/34009) 1. SQL Binder: Add sql bind logic for create table statement - [#34074](https://github.com/apache/shardingsphere/pull/34074) 1. SQL Binder: Support create index statement sql bind - [#34112](https://github.com/apache/shardingsphere/pull/34112) +1. SQL Parser: Support MySQL update with statement parse - [#34126](https://github.com/apache/shardingsphere/pull/34126) ### Bug Fixes From 44c49a17420c85a3d5a788562642f8adf799516a Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Mon, 23 Dec 2024 17:34:05 +0800 Subject: [PATCH 123/192] Fix index out of bounds exception for migration without unique keys (#34127) --- .../table/calculator/RecordSingleTableInventoryCalculator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordSingleTableInventoryCalculator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordSingleTableInventoryCalculator.java index 22af62850c3c7..ebf59bb3c7c6a 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordSingleTableInventoryCalculator.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/consistencycheck/table/calculator/RecordSingleTableInventoryCalculator.java @@ -148,7 +148,7 @@ private void fulfillCalculationContext(final CalculationContext calculationConte } private String getQuerySQL(final SingleTableInventoryCalculateParameter param) { - ShardingSpherePreconditions.checkNotNull(param.getFirstUniqueKey(), + ShardingSpherePreconditions.checkState(param.getUniqueKeys() != null && !param.getUniqueKeys().isEmpty() && null != param.getFirstUniqueKey(), () -> new UnsupportedOperationException("Record inventory calculator does not support table without unique key and primary key now.")); PipelineDataConsistencyCalculateSQLBuilder pipelineSQLBuilder = new PipelineDataConsistencyCalculateSQLBuilder(param.getDatabaseType()); Collection columnNames = param.getColumnNames().isEmpty() ? Collections.singleton("*") : param.getColumnNames(); From d681b205671951bc3484aa04bf5728cb071d1e9a Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Mon, 23 Dec 2024 22:03:30 +0800 Subject: [PATCH 124/192] Refactor GlobalLockDefinition (#34128) --- .../migration/preparer/MigrationJobPreparer.java | 2 +- .../globalclock/executor/GlobalClockTransactionHook.java | 2 +- .../mode/lock/global/GlobalLockDefinition.java | 4 ++++ .../refresher/ShardingSphereStatisticsRefreshEngine.java | 2 +- .../mode/lock/global/GlobalLockDefinitionTest.java | 2 +- .../manager/cluster/lock/ClusterLockContextTest.java | 3 ++- .../persist/service/GlobalLockPersistServiceTest.java | 9 +++++---- .../distsql/ral/updatable/LockClusterExecutor.java | 2 +- .../distsql/ral/updatable/UnlockClusterExecutor.java | 2 +- 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 6f88bce5f3ff4..7c505dd06942d 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -118,7 +118,7 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem if (!jobItemManager.getProgress(jobId, jobItemContext.getShardingItem()).isPresent()) { jobItemManager.persistProgress(jobItemContext); } - LockDefinition lockDefinition = new GlobalLockDefinition(String.format(GlobalLockNames.PREPARE.getLockName(), jobConfig.getJobId())); + LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.PREPARE, jobConfig.getJobId()); long startTimeMillis = System.currentTimeMillis(); if (lockContext.tryLock(lockDefinition, 600 * 1000L)) { log.info("Lock success, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index abe1f6436c5a1..16e01e9c3eef1 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -41,7 +41,7 @@ */ public final class GlobalClockTransactionHook implements TransactionHook { - private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.GLOBAL_LOCK.getLockName()); + private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.GLOBAL_LOCK); @Override public void beforeBegin(final GlobalClockRule rule, final DatabaseType databaseType, final TransactionConnectionContext transactionContext) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index 43cc3a02154f8..9988d61cb9765 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -33,4 +33,8 @@ public final class GlobalLockDefinition implements LockDefinition { public GlobalLockDefinition(final String lockName) { lockKey = String.format(KEY_PATTERN, lockName); } + + public GlobalLockDefinition(final GlobalLockNames lockName, final Object... lockParams) { + lockKey = String.format(KEY_PATTERN, String.format(lockName.getLockName(), lockParams)); + } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index c87b8e1904379..59aab09ab855f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -84,7 +84,7 @@ public void refresh() { } private void collectAndRefresh() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.STATISTICS.getLockName()); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.STATISTICS); if (lockContext.tryLock(lockDefinition, 5000L)) { try { ShardingSphereStatistics statistics = contextManager.getMetaDataContexts().getStatistics(); diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java index 8f28aeafd0667..8e273682d8a85 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java @@ -26,6 +26,6 @@ class GlobalLockDefinitionTest { @Test void assertGetLockKey() { - assertThat(new GlobalLockDefinition("foo_lock").getLockKey(), is("/lock/exclusive/locks/foo_lock")); + assertThat(new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK).getLockKey(), is("/lock/exclusive/locks/cluster_lock")); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java index e9c5a39d9a0fd..711d7335a00fe 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java @@ -19,6 +19,7 @@ import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -32,7 +33,7 @@ @ExtendWith(MockitoExtension.class) class ClusterLockContextTest { - private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition("foo_lock"); + private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); @Mock private LockPersistService lockPersistService; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java index 690d86303cc7f..164a4402b5780 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -37,15 +38,15 @@ class GlobalLockPersistServiceTest { @Test void assertTryLock() { - when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock").tryLock(1000L)).thenReturn(true); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition("foo_lock"); + when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock").tryLock(1000L)).thenReturn(true); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); assertTrue(new GlobalLockPersistService(repository).tryLock(lockDefinition, 1000L)); } @Test void assertUnlock() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition("foo_lock"); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); new GlobalLockPersistService(repository).unlock(lockDefinition); - verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock")).unlock(); + verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock")).unlock(); } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 7316f5405c5c4..a35bf9bf1288d 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -43,7 +43,7 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context checkState(contextManager); checkAlgorithm(sqlStatement); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK.getLockName()); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); if (lockContext.tryLock(lockDefinition, 3000L)) { try { checkState(contextManager); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index a32b2e650fd2d..6c24fdc623a0a 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -38,7 +38,7 @@ public final class UnlockClusterExecutor implements DistSQLUpdateExecutor Date: Mon, 23 Dec 2024 23:01:56 +0800 Subject: [PATCH 125/192] Rename GlobalLockName (#34129) --- .../scenario/migration/preparer/MigrationJobPreparer.java | 4 ++-- .../globalclock/executor/GlobalClockTransactionHook.java | 4 ++-- .../mode/lock/global/GlobalLockDefinition.java | 6 +----- .../global/{GlobalLockNames.java => GlobalLockName.java} | 4 ++-- .../refresher/ShardingSphereStatisticsRefreshEngine.java | 4 ++-- .../mode/lock/global/GlobalLockDefinitionTest.java | 2 +- .../mode/manager/cluster/lock/ClusterLockContextTest.java | 4 ++-- .../persist/service/GlobalLockPersistServiceTest.java | 6 +++--- .../handler/distsql/ral/updatable/LockClusterExecutor.java | 4 ++-- .../distsql/ral/updatable/UnlockClusterExecutor.java | 4 ++-- 10 files changed, 19 insertions(+), 23 deletions(-) rename mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/{GlobalLockNames.java => GlobalLockName.java} (95%) diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 7c505dd06942d..0bed58cbd4cfe 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -70,7 +70,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.rule.SQLParserRule; @@ -118,7 +118,7 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem if (!jobItemManager.getProgress(jobId, jobItemContext.getShardingItem()).isPresent()) { jobItemManager.persistProgress(jobItemContext); } - LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.PREPARE, jobConfig.getJobId()); + LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.PREPARE, jobConfig.getJobId()); long startTimeMillis = System.currentTimeMillis(); if (lockContext.tryLock(lockDefinition, 600 * 1000L)) { log.info("Lock success, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 16e01e9c3eef1..6f9f8cc23f309 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.globalclock.rule.constant.GlobalClockOrder; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; @@ -41,7 +41,7 @@ */ public final class GlobalClockTransactionHook implements TransactionHook { - private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.GLOBAL_LOCK); + private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.GLOBAL_LOCK); @Override public void beforeBegin(final GlobalClockRule rule, final DatabaseType databaseType, final TransactionConnectionContext transactionContext) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index 9988d61cb9765..bee425df49d7b 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -30,11 +30,7 @@ public final class GlobalLockDefinition implements LockDefinition { private final String lockKey; - public GlobalLockDefinition(final String lockName) { - lockKey = String.format(KEY_PATTERN, lockName); - } - - public GlobalLockDefinition(final GlobalLockNames lockName, final Object... lockParams) { + public GlobalLockDefinition(final GlobalLockName lockName, final Object... lockParams) { lockKey = String.format(KEY_PATTERN, String.format(lockName.getLockName(), lockParams)); } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java similarity index 95% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java index 1656c137889e3..03a92419e45a6 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockNames.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java @@ -21,11 +21,11 @@ import lombok.RequiredArgsConstructor; /** - * Global lock names. + * Global lock name. */ @RequiredArgsConstructor @Getter -public enum GlobalLockNames { +public enum GlobalLockName { CLUSTER_LOCK("cluster_lock"), diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index 59aab09ab855f..d3add96827bf4 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -36,7 +36,7 @@ import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper; import org.apache.shardingsphere.metadata.persist.data.AlteredShardingSphereDatabaseData; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.manager.ContextManager; import java.util.ArrayList; @@ -84,7 +84,7 @@ public void refresh() { } private void collectAndRefresh() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.STATISTICS); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.STATISTICS); if (lockContext.tryLock(lockDefinition, 5000L)) { try { ShardingSphereStatistics statistics = contextManager.getMetaDataContexts().getStatistics(); diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java index 8e273682d8a85..19732c7a989f3 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java @@ -26,6 +26,6 @@ class GlobalLockDefinitionTest { @Test void assertGetLockKey() { - assertThat(new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK).getLockKey(), is("/lock/exclusive/locks/cluster_lock")); + assertThat(new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK).getLockKey(), is("/lock/exclusive/locks/cluster_lock")); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java index 711d7335a00fe..08d857be142c3 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -33,7 +33,7 @@ @ExtendWith(MockitoExtension.class) class ClusterLockContextTest { - private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); + private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); @Mock private LockPersistService lockPersistService; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java index 164a4402b5780..77ea847d5e003 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -39,13 +39,13 @@ class GlobalLockPersistServiceTest { @Test void assertTryLock() { when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock").tryLock(1000L)).thenReturn(true); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); assertTrue(new GlobalLockPersistService(repository).tryLock(lockDefinition, 1000L)); } @Test void assertUnlock() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); new GlobalLockPersistService(repository).unlock(lockDefinition); verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock")).unlock(); } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index a35bf9bf1288d..ebaf98e816db9 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.algorithm.core.exception.MissingRequiredAlgorithmException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; @@ -43,7 +43,7 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context checkState(contextManager); checkAlgorithm(sqlStatement); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockNames.CLUSTER_LOCK); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); if (lockContext.tryLock(lockDefinition, 3000L)) { try { checkState(contextManager); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index 6c24fdc623a0a..701e1c0eee3f0 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired; import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; -import org.apache.shardingsphere.mode.lock.global.GlobalLockNames; +import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.NotLockedClusterException; @@ -38,7 +38,7 @@ public final class UnlockClusterExecutor implements DistSQLUpdateExecutor Date: Mon, 23 Dec 2024 23:09:30 +0800 Subject: [PATCH 126/192] Rename GlobalLockName.GLOBAL_CLOCK (#34130) --- .../globalclock/executor/GlobalClockTransactionHook.java | 2 +- .../apache/shardingsphere/mode/lock/global/GlobalLockName.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 6f9f8cc23f309..3a36bf69dca92 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -41,7 +41,7 @@ */ public final class GlobalClockTransactionHook implements TransactionHook { - private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.GLOBAL_LOCK); + private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.GLOBAL_CLOCK); @Override public void beforeBegin(final GlobalClockRule rule, final DatabaseType databaseType, final TransactionConnectionContext transactionContext) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java index 03a92419e45a6..782c0818ce0c5 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java @@ -31,7 +31,7 @@ public enum GlobalLockName { PREPARE("prepare_%s"), - GLOBAL_LOCK("global_clock"), + GLOBAL_CLOCK("global_clock"), STATISTICS("statistics"); From a01e7ef37bf991870ac54ca159fd77a3d3b7b10c Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 24 Dec 2024 07:44:02 +0800 Subject: [PATCH 127/192] Add GlobalLock (#34131) * Add GlobalLock * Add GlobalLock --- .../preparer/MigrationJobPreparer.java | 3 +- .../preparer/MigrationPrepareLock.java | 35 +++++++++++++++++++ .../globalclock/executor/GlobalClockLock.java | 31 ++++++++++++++++ .../executor/GlobalClockTransactionHook.java | 3 +- .../mode/lock/global/GlobalLock.java | 31 ++++++++++++++++ .../lock/global/GlobalLockDefinition.java | 4 +++ .../mode/lock/global/GlobalLockName.java | 6 ---- ...ShardingSphereStatisticsRefreshEngine.java | 4 +-- .../refresher/lock/StatisticsLock.java | 31 ++++++++++++++++ .../lock/global/GlobalLockDefinitionTest.java | 6 +++- .../cluster/lock/ClusterLockContextTest.java | 9 +++-- .../service/GlobalLockPersistServiceTest.java | 19 +++++++--- .../ral/updatable/LockClusterExecutor.java | 4 +-- .../ral/updatable/UnlockClusterExecutor.java | 4 +-- .../ral/updatable/lock/ClusterLock.java | 31 ++++++++++++++++ 15 files changed, 197 insertions(+), 24 deletions(-) create mode 100644 kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationPrepareLock.java create mode 100644 kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockLock.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLock.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/lock/StatisticsLock.java create mode 100644 proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/lock/ClusterLock.java diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 0bed58cbd4cfe..1d2314aa29e43 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -70,7 +70,6 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.rule.SQLParserRule; @@ -118,7 +117,7 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem if (!jobItemManager.getProgress(jobId, jobItemContext.getShardingItem()).isPresent()) { jobItemManager.persistProgress(jobItemContext); } - LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.PREPARE, jobConfig.getJobId()); + LockDefinition lockDefinition = new GlobalLockDefinition(new MigrationPrepareLock(jobConfig.getJobId())); long startTimeMillis = System.currentTimeMillis(); if (lockContext.tryLock(lockDefinition, 600 * 1000L)) { log.info("Lock success, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationPrepareLock.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationPrepareLock.java new file mode 100644 index 0000000000000..958045d301fc0 --- /dev/null +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationPrepareLock.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.data.pipeline.scenario.migration.preparer; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.mode.lock.global.GlobalLock; + +/** + * Migration prepare lock. + */ +@RequiredArgsConstructor +public final class MigrationPrepareLock implements GlobalLock { + + private final String jobId; + + @Override + public String getName() { + return String.format("migration_prepare_%s", jobId); + } +} diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockLock.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockLock.java new file mode 100644 index 0000000000000..589b13b4e8138 --- /dev/null +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockLock.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.globalclock.executor; + +import org.apache.shardingsphere.mode.lock.global.GlobalLock; + +/** + * Global clock lock. + */ +public final class GlobalClockLock implements GlobalLock { + + @Override + public String getName() { + return "global_clock"; + } +} diff --git a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java index 3a36bf69dca92..c6093c1d03ea6 100644 --- a/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java +++ b/kernel/global-clock/core/src/main/java/org/apache/shardingsphere/globalclock/executor/GlobalClockTransactionHook.java @@ -23,7 +23,6 @@ import org.apache.shardingsphere.globalclock.rule.constant.GlobalClockOrder; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; @@ -41,7 +40,7 @@ */ public final class GlobalClockTransactionHook implements TransactionHook { - private final LockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.GLOBAL_CLOCK); + private final LockDefinition lockDefinition = new GlobalLockDefinition(new GlobalClockLock()); @Override public void beforeBegin(final GlobalClockRule rule, final DatabaseType databaseType, final TransactionConnectionContext transactionContext) { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLock.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLock.java new file mode 100644 index 0000000000000..c4c54b55c36f5 --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLock.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.lock.global; + +/** + * Global lock. + */ +public interface GlobalLock { + + /** + * Get lock name. + * + * @return lock name + */ + String getName(); +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index bee425df49d7b..a886d715dc86d 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -33,4 +33,8 @@ public final class GlobalLockDefinition implements LockDefinition { public GlobalLockDefinition(final GlobalLockName lockName, final Object... lockParams) { lockKey = String.format(KEY_PATTERN, String.format(lockName.getLockName(), lockParams)); } + + public GlobalLockDefinition(final GlobalLock globalLock) { + lockKey = String.format(KEY_PATTERN, globalLock.getName()); + } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java index 782c0818ce0c5..b05d10e0d760c 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java @@ -27,12 +27,6 @@ @Getter public enum GlobalLockName { - CLUSTER_LOCK("cluster_lock"), - - PREPARE("prepare_%s"), - - GLOBAL_CLOCK("global_clock"), - STATISTICS("statistics"); private final String lockName; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index d3add96827bf4..61fe8413cb779 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -36,8 +36,8 @@ import org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper; import org.apache.shardingsphere.metadata.persist.data.AlteredShardingSphereDatabaseData; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.metadata.refresher.lock.StatisticsLock; import java.util.ArrayList; import java.util.Map; @@ -84,7 +84,7 @@ public void refresh() { } private void collectAndRefresh() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.STATISTICS); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new StatisticsLock()); if (lockContext.tryLock(lockDefinition, 5000L)) { try { ShardingSphereStatistics statistics = contextManager.getMetaDataContexts().getStatistics(); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/lock/StatisticsLock.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/lock/StatisticsLock.java new file mode 100644 index 0000000000000..db5d495102780 --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/lock/StatisticsLock.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.metadata.refresher.lock; + +import org.apache.shardingsphere.mode.lock.global.GlobalLock; + +/** + * Statistics lock. + */ +public final class StatisticsLock implements GlobalLock { + + @Override + public String getName() { + return "statistics"; + } +} diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java index 19732c7a989f3..82ee55f24a609 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java @@ -21,11 +21,15 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; class GlobalLockDefinitionTest { @Test void assertGetLockKey() { - assertThat(new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK).getLockKey(), is("/lock/exclusive/locks/cluster_lock")); + GlobalLock globalLock = mock(GlobalLock.class); + when(globalLock.getName()).thenReturn("foo_lock"); + assertThat(new GlobalLockDefinition(globalLock).getLockKey(), is("/lock/exclusive/locks/foo_lock")); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java index 08d857be142c3..8b168bad457df 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.mode.manager.cluster.lock; import org.apache.shardingsphere.mode.lock.LockPersistService; +import org.apache.shardingsphere.mode.lock.global.GlobalLock; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -33,15 +33,20 @@ @ExtendWith(MockitoExtension.class) class ClusterLockContextTest { - private final GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); + @Mock + private GlobalLock globalLock; @Mock private LockPersistService lockPersistService; + private GlobalLockDefinition lockDefinition; + private ClusterLockContext lockContext; @BeforeEach void init() { + when(globalLock.getName()).thenReturn("foo_lock"); + lockDefinition = new GlobalLockDefinition(globalLock); lockContext = new ClusterLockContext(lockPersistService); } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java index 77ea847d5e003..6a34617d5b2bf 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java @@ -17,9 +17,10 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; +import org.apache.shardingsphere.mode.lock.global.GlobalLock; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Answers; @@ -33,20 +34,28 @@ @ExtendWith(MockitoExtension.class) class GlobalLockPersistServiceTest { + @Mock + private GlobalLock globalLock; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private ClusterPersistRepository repository; + @BeforeEach + void setUp() { + when(globalLock.getName()).thenReturn("foo_lock"); + } + @Test void assertTryLock() { - when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock").tryLock(1000L)).thenReturn(true); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); + when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock").tryLock(1000L)).thenReturn(true); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(globalLock); assertTrue(new GlobalLockPersistService(repository).tryLock(lockDefinition, 1000L)); } @Test void assertUnlock() { - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(globalLock); new GlobalLockPersistService(repository).unlock(lockDefinition); - verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/cluster_lock")).unlock(); + verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock")).unlock(); } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index ebaf98e816db9..73d2bb59f26da 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -23,13 +23,13 @@ import org.apache.shardingsphere.infra.algorithm.core.exception.MissingRequiredAlgorithmException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.LockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.lock.ClusterLock; import org.apache.shardingsphere.proxy.backend.lock.spi.ClusterLockStrategy; /** @@ -43,7 +43,7 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context checkState(contextManager); checkAlgorithm(sqlStatement); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); - GlobalLockDefinition lockDefinition = new GlobalLockDefinition(GlobalLockName.CLUSTER_LOCK); + GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new ClusterLock()); if (lockContext.tryLock(lockDefinition, 3000L)) { try { checkState(contextManager); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index 701e1c0eee3f0..d9d28b883f875 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -21,12 +21,12 @@ import org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired; import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; -import org.apache.shardingsphere.mode.lock.global.GlobalLockName; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.NotLockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.lock.ClusterLock; /** * Unlock cluster executor. @@ -38,7 +38,7 @@ public final class UnlockClusterExecutor implements DistSQLUpdateExecutor Date: Tue, 24 Dec 2024 08:29:58 +0800 Subject: [PATCH 128/192] Remove useless GlobalLockName (#34132) --- .../lock/global/GlobalLockDefinition.java | 4 --- .../mode/lock/global/GlobalLockName.java | 33 ------------------- 2 files changed, 37 deletions(-) delete mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index a886d715dc86d..76376151d59f1 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -30,10 +30,6 @@ public final class GlobalLockDefinition implements LockDefinition { private final String lockKey; - public GlobalLockDefinition(final GlobalLockName lockName, final Object... lockParams) { - lockKey = String.format(KEY_PATTERN, String.format(lockName.getLockName(), lockParams)); - } - public GlobalLockDefinition(final GlobalLock globalLock) { lockKey = String.format(KEY_PATTERN, globalLock.getName()); } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java deleted file mode 100644 index b05d10e0d760c..0000000000000 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockName.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.lock.global; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * Global lock name. - */ -@RequiredArgsConstructor -@Getter -public enum GlobalLockName { - - STATISTICS("statistics"); - - private final String lockName; -} From d187256683203faea21028b6e74813267601fa3d Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 24 Dec 2024 11:54:48 +0800 Subject: [PATCH 129/192] Add todo on cluster lock (#34133) --- .../handler/distsql/ral/updatable/LockClusterExecutor.java | 1 + .../handler/distsql/ral/updatable/UnlockClusterExecutor.java | 1 + 2 files changed, 2 insertions(+) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 73d2bb59f26da..f490b58143aea 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -44,6 +44,7 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context checkAlgorithm(sqlStatement); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new ClusterLock()); + // TODO should configured in SQL Statement if (lockContext.tryLock(lockDefinition, 3000L)) { try { checkState(contextManager); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index d9d28b883f875..9b744e649564d 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -39,6 +39,7 @@ public void executeUpdate(final UnlockClusterStatement sqlStatement, final Conte checkState(contextManager); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new ClusterLock()); + // TODO should configured in SQL Statement if (lockContext.tryLock(lockDefinition, 3000L)) { try { checkState(contextManager); From cf0b19a0b511f91135725f3abcc60a57dfebd9ad Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Tue, 24 Dec 2024 16:14:18 +0800 Subject: [PATCH 130/192] Remove TablesContext#findTableNames method and implement select order by, group by bind logic (#34123) * Remove TablesContext#findTableNames method and use sql bind info to replace * fix unit test * optimize select statement binder * update release note --- RELEASE-NOTES.md | 1 + .../EncryptOrderByItemSupportedChecker.java | 10 +- ...ncryptPredicateColumnSupportedChecker.java | 9 +- .../condition/EncryptConditionEngine.java | 28 +--- .../EncryptSQLRewriteContextDecorator.java | 5 +- .../EncryptGroupByItemTokenGenerator.java | 20 +-- ...ncryptOrderByItemSupportedCheckerTest.java | 4 + ...ptPredicateColumnSupportedCheckerTest.java | 2 - ...PredicateRightValueTokenGeneratorTest.java | 2 +- .../EncryptGroupByItemTokenGeneratorTest.java | 6 +- .../WhereClauseShardingConditionEngine.java | 27 ++-- .../sharding/rule/ShardingRule.java | 17 +-- ...hereClauseShardingConditionEngineTest.java | 5 - .../sharding/rule/ShardingRuleTest.java | 13 +- .../context/segment/table/TablesContext.java | 127 ------------------ .../expression/ExpressionSegmentBinder.java | 5 + .../type/BetweenExpressionSegmentBinder.java | 54 ++++++++ .../segment/order/GroupBySegmentBinder.java | 71 ++++++++++ .../segment/order/OrderBySegmentBinder.java | 71 ++++++++++ .../item/ColumnOrderByItemSegmentBinder.java | 52 +++++++ .../ExpressionOrderByItemSegmentBinder.java | 52 +++++++ .../order/item/OrderByItemSegmentBinder.java | 58 ++++++++ .../predicate/HavingSegmentBinder.java | 51 +++++++ .../WhereSegmentBinder.java | 2 +- .../statement/dml/DeleteStatementBinder.java | 2 +- .../statement/dml/SelectStatementBinder.java | 28 +++- .../statement/dml/UpdateStatementBinder.java | 2 +- .../segment/table/TablesContextTest.java | 70 ---------- .../WhereSegmentBinderTest.java | 2 +- 29 files changed, 498 insertions(+), 298 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{where => predicate}/WhereSegmentBinder.java (97%) rename infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/{where => predicate}/WhereSegmentBinderTest.java (97%) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index b1f96d7cd956d..318dd2e0892a8 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -37,6 +37,7 @@ 1. SQL Binder: Add sql bind logic for create table statement - [#34074](https://github.com/apache/shardingsphere/pull/34074) 1. SQL Binder: Support create index statement sql bind - [#34112](https://github.com/apache/shardingsphere/pull/34112) 1. SQL Parser: Support MySQL update with statement parse - [#34126](https://github.com/apache/shardingsphere/pull/34126) +1. SQL Binder: Remove TablesContext#findTableNames method and implement select order by, group by bind logic - [#34123](https://github.com/apache/shardingsphere/pull/34123) ### Bug Fixes diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java index f12994d2ea1a7..45ec1217aa6ab 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java @@ -32,9 +32,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; import java.util.Collection; -import java.util.Collections; import java.util.LinkedList; -import java.util.Map; import java.util.Optional; /** @@ -64,7 +62,7 @@ private boolean containsOrderByItem(final SelectStatementContext sqlStatementCon public void check(final EncryptRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final SelectStatementContext sqlStatementContext) { for (OrderByItem each : getOrderByItems(sqlStatementContext)) { if (each.getSegment() instanceof ColumnOrderByItemSegment) { - checkColumnOrderByItem(rule, currentSchema, sqlStatementContext, ((ColumnOrderByItemSegment) each.getSegment()).getColumn()); + checkColumnOrderByItem(rule, ((ColumnOrderByItemSegment) each.getSegment()).getColumn()); } } } @@ -80,10 +78,8 @@ private Collection getOrderByItems(final SelectStatementContext sql return result; } - private void checkColumnOrderByItem(final EncryptRule rule, final ShardingSphereSchema schema, final SelectStatementContext sqlStatementContext, final ColumnSegment columnSegment) { - Map columnTableNames = sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment), schema); - String tableName = columnTableNames.getOrDefault(columnSegment.getExpression(), ""); - Optional encryptTable = rule.findEncryptTable(tableName); + private void checkColumnOrderByItem(final EncryptRule rule, final ColumnSegment columnSegment) { + Optional encryptTable = rule.findEncryptTable(columnSegment.getColumnBoundInfo().getOriginalTable().getValue()); String columnName = columnSegment.getIdentifier().getValue(); ShardingSpherePreconditions.checkState(!encryptTable.isPresent() || !encryptTable.get().isEncryptColumn(columnName), () -> new UnsupportedEncryptSQLException("ORDER BY")); } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java index 9938819dc23e6..129e69441bbea 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java @@ -25,7 +25,6 @@ import org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; @@ -40,7 +39,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; import java.util.Collection; -import java.util.Map; import java.util.Optional; /** @@ -60,13 +58,12 @@ public void check(final EncryptRule rule, final ShardingSphereDatabase database, Collection joinConditions = SQLStatementContextExtractor.getJoinConditions((WhereAvailable) sqlStatementContext, allSubqueryContexts); ShardingSpherePreconditions.checkState(JoinConditionsEncryptorComparator.isSame(joinConditions, rule), () -> new UnsupportedSQLOperationException("Can not use different encryptor in join condition")); - check(rule, currentSchema, (WhereAvailable) sqlStatementContext); + check(rule, (WhereAvailable) sqlStatementContext); } - private void check(final EncryptRule rule, final ShardingSphereSchema schema, final WhereAvailable sqlStatementContext) { - Map columnExpressionTableNames = ((TableAvailable) sqlStatementContext).getTablesContext().findTableNames(sqlStatementContext.getColumnSegments(), schema); + private void check(final EncryptRule rule, final WhereAvailable sqlStatementContext) { for (ColumnSegment each : sqlStatementContext.getColumnSegments()) { - Optional encryptTable = rule.findEncryptTable(columnExpressionTableNames.getOrDefault(each.getExpression(), "")); + Optional encryptTable = rule.findEncryptTable(each.getColumnBoundInfo().getOriginalTable().getValue()); String columnName = each.getIdentifier().getValue(); if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(columnName) && includesLike(sqlStatementContext.getWhereSegments(), each)) { String tableName = encryptTable.get().getTable(); diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java index ecee22e14e1ae..2c66ec5d512ec 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java @@ -24,12 +24,8 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.encrypt.rule.table.EncryptTable; import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; -import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; -import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; -import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; @@ -43,13 +39,11 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubqueryExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.AndPredicate; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeSet; @@ -89,44 +83,36 @@ public final class EncryptConditionEngine { * Create encrypt conditions. * * @param whereSegments where segments - * @param columnSegments column segments - * @param sqlStatementContext SQL statement context - * @param databaseName database name * @return encrypt conditions */ - public Collection createEncryptConditions(final Collection whereSegments, final Collection columnSegments, - final SQLStatementContext sqlStatementContext, final String databaseName) { + public Collection createEncryptConditions(final Collection whereSegments) { Collection result = new LinkedList<>(); - String defaultSchema = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName); - ShardingSphereSchema schema = ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(database::getSchema).orElseGet(() -> database.getSchema(defaultSchema)); - Map expressionTableNames = ((TableAvailable) sqlStatementContext).getTablesContext().findTableNames(columnSegments, schema); for (WhereSegment each : whereSegments) { Collection andPredicates = ExpressionExtractor.extractAndPredicates(each.getExpr()); for (AndPredicate predicate : andPredicates) { - addEncryptConditions(result, predicate.getPredicates(), expressionTableNames); + addEncryptConditions(result, predicate.getPredicates()); } } return result; } - private void addEncryptConditions(final Collection encryptConditions, final Collection predicates, final Map expressionTableNames) { + private void addEncryptConditions(final Collection encryptConditions, final Collection predicates) { Collection stopIndexes = new HashSet<>(predicates.size(), 1F); for (ExpressionSegment each : predicates) { if (stopIndexes.add(each.getStopIndex())) { - addEncryptConditions(encryptConditions, each, expressionTableNames); + addEncryptConditions(encryptConditions, each); } } } - private void addEncryptConditions(final Collection encryptConditions, final ExpressionSegment expression, final Map expressionTableNames) { + private void addEncryptConditions(final Collection encryptConditions, final ExpressionSegment expression) { if (!findNotContainsNullLiteralsExpression(expression).isPresent()) { return; } for (ColumnSegment each : ColumnExtractor.extract(expression)) { - ColumnSegmentBoundInfo columnBoundInfo = each.getColumnBoundInfo(); - String tableName = columnBoundInfo.getOriginalTable().getValue().isEmpty() ? expressionTableNames.getOrDefault(each.getExpression(), "") : columnBoundInfo.getOriginalTable().getValue(); + String tableName = each.getColumnBoundInfo().getOriginalTable().getValue(); Optional encryptTable = rule.findEncryptTable(tableName); - if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) { + if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getColumnBoundInfo().getOriginalColumn().getValue())) { createEncryptCondition(expression, tableName).ifPresent(encryptConditions::add); } } diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java index 045a014ba0094..7f7fab2ad91e4 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/context/EncryptSQLRewriteContextDecorator.java @@ -37,7 +37,6 @@ import org.apache.shardingsphere.infra.rewrite.parameter.rewriter.ParameterRewritersBuilder; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.builder.SQLTokenGeneratorBuilder; import org.apache.shardingsphere.infra.route.context.RouteContext; -import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; import java.util.Collection; @@ -93,9 +92,7 @@ private Collection createEncryptConditions(final EncryptRule r } Collection allSubqueryContexts = SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext); Collection whereSegments = SQLStatementContextExtractor.getWhereSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); - Collection columnSegments = SQLStatementContextExtractor.getColumnSegments((WhereAvailable) sqlStatementContext, allSubqueryContexts); - return new EncryptConditionEngine(rule, sqlRewriteContext.getDatabase()).createEncryptConditions(whereSegments, columnSegments, sqlStatementContext, - sqlRewriteContext.getDatabase().getName()); + return new EncryptConditionEngine(rule, sqlRewriteContext.getDatabase()).createEncryptConditions(whereSegments); } private void rewriteParameters(final SQLRewriteContext sqlRewriteContext, final Collection parameterRewriters) { diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java index 2abad5c730490..cfc5d86a68956 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGenerator.java @@ -30,9 +30,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.CollectionSQLTokenGenerator; -import org.apache.shardingsphere.infra.rewrite.sql.token.common.generator.aware.SchemaMetaDataAware; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.SQLToken; import org.apache.shardingsphere.infra.rewrite.sql.token.common.pojo.generic.SubstitutableColumnNameToken; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; @@ -42,7 +40,6 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; -import java.util.Map; import java.util.Optional; /** @@ -51,14 +48,10 @@ @HighFrequencyInvocation @RequiredArgsConstructor @Setter -public final class EncryptGroupByItemTokenGenerator implements CollectionSQLTokenGenerator, SchemaMetaDataAware { +public final class EncryptGroupByItemTokenGenerator implements CollectionSQLTokenGenerator { private final EncryptRule rule; - private Map schemas; - - private ShardingSphereSchema defaultSchema; - @Override public boolean isGenerateSQLToken(final SQLStatementContext sqlStatementContext) { return sqlStatementContext instanceof SelectStatementContext && containsGroupByItem((SelectStatementContext) sqlStatementContext); @@ -79,21 +72,18 @@ private boolean containsGroupByItem(final SelectStatementContext sqlStatementCon @Override public Collection generateSQLTokens(final SelectStatementContext sqlStatementContext) { Collection result = new LinkedList<>(); - ShardingSphereSchema schema = sqlStatementContext.getTablesContext().getSchemaName().map(schemas::get).orElseGet(() -> defaultSchema); for (OrderByItem each : getGroupByItems(sqlStatementContext)) { if (each.getSegment() instanceof ColumnOrderByItemSegment) { ColumnSegment columnSegment = ((ColumnOrderByItemSegment) each.getSegment()).getColumn(); - Map columnTableNames = sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment), schema); - generateSQLToken(columnSegment, columnTableNames, sqlStatementContext.getDatabaseType()).ifPresent(result::add); + generateSQLToken(columnSegment, sqlStatementContext.getDatabaseType()).ifPresent(result::add); } } return result; } - private Optional generateSQLToken(final ColumnSegment columnSegment, final Map columnTableNames, final DatabaseType databaseType) { - String tableName = columnTableNames.getOrDefault(columnSegment.getExpression(), ""); - Optional encryptTable = rule.findEncryptTable(tableName); - String columnName = columnSegment.getIdentifier().getValue(); + private Optional generateSQLToken(final ColumnSegment columnSegment, final DatabaseType databaseType) { + Optional encryptTable = rule.findEncryptTable(columnSegment.getColumnBoundInfo().getOriginalTable().getValue()); + String columnName = columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(); if (!encryptTable.isPresent() || !encryptTable.get().isEncryptColumn(columnName)) { return Optional.empty(); } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java index bd54b59414a6a..edaaffc99ea84 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java @@ -33,6 +33,8 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -116,6 +118,8 @@ private SelectStatementContext mockSelectStatementContext(final String tableName simpleTableSegment.setAlias(new AliasSegment(0, 0, new IdentifierValue("a"))); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("foo_col")); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a"))); + columnSegment.setColumnBoundInfo( + new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue(tableName), new IdentifierValue("foo_col"))); SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); when(result.getDatabaseType()).thenReturn(databaseType); ColumnOrderByItemSegment columnOrderByItemSegment = new ColumnOrderByItemSegment(columnSegment, OrderDirection.ASC, NullsOrderType.FIRST); diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java index 1c2ef0ba5aff8..b82a0c37a5e7a 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java @@ -88,7 +88,6 @@ private SQLStatementContext mockSelectStatementContextWithLike() { columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("t_user"), new IdentifierValue("user_name"))); SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); - when(result.getTablesContext().findTableNames(Collections.singleton(columnSegment), null)).thenReturn(Collections.singletonMap("user_name", "t_user")); when(result.getColumnSegments()).thenReturn(Collections.singleton(columnSegment)); when(result.getWhereSegments()).thenReturn(Collections.singleton(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, columnSegment, columnSegment, "LIKE", "")))); when(result.getSubqueryContexts()).thenReturn(Collections.emptyMap()); @@ -106,7 +105,6 @@ private SQLStatementContext mockSelectStatementContextWithEqual() { columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_schema")), new IdentifierValue("t_user"), new IdentifierValue("user_name"))); SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); - when(result.getTablesContext().findTableNames(Collections.singleton(columnSegment), null)).thenReturn(Collections.singletonMap("user_name", "t_user")); when(result.getColumnSegments()).thenReturn(Collections.singleton(columnSegment)); when(result.getWhereSegments()).thenReturn(Collections.singleton(new WhereSegment(0, 0, new BinaryOperationExpression(0, 0, columnSegment, columnSegment, "=", "")))); when(result.getSubqueryContexts()).thenReturn(Collections.emptyMap()); diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGeneratorTest.java index d37fea852b784..002e641a26ffc 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/predicate/EncryptPredicateRightValueTokenGeneratorTest.java @@ -63,6 +63,6 @@ void assertGenerateSQLTokenFromGenerateNewSQLToken() { private Collection getEncryptConditions(final UpdateStatementContext updateStatementContext) { ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", mock(), mock(), mock(), Collections.singleton(new ShardingSphereSchema("foo_db"))); return new EncryptConditionEngine(EncryptGeneratorFixtureBuilder.createEncryptRule(), database) - .createEncryptConditions(updateStatementContext.getWhereSegments(), updateStatementContext.getColumnSegments(), updateStatementContext, "foo_db"); + .createEncryptConditions(updateStatementContext.getWhereSegments()); } } diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGeneratorTest.java index add57075398b5..ab0011e86f5a4 100644 --- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGeneratorTest.java +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/select/EncryptGroupByItemTokenGeneratorTest.java @@ -25,13 +25,14 @@ import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -56,7 +57,6 @@ class EncryptGroupByItemTokenGeneratorTest { @BeforeEach void setup() { generator = new EncryptGroupByItemTokenGenerator(mockEncryptRule()); - generator.setSchemas(Collections.singletonMap("test", mock(ShardingSphereSchema.class))); } private EncryptRule mockEncryptRule() { @@ -79,6 +79,8 @@ private SelectStatementContext buildSelectStatementContext() { SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_encrypt"))); simpleTableSegment.setAlias(new AliasSegment(0, 0, new IdentifierValue("a"))); ColumnSegment columnSegment = new ColumnSegment(0, 0, new IdentifierValue("certificate_number")); + columnSegment.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("t_encrypt"), + new IdentifierValue("certificate_number"))); columnSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue("a"))); SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); when(result.getDatabaseType()).thenReturn(databaseType); diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java index 752f68dbff152..8a9eb3f0aecf0 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java @@ -36,12 +36,12 @@ import org.apache.shardingsphere.sharding.route.engine.condition.value.RangeShardingConditionValue; import org.apache.shardingsphere.sharding.route.engine.condition.value.ShardingConditionValue; import org.apache.shardingsphere.sharding.rule.ShardingRule; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.AndPredicate; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.util.SafeNumberOperationUtils; import org.apache.shardingsphere.timeservice.core.rule.TimestampServiceRule; @@ -80,23 +80,18 @@ public List createShardingConditions(final SQLStatementContex if (!(sqlStatementContext instanceof WhereAvailable)) { return Collections.emptyList(); } - Collection columnSegments = ((WhereAvailable) sqlStatementContext).getColumnSegments(); - ShardingSphereSchema schema = getSchema(sqlStatementContext, database); - Map columnExpressionTableNames = sqlStatementContext instanceof TableAvailable - ? ((TableAvailable) sqlStatementContext).getTablesContext().findTableNames(columnSegments, schema) - : Collections.emptyMap(); List result = new ArrayList<>(); for (WhereSegment each : SQLStatementContextExtractor.getAllWhereSegments(sqlStatementContext)) { - result.addAll(createShardingConditions(each.getExpr(), params, columnExpressionTableNames)); + result.addAll(createShardingConditions(each.getExpr(), params)); } return result; } - private Collection createShardingConditions(final ExpressionSegment expression, final List params, final Map columnExpressionTableNames) { + private Collection createShardingConditions(final ExpressionSegment expression, final List params) { Collection andPredicates = ExpressionExtractor.extractAndPredicates(expression); Collection result = new LinkedList<>(); for (AndPredicate each : andPredicates) { - Map> shardingConditionValues = createShardingConditionValueMap(each.getPredicates(), params, columnExpressionTableNames); + Map> shardingConditionValues = createShardingConditionValueMap(each.getPredicates(), params); if (shardingConditionValues.isEmpty()) { return Collections.emptyList(); } @@ -115,18 +110,16 @@ private ShardingSphereSchema getSchema(final SQLStatementContext sqlStatementCon : database.getSchema(defaultSchemaName); } - private Map> createShardingConditionValueMap(final Collection predicates, - final List params, final Map columnTableNames) { + private Map> createShardingConditionValueMap(final Collection predicates, final List params) { Map> result = new HashMap<>(predicates.size(), 1F); for (ExpressionSegment each : predicates) { for (ColumnSegment columnSegment : ColumnExtractor.extract(each)) { - Optional tableName = Optional.ofNullable(Optional.ofNullable(columnTableNames.get(columnSegment.getExpression())) - .orElse(columnSegment.getColumnBoundInfo().getOriginalTable().getValue())); - Optional shardingColumn = tableName.flatMap(optional -> shardingRule.findShardingColumn(columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(), optional)); - if (!tableName.isPresent() || !shardingColumn.isPresent()) { + String tableName = columnSegment.getColumnBoundInfo().getOriginalTable().getValue(); + Optional shardingColumn = shardingRule.findShardingColumn(columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(), tableName); + if (!shardingColumn.isPresent()) { continue; } - Column column = new Column(shardingColumn.get(), tableName.get()); + Column column = new Column(shardingColumn.get(), tableName); Optional shardingConditionValue = ConditionValueGeneratorFactory.generate(each, column, params, timestampServiceRule); if (!shardingConditionValue.isPresent()) { continue; diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java index 758d45b663c96..6c3e63386eacf 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java @@ -68,7 +68,6 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; import javax.sql.DataSource; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -586,8 +585,8 @@ private boolean isJoinConditionContainsShardingColumns(final ShardingSphereSchem return false; } for (AndPredicate andPredicate : andPredicates) { - databaseJoinConditionTables.addAll(getJoinConditionTables(schema, select, andPredicate.getPredicates(), true)); - tableJoinConditionTables.addAll(getJoinConditionTables(schema, select, andPredicate.getPredicates(), false)); + databaseJoinConditionTables.addAll(getJoinConditionTables(andPredicate.getPredicates(), true)); + tableJoinConditionTables.addAll(getJoinConditionTables(andPredicate.getPredicates(), false)); } } ShardingTable shardingTable = getShardingTable(tableNames.iterator().next()); @@ -598,8 +597,7 @@ private boolean isJoinConditionContainsShardingColumns(final ShardingSphereSchem return containsDatabaseShardingColumns && containsTableShardingColumns; } - private Collection getJoinConditionTables(final ShardingSphereSchema schema, final SelectStatementContext select, - final Collection predicates, final boolean isDatabaseJoinCondition) { + private Collection getJoinConditionTables(final Collection predicates, final boolean isDatabaseJoinCondition) { Collection result = new LinkedList<>(); for (ExpressionSegment each : predicates) { if (!isJoinConditionExpression(each)) { @@ -607,9 +605,8 @@ private Collection getJoinConditionTables(final ShardingSphereSchema sch } ColumnSegment leftColumn = (ColumnSegment) ((BinaryOperationExpression) each).getLeft(); ColumnSegment rightColumn = (ColumnSegment) ((BinaryOperationExpression) each).getRight(); - Map columnExpressionTableNames = select.getTablesContext().findTableNames(Arrays.asList(leftColumn, rightColumn), schema); - Optional leftShardingTable = findShardingTable(columnExpressionTableNames.get(leftColumn.getExpression())); - Optional rightShardingTable = findShardingTable(columnExpressionTableNames.get(rightColumn.getExpression())); + Optional leftShardingTable = findShardingTable(leftColumn.getColumnBoundInfo().getOriginalTable().getValue()); + Optional rightShardingTable = findShardingTable(rightColumn.getColumnBoundInfo().getOriginalTable().getValue()); if (!leftShardingTable.isPresent() || !rightShardingTable.isPresent()) { continue; } @@ -621,8 +618,8 @@ private Collection getJoinConditionTables(final ShardingSphereSchema sch : getTableShardingStrategyConfiguration(rightShardingTable.get()); if (findShardingColumn(leftConfig, leftColumn.getIdentifier().getValue()).isPresent() && findShardingColumn(rightConfig, rightColumn.getIdentifier().getValue()).isPresent()) { - result.add(columnExpressionTableNames.get(leftColumn.getExpression())); - result.add(columnExpressionTableNames.get(rightColumn.getExpression())); + result.add(leftColumn.getColumnBoundInfo().getOriginalTable().getValue()); + result.add(rightColumn.getColumnBoundInfo().getOriginalTable().getValue()); } } return result; diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java index 307d85fc262ee..d85bba0435e9c 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sharding.route.engine.condition.engine; -import org.apache.groovy.util.Maps; import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; @@ -52,7 +51,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyCollection; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -78,9 +76,6 @@ void setUp() { shardingConditionEngine = new WhereClauseShardingConditionEngine(ShardingSphereDatabase.create("test_db", TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), new ConfigurationProperties(new Properties())), shardingRule, mock(TimestampServiceRule.class)); when(sqlStatementContext.getWhereSegments()).thenReturn(Collections.singleton(whereSegment)); - when(sqlStatementContext.getTablesContext()).thenReturn(tablesContext); - when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); - when(tablesContext.findTableNames(anyCollection(), any())).thenReturn(Maps.of("foo_sharding_col", "table_1")); } @Test diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java index 4d2c328ee126f..9caefec97bf8f 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java @@ -53,6 +53,8 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; @@ -653,7 +655,6 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseJoinCondition() { when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType); when(sqlStatementContext.getTablesContext().getSchemaName()).thenReturn(Optional.empty()); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); - when(sqlStatementContext.getTablesContext().findTableNames(Arrays.asList(leftDatabaseJoin, rightDatabaseJoin), schema)).thenReturn(createColumnTableNameMap()); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("foo_db"); when(database.getSchema("foo_db")).thenReturn(schema); @@ -686,10 +687,18 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseJoinConditionInUpperCaseAnd @Test void assertIsAllBindingTableWithJoinQueryWithDatabaseTableJoinCondition() { ColumnSegment leftDatabaseJoin = createColumnSegment("user_id", "logic_Table"); + leftDatabaseJoin.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("logic_Table"), + new IdentifierValue("user_id"))); ColumnSegment rightDatabaseJoin = createColumnSegment("user_id", "sub_Logic_Table"); + rightDatabaseJoin.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("sub_Logic_Table"), + new IdentifierValue("user_id"))); BinaryOperationExpression databaseJoin = createBinaryOperationExpression(leftDatabaseJoin, rightDatabaseJoin, EQUAL); ColumnSegment leftTableJoin = createColumnSegment("order_id", "logic_Table"); + leftTableJoin.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("logic_Table"), + new IdentifierValue("order_id"))); ColumnSegment rightTableJoin = createColumnSegment("order_id", "sub_Logic_Table"); + rightTableJoin.setColumnBoundInfo(new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(new IdentifierValue("foo_db"), new IdentifierValue("foo_db")), new IdentifierValue("sub_Logic_Table"), + new IdentifierValue("order_id"))); BinaryOperationExpression tableJoin = createBinaryOperationExpression(leftTableJoin, rightTableJoin, EQUAL); JoinTableSegment joinTable = mock(JoinTableSegment.class); BinaryOperationExpression condition = createBinaryOperationExpression(databaseJoin, tableJoin, AND); @@ -703,8 +712,6 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseTableJoinCondition() { when(sqlStatementContext.getTablesContext().getSchemaName()).thenReturn(Optional.empty()); when(sqlStatementContext.getWhereSegments()).thenReturn(Collections.singleton(new WhereSegment(0, 0, condition))); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); - when(sqlStatementContext.getTablesContext().findTableNames(Arrays.asList(leftDatabaseJoin, rightDatabaseJoin), schema)).thenReturn(createColumnTableNameMap()); - when(sqlStatementContext.getTablesContext().findTableNames(Arrays.asList(leftTableJoin, rightTableJoin), schema)).thenReturn(createColumnTableNameMap()); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("foo_db"); when(database.getSchema("foo_db")).thenReturn(schema); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java index 50fb33851a60e..b274f0d8eaa05 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java @@ -17,19 +17,14 @@ package org.apache.shardingsphere.infra.binder.context.segment.table; -import com.cedarsoftware.util.CaseInsensitiveMap; import com.cedarsoftware.util.CaseInsensitiveSet; import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.Getter; import lombok.ToString; -import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; import org.apache.shardingsphere.infra.binder.context.segment.select.subquery.SubqueryTableContext; import org.apache.shardingsphere.infra.binder.context.segment.select.subquery.engine.SubqueryTableContextEngine; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; @@ -38,11 +33,9 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.Optional; -import java.util.TreeSet; /** * Tables context. @@ -111,126 +104,6 @@ private Map> createSubqueryTables(final return result; } - /** - * Find expression table name map. - * - * @param columns column segments - * @param schema schema - * @return expression table name map - */ - @HighFrequencyInvocation - public Map findTableNames(final Collection columns, final ShardingSphereSchema schema) { - if (1 == simpleTables.size()) { - return findTableNameFromSingleTable(columns); - } - Map result = new CaseInsensitiveMap<>(); - Map> ownerColumnNames = getOwnerColumnNames(columns); - result.putAll(findTableNameFromSQL(ownerColumnNames)); - Collection noOwnerColumnNames = getNoOwnerColumnNames(columns); - result.putAll(findTableNameFromMetaData(noOwnerColumnNames, schema)); - result.putAll(findTableNameFromSubquery(columns, result)); - return result; - } - - @HighFrequencyInvocation - private Map findTableNameFromSingleTable(final Collection columns) { - String tableName = simpleTables.iterator().next().getTableName().getIdentifier().getValue(); - Map result = new CaseInsensitiveMap<>(); - for (ColumnSegment each : columns) { - result.putIfAbsent(each.getExpression(), tableName); - } - return result; - } - - @HighFrequencyInvocation - private Map> getOwnerColumnNames(final Collection columns) { - Map> result = new CaseInsensitiveMap<>(); - for (ColumnSegment each : columns) { - if (!each.getOwner().isPresent()) { - continue; - } - result.computeIfAbsent(each.getOwner().get().getIdentifier().getValue(), unused -> new LinkedList<>()).add(each.getExpression()); - } - return result; - } - - @HighFrequencyInvocation - private Map findTableNameFromSQL(final Map> ownerColumnNames) { - if (ownerColumnNames.isEmpty()) { - return Collections.emptyMap(); - } - Map result = new LinkedHashMap<>(simpleTables.size(), 1F); - for (SimpleTableSegment each : simpleTables) { - String tableName = each.getTableName().getIdentifier().getValue(); - if (ownerColumnNames.containsKey(tableName)) { - ownerColumnNames.get(tableName).forEach(column -> result.put(column, tableName)); - } - Optional alias = each.getAliasName(); - if (alias.isPresent() && ownerColumnNames.containsKey(alias.get())) { - ownerColumnNames.get(alias.get()).forEach(column -> result.put(column, tableName)); - } - } - return result; - } - - @HighFrequencyInvocation - private Map findTableNameFromMetaData(final Collection noOwnerColumnNames, final ShardingSphereSchema schema) { - if (noOwnerColumnNames.isEmpty()) { - return Collections.emptyMap(); - } - Map result = new LinkedHashMap<>(noOwnerColumnNames.size(), 1F); - for (SimpleTableSegment each : simpleTables) { - String tableName = each.getTableName().getIdentifier().getValue(); - if (schema.containsTable(tableName)) { - filterColumnNames(noOwnerColumnNames, schema.getTable(tableName)).forEach(columnName -> result.put(columnName, tableName)); - } - } - return result; - } - - @HighFrequencyInvocation - private Collection filterColumnNames(final Collection noOwnerColumnNames, final ShardingSphereTable table) { - Collection result = new LinkedList<>(); - for (String each : noOwnerColumnNames) { - if (table.containsColumn(each)) { - result.add(each); - } - } - return result; - } - - @HighFrequencyInvocation - private Collection getNoOwnerColumnNames(final Collection columns) { - Collection result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - for (ColumnSegment each : columns) { - if (!each.getOwner().isPresent()) { - result.add(each.getIdentifier().getValue()); - } - } - return result; - } - - @HighFrequencyInvocation - private Map findTableNameFromSubquery(final Collection columns, final Map ownerTableNames) { - if (ownerTableNames.size() == columns.size() || subqueryTables.isEmpty()) { - return Collections.emptyMap(); - } - Map result = new LinkedHashMap<>(columns.size(), 1F); - for (ColumnSegment each : columns) { - if (ownerTableNames.containsKey(each.getExpression())) { - continue; - } - String owner = each.getOwner().map(optional -> optional.getIdentifier().getValue()).orElse(""); - Collection subqueryTableContexts = subqueryTables.getOrDefault(owner, Collections.emptyList()); - for (SubqueryTableContext subqueryTableContext : subqueryTableContexts) { - if (subqueryTableContext.getColumnNames().contains(each.getIdentifier().getValue())) { - result.put(each.getExpression(), subqueryTableContext.getTableName()); - } - } - } - return result; - } - /** * Get database name. * diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java index 5adaf40ff5d11..78b395fc203b8 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java @@ -23,6 +23,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.BetweenExpressionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.BinaryOperationExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ExistsSubqueryExpressionBinder; @@ -33,6 +34,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExistsSubqueryExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; @@ -84,6 +86,9 @@ public static ExpressionSegment bind(final ExpressionSegment segment, final Segm if (segment instanceof FunctionSegment) { return FunctionExpressionSegmentBinder.bind((FunctionSegment) segment, parentSegmentType, binderContext, tableBinderContexts, outerTableBinderContexts); } + if (segment instanceof BetweenExpression) { + return BetweenExpressionSegmentBinder.bind((BetweenExpression) segment, binderContext, tableBinderContexts, outerTableBinderContexts); + } // TODO support more ExpressionSegment bound return segment; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java new file mode 100644 index 0000000000000..b12f2c5feaaf4 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; + +/** + * Between expression binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class BetweenExpressionSegmentBinder { + + /** + * Bind between expression. + * + * @param segment between expression segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @return bound between segment + */ + public static BetweenExpression bind(final BetweenExpression segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts) { + ExpressionSegment boundLeft = ExpressionSegmentBinder.bind(segment.getLeft(), SegmentType.PREDICATE, binderContext, tableBinderContexts, outerTableBinderContexts); + ExpressionSegment boundBetweenExpr = ExpressionSegmentBinder.bind(segment.getBetweenExpr(), SegmentType.PREDICATE, binderContext, tableBinderContexts, outerTableBinderContexts); + ExpressionSegment boundAndExpr = ExpressionSegmentBinder.bind(segment.getAndExpr(), SegmentType.PREDICATE, binderContext, tableBinderContexts, outerTableBinderContexts); + return new BetweenExpression(segment.getStartIndex(), segment.getStopIndex(), boundLeft, boundBetweenExpr, boundAndExpr, segment.isNot()); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java new file mode 100644 index 0000000000000..8d36597ed7460 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.order; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.order.item.OrderByItemSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.GroupBySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment; + +import java.util.Collection; +import java.util.LinkedList; + +/** + * Group by segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class GroupBySegmentBinder { + + /** + * Bind group by segment. + * + * @param segment group by segment + * @param binderContext SQL statement binder context + * @param currentTableBinderContexts current table binder contexts + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @return bound group by segment + */ + public static GroupBySegment bind(final GroupBySegment segment, final SQLStatementBinderContext binderContext, + final Multimap currentTableBinderContexts, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts) { + Collection boundGroupByItems = new LinkedList<>(); + for (OrderByItemSegment each : segment.getGroupByItems()) { + boundGroupByItems.add(bind(binderContext, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts, each)); + } + return new GroupBySegment(segment.getStartIndex(), segment.getStopIndex(), boundGroupByItems); + } + + private static OrderByItemSegment bind(final SQLStatementBinderContext binderContext, final Multimap currentTableBinderContexts, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, final OrderByItemSegment groupByItemSegment) { + try { + return OrderByItemSegmentBinder.bind(groupByItemSegment, binderContext, currentTableBinderContexts, outerTableBinderContexts, SegmentType.GROUP_BY); + } catch (final ColumnNotFoundException ignored) { + return OrderByItemSegmentBinder.bind(groupByItemSegment, binderContext, tableBinderContexts, outerTableBinderContexts, SegmentType.GROUP_BY); + } + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java new file mode 100644 index 0000000000000..426549e60141a --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.order; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.order.item.OrderByItemSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment; + +import java.util.Collection; +import java.util.LinkedList; + +/** + * Order by segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class OrderBySegmentBinder { + + /** + * Bind order by segment. + * + * @param segment order by segment + * @param binderContext SQL statement binder context + * @param currentTableBinderContexts current table binder contexts + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @return bound order by segment + */ + public static OrderBySegment bind(final OrderBySegment segment, final SQLStatementBinderContext binderContext, + final Multimap currentTableBinderContexts, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts) { + Collection boundGroupByItems = new LinkedList<>(); + for (OrderByItemSegment each : segment.getOrderByItems()) { + boundGroupByItems.add(bind(binderContext, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts, each)); + } + return new OrderBySegment(segment.getStartIndex(), segment.getStopIndex(), boundGroupByItems); + } + + private static OrderByItemSegment bind(final SQLStatementBinderContext binderContext, final Multimap currentTableBinderContexts, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, final OrderByItemSegment orderByItemSegment) { + try { + return OrderByItemSegmentBinder.bind(orderByItemSegment, binderContext, currentTableBinderContexts, outerTableBinderContexts, SegmentType.ORDER_BY); + } catch (final ColumnNotFoundException ignored) { + return OrderByItemSegmentBinder.bind(orderByItemSegment, binderContext, tableBinderContexts, outerTableBinderContexts, SegmentType.ORDER_BY); + } + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java new file mode 100644 index 0000000000000..abedd2763b122 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.order.item; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; + +/** + * Column order by item segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ColumnOrderByItemSegmentBinder { + + /** + * Bind column order by item segment. + * + * @param segment column order by item segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @param segmentType segment type + * @return bound column order by item segment + */ + public static ColumnOrderByItemSegment bind(final ColumnOrderByItemSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, final SegmentType segmentType) { + return new ColumnOrderByItemSegment(ColumnSegmentBinder.bind(segment.getColumn(), segmentType, binderContext, tableBinderContexts, outerTableBinderContexts), segment.getOrderDirection(), + segment.getNullsOrderType().orElse(null)); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java new file mode 100644 index 0000000000000..454fa2142f380 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.order.item; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment; + +/** + * Expression order by item segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ExpressionOrderByItemSegmentBinder { + + /** + * Bind expression order by item segment. + * + * @param segment expression order by item segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @param segmentType segment type + * @return bound expression order by item segment + */ + public static ExpressionOrderByItemSegment bind(final ExpressionOrderByItemSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, final SegmentType segmentType) { + return new ExpressionOrderByItemSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getExpression(), segment.getOrderDirection(), segment.getNullsOrderType().orElse(null), + ExpressionSegmentBinder.bind(segment.getExpr(), segmentType, binderContext, tableBinderContexts, outerTableBinderContexts)); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java new file mode 100644 index 0000000000000..b1e152b4938ad --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.order.item; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment; + +/** + * Order by item segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class OrderByItemSegmentBinder { + + /** + * Bind order by item segment. + * + * @param segment order by item segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @param segmentType segment type + * @return bound order by item segment + */ + public static OrderByItemSegment bind(final OrderByItemSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, final SegmentType segmentType) { + if (segment instanceof ColumnOrderByItemSegment) { + return ColumnOrderByItemSegmentBinder.bind((ColumnOrderByItemSegment) segment, binderContext, tableBinderContexts, outerTableBinderContexts, segmentType); + } + if (segment instanceof ExpressionOrderByItemSegment) { + return ExpressionOrderByItemSegmentBinder.bind((ExpressionOrderByItemSegment) segment, binderContext, tableBinderContexts, outerTableBinderContexts, segmentType); + } + return segment; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java new file mode 100644 index 0000000000000..d321b700a2fba --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.predicate; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.HavingSegment; + +/** + * Having segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class HavingSegmentBinder { + + /** + * Bind having segment. + * + * @param segment having segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts + * @return bound having segment + */ + public static HavingSegment bind(final HavingSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts) { + return new HavingSegment(segment.getStartIndex(), segment.getStopIndex(), + ExpressionSegmentBinder.bind(segment.getExpr(), SegmentType.PREDICATE, binderContext, tableBinderContexts, outerTableBinderContexts)); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java similarity index 97% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java index 8c96935e7e874..c9e57d1cb7871 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.where; +package org.apache.shardingsphere.infra.binder.engine.segment.predicate; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java index 663c8f5bb45d4..30ad9a5519971 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java @@ -23,7 +23,7 @@ import lombok.SneakyThrows; import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.where.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java index 47c8357c87dc8..521d949a899f9 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java @@ -25,14 +25,22 @@ import org.apache.shardingsphere.infra.binder.engine.segment.combine.CombineSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.lock.LockSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.order.GroupBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.predicate.HavingSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.projection.ProjectionsSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.where.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; +import java.util.Collection; import java.util.Optional; /** @@ -57,16 +65,27 @@ public SelectStatement bind(final SelectStatement sqlStatement, final SQLStateme sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, binderContext, tableBinderContexts, outerTableBinderContexts))); sqlStatement.getCombine().ifPresent(optional -> result.setCombine(CombineSegmentBinder.bind(optional, binderContext, outerTableBinderContexts))); sqlStatement.getLock().ifPresent(optional -> result.setLock(LockSegmentBinder.bind(optional, binderContext, tableBinderContexts, outerTableBinderContexts))); + Multimap currentTableBinderContexts = createCurrentTableBinderContexts(binderContext, result); + sqlStatement.getGroupBy().ifPresent(optional -> result.setGroupBy( + GroupBySegmentBinder.bind(optional, binderContext, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts))); + sqlStatement.getOrderBy().ifPresent(optional -> result.setOrderBy( + OrderBySegmentBinder.bind(optional, binderContext, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts))); + sqlStatement.getHaving().ifPresent(optional -> result.setHaving(HavingSegmentBinder.bind(optional, binderContext, currentTableBinderContexts, outerTableBinderContexts))); // TODO support other segment bind in select statement return result; } + private Multimap createCurrentTableBinderContexts(final SQLStatementBinderContext binderContext, final SelectStatement selectStatement) { + Multimap result = LinkedHashMultimap.create(); + Collection subqueryProjections = SubqueryTableBindUtils.createSubqueryProjections( + selectStatement.getProjections().getProjections(), new IdentifierValue(""), binderContext.getSqlStatement().getDatabaseType()); + result.put(new CaseInsensitiveString(""), new SimpleTableSegmentBinderContext(subqueryProjections)); + return result; + } + @SneakyThrows(ReflectiveOperationException.class) private SelectStatement copy(final SelectStatement sqlStatement) { SelectStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); - sqlStatement.getGroupBy().ifPresent(result::setGroupBy); - sqlStatement.getHaving().ifPresent(result::setHaving); - sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); sqlStatement.getWindow().ifPresent(result::setWindow); sqlStatement.getModelSegment().ifPresent(result::setModelSegment); @@ -74,6 +93,7 @@ private SelectStatement copy(final SelectStatement sqlStatement) { sqlStatement.getWithSegment().ifPresent(result::setWithSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java index 2747106952de2..1de69236fdd96 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.assign.AssignmentSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.where.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java index 377c317dfb3da..20fd15c36b2ff 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java @@ -17,10 +17,6 @@ package org.apache.shardingsphere.infra.binder.context.segment.table; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; @@ -33,16 +29,13 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.Map; import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -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.when; class TablesContextTest { @@ -75,61 +68,6 @@ void assertInstanceCreatedWhenNoExceptionThrown() { assertThat(tablesContext.getTableNames(), is(Collections.singleton("tbl"))); } - @Test - void assertFindTableNameWhenSingleTable() { - SimpleTableSegment tableSegment = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - ColumnSegment columnSegment = createColumnSegment(null, "col"); - Map actual = new TablesContext(Collections.singletonList(tableSegment)).findTableNames(Collections.singletonList(columnSegment), mock()); - assertFalse(actual.isEmpty()); - assertThat(actual.get("col"), is("table_1")); - } - - @Test - void assertFindTableNameWhenColumnSegmentOwnerPresent() { - SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2", "sharding_db_1"); - ColumnSegment columnSegment = createColumnSegment("table_1", "col"); - Map actual = new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).findTableNames(Collections.singletonList(columnSegment), mock()); - assertFalse(actual.isEmpty()); - assertThat(actual.get("table_1.col"), is("table_1")); - } - - @Test - void assertFindTableNameWhenColumnSegmentOwnerAbsent() { - SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2", "sharding_db_1"); - ColumnSegment columnSegment = createColumnSegment(null, "col"); - Map actual = new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).findTableNames(Collections.singletonList(columnSegment), mock()); - assertTrue(actual.isEmpty()); - } - - @Test - void assertFindTableNameWhenColumnSegmentOwnerAbsentAndSchemaMetaDataContainsColumn() { - SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2", "sharding_db_1"); - ShardingSphereSchema schema = mock(ShardingSphereSchema.class); - when(schema.containsTable("table_1")).thenReturn(true); - ShardingSphereTable table = mock(ShardingSphereTable.class); - when(table.containsColumn("col")).thenReturn(true); - when(schema.getTable("table_1")).thenReturn(table); - ColumnSegment columnSegment = createColumnSegment(null, "col"); - Map actual = new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).findTableNames(Collections.singletonList(columnSegment), schema); - assertThat(actual.get("col"), is("table_1")); - } - - @Test - void assertFindTableNameWhenColumnSegmentOwnerAbsentAndSchemaMetaDataContainsColumnInUpperCase() { - SimpleTableSegment tableSegment1 = createTableSegment("TABLE_1", "TBL_1", "sharding_db_1"); - SimpleTableSegment tableSegment2 = createTableSegment("TABLE_2", "TBL_2", "sharding_db_1"); - ShardingSphereTable table = new ShardingSphereTable("TABLE_1", - Collections.singletonList(new ShardingSphereColumn("COL", 0, false, false, true, true, false, false)), Collections.emptyList(), Collections.emptyList()); - ShardingSphereSchema schema = new ShardingSphereSchema("foo_db", Collections.singleton(table), Collections.emptyList()); - ColumnSegment columnSegment = createColumnSegment(null, "COL"); - Map actual = new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).findTableNames(Collections.singletonList(columnSegment), schema); - assertFalse(actual.isEmpty()); - assertThat(actual.get("col"), is("TABLE_1")); - } - private SimpleTableSegment createTableSegment(final String tableName, final String alias, final String databaseName) { TableNameSegment tableNameSegment = new TableNameSegment(0, 0, new IdentifierValue(tableName)); tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new IdentifierValue(databaseName), new IdentifierValue(databaseName))); @@ -139,14 +77,6 @@ private SimpleTableSegment createTableSegment(final String tableName, final Stri return result; } - private ColumnSegment createColumnSegment(final String owner, final String name) { - ColumnSegment result = new ColumnSegment(0, 0, new IdentifierValue(name)); - if (null != owner) { - result.setOwner(new OwnerSegment(0, 0, new IdentifierValue(owner))); - } - return result; - } - @Test void assertGetSchemaNameWithSameSchemaAndSameTable() { SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java similarity index 97% rename from infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinderTest.java rename to infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java index 84815358e6316..ebb18e15c6c21 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/where/WhereSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.where; +package org.apache.shardingsphere.infra.binder.engine.segment.predicate; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; From fc693479b7ed02d1bc0f21157e2657bf7a6a0445 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Tue, 24 Dec 2024 17:28:25 +0800 Subject: [PATCH 131/192] Add skip execute query method in general dql E2E (#34138) --- .../test/e2e/engine/type/dql/GeneralDQLE2EIT.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java index 3fb3f146b528c..9379586c32fe8 100644 --- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java +++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dql/GeneralDQLE2EIT.java @@ -65,8 +65,7 @@ private void assertExecuteQuery(final AssertionTestParameter testParam, final E2 private void assertExecuteQueryWithXmlExpected(final AssertionTestParameter testParam, final E2ETestContext context) throws SQLException { // TODO Fix jdbc adapter and empty_storage_units proxy adapter - if ("jdbc".equals(testParam.getAdapter()) && !"empty_storage_units".equalsIgnoreCase(testParam.getScenario()) - || "proxy".equals(testParam.getAdapter()) && "empty_storage_units".equalsIgnoreCase(testParam.getScenario())) { + if (isNeedSkipExecuteQueryWithXmlExcepted(testParam)) { return; } if (SQLExecuteType.LITERAL == context.getSqlExecuteType()) { @@ -76,6 +75,11 @@ private void assertExecuteQueryWithXmlExpected(final AssertionTestParameter test } } + private boolean isNeedSkipExecuteQueryWithXmlExcepted(final AssertionTestParameter testParam) { + return "jdbc".equals(testParam.getAdapter()) && !"empty_storage_units".equalsIgnoreCase(testParam.getScenario()) + || "proxy".equals(testParam.getAdapter()) && "empty_storage_units".equalsIgnoreCase(testParam.getScenario()); + } + private void assertQueryForStatementWithXmlExpected(final E2ETestContext context) throws SQLException { try ( Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); @@ -161,7 +165,7 @@ private void assertExecute(final AssertionTestParameter testParam, final E2ETest private void assertExecuteWithXmlExpected(final AssertionTestParameter testParam, final E2ETestContext context) throws SQLException { // TODO Fix jdbc adapter - if ("jdbc".equals(testParam.getAdapter())) { + if (isNeedSkipExecuteWithXmlExcepted(testParam)) { return; } if (SQLExecuteType.LITERAL == context.getSqlExecuteType()) { @@ -171,6 +175,10 @@ private void assertExecuteWithXmlExpected(final AssertionTestParameter testParam } } + private boolean isNeedSkipExecuteWithXmlExcepted(final AssertionTestParameter testParam) { + return "jdbc".equals(testParam.getAdapter()); + } + private void assertExecuteForStatementWithXmlExpected(final E2ETestContext context) throws SQLException { try ( Connection connection = getEnvironmentEngine().getTargetDataSource().getConnection(); From 91d84ad3cf9464ae8754b7de7ff55b561897e22e Mon Sep 17 00:00:00 2001 From: Raigor Date: Tue, 24 Dec 2024 19:30:35 +0800 Subject: [PATCH 132/192] Optimize props check for weight load balancer (#34140) --- .../ReadwriteSplittingRuleStatementChecker.java | 10 +++++----- .../InvalidAlgorithmConfigurationException.java | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java index 894a61dc1c994..b536498cb7182 100644 --- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java +++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java @@ -237,10 +237,10 @@ private static void checkProperties(final ReadwriteSplittingRuleSegment each) { } private static void checkDataSource(final ReadwriteSplittingRuleSegment ruleSegment) { - for (Object each : ruleSegment.getLoadBalancer().getProps().keySet()) { - String dataSourceName = (String) each; - ShardingSpherePreconditions.checkState(ruleSegment.getReadDataSources().contains(dataSourceName) || ruleSegment.getWriteDataSource().equals(dataSourceName), - () -> new InvalidAlgorithmConfigurationException("Load balancer", ruleSegment.getLoadBalancer().getName())); - } + Collection weightKeys = ruleSegment.getLoadBalancer().getProps().stringPropertyNames(); + weightKeys.forEach(each -> ShardingSpherePreconditions.checkContains(ruleSegment.getReadDataSources(), each, + () -> new InvalidAlgorithmConfigurationException("Load balancer", ruleSegment.getLoadBalancer().getName(), String.format("Can not find read storge unit '%s'", each)))); + ruleSegment.getReadDataSources().forEach(each -> ShardingSpherePreconditions.checkContains(weightKeys, each, + () -> new InvalidAlgorithmConfigurationException("Load balancer", ruleSegment.getLoadBalancer().getName(), String.format("Weight of '%s' is required", each)))); } } diff --git a/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/exception/InvalidAlgorithmConfigurationException.java b/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/exception/InvalidAlgorithmConfigurationException.java index c509efaeeae03..dc28fcee8656c 100644 --- a/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/exception/InvalidAlgorithmConfigurationException.java +++ b/infra/algorithm/core/src/main/java/org/apache/shardingsphere/infra/algorithm/core/exception/InvalidAlgorithmConfigurationException.java @@ -34,4 +34,8 @@ public InvalidAlgorithmConfigurationException(final String algorithmType, final public InvalidAlgorithmConfigurationException(final String algorithmType) { super(XOpenSQLState.CHECK_OPTION_VIOLATION, 4, "Invalid %s algorithm configuration.", algorithmType); } + + public InvalidAlgorithmConfigurationException(final String algorithmType, final String algorithm, final String message) { + super(XOpenSQLState.CHECK_OPTION_VIOLATION, 4, "Invalid %s algorithm configuration '%s'. %s.", algorithmType, algorithm, message); + } } From f4c1815c53142090777fd0c4d3f98b8ef4691fc2 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 24 Dec 2024 22:03:27 +0800 Subject: [PATCH 133/192] Rename global lock's key from /lock/exclusive/locks to /lock/global/locks (#34142) --- .../shardingsphere/mode/lock/global/GlobalLockDefinition.java | 2 +- .../mode/lock/global/GlobalLockDefinitionTest.java | 2 +- .../cluster/persist/service/GlobalLockPersistServiceTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java index 76376151d59f1..77f2d032c7af1 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinition.java @@ -26,7 +26,7 @@ @Getter public final class GlobalLockDefinition implements LockDefinition { - private static final String KEY_PATTERN = "/lock/exclusive/locks/%s"; + private static final String KEY_PATTERN = "/lock/global/locks/%s"; private final String lockKey; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java index 82ee55f24a609..ee6bb5b62f6da 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/lock/global/GlobalLockDefinitionTest.java @@ -30,6 +30,6 @@ class GlobalLockDefinitionTest { void assertGetLockKey() { GlobalLock globalLock = mock(GlobalLock.class); when(globalLock.getName()).thenReturn("foo_lock"); - assertThat(new GlobalLockDefinition(globalLock).getLockKey(), is("/lock/exclusive/locks/foo_lock")); + assertThat(new GlobalLockDefinition(globalLock).getLockKey(), is("/lock/global/locks/foo_lock")); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java index 6a34617d5b2bf..ddc86c196835c 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistServiceTest.java @@ -47,7 +47,7 @@ void setUp() { @Test void assertTryLock() { - when(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock").tryLock(1000L)).thenReturn(true); + when(repository.getDistributedLockHolder().getDistributedLock("/lock/global/locks/foo_lock").tryLock(1000L)).thenReturn(true); GlobalLockDefinition lockDefinition = new GlobalLockDefinition(globalLock); assertTrue(new GlobalLockPersistService(repository).tryLock(lockDefinition, 1000L)); } @@ -56,6 +56,6 @@ void assertTryLock() { void assertUnlock() { GlobalLockDefinition lockDefinition = new GlobalLockDefinition(globalLock); new GlobalLockPersistService(repository).unlock(lockDefinition); - verify(repository.getDistributedLockHolder().getDistributedLock("/lock/exclusive/locks/foo_lock")).unlock(); + verify(repository.getDistributedLockHolder().getDistributedLock("/lock/global/locks/foo_lock")).unlock(); } } From 0a6b51e68039fe811ea906d3096f73a43d467a15 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 24 Dec 2024 22:17:28 +0800 Subject: [PATCH 134/192] Fix sonar issue on WhereClauseShardingConditionEngine (#34143) --- .../ShardingRouteCacheableChecker.java | 22 ++++++++--------- .../InsertClauseShardingConditionEngine.java | 2 +- .../engine/ShardingConditionEngine.java | 2 +- .../WhereClauseShardingConditionEngine.java | 17 ++----------- ...hereClauseShardingConditionEngineTest.java | 24 ++++++------------- 5 files changed, 22 insertions(+), 45 deletions(-) diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java index 9a308d3d1d234..67b6160b7dd92 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java @@ -86,13 +86,13 @@ private ShardingRouteCacheableCheckResult load(final Key key) { SQLStatementContext sqlStatementContext = key.getSqlStatementContext(); ShardingRouteCacheableCheckResult result; if (sqlStatementContext instanceof SelectStatementContext) { - result = checkSelectCacheable((SelectStatementContext) sqlStatementContext, key.getParameters(), key.getDatabase()); + result = checkSelectCacheable((SelectStatementContext) sqlStatementContext, key.getParameters()); } else if (sqlStatementContext instanceof UpdateStatementContext) { - result = checkUpdateCacheable((UpdateStatementContext) sqlStatementContext, key.getParameters(), key.getDatabase()); + result = checkUpdateCacheable((UpdateStatementContext) sqlStatementContext, key.getParameters()); } else if (sqlStatementContext instanceof InsertStatementContext) { result = checkInsertCacheable((InsertStatementContext) sqlStatementContext, key.getParameters(), key.getDatabase()); } else if (sqlStatementContext instanceof DeleteStatementContext) { - result = checkDeleteCacheable((DeleteStatementContext) sqlStatementContext, key.getParameters(), key.getDatabase()); + result = checkDeleteCacheable((DeleteStatementContext) sqlStatementContext, key.getParameters()); } else { result = new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); } @@ -100,7 +100,7 @@ private ShardingRouteCacheableCheckResult load(final Key key) { return result; } - private ShardingRouteCacheableCheckResult checkSelectCacheable(final SelectStatementContext statementContext, final List params, final ShardingSphereDatabase database) { + private ShardingRouteCacheableCheckResult checkSelectCacheable(final SelectStatementContext statementContext, final List params) { Collection tableNames = new HashSet<>(statementContext.getTablesContext().getTableNames()); if (!shardingRule.isAllShardingTables(tableNames)) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); @@ -108,12 +108,12 @@ private ShardingRouteCacheableCheckResult checkSelectCacheable(final SelectState if (1 != tableNames.size() && !shardingRule.isAllBindingTables(tableNames) || containsNonCacheableShardingAlgorithm(tableNames)) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); } - List shardingConditions = new WhereClauseShardingConditionEngine(database, shardingRule, timestampServiceRule).createShardingConditions(statementContext, params); + List shardingConditions = new WhereClauseShardingConditionEngine(shardingRule, timestampServiceRule).createShardingConditions(statementContext, params); return checkShardingConditionsCacheable(shardingConditions); } - private ShardingRouteCacheableCheckResult checkUpdateCacheable(final UpdateStatementContext statementContext, final List params, final ShardingSphereDatabase database) { - return checkUpdateOrDeleteCacheable(statementContext, params, database); + private ShardingRouteCacheableCheckResult checkUpdateCacheable(final UpdateStatementContext statementContext, final List params) { + return checkUpdateOrDeleteCacheable(statementContext, params); } private ShardingRouteCacheableCheckResult checkInsertCacheable(final InsertStatementContext statementContext, final List params, final ShardingSphereDatabase database) { @@ -140,11 +140,11 @@ private ShardingRouteCacheableCheckResult checkInsertCacheable(final InsertState return checkShardingConditionsCacheable(shardingConditions); } - private ShardingRouteCacheableCheckResult checkDeleteCacheable(final DeleteStatementContext statementContext, final List params, final ShardingSphereDatabase database) { - return checkUpdateOrDeleteCacheable(statementContext, params, database); + private ShardingRouteCacheableCheckResult checkDeleteCacheable(final DeleteStatementContext statementContext, final List params) { + return checkUpdateOrDeleteCacheable(statementContext, params); } - private ShardingRouteCacheableCheckResult checkUpdateOrDeleteCacheable(final SQLStatementContext sqlStatementContext, final List params, final ShardingSphereDatabase database) { + private ShardingRouteCacheableCheckResult checkUpdateOrDeleteCacheable(final SQLStatementContext sqlStatementContext, final List params) { Collection tableNames = ((TableAvailable) sqlStatementContext).getTablesContext().getTableNames(); if (1 != tableNames.size()) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); @@ -153,7 +153,7 @@ private ShardingRouteCacheableCheckResult checkUpdateOrDeleteCacheable(final SQL if (!isShardingTable || containsNonCacheableShardingAlgorithm(tableNames)) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); } - List shardingConditions = new WhereClauseShardingConditionEngine(database, shardingRule, timestampServiceRule).createShardingConditions(sqlStatementContext, params); + List shardingConditions = new WhereClauseShardingConditionEngine(shardingRule, timestampServiceRule).createShardingConditions(sqlStatementContext, params); return checkShardingConditionsCacheable(shardingConditions); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java index 15c7cd5615339..7bee81e16c715 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java @@ -164,7 +164,7 @@ private Object getShardingValue(final SimpleExpressionSegment expressionSegment, private List createShardingConditionsWithInsertSelect(final InsertStatementContext sqlStatementContext, final List params) { SelectStatementContext selectStatementContext = sqlStatementContext.getInsertSelectContext().getSelectStatementContext(); - return new LinkedList<>(new WhereClauseShardingConditionEngine(database, rule, timestampServiceRule).createShardingConditions(selectStatementContext, params)); + return new LinkedList<>(new WhereClauseShardingConditionEngine(rule, timestampServiceRule).createShardingConditions(selectStatementContext, params)); } private void appendGeneratedKeyConditions(final InsertStatementContext sqlStatementContext, final List shardingConditions) { diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java index 72eff8f587ef9..512c94de9262e 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java @@ -51,6 +51,6 @@ public List createShardingConditions(final SQLStatementContex TimestampServiceRule timestampServiceRule = globalRuleMetaData.getSingleRule(TimestampServiceRule.class); return sqlStatementContext instanceof InsertStatementContext ? new InsertClauseShardingConditionEngine(database, shardingRule, timestampServiceRule).createShardingConditions((InsertStatementContext) sqlStatementContext, params) - : new WhereClauseShardingConditionEngine(database, shardingRule, timestampServiceRule).createShardingConditions(sqlStatementContext, params); + : new WhereClauseShardingConditionEngine(shardingRule, timestampServiceRule).createShardingConditions(sqlStatementContext, params); } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java index 8a9eb3f0aecf0..d558597ea3e31 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java @@ -21,11 +21,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; -import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; -import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; -import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sharding.exception.data.ShardingValueDataTypeException; import org.apache.shardingsphere.sharding.route.engine.condition.AlwaysFalseShardingCondition; import org.apache.shardingsphere.sharding.route.engine.condition.Column; @@ -63,9 +59,7 @@ @RequiredArgsConstructor public final class WhereClauseShardingConditionEngine { - private final ShardingSphereDatabase database; - - private final ShardingRule shardingRule; + private final ShardingRule rule; private final TimestampServiceRule timestampServiceRule; @@ -103,19 +97,12 @@ private Collection createShardingConditions(final ExpressionS return result; } - private ShardingSphereSchema getSchema(final SQLStatementContext sqlStatementContext, final ShardingSphereDatabase database) { - String defaultSchemaName = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(database.getName()); - return sqlStatementContext instanceof TableAvailable - ? ((TableAvailable) sqlStatementContext).getTablesContext().getSchemaName().map(database::getSchema).orElseGet(() -> database.getSchema(defaultSchemaName)) - : database.getSchema(defaultSchemaName); - } - private Map> createShardingConditionValueMap(final Collection predicates, final List params) { Map> result = new HashMap<>(predicates.size(), 1F); for (ExpressionSegment each : predicates) { for (ColumnSegment columnSegment : ColumnExtractor.extract(each)) { String tableName = columnSegment.getColumnBoundInfo().getOriginalTable().getValue(); - Optional shardingColumn = shardingRule.findShardingColumn(columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(), tableName); + Optional shardingColumn = rule.findShardingColumn(columnSegment.getColumnBoundInfo().getOriginalColumn().getValue(), tableName); if (!shardingColumn.isPresent()) { continue; } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java index d85bba0435e9c..ba8b39a7c12b0 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java @@ -17,12 +17,7 @@ package org.apache.shardingsphere.sharding.route.engine.condition.engine; -import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition; import org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue; import org.apache.shardingsphere.sharding.route.engine.condition.value.RangeShardingConditionValue; @@ -45,11 +40,10 @@ import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.Properties; +import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -60,7 +54,7 @@ class WhereClauseShardingConditionEngineTest { private WhereClauseShardingConditionEngine shardingConditionEngine; @Mock - private ShardingRule shardingRule; + private ShardingRule rule; @Mock private SelectStatementContext sqlStatementContext; @@ -68,13 +62,9 @@ class WhereClauseShardingConditionEngineTest { @Mock private WhereSegment whereSegment; - @Mock - private TablesContext tablesContext; - @BeforeEach void setUp() { - shardingConditionEngine = new WhereClauseShardingConditionEngine(ShardingSphereDatabase.create("test_db", - TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), new ConfigurationProperties(new Properties())), shardingRule, mock(TimestampServiceRule.class)); + shardingConditionEngine = new WhereClauseShardingConditionEngine(rule, mock(TimestampServiceRule.class)); when(sqlStatementContext.getWhereSegments()).thenReturn(Collections.singleton(whereSegment)); } @@ -87,10 +77,10 @@ void assertCreateShardingConditionsForSelectRangeStatement() { ExpressionSegment andSegment = new LiteralExpressionSegment(0, 0, and); BetweenExpression betweenExpression = new BetweenExpression(0, 0, left, betweenSegment, andSegment, false); when(whereSegment.getExpr()).thenReturn(betweenExpression); - when(shardingRule.findShardingColumn(any(), any())).thenReturn(Optional.of("foo_sharding_col")); + when(rule.findShardingColumn(any(), any())).thenReturn(Optional.of("foo_sharding_col")); List actual = shardingConditionEngine.createShardingConditions(sqlStatementContext, Collections.emptyList()); assertThat(actual.get(0).getStartIndex(), is(0)); - assertTrue(actual.get(0).getValues().get(0) instanceof RangeShardingConditionValue); + assertThat(actual.get(0).getValues().get(0), instanceOf(RangeShardingConditionValue.class)); } @Test @@ -101,9 +91,9 @@ void assertCreateShardingConditionsForSelectInStatement() { right.getItems().add(literalExpressionSegment); InExpression inExpression = new InExpression(0, 0, left, right, false); when(whereSegment.getExpr()).thenReturn(inExpression); - when(shardingRule.findShardingColumn(any(), any())).thenReturn(Optional.of("foo_sharding_col")); + when(rule.findShardingColumn(any(), any())).thenReturn(Optional.of("foo_sharding_col")); List actual = shardingConditionEngine.createShardingConditions(sqlStatementContext, Collections.emptyList()); assertThat(actual.get(0).getStartIndex(), is(0)); - assertTrue(actual.get(0).getValues().get(0) instanceof ListShardingConditionValue); + assertThat(actual.get(0).getValues().get(0), instanceOf(ListShardingConditionValue.class)); } } From 523a4f17bf8f9d32e94deba53352b3b79074777c Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Tue, 24 Dec 2024 22:23:53 +0800 Subject: [PATCH 135/192] Fix sonar issue on PipelineDDLGenerator (#34144) * Fix sonar issue on WhereClauseShardingConditionEngine * Fix sonar issue on PipelineDDLGenerator --- .../core/metadata/generator/PipelineDDLGenerator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java index 37d281e4da6a7..dbdb67da6bd2d 100644 --- a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java +++ b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java @@ -17,7 +17,8 @@ package org.apache.shardingsphere.data.pipeline.core.metadata.generator; -import lombok.RequiredArgsConstructor; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.data.pipeline.core.sqlbuilder.dialect.DialectPipelineSQLBuilder; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; @@ -31,7 +32,7 @@ /** * Pipeline DDL generator. */ -@RequiredArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) @Slf4j public final class PipelineDDLGenerator { From 56117f45091aefdb26dec82a96c039c462d8f9bb Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Wed, 25 Dec 2024 07:42:30 +0800 Subject: [PATCH 136/192] Support select with statement sql bind and add bind test case (#34141) * Remove TablesContext#findTableNames method and use sql bind info to replace * fix unit test * optimize select statement binder * update release note * Support select with statement sql bind and add bind test case * update release note * fix build error --- RELEASE-NOTES.md | 1 + .../EncryptSupportedSQLCheckersBuilder.java | 4 +- .../from/type/SimpleTableSegmentBinder.java | 7 + .../CommonTableExpressionSegmentBinder.java | 62 ++++++ .../segment/with/WithSegmentBinder.java | 125 +++++++++++ .../statement/dml/SelectStatementBinder.java | 4 +- .../statement/dml/UpdateStatementBinder.java | 3 +- .../src/test/resources/cases/dml/select.xml | 206 ++++++++++++++++++ .../src/test/resources/sqls/dml/select.xml | 2 + .../segment/orderby/OrderByItemAssert.java | 2 + .../item/impl/ExpectedColumnOrderByItem.java | 4 + 11 files changed, 415 insertions(+), 5 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 318dd2e0892a8..37fad67b25538 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -38,6 +38,7 @@ 1. SQL Binder: Support create index statement sql bind - [#34112](https://github.com/apache/shardingsphere/pull/34112) 1. SQL Parser: Support MySQL update with statement parse - [#34126](https://github.com/apache/shardingsphere/pull/34126) 1. SQL Binder: Remove TablesContext#findTableNames method and implement select order by, group by bind logic - [#34123](https://github.com/apache/shardingsphere/pull/34123) +1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) ### Bug Fixes diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java index 7a661c2e92633..fce03c66f1094 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java @@ -17,10 +17,10 @@ package org.apache.shardingsphere.encrypt.checker.sql; -import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptInsertSelectProjectionSupportedChecker; -import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptSelectProjectionSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.orderby.EncryptOrderByItemSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.predicate.EncryptPredicateColumnSupportedChecker; +import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptInsertSelectProjectionSupportedChecker; +import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptSelectProjectionSupportedChecker; import org.apache.shardingsphere.encrypt.constant.EncryptOrder; import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java index eb57d97f82824..d471cb8cf0105 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; @@ -150,6 +151,12 @@ private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(fi if (binderContext.getSqlStatement() instanceof CreateTableStatement) { return new SimpleTableSegmentBinderContext(createProjectionSegments((CreateTableStatement) binderContext.getSqlStatement(), databaseName, schemaName, tableName)); } + CaseInsensitiveString caseInsensitiveTableName = new CaseInsensitiveString(tableName.getValue()); + if (binderContext.getExternalTableBinderContexts().containsKey(caseInsensitiveTableName)) { + TableSegmentBinderContext tableSegmentBinderContext = binderContext.getExternalTableBinderContexts().get(caseInsensitiveTableName).iterator().next(); + return new SimpleTableSegmentBinderContext( + SubqueryTableBindUtils.createSubqueryProjections(tableSegmentBinderContext.getProjectionSegments(), tableName, binderContext.getSqlStatement().getDatabaseType())); + } return new SimpleTableSegmentBinderContext(Collections.emptyList()); } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java new file mode 100644 index 0000000000000..136c33e7fbdcc --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.with; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SubqueryTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment; + +import java.util.stream.Collectors; + +/** + * Common table expression segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class CommonTableExpressionSegmentBinder { + + /** + * Bind common table expression segment. + * + * @param segment common table expression segment + * @param binderContext SQL statement binder context + * @param recursive recursive + * @return bound common table expression segment + */ + public static CommonTableExpressionSegment bind(final CommonTableExpressionSegment segment, final SQLStatementBinderContext binderContext, final boolean recursive) { + if (recursive && segment.getAliasName().isPresent()) { + binderContext.getExternalTableBinderContexts().put(new CaseInsensitiveString(segment.getAliasName().get()), + new SimpleTableSegmentBinderContext(segment.getColumns().stream().map(ColumnProjectionSegment::new).collect(Collectors.toList()))); + } + SubqueryTableSegment subqueryTableSegment = new SubqueryTableSegment(segment.getStartIndex(), segment.getStopIndex(), segment.getSubquery()); + subqueryTableSegment.setAlias(segment.getAliasSegment()); + SubqueryTableSegment boundSubquerySegment = + SubqueryTableSegmentBinder.bind(subqueryTableSegment, binderContext, LinkedHashMultimap.create(), binderContext.getExternalTableBinderContexts()); + CommonTableExpressionSegment result = new CommonTableExpressionSegment( + segment.getStartIndex(), segment.getStopIndex(), boundSubquerySegment.getAliasSegment().orElse(null), boundSubquerySegment.getSubquery()); + // TODO bind with columns + result.getColumns().addAll(segment.getColumns()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java new file mode 100644 index 0000000000000..ca4af9da753b7 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.with; + +import com.cedarsoftware.util.CaseInsensitiveMap; +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.base.Strings; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; +import java.util.Optional; + +/** + * With segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class WithSegmentBinder { + + /** + * Bind with segment. + * + * @param segment with segment + * @param binderContext SQL statement binder context + * @param externalTableBinderContexts external table binder contexts + * @return bound with segment + */ + public static WithSegment bind(final WithSegment segment, final SQLStatementBinderContext binderContext, + final Multimap externalTableBinderContexts) { + Collection boundCommonTableExpressions = new LinkedList<>(); + for (CommonTableExpressionSegment each : segment.getCommonTableExpressions()) { + CommonTableExpressionSegment boundCommonTableExpression = CommonTableExpressionSegmentBinder.bind(each, binderContext, segment.isRecursive()); + boundCommonTableExpressions.add(boundCommonTableExpression); + if (segment.isRecursive() && each.getAliasName().isPresent()) { + externalTableBinderContexts.removeAll(new CaseInsensitiveString(each.getAliasName().get())); + } + bindWithColumns(each.getColumns(), boundCommonTableExpression); + each.getAliasName().ifPresent(optional -> externalTableBinderContexts.put(new CaseInsensitiveString(optional), createWithTableBinderContext(boundCommonTableExpression))); + } + return new WithSegment(segment.getStartIndex(), segment.getStopIndex(), boundCommonTableExpressions); + } + + private static SimpleTableSegmentBinderContext createWithTableBinderContext(final CommonTableExpressionSegment commonTableExpressionSegment) { + return new SimpleTableSegmentBinderContext(commonTableExpressionSegment.getSubquery().getSelect().getProjections().getProjections()); + } + + private static void bindWithColumns(final Collection columns, final CommonTableExpressionSegment boundCommonTableExpression) { + if (columns.isEmpty()) { + return; + } + Map columnProjections = extractWithSubqueryColumnProjections(boundCommonTableExpression); + columns.forEach(each -> { + ColumnProjectionSegment projectionSegment = columnProjections.get(each.getIdentifier().getValue()); + if (null != projectionSegment) { + each.setColumnBoundInfo(createColumnSegmentBoundInfo(each, projectionSegment.getColumn())); + } + }); + } + + private static Map extractWithSubqueryColumnProjections(final CommonTableExpressionSegment boundCommonTableExpression) { + Map result = new CaseInsensitiveMap<>(); + Collection projections = boundCommonTableExpression.getSubquery().getSelect().getProjections().getProjections(); + projections.forEach(each -> extractWithSubqueryColumnProjections(each, result)); + return result; + } + + private static void extractWithSubqueryColumnProjections(final ProjectionSegment projectionSegment, final Map result) { + if (projectionSegment instanceof ColumnProjectionSegment) { + result.put(getColumnName((ColumnProjectionSegment) projectionSegment), (ColumnProjectionSegment) projectionSegment); + } + if (projectionSegment instanceof ShorthandProjectionSegment) { + ((ShorthandProjectionSegment) projectionSegment).getActualProjectionSegments().forEach(eachProjection -> { + if (eachProjection instanceof ColumnProjectionSegment) { + result.put(getColumnName((ColumnProjectionSegment) eachProjection), (ColumnProjectionSegment) eachProjection); + } + }); + } + } + + private static String getColumnName(final ColumnProjectionSegment columnProjection) { + return columnProjection.getAliasName().orElse(columnProjection.getColumn().getIdentifier().getValue()); + } + + private static ColumnSegmentBoundInfo createColumnSegmentBoundInfo(final ColumnSegment segment, final ColumnSegment inputColumnSegment) { + IdentifierValue originalDatabase = null == inputColumnSegment ? null : inputColumnSegment.getColumnBoundInfo().getOriginalDatabase(); + IdentifierValue originalSchema = null == inputColumnSegment ? null : inputColumnSegment.getColumnBoundInfo().getOriginalSchema(); + IdentifierValue segmentOriginalTable = segment.getColumnBoundInfo().getOriginalTable(); + IdentifierValue originalTable = Strings.isNullOrEmpty(segmentOriginalTable.getValue()) + ? Optional.ofNullable(inputColumnSegment).map(optional -> optional.getColumnBoundInfo().getOriginalTable()).orElse(segmentOriginalTable) + : segmentOriginalTable; + IdentifierValue segmentOriginalColumn = segment.getColumnBoundInfo().getOriginalColumn(); + IdentifierValue originalColumn = Optional.ofNullable(inputColumnSegment).map(optional -> optional.getColumnBoundInfo().getOriginalColumn()).orElse(segmentOriginalColumn); + return new ColumnSegmentBoundInfo(new TableSegmentBoundInfo(originalDatabase, originalSchema), originalTable, originalColumn); + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java index 521d949a899f9..3f0cf8244b2a2 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java @@ -32,6 +32,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.predicate.HavingSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.projection.ProjectionsSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; @@ -59,6 +60,7 @@ public SelectStatementBinder() { public SelectStatement bind(final SelectStatement sqlStatement, final SQLStatementBinderContext binderContext) { SelectStatement result = copy(sqlStatement); Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getWithSegment().ifPresent(optional -> result.setWithSegment(WithSegmentBinder.bind(optional, binderContext, binderContext.getExternalTableBinderContexts()))); Optional boundTableSegment = sqlStatement.getFrom().map(optional -> TableSegmentBinder.bind(optional, binderContext, tableBinderContexts, outerTableBinderContexts)); boundTableSegment.ifPresent(result::setFrom); result.setProjections(ProjectionsSegmentBinder.bind(sqlStatement.getProjections(), binderContext, boundTableSegment.orElse(null), tableBinderContexts, outerTableBinderContexts)); @@ -71,7 +73,6 @@ public SelectStatement bind(final SelectStatement sqlStatement, final SQLStateme sqlStatement.getOrderBy().ifPresent(optional -> result.setOrderBy( OrderBySegmentBinder.bind(optional, binderContext, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts))); sqlStatement.getHaving().ifPresent(optional -> result.setHaving(HavingSegmentBinder.bind(optional, binderContext, currentTableBinderContexts, outerTableBinderContexts))); - // TODO support other segment bind in select statement return result; } @@ -90,7 +91,6 @@ private SelectStatement copy(final SelectStatement sqlStatement) { sqlStatement.getWindow().ifPresent(result::setWindow); sqlStatement.getModelSegment().ifPresent(result::setModelSegment); sqlStatement.getSubqueryType().ifPresent(result::setSubqueryType); - sqlStatement.getWithSegment().ifPresent(result::setWithSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); result.getVariableNames().addAll(sqlStatement.getVariableNames()); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java index 1de69236fdd96..ba4744cc5db3a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; @@ -38,6 +39,7 @@ public final class UpdateStatementBinder implements SQLStatementBinder tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getWithSegment().ifPresent(optional -> result.setWithSegment(WithSegmentBinder.bind(optional, binderContext, binderContext.getExternalTableBinderContexts()))); result.setTable(TableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts, LinkedHashMultimap.create())); sqlStatement.getFrom().ifPresent(optional -> result.setFrom(TableSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); sqlStatement.getAssignmentSegment().ifPresent(optional -> result.setSetAssignment(AssignmentSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); @@ -50,7 +52,6 @@ private UpdateStatement copy(final UpdateStatement sqlStatement) { UpdateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); - sqlStatement.getWithSegment().ifPresent(result::setWithSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); return result; diff --git a/test/it/binder/src/test/resources/cases/dml/select.xml b/test/it/binder/src/test/resources/cases/dml/select.xml index 7f03799f5f7c1..8caabdcb4d972 100644 --- a/test/it/binder/src/test/resources/cases/dml/select.xml +++ b/test/it/binder/src/test/resources/cases/dml/select.xml @@ -87,4 +87,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/select.xml b/test/it/binder/src/test/resources/sqls/dml/select.xml index aa09790e7ad17..cca532f1c5f25 100644 --- a/test/it/binder/src/test/resources/sqls/dml/select.xml +++ b/test/it/binder/src/test/resources/sqls/dml/select.xml @@ -18,4 +18,6 @@ + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/orderby/OrderByItemAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/orderby/OrderByItemAssert.java index af1be821b57f7..6a6df5f5aabdc 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/orderby/OrderByItemAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/orderby/OrderByItemAssert.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound.ColumnBoundAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.owner.OwnerAssert; @@ -106,6 +107,7 @@ private static void assertOrderInfo(final SQLCaseAssertContext assertContext, fi private static void assertColumnOrderByItem(final SQLCaseAssertContext assertContext, final ColumnOrderByItemSegment actual, final ExpectedColumnOrderByItem expected, final String type) { IdentifierValueAssert.assertIs(assertContext, actual.getColumn().getIdentifier(), expected, String.format("%s item", type)); + ColumnBoundAssert.assertIs(assertContext, actual.getColumn().getColumnBoundInfo(), expected.getColumnBound()); if (null == expected.getOwner()) { assertFalse(actual.getColumn().getOwner().isPresent(), assertContext.getText("Actual owner should not exist.")); } else { diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/orderby/item/impl/ExpectedColumnOrderByItem.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/orderby/item/impl/ExpectedColumnOrderByItem.java index f150058e9f46e..f000d2b5234f5 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/orderby/item/impl/ExpectedColumnOrderByItem.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/orderby/item/impl/ExpectedColumnOrderByItem.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.ExpectedIdentifierSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.bound.ExpectedColumnBoundInfo; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.orderby.item.ExpectedOrderByItem; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedOwner; @@ -38,4 +39,7 @@ public final class ExpectedColumnOrderByItem extends ExpectedOrderByItem impleme @XmlElement private ExpectedOwner owner; + + @XmlElement(name = "column-bound") + private ExpectedColumnBoundInfo columnBound; } From d8909ceec47b99739d68df69801e0f979783a532 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Wed, 25 Dec 2024 08:14:57 +0800 Subject: [PATCH 137/192] Remove useless parameter in ShardingRule to fix sonar issue (#34145) * Remove useless parameter in ShardingRule to fix sonar issue * fix sonar issue in ColumnDefinitionSegmentBinder and ShardingRuleTest --- .../ShardingRouteCacheableChecker.java | 2 +- .../ShardingSupportedCommonChecker.java | 2 +- .../ShardingAlterViewSupportedChecker.java | 2 +- .../dml/ShardingInsertSupportedChecker.java | 2 +- .../sql/util/ShardingSupportedCheckUtils.java | 2 +- .../decider/ShardingSQLFederationDecider.java | 9 ++-- .../impl/ShardingTableTokenGenerator.java | 2 +- .../type/ShardingRouteEngineFactory.java | 9 ++-- .../ShardingTableBroadcastRouteEngine.java | 2 +- .../sharding/rule/ShardingRule.java | 46 +++++++---------- ...hardingCreateViewSupportedCheckerTest.java | 2 +- .../ShardingSQLFederationDeciderTest.java | 4 +- .../impl/ShardingTableTokenGeneratorTest.java | 2 +- .../sharding/rule/ShardingRuleTest.java | 49 +++++++------------ .../column/ColumnDefinitionSegmentBinder.java | 2 +- 15 files changed, 56 insertions(+), 81 deletions(-) diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java index 67b6160b7dd92..e1af887254fb2 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java @@ -105,7 +105,7 @@ private ShardingRouteCacheableCheckResult checkSelectCacheable(final SelectState if (!shardingRule.isAllShardingTables(tableNames)) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); } - if (1 != tableNames.size() && !shardingRule.isAllBindingTables(tableNames) || containsNonCacheableShardingAlgorithm(tableNames)) { + if (1 != tableNames.size() && !shardingRule.isAllConfigBindingTables(tableNames) || containsNonCacheableShardingAlgorithm(tableNames)) { return new ShardingRouteCacheableCheckResult(false, Collections.emptyList()); } List shardingConditions = new WhereClauseShardingConditionEngine(shardingRule, timestampServiceRule).createShardingConditions(statementContext, params); diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/common/ShardingSupportedCommonChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/common/ShardingSupportedCommonChecker.java index d3e527f0472b0..ed876d0f82200 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/common/ShardingSupportedCommonChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/common/ShardingSupportedCommonChecker.java @@ -89,7 +89,7 @@ public static void checkTableNotExist(final ShardingSphereSchema schema, final C */ public static void checkMultipleTable(final ShardingRule shardingRule, final SQLStatementContext sqlStatementContext) { Collection tableNames = ((TableAvailable) sqlStatementContext).getTablesContext().getTableNames(); - boolean isAllShardingTables = shardingRule.isAllShardingTables(tableNames) && (1 == tableNames.size() || shardingRule.isAllBindingTables(tableNames)); + boolean isAllShardingTables = shardingRule.isAllShardingTables(tableNames) && (1 == tableNames.size() || shardingRule.isAllConfigBindingTables(tableNames)); boolean isAllSingleTables = !shardingRule.containsShardingTable(tableNames); ShardingSpherePreconditions.checkState(isAllShardingTables || isAllSingleTables, () -> new DMLWithMultipleShardingTablesException(tableNames)); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java index 285b369a8f31d..81ade5d0cb6d5 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java @@ -62,6 +62,6 @@ private void checkAlterViewShardingTables(final ShardingRule shardingRule, final private void checkBroadcastShardingView(final ShardingRule shardingRule, final String originView, final String targetView) { ShardingSpherePreconditions.checkState(!shardingRule.isShardingTable(originView) && !shardingRule.isShardingTable(targetView) - || shardingRule.isAllBindingTables(Arrays.asList(originView, targetView)), () -> new RenamedViewWithoutSameConfigurationException(originView, targetView)); + || shardingRule.isAllConfigBindingTables(Arrays.asList(originView, targetView)), () -> new RenamedViewWithoutSameConfigurationException(originView, targetView)); } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingInsertSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingInsertSupportedChecker.java index 38f821a21ecf1..507b9b219fed5 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingInsertSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingInsertSupportedChecker.java @@ -61,7 +61,7 @@ public void check(final ShardingRule rule, final ShardingSphereDatabase database throw new MissingGenerateKeyColumnWithInsertSelectException(); } TablesContext tablesContext = sqlStatementContext.getTablesContext(); - if (rule.containsShardingTable(tablesContext.getTableNames()) && !isAllSameTables(tablesContext.getTableNames()) && !rule.isAllBindingTables(tablesContext.getTableNames())) { + if (rule.containsShardingTable(tablesContext.getTableNames()) && !isAllSameTables(tablesContext.getTableNames()) && !rule.isAllConfigBindingTables(tablesContext.getTableNames())) { throw new InsertSelectTableViolationException(); } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/util/ShardingSupportedCheckUtils.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/util/ShardingSupportedCheckUtils.java index d3a6123c3568c..9c5abb288c5df 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/util/ShardingSupportedCheckUtils.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/util/ShardingSupportedCheckUtils.java @@ -56,7 +56,7 @@ public static boolean isSchemaContainsIndex(final ShardingSphereSchema schema, f public static boolean isShardingTablesNotBindingWithView(final Collection tableSegments, final ShardingRule shardingRule, final String viewName) { for (SimpleTableSegment each : tableSegments) { String logicTable = each.getTableName().getIdentifier().getValue(); - if (shardingRule.isShardingTable(logicTable) && !shardingRule.isAllBindingTables(Arrays.asList(viewName, logicTable))) { + if (shardingRule.isShardingTable(logicTable) && !shardingRule.isAllConfigBindingTables(Arrays.asList(viewName, logicTable))) { return true; } } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java index 9f7e6ad61268f..d83c7ca15c3e1 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java @@ -52,15 +52,14 @@ public boolean decide(final SelectStatementContext selectStatementContext, final if (!selectStatementContext.isContainsJoinQuery() || rule.isAllTablesInSameDataSource(tableNames)) { return false; } - if (isSelfJoinWithoutShardingColumn(selectStatementContext, rule, database, tableNames)) { + if (isSelfJoinWithoutShardingColumn(selectStatementContext, rule, tableNames)) { return true; } - return tableNames.size() > 1 && !rule.isAllBindingTables(database, selectStatementContext, tableNames); + return tableNames.size() > 1 && !rule.isBindingTablesUseShardingColumnsJoin(selectStatementContext, tableNames); } - private boolean isSelfJoinWithoutShardingColumn(final SelectStatementContext selectStatementContext, - final ShardingRule rule, final ShardingSphereDatabase database, final Collection tableNames) { - return 1 == tableNames.size() && selectStatementContext.isContainsJoinQuery() && !rule.isAllBindingTables(database, selectStatementContext, tableNames); + private boolean isSelfJoinWithoutShardingColumn(final SelectStatementContext selectStatementContext, final ShardingRule rule, final Collection tableNames) { + return 1 == tableNames.size() && selectStatementContext.isContainsJoinQuery() && !rule.isBindingTablesUseShardingColumnsJoin(selectStatementContext, tableNames); } private Collection getTableDataNodes(final ShardingRule rule, final ShardingSphereDatabase database, final Collection tableNames) { diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGenerator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGenerator.java index e870b627b8fb2..d9e5c90405d01 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGenerator.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGenerator.java @@ -57,7 +57,7 @@ private boolean isAllBindingTables(final SQLStatementContext sqlStatementContext Collection shardingLogicTableNames = sqlStatementContext instanceof TableAvailable ? rule.getShardingLogicTableNames(((TableAvailable) sqlStatementContext).getTablesContext().getTableNames()) : Collections.emptyList(); - return shardingLogicTableNames.size() > 1 && rule.isAllBindingTables(shardingLogicTableNames); + return shardingLogicTableNames.size() > 1 && rule.isAllConfigBindingTables(shardingLogicTableNames); } @Override diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java index 98ac6ea844755..49de41137a3cf 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java @@ -98,7 +98,7 @@ private static ShardingRouteEngine getDDLRouteEngine(final ShardingSphereDatabas private static ShardingRouteEngine getCursorRouteEngine(final ShardingRule rule, final ShardingSphereDatabase database, final SQLStatementContext sqlStatementContext, final HintValueContext hintValueContext, final ShardingConditions shardingConditions, final Collection logicTableNames, final ConfigurationProperties props) { - boolean allBindingTables = logicTableNames.size() > 1 && rule.isAllBindingTables(database, sqlStatementContext, logicTableNames); + boolean allBindingTables = logicTableNames.size() > 1 && rule.isBindingTablesUseShardingColumnsJoin(sqlStatementContext, logicTableNames); if (isShardingStandardQuery(rule, logicTableNames, allBindingTables)) { return new ShardingStandardRouteEngine(getLogicTableName(shardingConditions, logicTableNames), shardingConditions, sqlStatementContext, hintValueContext, props); } @@ -135,13 +135,12 @@ private static ShardingRouteEngine getDQLRouteEngine(final ShardingRule rule, fi if (sqlStatementContext.getSqlStatement() instanceof DMLStatement && shardingConditions.isAlwaysFalse() || tableNames.isEmpty()) { return new ShardingUnicastRouteEngine(sqlStatementContext, tableNames, queryContext.getConnectionContext()); } - return getDQLRouteEngineForShardingTable(rule, database, sqlStatementContext, queryContext.getHintValueContext(), shardingConditions, logicTableNames, props); + return getDQLRouteEngineForShardingTable(rule, sqlStatementContext, queryContext.getHintValueContext(), shardingConditions, logicTableNames, props); } - private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final ShardingRule rule, final ShardingSphereDatabase database, - final SQLStatementContext sqlStatementContext, final HintValueContext hintValueContext, + private static ShardingRouteEngine getDQLRouteEngineForShardingTable(final ShardingRule rule, final SQLStatementContext sqlStatementContext, final HintValueContext hintValueContext, final ShardingConditions shardingConditions, final Collection logicTableNames, final ConfigurationProperties props) { - boolean allBindingTables = logicTableNames.size() > 1 && rule.isAllBindingTables(database, sqlStatementContext, logicTableNames); + boolean allBindingTables = logicTableNames.size() > 1 && rule.isBindingTablesUseShardingColumnsJoin(sqlStatementContext, logicTableNames); if (isShardingStandardQuery(rule, logicTableNames, allBindingTables)) { return new ShardingStandardRouteEngine(getLogicTableName(shardingConditions, logicTableNames), shardingConditions, sqlStatementContext, hintValueContext, props); } diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRouteEngine.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRouteEngine.java index 7b45827866dbc..87ae103f229a1 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRouteEngine.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/broadcast/ShardingTableBroadcastRouteEngine.java @@ -59,7 +59,7 @@ public RouteContext route(final ShardingRule shardingRule) { result.getRouteUnits().addAll(getBroadcastTableRouteUnits(shardingRule, "")); return result; } - if (logicTableNames.size() > 1 && shardingRule.isAllBindingTables(logicTableNames)) { + if (logicTableNames.size() > 1 && shardingRule.isAllConfigBindingTables(logicTableNames)) { result.getRouteUnits().addAll(getBindingTableRouteUnits(shardingRule, logicTableNames)); } else { Collection routeContexts = getRouteContexts(shardingRule, logicTableNames); diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java index 6c3e63386eacf..63300dfc59bc5 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.sharding.rule; import com.cedarsoftware.util.CaseInsensitiveMap; +import com.cedarsoftware.util.CaseInsensitiveSet; import com.google.common.base.Splitter; import com.google.common.base.Strings; import lombok.Getter; @@ -26,16 +27,13 @@ import org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; -import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.datanode.DataNode; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContextAware; -import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.PhysicalDataSourceAggregator; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes; import org.apache.shardingsphere.infra.rule.attribute.datasource.aggregate.AggregatedDataSourceRuleAttribute; @@ -320,12 +318,12 @@ public ShardingTable getShardingTable(final String logicTableName) { } /** - * Judge whether logic table is all binding tables or not. + * Judge whether logic table is all config binding tables or not. * * @param logicTableNames logic table names - * @return whether logic table is all binding tables or not + * @return whether logic table is all config binding tables or not */ - public boolean isAllBindingTables(final Collection logicTableNames) { + public boolean isAllConfigBindingTables(final Collection logicTableNames) { if (logicTableNames.isEmpty()) { return false; } @@ -339,25 +337,21 @@ public boolean isAllBindingTables(final Collection logicTableNames) { } /** - * Judge whether logic table is all binding tables. + * Judge whether logic table is all config binding tables and use sharding columns join. * - * @param database database * @param sqlStatementContext sqlStatementContext * @param logicTableNames logic table names - * @return whether logic table is all binding tables + * @return whether logic table is all config binding tables and use sharding columns join */ - // TODO rename the method name, add sharding condition judgement in method name @duanzhengqiang - public boolean isAllBindingTables(final ShardingSphereDatabase database, final SQLStatementContext sqlStatementContext, final Collection logicTableNames) { + public boolean isBindingTablesUseShardingColumnsJoin(final SQLStatementContext sqlStatementContext, final Collection logicTableNames) { if (!(sqlStatementContext instanceof SelectStatementContext && ((SelectStatementContext) sqlStatementContext).isContainsJoinQuery())) { - return isAllBindingTables(logicTableNames); + return isAllConfigBindingTables(logicTableNames); } - if (!isAllBindingTables(logicTableNames)) { + if (!isAllConfigBindingTables(logicTableNames)) { return false; } - String defaultSchemaName = new DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(database.getName()); SelectStatementContext select = (SelectStatementContext) sqlStatementContext; - ShardingSphereSchema schema = select.getTablesContext().getSchemaName().map(database::getSchema).orElseGet(() -> database.getSchema(defaultSchemaName)); - return isJoinConditionContainsShardingColumns(schema, select, logicTableNames, select.getWhereSegments()); + return isJoinConditionContainsShardingColumns(logicTableNames, select.getWhereSegments()); } private Optional findBindingTableRule(final Collection logicTableNames) { @@ -575,10 +569,9 @@ public boolean isShardingCacheEnabled() { return null != shardingCache; } - private boolean isJoinConditionContainsShardingColumns(final ShardingSphereSchema schema, final SelectStatementContext select, - final Collection tableNames, final Collection whereSegments) { - Collection databaseJoinConditionTables = new HashSet<>(tableNames.size(), 1F); - Collection tableJoinConditionTables = new HashSet<>(tableNames.size(), 1F); + private boolean isJoinConditionContainsShardingColumns(final Collection tableNames, final Collection whereSegments) { + Collection databaseJoinConditionTables = new CaseInsensitiveSet<>(tableNames.size(), 1F); + Collection tableJoinConditionTables = new CaseInsensitiveSet<>(tableNames.size(), 1F); for (WhereSegment each : whereSegments) { Collection andPredicates = ExpressionExtractor.extractAndPredicates(each.getExpr()); if (andPredicates.size() > 1) { @@ -610,14 +603,11 @@ private Collection getJoinConditionTables(final Collection new ShardingCreateViewSupportedChecker().check(rule, mock(), mock(), createViewStatementContext)); } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java index 2cd9d471b2faf..95aae4e87983b 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java @@ -161,7 +161,7 @@ void assertDecideWithSelfJoinAndShardingColumn() { ShardingRule rule = createShardingRule(); when(rule.getShardingLogicTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl")); ShardingSphereDatabase database = createDatabase(rule); - when(rule.isAllBindingTables(database, sqlStatementContext, Collections.singleton("foo_tbl"))).thenReturn(true); + when(rule.isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Collections.singleton("foo_tbl"))).thenReturn(true); Collection includedDataNodes = new HashSet<>(); assertFalse(decider.decide(sqlStatementContext, Collections.emptyList(), mock(RuleMetaData.class), database, rule, includedDataNodes)); assertThat(includedDataNodes.size(), is(2)); @@ -173,7 +173,7 @@ void assertDecideWithAllBindingTables() { when(sqlStatementContext.isContainsJoinQuery()).thenReturn(true); ShardingRule rule = createShardingRule(); ShardingSphereDatabase database = createDatabase(rule); - when(rule.isAllBindingTables(database, sqlStatementContext, Arrays.asList("foo_tbl", "bar_tbl"))).thenReturn(true); + when(rule.isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("foo_tbl", "bar_tbl"))).thenReturn(true); Collection includedDataNodes = new HashSet<>(); assertFalse(decider.decide(sqlStatementContext, Collections.emptyList(), mock(RuleMetaData.class), database, rule, includedDataNodes)); assertThat(includedDataNodes.size(), is(4)); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGeneratorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGeneratorTest.java index e80460e70423e..fe1edb407991a 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGeneratorTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rewrite/token/generator/impl/ShardingTableTokenGeneratorTest.java @@ -75,7 +75,7 @@ void assertIsNotGenerateSQLTokenWithNotTableAvailable() { void assertIsGenerateSQLTokenWithAllBindingTables() { Collection logicTableNames = Arrays.asList("foo_tbl", "bar_tbl"); when(rule.getShardingLogicTableNames(logicTableNames)).thenReturn(logicTableNames); - when(rule.isAllBindingTables(logicTableNames)).thenReturn(true); + when(rule.isAllConfigBindingTables(logicTableNames)).thenReturn(true); SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); when(sqlStatementContext.getTablesContext().getTableNames()).thenReturn(logicTableNames); assertTrue(generator.isGenerateSQLToken(sqlStatementContext)); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java index 9caefec97bf8f..83429eabfcab7 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java @@ -70,7 +70,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; @@ -264,26 +263,26 @@ void assertGetTableRuleFailure() { @Test void assertIsAllBindingTableWhenLogicTablesIsEmpty() { - assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.emptyList())); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Collections.emptyList())); } @Test void assertIsNotAllBindingTable() { - assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.singleton("new_Table"))); - assertFalse(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_Table", "new_Table"))); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("new_Table"))); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Arrays.asList("logic_Table", "new_Table"))); } @Test void assertIsAllBindingTable() { - assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singleton("logic_Table"))); - assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singleton("logic_table"))); - assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singleton("sub_Logic_Table"))); - assertTrue(createMaximumShardingRule().isAllBindingTables(Collections.singleton("sub_logic_table"))); - assertTrue(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_Table", "sub_Logic_Table"))); - assertTrue(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_table", "sub_logic_Table"))); - assertFalse(createMaximumShardingRule().isAllBindingTables(Arrays.asList("logic_table", "sub_logic_Table", "new_table"))); - assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.emptyList())); - assertFalse(createMaximumShardingRule().isAllBindingTables(Collections.singleton("new_Table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("logic_Table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("logic_table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("sub_Logic_Table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("sub_logic_table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertTrue(createMaximumShardingRule().isAllConfigBindingTables(Arrays.asList("logic_table", "sub_logic_Table"))); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Arrays.asList("logic_table", "sub_logic_Table", "new_table"))); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Collections.emptyList())); + assertFalse(createMaximumShardingRule().isAllConfigBindingTables(Collections.singleton("new_Table"))); } @Test @@ -615,16 +614,14 @@ private ShardingTableRuleConfiguration createTableRuleConfigWithComplexStrategie @Test void assertIsAllBindingTableWithUpdateStatementContext() { SQLStatementContext sqlStatementContext = mock(UpdateStatementContext.class); - assertTrue( - createMaximumShardingRule().isAllBindingTables(mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS), sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertTrue(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); } @Test void assertIsAllBindingTableWithoutJoinQuery() { SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class); when(sqlStatementContext.isContainsJoinQuery()).thenReturn(false); - assertTrue( - createMaximumShardingRule().isAllBindingTables(mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS), sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertTrue(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); } @Test @@ -636,8 +633,7 @@ void assertIsAllBindingTableWithJoinQueryWithoutJoinCondition() { when(sqlStatementContext.getTablesContext().getSchemaName()).thenReturn(Optional.empty()); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("db_schema"); - assertFalse( - createMaximumShardingRule().isAllBindingTables(database, sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertFalse(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); } @Test @@ -658,7 +654,7 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseJoinCondition() { ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("foo_db"); when(database.getSchema("foo_db")).thenReturn(schema); - assertFalse(createMaximumShardingRule().isAllBindingTables(database, sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertFalse(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); } @Test @@ -681,7 +677,7 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseJoinConditionInUpperCaseAnd when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("foo_db"); - assertFalse(createMaximumShardingRule().isAllBindingTables(database, sqlStatementContext, Arrays.asList("LOGIC_TABLE", "SUB_LOGIC_TABLE"))); + assertFalse(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("LOGIC_TABLE", "SUB_LOGIC_TABLE"))); } @Test @@ -715,7 +711,7 @@ void assertIsAllBindingTableWithJoinQueryWithDatabaseTableJoinCondition() { ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("foo_db"); when(database.getSchema("foo_db")).thenReturn(schema); - assertTrue(createMaximumShardingRule().isAllBindingTables(database, sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); + assertTrue(createMaximumShardingRule().isBindingTablesUseShardingColumnsJoin(sqlStatementContext, Arrays.asList("logic_Table", "sub_Logic_Table"))); } @Test @@ -742,15 +738,6 @@ private ColumnSegment createColumnSegment(final String columnName, final String return result; } - private Map createColumnTableNameMap() { - Map result = new HashMap<>(4, 1F); - result.put("logic_Table.user_id", "logic_Table"); - result.put("sub_Logic_Table.user_id", "sub_Logic_Table"); - result.put("logic_Table.order_id", "logic_Table"); - result.put("sub_Logic_Table.order_id", "sub_Logic_Table"); - return result; - } - @Test void assertGetDataNodesByTableName() { ShardingRule shardingRule = createMinimumShardingRule(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java index 633bfd8582171..cffab8116b328 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java @@ -49,7 +49,7 @@ public static ColumnDefinitionSegment bind(final ColumnDefinitionSegment segment ColumnSegment boundColumnSegment = ColumnSegmentBinder.bind(segment.getColumnName(), SegmentType.DEFINITION_COLUMNS, binderContext, tableBinderContexts, LinkedHashMultimap.create()); ColumnDefinitionSegment result = new ColumnDefinitionSegment(segment.getStartIndex(), segment.getStopIndex(), boundColumnSegment, segment.getDataType(), segment.isPrimaryKey(), segment.isNotNull(), segment.getText()); - copy(segment, result); + copy(result, segment); segment.getReferencedTables().forEach(each -> result.getReferencedTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); return result; } From c0b2829a0f10b984899a4b32ff55042cab076a33 Mon Sep 17 00:00:00 2001 From: jiangML <1060319118@qq.com> Date: Wed, 25 Dec 2024 10:17:12 +0800 Subject: [PATCH 138/192] Refactor export and import metadata (#34136) * Refactor export and import metadata * Fix test error * Fix checkstyle error --- .../ExportDatabaseConfigurationExecutor.java | 13 +- .../ral/queryable/ExportMetaDataExecutor.java | 93 +---------- .../ImportDatabaseConfigurationExecutor.java | 16 +- .../ral/updatable/ImportMetaDataExecutor.java | 51 ++---- .../util/ClusterExportMetaDataGenerator.java | 121 ++++++++++++++ .../util/DatabaseExportMetaDataGenerator.java | 108 ++++++++++++ .../proxy/backend/util/ExportUtils.java | 67 -------- .../backend/util/MetaDataImportExecutor.java | 101 ++++++++++++ ...mlDatabaseConfigurationImportExecutor.java | 22 +-- ...portDatabaseConfigurationExecutorTest.java | 4 +- .../queryable/ExportMetaDataExecutorTest.java | 98 +++++------ ...portDatabaseConfigurationExecutorTest.java | 69 +++----- .../updatable/ImportMetaDataExecutorTest.java | 156 ++++++++++-------- 13 files changed, 528 insertions(+), 391 deletions(-) create mode 100644 proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ClusterExportMetaDataGenerator.java create mode 100644 proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java create mode 100644 proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java index b95585bb75733..b7e482aeb57fb 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.proxy.backend.util.DatabaseExportMetaDataGenerator; import org.apache.shardingsphere.proxy.backend.util.ExportUtils; import java.util.Collection; @@ -44,13 +45,13 @@ public Collection getColumnNames(final ExportDatabaseConfigurationStatem @Override public Collection getRows(final ExportDatabaseConfigurationStatement sqlStatement, final ContextManager contextManager) { - String exportedData = ExportUtils.generateExportDatabaseData(database); - if (!sqlStatement.getFilePath().isPresent()) { - return Collections.singleton(new LocalDataQueryResultRow(exportedData)); + String exportedData = new DatabaseExportMetaDataGenerator(database).generateYAMLFormat(); + if (sqlStatement.getFilePath().isPresent()) { + String filePath = sqlStatement.getFilePath().get(); + ExportUtils.exportToFile(filePath, exportedData); + return Collections.singleton(new LocalDataQueryResultRow(String.format("Successfully exported to: '%s'", filePath))); } - String filePath = sqlStatement.getFilePath().get(); - ExportUtils.exportToFile(filePath, exportedData); - return Collections.singleton(new LocalDataQueryResultRow(String.format("Successfully exported to: '%s'", filePath))); + return Collections.singleton(new LocalDataQueryResultRow(exportedData)); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java index cda276c5496f9..cad9e0a6785a7 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java @@ -20,32 +20,15 @@ import org.apache.commons.codec.binary.Base64; import org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor; import org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportMetaDataStatement; -import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider; -import org.apache.shardingsphere.globalclock.rule.GlobalClockRule; -import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow; -import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; -import org.apache.shardingsphere.infra.util.json.JsonUtils; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.metadata.decorator.RuleConfigurationPersistDecorateEngine; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; -import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo; -import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData; -import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedSnapshotInfo; +import org.apache.shardingsphere.proxy.backend.util.ClusterExportMetaDataGenerator; import org.apache.shardingsphere.proxy.backend.util.ExportUtils; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; /** * Export metadata executor. @@ -59,80 +42,14 @@ public Collection getColumnNames(final ExportMetaDataStatement sqlStatem @Override public Collection getRows(final ExportMetaDataStatement sqlStatement, final ContextManager contextManager) { - String exportedData = generateExportData(contextManager.getMetaDataContexts().getMetaData()); + String exportedData = new ClusterExportMetaDataGenerator(contextManager).generateJsonFormat(); + String instanceId = contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(); if (sqlStatement.getFilePath().isPresent()) { String filePath = sqlStatement.getFilePath().get(); ExportUtils.exportToFile(filePath, exportedData); - return Collections.singleton(new LocalDataQueryResultRow(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(), LocalDateTime.now(), - String.format("Successfully exported to:'%s'", filePath))); - } - return Collections.singleton(new LocalDataQueryResultRow( - contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(), LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes()))); - } - - private String generateExportData(final ShardingSphereMetaData metaData) { - ProxyContext proxyContext = ProxyContext.getInstance(); - ExportedMetaData exportedMetaData = new ExportedMetaData(); - exportedMetaData.setDatabases(getDatabases(proxyContext)); - exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps())); - RuleConfigurationPersistDecorateEngine ruleConfigPersistDecorateEngine = - new RuleConfigurationPersistDecorateEngine(ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext()); - Collection ruleConfigs = ruleConfigPersistDecorateEngine.decorate(metaData.getGlobalRuleMetaData().getConfigurations()); - exportedMetaData.setRules(generateRulesData(ruleConfigs)); - ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo(); - exportedClusterInfo.setMetaData(exportedMetaData); - generateSnapshotInfo(metaData, exportedClusterInfo); - return JsonUtils.toJsonString(exportedClusterInfo); - } - - private Map getDatabases(final ProxyContext proxyContext) { - Collection databaseNames = proxyContext.getAllDatabaseNames(); - Map result = new LinkedHashMap<>(databaseNames.size(), 1F); - for (String each : databaseNames) { - ShardingSphereDatabase database = proxyContext.getContextManager().getDatabase(each); - if (database.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) { - continue; - } - result.put(each, ExportUtils.generateExportDatabaseData(database)); - } - return result; - } - - private String generatePropsData(final Properties props) { - if (props.isEmpty()) { - return ""; - } - StringBuilder result = new StringBuilder(); - result.append("props:").append(System.lineSeparator()); - props.forEach((key, value) -> { - if (null != value && !"".equals(value)) { - result.append(" ").append(key).append(": ").append(value).append(System.lineSeparator()); - } - }); - return result.toString(); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - private String generateRulesData(final Collection rules) { - if (rules.isEmpty()) { - return ""; - } - StringBuilder result = new StringBuilder(); - result.append("rules:").append(System.lineSeparator()); - for (Entry entry : OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class, rules).entrySet()) { - result.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey())))); - } - return result.toString(); - } - - private void generateSnapshotInfo(final ShardingSphereMetaData metaData, final ExportedClusterInfo exportedClusterInfo) { - GlobalClockRule globalClockRule = metaData.getGlobalRuleMetaData().getSingleRule(GlobalClockRule.class); - if (globalClockRule.getConfiguration().isEnabled()) { - ExportedSnapshotInfo snapshotInfo = new ExportedSnapshotInfo(); - snapshotInfo.setCsn(String.valueOf(globalClockRule.getGlobalClockProvider().map(GlobalClockProvider::getCurrentTimestamp).orElse(0L))); - snapshotInfo.setCreateTime(LocalDateTime.now()); - exportedClusterInfo.setSnapshotInfo(snapshotInfo); + return Collections.singleton(new LocalDataQueryResultRow(instanceId, LocalDateTime.now(), String.format("Successfully exported to:'%s'", filePath))); } + return Collections.singleton(new LocalDataQueryResultRow(instanceId, LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes()))); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java index ec25631721540..8f18f91fd76b1 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java @@ -19,33 +19,35 @@ import org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor; import org.apache.shardingsphere.distsql.statement.ral.updatable.ImportDatabaseConfigurationStatement; +import org.apache.shardingsphere.infra.exception.generic.FileIOException; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration; -import org.apache.shardingsphere.infra.exception.generic.FileIOException; -import org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor; +import org.apache.shardingsphere.proxy.backend.util.MetaDataImportExecutor; import java.io.File; import java.io.IOException; import java.sql.SQLException; +import java.util.Collections; /** * Import database configuration executor. */ public final class ImportDatabaseConfigurationExecutor implements DistSQLUpdateExecutor { - private final YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor(); - @Override public void executeUpdate(final ImportDatabaseConfigurationStatement sqlStatement, final ContextManager contextManager) throws SQLException { + YamlProxyDatabaseConfiguration yamlConfig = getYamlProxyDatabaseConfiguration(sqlStatement); + new MetaDataImportExecutor(contextManager).importDatabaseConfigurations(Collections.singletonList(yamlConfig)); + } + + private YamlProxyDatabaseConfiguration getYamlProxyDatabaseConfiguration(final ImportDatabaseConfigurationStatement sqlStatement) { File file = new File(sqlStatement.getFilePath()); - YamlProxyDatabaseConfiguration yamlConfig; try { - yamlConfig = YamlEngine.unmarshal(file, YamlProxyDatabaseConfiguration.class); + return YamlEngine.unmarshal(file, YamlProxyDatabaseConfiguration.class); } catch (final IOException ignore) { throw new FileIOException(file); } - databaseConfigImportExecutor.importDatabaseConfiguration(yamlConfig); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java index dc6d9306bf9a4..62478b2930a16 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java @@ -21,69 +21,42 @@ import org.apache.commons.io.FileUtils; import org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor; import org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement; -import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.exception.generic.FileIOException; import org.apache.shardingsphere.infra.util.json.JsonUtils; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration; -import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration; import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo; import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData; -import org.apache.shardingsphere.infra.exception.generic.FileIOException; -import org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor; +import org.apache.shardingsphere.proxy.backend.util.MetaDataImportExecutor; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.sql.SQLException; -import java.util.Collection; /** * Import meta data executor. */ public final class ImportMetaDataExecutor implements DistSQLUpdateExecutor { - private final YamlRuleConfigurationSwapperEngine ruleConfigSwapperEngine = new YamlRuleConfigurationSwapperEngine(); - - private final YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor(); - @Override public void executeUpdate(final ImportMetaDataStatement sqlStatement, final ContextManager contextManager) throws SQLException { - String jsonMetaDataConfig; - if (sqlStatement.getFilePath().isPresent()) { - File file = new File(sqlStatement.getFilePath().get()); - try { - jsonMetaDataConfig = FileUtils.readFileToString(file, Charset.defaultCharset()); - } catch (final IOException ignore) { - throw new FileIOException(file); - } - } else { - jsonMetaDataConfig = new String(Base64.decodeBase64(sqlStatement.getMetaDataValue())); - } + String jsonMetaDataConfig = sqlStatement.getFilePath().isPresent() ? getMetaDataFromFile(sqlStatement) : getMetaDataFromConsole(sqlStatement); ExportedClusterInfo exportedClusterInfo = JsonUtils.fromJsonString(jsonMetaDataConfig, ExportedClusterInfo.class); ExportedMetaData exportedMetaData = exportedClusterInfo.getMetaData(); - importServerConfiguration(contextManager, exportedMetaData); - importDatabase(exportedMetaData); + new MetaDataImportExecutor(contextManager).importClusterConfigurations(exportedMetaData); } - private void importServerConfiguration(final ContextManager contextManager, final ExportedMetaData exportedMetaData) throws SQLException { - YamlProxyServerConfiguration yamlServerConfig = YamlEngine.unmarshal(exportedMetaData.getRules() + System.lineSeparator() + exportedMetaData.getProps(), YamlProxyServerConfiguration.class); - if (null == yamlServerConfig) { - return; - } - Collection rules = ruleConfigSwapperEngine.swapToRuleConfigurations(yamlServerConfig.getRules()); - for (RuleConfiguration each : rules) { - contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterGlobalRuleConfiguration(each); + private String getMetaDataFromFile(final ImportMetaDataStatement sqlStatement) { + File file = new File(sqlStatement.getFilePath().get()); + try { + return FileUtils.readFileToString(file, Charset.defaultCharset()); + } catch (final IOException ignore) { + throw new FileIOException(file); } - contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterProperties(yamlServerConfig.getProps()); } - private void importDatabase(final ExportedMetaData exportedMetaData) throws SQLException { - for (String each : exportedMetaData.getDatabases().values()) { - YamlProxyDatabaseConfiguration yamlDatabaseConfig = YamlEngine.unmarshal(each, YamlProxyDatabaseConfiguration.class); - databaseConfigImportExecutor.importDatabaseConfiguration(yamlDatabaseConfig); - } + private String getMetaDataFromConsole(final ImportMetaDataStatement sqlStatement) { + return new String(Base64.decodeBase64(sqlStatement.getMetaDataValue())); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ClusterExportMetaDataGenerator.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ClusterExportMetaDataGenerator.java new file mode 100644 index 0000000000000..f788c8967f633 --- /dev/null +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ClusterExportMetaDataGenerator.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.backend.util; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider; +import org.apache.shardingsphere.globalclock.rule.GlobalClockRule; +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; +import org.apache.shardingsphere.infra.util.json.JsonUtils; +import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.metadata.decorator.RuleConfigurationPersistDecorateEngine; +import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo; +import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData; +import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedSnapshotInfo; + +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; + +/** + * Cluster export metadata generator. + */ +@RequiredArgsConstructor +public final class ClusterExportMetaDataGenerator { + + private final ContextManager contextManager; + + /** + * Generate Json format. + * + * @return export data + */ + public String generateJsonFormat() { + ShardingSphereMetaData metaData = contextManager.getMetaDataContexts().getMetaData(); + ExportedMetaData exportedMetaData = new ExportedMetaData(); + exportedMetaData.setDatabases(generatorDatabasesExportData()); + exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps())); + exportedMetaData.setRules(generateRulesData(getGlobalRules(metaData))); + ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo(); + exportedClusterInfo.setMetaData(exportedMetaData); + generateSnapshotInfo(metaData, exportedClusterInfo); + return JsonUtils.toJsonString(exportedClusterInfo); + } + + private Map generatorDatabasesExportData() { + Map result = new LinkedHashMap<>(contextManager.getMetaDataContexts().getMetaData().getAllDatabases().size(), 1F); + for (ShardingSphereDatabase each : contextManager.getMetaDataContexts().getMetaData().getAllDatabases()) { + if (each.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) { + continue; + } + result.put(each.getName(), new DatabaseExportMetaDataGenerator(each).generateYAMLFormat()); + } + return result; + } + + private String generatePropsData(final Properties props) { + if (props.isEmpty()) { + return ""; + } + StringBuilder result = new StringBuilder(); + result.append("props:").append(System.lineSeparator()); + for (Entry entry : props.entrySet()) { + if (null != entry.getValue() && !"".equals(entry.getValue().toString())) { + result.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append(System.lineSeparator()); + } + } + return result.toString(); + } + + private Collection getGlobalRules(final ShardingSphereMetaData metaData) { + RuleConfigurationPersistDecorateEngine ruleConfigPersistDecorateEngine = new RuleConfigurationPersistDecorateEngine(contextManager.getComputeNodeInstanceContext()); + return ruleConfigPersistDecorateEngine.decorate(metaData.getGlobalRuleMetaData().getConfigurations()); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private String generateRulesData(final Collection rules) { + if (rules.isEmpty()) { + return ""; + } + StringBuilder result = new StringBuilder(); + result.append("rules:").append(System.lineSeparator()); + for (Entry entry : OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class, rules).entrySet()) { + result.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey())))); + } + return result.toString(); + } + + private void generateSnapshotInfo(final ShardingSphereMetaData metaData, final ExportedClusterInfo exportedClusterInfo) { + GlobalClockRule globalClockRule = metaData.getGlobalRuleMetaData().getSingleRule(GlobalClockRule.class); + if (globalClockRule.getConfiguration().isEnabled()) { + ExportedSnapshotInfo snapshotInfo = new ExportedSnapshotInfo(); + snapshotInfo.setCsn(String.valueOf(globalClockRule.getGlobalClockProvider().map(GlobalClockProvider::getCurrentTimestamp).orElse(0L))); + snapshotInfo.setCreateTime(LocalDateTime.now()); + exportedClusterInfo.setSnapshotInfo(snapshotInfo); + } + } +} diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java new file mode 100644 index 0000000000000..570e9f9694416 --- /dev/null +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.backend.util; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration; +import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker; +import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; +import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; +import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map.Entry; + +/** + * Database export metadata generator. + */ +@RequiredArgsConstructor +public final class DatabaseExportMetaDataGenerator { + + private final ShardingSphereDatabase database; + + /** + * Generate YAML format. + * + * @return database configuration data of YAML format + */ + public String generateYAMLFormat() { + StringBuilder result = new StringBuilder(); + appendDatabaseName(database.getName(), result); + appendDataSourceConfigurations(database, result); + appendRuleConfigurations(database.getRuleMetaData().getConfigurations(), result); + return result.toString(); + } + + private void appendDatabaseName(final String databaseName, final StringBuilder stringBuilder) { + stringBuilder.append("databaseName: ").append(databaseName).append(System.lineSeparator()); + } + + private void appendDataSourceConfigurations(final ShardingSphereDatabase database, final StringBuilder stringBuilder) { + if (database.getResourceMetaData().getStorageUnits().isEmpty()) { + return; + } + stringBuilder.append("dataSources:").append(System.lineSeparator()); + for (Entry entry : database.getResourceMetaData().getStorageUnits().entrySet()) { + appendDataSourceConfiguration(entry.getKey(), entry.getValue().getDataSourcePoolProperties(), stringBuilder); + } + } + + private void appendDataSourceConfiguration(final String dataSourceName, final DataSourcePoolProperties props, final StringBuilder stringBuilder) { + stringBuilder.append(createIndentation(2)).append(dataSourceName).append(':').append(System.lineSeparator()); + for (Entry entry : props.getConnectionPropertySynonyms().getStandardProperties().entrySet()) { + String value = null == entry.getValue() ? "" : entry.getValue().toString(); + stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + } + for (Entry entry : props.getPoolPropertySynonyms().getStandardProperties().entrySet()) { + String value = null == entry.getValue() ? "" : entry.getValue().toString(); + stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + } + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private void appendRuleConfigurations(final Collection ruleConfigs, final StringBuilder stringBuilder) { + if (ruleConfigs.isEmpty()) { + return; + } + boolean hasAppendedRule = false; + for (Entry entry : OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class, ruleConfigs).entrySet()) { + if (TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class, entry.getKey().getClass()).isEmpty((DatabaseRuleConfiguration) entry.getKey())) { + continue; + } + if (!hasAppendedRule) { + stringBuilder.append("rules:").append(System.lineSeparator()); + hasAppendedRule = true; + } + stringBuilder.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey())))); + } + } + + private String createIndentation(final int count) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < count; i++) { + result.append(" "); + } + return result.toString(); + } +} diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java index 433139ca1b50c..cc482d0566ac4 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java @@ -19,26 +19,13 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; -import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration; -import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker; -import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.exception.generic.FileIOException; -import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; -import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Collection; -import java.util.Collections; -import java.util.Map.Entry; /** * Export utility class. @@ -66,58 +53,4 @@ public static void exportToFile(final String filePath, final String exportedData throw new FileIOException(file); } } - - /** - * Generate configuration data of ShardingSphere database. - * - * @param database ShardingSphere database - * @return configuration data - */ - public static String generateExportDatabaseData(final ShardingSphereDatabase database) { - StringBuilder result = new StringBuilder(); - appendDatabaseName(database.getName(), result); - appendDataSourceConfigurations(database, result); - appendRuleConfigurations(database.getRuleMetaData().getConfigurations(), result); - return result.toString(); - } - - private static void appendDatabaseName(final String databaseName, final StringBuilder stringBuilder) { - stringBuilder.append("databaseName: ").append(databaseName).append(System.lineSeparator()); - } - - private static void appendDataSourceConfigurations(final ShardingSphereDatabase database, final StringBuilder stringBuilder) { - if (database.getResourceMetaData().getStorageUnits().isEmpty()) { - return; - } - stringBuilder.append("dataSources:").append(System.lineSeparator()); - for (Entry entry : database.getResourceMetaData().getStorageUnits().entrySet()) { - appendDataSourceConfiguration(entry.getKey(), entry.getValue().getDataSourcePoolProperties(), stringBuilder); - } - } - - private static void appendDataSourceConfiguration(final String name, final DataSourcePoolProperties props, final StringBuilder stringBuilder) { - stringBuilder.append(" ").append(name).append(':').append(System.lineSeparator()); - props.getConnectionPropertySynonyms().getStandardProperties() - .forEach((key, value) -> stringBuilder.append(" ").append(key).append(": ").append(value).append(System.lineSeparator())); - for (Entry entry : props.getPoolPropertySynonyms().getStandardProperties().entrySet()) { - if (null != entry.getValue()) { - stringBuilder.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append(System.lineSeparator()); - } - } - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - private static void appendRuleConfigurations(final Collection ruleConfigs, final StringBuilder stringBuilder) { - if (ruleConfigs.isEmpty() - || ruleConfigs.stream().allMatch(each -> TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class, each.getClass()).isEmpty((DatabaseRuleConfiguration) each))) { - return; - } - stringBuilder.append("rules:").append(System.lineSeparator()); - for (Entry entry : OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class, ruleConfigs).entrySet()) { - if (TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class, entry.getKey().getClass()).isEmpty((DatabaseRuleConfiguration) entry.getKey())) { - continue; - } - stringBuilder.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey())))); - } - } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java new file mode 100644 index 0000000000000..016b01f00b1e8 --- /dev/null +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.proxy.backend.util; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration; +import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration; +import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData; + +import java.sql.SQLException; +import java.util.Collection; +import java.util.LinkedList; + +/** + * Metadata import executor. + */ +@RequiredArgsConstructor +public final class MetaDataImportExecutor { + + private final YamlRuleConfigurationSwapperEngine ruleConfigSwapperEngine = new YamlRuleConfigurationSwapperEngine(); + + private final YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor; + + private final ContextManager contextManager; + + public MetaDataImportExecutor(final ContextManager contextManager) { + this.contextManager = contextManager; + this.databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor(contextManager); + } + + /** + * Import cluster configurations. + * + * @param exportedMetaData exported metadata + * @throws SQLException SQL exception + */ + public void importClusterConfigurations(final ExportedMetaData exportedMetaData) throws SQLException { + Collection databaseConfigs = getYamlProxyDatabaseConfigurations(exportedMetaData); + importServerConfiguration(exportedMetaData); + importDatabaseConfigurations(databaseConfigs); + } + + private void importServerConfiguration(final ExportedMetaData exportedMetaData) throws SQLException { + YamlProxyServerConfiguration yamlServerConfig = YamlEngine.unmarshal(exportedMetaData.getRules() + System.lineSeparator() + exportedMetaData.getProps(), YamlProxyServerConfiguration.class); + if (null == yamlServerConfig) { + return; + } + importGlobalRules(yamlServerConfig); + importProps(yamlServerConfig); + } + + private void importGlobalRules(final YamlProxyServerConfiguration yamlServerConfig) throws SQLException { + Collection rules = ruleConfigSwapperEngine.swapToRuleConfigurations(yamlServerConfig.getRules()); + for (RuleConfiguration each : rules) { + contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterGlobalRuleConfiguration(each); + } + } + + private void importProps(final YamlProxyServerConfiguration yamlServerConfig) throws SQLException { + contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterProperties(yamlServerConfig.getProps()); + } + + private Collection getYamlProxyDatabaseConfigurations(final ExportedMetaData exportedMetaData) { + Collection result = new LinkedList<>(); + for (String each : exportedMetaData.getDatabases().values()) { + result.add(YamlEngine.unmarshal(each, YamlProxyDatabaseConfiguration.class)); + } + return result; + } + + /** + * Import database configurations. + * + * @param databaseConfigs YAML proxy database configuration + * @throws SQLException SQL exception + */ + public void importDatabaseConfigurations(final Collection databaseConfigs) throws SQLException { + for (YamlProxyDatabaseConfiguration each : databaseConfigs) { + databaseConfigImportExecutor.importDatabaseConfiguration(each); + } + } +} diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java index 33078e9e56ad7..54c141f8a640b 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.proxy.backend.util; +import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationCheckEngine; @@ -47,7 +48,6 @@ import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration; import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration; import org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyDataSourceConfigurationSwapper; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import java.sql.SQLException; import java.util.Collection; @@ -62,12 +62,15 @@ /** * Yaml database configuration import executor. */ +@RequiredArgsConstructor public final class YamlDatabaseConfigurationImportExecutor { private final YamlProxyDataSourceConfigurationSwapper dataSourceConfigSwapper = new YamlProxyDataSourceConfigurationSwapper(); private final DistSQLDataSourcePoolPropertiesValidator validateHandler = new DistSQLDataSourcePoolPropertiesValidator(); + private final ContextManager contextManager; + /** * Import proxy database from yaml configuration. * @@ -94,11 +97,11 @@ private void checkDataSources(final String databaseName, final Map new DatabaseCreateExistsException(databaseName)); + ShardingSpherePreconditions.checkNotEmpty(databaseName, MissingRequiredDatabaseException::new); + ShardingSpherePreconditions.checkState(!contextManager.getMetaDataContexts().getMetaData().containsDatabase(databaseName), () -> new DatabaseCreateExistsException(databaseName)); } private void addDatabase(final String databaseName) throws SQLException { - ContextManager contextManager = ProxyContext.getInstance().getContextManager(); contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().createDatabase(databaseName); DatabaseType protocolType = DatabaseTypeEngine.getProtocolType(Collections.emptyMap(), contextManager.getMetaDataContexts().getMetaData().getProps()); contextManager.getMetaDataContexts().getMetaData().addDatabase(databaseName, protocolType, contextManager.getMetaDataContexts().getMetaData().getProps()); @@ -112,12 +115,11 @@ private void importDataSources(final String databaseName, final Map storageUnits = ProxyContext.getInstance().getContextManager() - .getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits(); + Map storageUnits = contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits(); Map toBeAddedStorageNode = StorageUnitNodeMapCreator.create(propsMap); for (Entry entry : propsMap.entrySet()) { storageUnits.put(entry.getKey(), new StorageUnit(toBeAddedStorageNode.get(entry.getKey()), entry.getValue(), DataSourcePoolCreator.create(entry.getValue()))); @@ -129,10 +131,10 @@ private void importRules(final String databaseName, final Collection ruleConfigs = new LinkedList<>(); - MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); + MetaDataContexts metaDataContexts = contextManager.getMetaDataContexts(); ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabase(databaseName); swapToRuleConfigs(yamlRuleConfigs).values().forEach(each -> addRule(ruleConfigs, each, database)); - ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService() + contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService() .persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(), ruleConfigs); } @@ -145,7 +147,7 @@ private void addRule(final Collection ruleConfigs, final Rule @SuppressWarnings({"unchecked", "rawtypes"}) private ShardingSphereRule buildRule(final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) { DatabaseRuleBuilder ruleBuilder = OrderedSPILoader.getServices(DatabaseRuleBuilder.class, Collections.singleton(ruleConfig)).get(ruleConfig); - ComputeNodeInstanceContext computeNodeInstanceContext = ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext(); + ComputeNodeInstanceContext computeNodeInstanceContext = contextManager.getComputeNodeInstanceContext(); return ruleBuilder.build(ruleConfig, database.getName(), database.getProtocolType(), database.getResourceMetaData(), database.getRuleMetaData().getRules(), computeNodeInstanceContext); } @@ -161,6 +163,6 @@ private Map swapToRuleConfigs(final Collection storageUnits = createStorageUnits(); when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits); @@ -91,6 +90,7 @@ private Map createStorageUnits() { @Test void assertExecuteWithEmptyDatabase() { + ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("empty_db"); when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap()); when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java index 908fd91169ef7..6967b4e51f3c8 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java @@ -52,26 +52,18 @@ import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration; import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration; import org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo; import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData; import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; -import org.apache.shardingsphere.test.mock.AutoMockExtension; -import org.apache.shardingsphere.test.mock.StaticMockSettings; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.mockito.Mock; import javax.sql.DataSource; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; @@ -87,36 +79,21 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ProxyContext.class) class ExportMetaDataExecutorTest { - private static final String EXPECTED_EMPTY_METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7ImVtcHR5X21ldGFkYXRhIjoiZGF0YWJhc2VOYW1lOiBudWxsXG5kYXRhU291cmNlczpcbn" - + "J1bGVzOlxuIn0sInByb3BzIjoiIiwicnVsZXMiOiJydWxlczpcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0="; + private static final String EXPECTED_EMPTY_METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7ImVtcHR5X21ldGFkYXRhIjoiZGF0YWJhc2VOYW1lOiBlbXB0eV9tZXRhZGF0YVxuI" + + "n0sInByb3BzIjoiIiwicnVsZXMiOiJydWxlczpcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0="; - private static final String EXPECTED_NOT_EMPTY_METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cm" - + "NlczpcbiAgZHNfMDpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOm9wZW5nYXVzczovLzEyNy4wLjAuMTo1NDMyL2RlbW9fZHNfMFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vb" - + "FNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOm9wZW5nYXVzczovLzEyNy4wLjAuMTo1NDMyL2RlbW9fZHNfMVxuICAgIHVzZ" - + "XJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g" - + "IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3Rc" - + "biAgICB1c2VyOiByb290QCVcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0="; - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private ShardingSphereDatabase database; - - @BeforeEach - void setUp() { - when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); - } + private static final String EXPECTED_NOT_EMPTY_METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cmNlczpcbiAgZHNfMDpcbiA" + + "gICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzA7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9" + + "vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzE7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2" + + "U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g" + + "IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhZG1pbjogdHJ1ZVxuICAgIGF1dGhlbnRpY2F0aW9uTWV0aG9kTmFtZTogJydcbiAgIC" + + "BwYXNzd29yZDogcm9vdFxuICAgIHVzZXI6IHJvb3RAJVxuLSAhR0xPQkFMX0NMT0NLXG4gIGVuYWJsZWQ6IGZhbHNlXG4gIHByb3ZpZGVyOiBsb2NhbFxuICB0eXBlOiBUU09cbiJ9fQ=="; @Test void assertExecuteWithEmptyMetaData() { ContextManager contextManager = mockEmptyContextManager(); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("empty_metadata")); - when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata")); - when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap()); - when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); ExportMetaDataStatement sqlStatement = new ExportMetaDataStatement(null); Collection actual = new ExportMetaDataExecutor().getRows(sqlStatement, contextManager); assertThat(actual.size(), is(1)); @@ -125,43 +102,36 @@ void assertExecuteWithEmptyMetaData() { } private ContextManager mockEmptyContextManager() { + ShardingSphereDatabase database = mockEmptyShardingSphereDatabase(); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); - MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData(new LinkedList<>(), + MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData(Collections.singleton(database), new ResourceMetaData(Collections.emptyMap()), new RuleMetaData(Collections.singleton(new GlobalClockRule(new DefaultGlobalClockRuleConfigurationBuilder().build()))), new ConfigurationProperties(new Properties()))); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); return result; } + private ShardingSphereDatabase mockEmptyShardingSphereDatabase() { + ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); + when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); + when(result.getName()).thenReturn("empty_metadata"); + when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata")); + when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap()); + when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); + return result; + } + @Test void assertExecute() { - when(database.getName()).thenReturn("normal_db"); - when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata")); - Map storageUnits = createStorageUnits(); - when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits); - when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); ContextManager contextManager = mockContextManager(); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("normal_db")); Collection actual = new ExportMetaDataExecutor().getRows(new ExportMetaDataStatement(null), contextManager); assertThat(actual.size(), is(1)); LocalDataQueryResultRow row = actual.iterator().next(); assertMetaData(row.getCell(3), EXPECTED_NOT_EMPTY_METADATA_VALUE); } - private Map createStorageUnits() { - Map propsMap = createDataSourceMap().entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, entry -> DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); - Map result = new LinkedHashMap<>(propsMap.size(), 1F); - for (Entry entry : propsMap.entrySet()) { - StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS); - when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue()); - result.put(entry.getKey(), storageUnit); - } - return result; - } - private ContextManager mockContextManager() { + ShardingSphereDatabase database = mockShardingSphereDatabase(); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData(Collections.singleton(database), new ResourceMetaData(Collections.emptyMap()), new RuleMetaData(Arrays.asList(new AuthorityRule(new DefaultAuthorityRuleConfigurationBuilder().build()), @@ -173,7 +143,29 @@ private ContextManager mockContextManager() { ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); - when(result.getDatabase("normal_db")).thenReturn(database); + return result; + } + + private ShardingSphereDatabase mockShardingSphereDatabase() { + Map storageUnits = createStorageUnits(); + ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); + when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); + when(result.getName()).thenReturn("normal_db"); + when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(storageUnits.keySet()); + when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits); + when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); + return result; + } + + private Map createStorageUnits() { + Map propsMap = createDataSourceMap().entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, entry -> DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); + Map result = new LinkedHashMap<>(propsMap.size(), 1F); + for (Entry entry : propsMap.entrySet()) { + StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS); + when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue()); + result.put(entry.getKey(), storageUnit); + } return result; } @@ -186,7 +178,7 @@ private Map createDataSourceMap() { private DataSource createDataSource(final String name) { MockedDataSource result = new MockedDataSource(); - result.setUrl(String.format("jdbc:opengauss://127.0.0.1:5432/%s", name)); + result.setUrl(String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL", name)); result.setUsername("root"); result.setPassword(""); result.setMaxPoolSize(50); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java index 7d49a7ac63914..204ddfbec561c 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java @@ -17,8 +17,6 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable; -import lombok.SneakyThrows; -import org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator; import org.apache.shardingsphere.distsql.statement.ral.updatable.ImportDatabaseConfigurationStatement; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; @@ -33,18 +31,8 @@ import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; -import org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor; import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; -import org.apache.shardingsphere.test.fixture.jdbc.MockedDriver; -import org.apache.shardingsphere.test.mock.AutoMockExtension; -import org.apache.shardingsphere.test.mock.StaticMockSettings; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.internal.configuration.plugins.Plugins; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; import javax.sql.DataSource; import java.net.URL; @@ -60,81 +48,68 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ProxyContext.class) -@MockitoSettings(strictness = Strictness.LENIENT) class ImportDatabaseConfigurationExecutorTest { - private ImportDatabaseConfigurationExecutor executor; - - @BeforeAll - static void setUp() throws ClassNotFoundException { - Class.forName(MockedDriver.class.getName()); - } - @Test void assertImportDatabaseExecutorForSharding() throws SQLException { - assertExecute("sharding_db", "/conf/import/database-sharding.yaml"); + ContextManager contextManager = mockContextManager("sharding_db"); + assertExecute(contextManager, "/conf/import/database-sharding.yaml"); } @Test void assertImportDatabaseExecutorForReadwriteSplitting() throws SQLException { - assertExecute("readwrite_splitting_db", "/conf/import/database-readwrite-splitting.yaml"); + ContextManager contextManager = mockContextManager("readwrite_splitting_db"); + assertExecute(contextManager, "/conf/import/database-readwrite-splitting.yaml"); } @Test void assertImportDatabaseExecutorForEncrypt() throws SQLException { - assertExecute("encrypt_db", "/conf/import/database-encrypt.yaml"); + ContextManager contextManager = mockContextManager("encrypt_db"); + assertExecute(contextManager, "/conf/import/database-encrypt.yaml"); } @Test void assertImportDatabaseExecutorForShadow() throws SQLException { - assertExecute("shadow_db", "/conf/import/database-shadow.yaml"); + ContextManager contextManager = mockContextManager("shadow_db"); + assertExecute(contextManager, "/conf/import/database-shadow.yaml"); } @Test void assertImportDatabaseExecutorForMask() throws SQLException { - assertExecute("mask_db", "/conf/import/database-mask.yaml"); + ContextManager contextManager = mockContextManager("mask_db"); + assertExecute(contextManager, "/conf/import/database-mask.yaml"); } @Test void assertImportExistedDatabase() { - String databaseName = "sharding_db"; - when(ProxyContext.getInstance().databaseExists(databaseName)).thenReturn(true); - assertThrows(DatabaseCreateExistsException.class, () -> assertExecute(databaseName, "/conf/import/database-sharding.yaml")); + ContextManager contextManager = mockContextManager("sharding_db"); + when(contextManager.getMetaDataContexts().getMetaData().containsDatabase("sharding_db")).thenReturn(true); + assertThrows(DatabaseCreateExistsException.class, () -> assertExecute(contextManager, "/conf/import/database-sharding.yaml")); } @Test void assertImportEmptyDatabaseName() { - assertThrows(MissingRequiredDatabaseException.class, () -> assertExecute("sharding_db", "/conf/import/database-empty-database-name.yaml")); + ContextManager contextManager = mockContextManager("sharding_db"); + assertThrows(MissingRequiredDatabaseException.class, () -> assertExecute(contextManager, "/conf/import/database-empty-database-name.yaml")); } @Test void assertImportDuplicatedLogicTable() { - assertThrows(DuplicateRuleException.class, () -> assertExecute("sharding_db", "/conf/import/database-duplicated-logic-table.yaml")); + ContextManager contextManager = mockContextManager("sharding_db"); + assertThrows(DuplicateRuleException.class, () -> assertExecute(contextManager, "/conf/import/database-duplicated-logic-table.yaml")); } @Test void assertImportInvalidAlgorithm() { - assertThrows(ServiceProviderNotFoundException.class, () -> assertExecute("sharding_db", "/conf/import/database-invalid-algorithm.yaml")); + ContextManager contextManager = mockContextManager("sharding_db"); + assertThrows(ServiceProviderNotFoundException.class, () -> assertExecute(contextManager, "/conf/import/database-invalid-algorithm.yaml")); } - private void assertExecute(final String databaseName, final String filePath) throws SQLException { - init(databaseName); + private void assertExecute(final ContextManager contextManager, final String filePath) throws SQLException { + ImportDatabaseConfigurationExecutor executor = new ImportDatabaseConfigurationExecutor(); URL url = ImportDatabaseConfigurationExecutorTest.class.getResource(filePath); assertNotNull(url); - executor.executeUpdate(new ImportDatabaseConfigurationStatement(url.getPath()), mock(ContextManager.class)); - } - - @SneakyThrows({IllegalAccessException.class, NoSuchFieldException.class}) - private void init(final String databaseName) { - ContextManager contextManager = mockContextManager(databaseName); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - executor = new ImportDatabaseConfigurationExecutor(); - YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor(); - Plugins.getMemberAccessor().set(ImportDatabaseConfigurationExecutor.class.getDeclaredField("databaseConfigImportExecutor"), executor, databaseConfigImportExecutor); - Plugins.getMemberAccessor().set( - YamlDatabaseConfigurationImportExecutor.class.getDeclaredField("validateHandler"), databaseConfigImportExecutor, mock(DistSQLDataSourcePoolPropertiesValidator.class)); + executor.executeUpdate(new ImportDatabaseConfigurationStatement(url.getPath()), contextManager); } private ContextManager mockContextManager(final String databaseName) { diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java index 89c353b4e5d96..f0a7cb00bb60d 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java @@ -17,44 +17,51 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable; -import lombok.SneakyThrows; -import org.apache.groovy.util.Maps; -import org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator; +import org.apache.shardingsphere.authority.rule.AuthorityRule; +import org.apache.shardingsphere.authority.rule.builder.DefaultAuthorityRuleConfigurationBuilder; import org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement; +import org.apache.shardingsphere.globalclock.rule.GlobalClockRule; +import org.apache.shardingsphere.globalclock.rule.builder.DefaultGlobalClockRuleConfigurationBuilder; +import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; +import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.DatabaseCreateExistsException; import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException; +import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; +import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; +import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.lock.LockContext; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; -import org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode; +import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; +import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; +import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; +import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; -import org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor; +import org.apache.shardingsphere.mode.manager.standalone.workerid.StandaloneWorkerIdGenerator; +import org.apache.shardingsphere.mode.metadata.MetaDataContexts; +import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; -import org.apache.shardingsphere.test.mock.AutoMockExtension; -import org.apache.shardingsphere.test.mock.StaticMockSettings; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.internal.configuration.plugins.Plugins; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; +import javax.sql.DataSource; import java.sql.SQLException; -import java.util.Collection; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; +import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -62,96 +69,101 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ProxyContext.class) -@MockitoSettings(strictness = Strictness.LENIENT) class ImportMetaDataExecutorTest { - private static final String METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7InNoYXJkaW5nX2RiIjoiZGF0YWJhc2VOYW1lOiBzaGFyZGluZ19kYlxuZGF0YVNvdXJjZXM6XG4gIGRzXzA6XG4gICAgcGFzc3dvcmQ6IFxu" - + "ICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzA/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiAgICBtaW5Qb29sU2l6ZTogMVxuICAgI" - + "GNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4gICAgbWF4UG9vbFNpemU6IDUwXG4gIG" - + "RzXzE6XG4gICAgcGFzc3dvcmQ6IFxuICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzE/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiA" - + "gICBtaW5Qb29sU2l6ZTogMVxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4g" - + "ICAgbWF4UG9vbFNpemU6IDUwXG5ydWxlczpcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzeXN0ZW0tbG9nLWxldmVsOiBJTkZPXG4gIHNxbC1zaG93OiBmYWxzZVxuIiwicnVsZXMiOiJydWxlczpcbi0gIUFVVEhPUklUWVxuICBwcml2aWxlZ" - + "2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3RcbiAgICB1c2VyOiByb290QCVcbiJ9fQ=="; + private static final String METADATA_VALUE = "eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cmNlczpcbiAgZHNfMDpcbiA" + + "gICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzA7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9" + + "vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzE7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2" + + "U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g" + + "IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhZG1pbjogdHJ1ZVxuICAgIGF1dGhlbnRpY2F0aW9uTWV0aG9kTmFtZTogJydcbiAgIC" + + "BwYXNzd29yZDogcm9vdFxuICAgIHVzZXI6IHJvb3RAJVxuLSAhR0xPQkFMX0NMT0NLXG4gIGVuYWJsZWQ6IGZhbHNlXG4gIHByb3ZpZGVyOiBsb2NhbFxuICB0eXBlOiBUU09cbiJ9fQ=="; - private static final String EMPTY = "empty_metadata"; - - private ImportMetaDataExecutor executor; + private static final String EMPTY_DATABASE_NAME = "empty_metadata"; private final Map featureMap = new HashMap<>(1, 1F); @BeforeEach void setup() { - featureMap.put(EMPTY, "/conf/import/empty-metadata.json"); + featureMap.put(EMPTY_DATABASE_NAME, "/conf/import/empty-metadata.json"); } @Test void assertImportEmptyMetaData() { - init(null); + ImportMetaDataExecutor executor = new ImportMetaDataExecutor(); ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); assertThrows(EmptyStorageUnitException.class, () -> executor.executeUpdate( - new ImportMetaDataStatement(null, Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()), contextManager)); + new ImportMetaDataStatement(null, Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY_DATABASE_NAME))).getPath()), contextManager)); } @Test void assertImportMetaDataFromJsonValue() throws SQLException { - init(EMPTY); ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); + ImportMetaDataExecutor executor = new ImportMetaDataExecutor(); executor.executeUpdate(new ImportMetaDataStatement(METADATA_VALUE, null), contextManager); - assertNotNull(contextManager.getDatabase("sharding_db")); + assertNotNull(contextManager.getDatabase("normal_db")); } @Test void assertImportExistedMetaDataFromFile() { - init(EMPTY); - ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); + ImportMetaDataExecutor executor = new ImportMetaDataExecutor(); + ContextManager contextManager = mockContextManager(); assertThrows(DatabaseCreateExistsException.class, () -> executor.executeUpdate( - new ImportMetaDataStatement(null, Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()), contextManager)); + new ImportMetaDataStatement(null, Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY_DATABASE_NAME))).getPath()), contextManager)); } - @SneakyThrows({IllegalAccessException.class, NoSuchFieldException.class}) - private void init(final String feature) { - executor = new ImportMetaDataExecutor(); - ContextManager contextManager = mockContextManager(feature); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(ProxyContext.getInstance().databaseExists(feature)).thenReturn(true); - YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor(); - Plugins.getMemberAccessor().set(ImportMetaDataExecutor.class.getDeclaredField("databaseConfigImportExecutor"), executor, databaseConfigImportExecutor); - Plugins.getMemberAccessor().set( - YamlDatabaseConfigurationImportExecutor.class.getDeclaredField("validateHandler"), databaseConfigImportExecutor, mock(DistSQLDataSourcePoolPropertiesValidator.class)); + private ContextManager mockContextManager() { + ShardingSphereDatabase database = mockShardingSphereDatabase(); + MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData(Collections.singleton(database), + new ResourceMetaData(Collections.emptyMap()), + new RuleMetaData(Arrays.asList(new AuthorityRule(new DefaultAuthorityRuleConfigurationBuilder().build()), + new GlobalClockRule(new DefaultGlobalClockRuleConfigurationBuilder().build()))), + new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); + ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( + new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); + ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); + when(result.getMetaDataContexts()).thenReturn(metaDataContexts); + when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); + return result; } - private ContextManager mockContextManager(final String feature) { - ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(result.getMetaDataContexts().getMetaData().getProps()) - .thenReturn(new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.PROXY_FRONTEND_DATABASE_PROTOCOL_TYPE.getKey(), "MySQL")))); - if (null != feature) { - ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); - when(database.getName()).thenReturn(feature); - when(database.getSchema("foo_db")).thenReturn(new ShardingSphereSchema("foo_db", createTables(), Collections.emptyList())); - Map storageUnits = createStorageUnits(); - when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits); - when(result.getMetaDataContexts().getMetaData().getAllDatabases()).thenReturn(Collections.singleton(database)); - when(result.getMetaDataContexts().getMetaData().getDatabase(feature)).thenReturn(database); - } + private ShardingSphereDatabase mockShardingSphereDatabase() { + Map storageUnits = createStorageUnits(); + ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); + when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); + when(result.getName()).thenReturn(EMPTY_DATABASE_NAME); + when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(storageUnits.keySet()); + when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits); + when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList()); return result; } private Map createStorageUnits() { - Map result = new LinkedHashMap<>(2, 1F); - DataSourcePoolProperties dataSourcePoolProps0 = mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS); - when(dataSourcePoolProps0.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url", "jdbc:mock://127.0.0.1/ds_0", "username", "test")); - result.put("ds_0", new StorageUnit(mock(StorageNode.class), dataSourcePoolProps0, new MockedDataSource())); - DataSourcePoolProperties dataSourcePoolProps1 = mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS); - when(dataSourcePoolProps1.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url", "jdbc:mock://127.0.0.1/ds_1", "username", "test")); - result.put("ds_1", new StorageUnit(mock(StorageNode.class), dataSourcePoolProps1, new MockedDataSource())); + Map propsMap = createDataSourceMap().entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, entry -> DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); + Map result = new LinkedHashMap<>(propsMap.size(), 1F); + for (Entry entry : propsMap.entrySet()) { + StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS); + when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue()); + result.put(entry.getKey(), storageUnit); + } return result; } - private Collection createTables() { - Collection columns = Collections.singleton(new ShardingSphereColumn("order_id", 0, false, false, false, true, false, false)); - Collection indexes = Collections.singleton(new ShardingSphereIndex("primary", Collections.emptyList(), false)); - return Collections.singletonList(new ShardingSphereTable("t_order", columns, indexes, Collections.emptyList())); + private Map createDataSourceMap() { + Map result = new LinkedHashMap<>(2, 1F); + result.put("ds_0", createDataSource("demo_ds_0")); + result.put("ds_1", createDataSource("demo_ds_1")); + return result; + } + + private DataSource createDataSource(final String name) { + MockedDataSource result = new MockedDataSource(); + result.setUrl(String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL", name)); + result.setUsername("root"); + result.setPassword(""); + result.setMaxPoolSize(50); + result.setMinPoolSize(1); + return result; } } From 4fe038b2e5bbc6e7bb07fd0fa3865155b7b1dc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BF=B5=E5=90=9B=20Nianjun=20Sun?= Date: Wed, 25 Dec 2024 11:32:40 +0800 Subject: [PATCH 139/192] Add : add nightly workflow for agent (#34146) --- .github/workflows/nightly-e2e-agent.yml | 145 ++++++++++++++++++++ .github/workflows/nightly-e2e-operation.yml | 2 +- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/nightly-e2e-agent.yml diff --git a/.github/workflows/nightly-e2e-agent.yml b/.github/workflows/nightly-e2e-agent.yml new file mode 100644 index 0000000000000..fa16101d6c48f --- /dev/null +++ b/.github/workflows/nightly-e2e-agent.yml @@ -0,0 +1,145 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: Nightly - E2E Agent + +on: + schedule: + - cron: '0 0 * * 1-5' # Once a day between Monday and Friday. UTC time + workflow_dispatch: + +concurrency: + group: e2e-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 -Dspotless.apply.skip=true + +jobs: + global-environment: + name: Import Global Environment + uses: ./.github/workflows/required-reusable.yml + + build-e2e-image: + if: github.repository == 'apache/shardingsphere' + name: Build E2E Image + needs: global-environment + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: apache-shardingsphere-maven-third-party-e2e-cache-${{ github.sha }} + restore-keys: | + apache-shardingsphere-maven-third-party-e2e-cache- + apache-shardingsphere-maven-third-party- + - name: Build Project + run: ./mvnw -B clean install -DskipTests -Prelease + - name: Build Proxy E2E Image + run: ./mvnw clean install -DskipTests -Pit.env.proxy -f test/e2e/agent/engine/pom.xml + - name: Save Proxy E2E Image + run: docker save -o /tmp/apache-shardingsphere-proxy-agent-test.tar apache/shardingsphere-proxy-agent-test:latest + - uses: actions/upload-artifact@v4 + with: + name: proxy-e2e-image + path: /tmp/apache-shardingsphere-proxy-agent-test.tar + retention-days: 10 + - name: Build JDBC E2E Image + run: ./mvnw clean install -DskipTests -Pit.env.jdbc -f test/e2e/agent/engine/pom.xml + - name: Save JDBC E2E Image + run: docker save -o /tmp/apache-shardingsphere-jdbc-agent-test.tar apache/shardingsphere-jdbc-agent-test:latest + - uses: actions/upload-artifact@v4 + with: + name: jdbc-e2e-image + path: /tmp/apache-shardingsphere-jdbc-agent-test.tar + retention-days: 10 + + agent-mysql: + name: E2E - Agent with MySQL + if: github.repository == 'apache/shardingsphere' + needs: [ global-environment, build-e2e-image ] + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + max-parallel: 20 + fail-fast: false + matrix: + include: + - adapter: proxy + feature: tracing + plugin: jaeger + - adapter: proxy + feature: tracing + plugin: zipkin + - adapter: proxy + feature: metrics + plugin: prometheus + - adapter: proxy + feature: logging + plugin: file + - adapter: jdbc + feature: logging + plugin: file + - adapter: jdbc + feature: metrics + plugin: prometheus + - adapter: jdbc + feature: tracing + plugin: jaeger + - adapter: jdbc + feature: tracing + plugin: zipkin + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 21 + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: apache-shardingsphere-maven-third-party-${{ hashFiles('**/pom.xml') }} + restore-keys: | + apache-shardingsphere-maven-third-party- + - name: Download Proxy E2E Image + if: matrix.adapter == 'proxy' + uses: actions/download-artifact@v4 + with: + name: proxy-e2e-image + path: /tmp/ + - name: Load Proxy E2E Image + if: matrix.adapter == 'proxy' + run: docker load -i /tmp/apache-shardingsphere-proxy-agent-test.tar + - name: Download JDBC E2E Image + if: matrix.adapter == 'jdbc' + uses: actions/download-artifact@v4 + with: + name: jdbc-e2e-image + path: /tmp/ + - name: Load JDBC E2E Image + if: matrix.adapter == 'jdbc' + run: docker load -i /tmp/apache-shardingsphere-jdbc-agent-test.tar + - name: Build Project + run: ./mvnw -B clean install -am -pl test/e2e/agent/plugins/${{ matrix.feature }}/${{ matrix.plugin }} -DskipTests + - name: Run E2E Test + run: ./mvnw -nsu -B clean install -f test/e2e/agent/plugins/${{ matrix.feature }}/${{ matrix.plugin }}/pom.xml -Dit.env.adapter=${{ matrix.adapter }} -Dit.env.plugin=${{ matrix.plugin }} diff --git a/.github/workflows/nightly-e2e-operation.yml b/.github/workflows/nightly-e2e-operation.yml index c79873bde7dfc..e3ea049f3b677 100644 --- a/.github/workflows/nightly-e2e-operation.yml +++ b/.github/workflows/nightly-e2e-operation.yml @@ -19,7 +19,7 @@ name: Nightly - E2E Operation on: schedule: - - cron: '0 20 * * 1-5' # Once a day between Monday and Friday. UTC time + - cron: '0 19 * * 1-5' # Once a day between Monday and Friday. UTC time workflow_dispatch: concurrency: From 9fc1b2a819c2950a231ba76e3a28590582405253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BF=B5=E5=90=9B=20Nianjun=20Sun?= Date: Wed, 25 Dec 2024 14:40:44 +0800 Subject: [PATCH 140/192] Refactor : refactor the building time for agent workflow (#34148) --- .github/workflows/nightly-e2e-agent.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly-e2e-agent.yml b/.github/workflows/nightly-e2e-agent.yml index fa16101d6c48f..af2e92cd545cf 100644 --- a/.github/workflows/nightly-e2e-agent.yml +++ b/.github/workflows/nightly-e2e-agent.yml @@ -39,7 +39,7 @@ jobs: name: Build E2E Image needs: global-environment runs-on: ubuntu-latest - timeout-minutes: 20 + timeout-minutes: 40 steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 From e43c4aa2d7653601698d7d866387a0e6bfcf1958 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Wed, 25 Dec 2024 15:32:07 +0800 Subject: [PATCH 141/192] Support extracting column name from function for postgresql (#34147) * Support extracting column name from function for postgresql * Support extracting column name from function for postgresql * Support extracting column name from function for postgresql * Support extracting column name from function for postgresql * Support extracting column name from function for postgresql --- .../extractor/DialectProjectionIdentifierExtractor.java | 8 +++++--- .../extractor/ProjectionIdentifierExtractEngine.java | 8 +++++--- .../dialect/OpenGaussProjectionIdentifierExtractor.java | 9 +++++++-- .../dialect/OracleProjectionIdentifierExtractor.java | 5 +++-- .../dialect/PostgreSQLProjectionIdentifierExtractor.java | 9 +++++++-- .../select/projection/impl/ExpressionProjection.java | 2 +- .../infra/binder/engine/util/SubqueryTableBindUtils.java | 2 +- .../extractor/ProjectionIdentifierExtractEngineTest.java | 3 ++- .../OpenGaussProjectionIdentifierExtractorTest.java | 9 ++++++++- .../dialect/OracleProjectionIdentifierExtractorTest.java | 3 ++- .../PostgreSQLProjectionIdentifierExtractorTest.java | 9 ++++++++- 11 files changed, 49 insertions(+), 18 deletions(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java index 23603c890284b..3fb98209148c3 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java @@ -19,6 +19,7 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI; import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -46,12 +47,13 @@ public interface DialectProjectionIdentifierExtractor extends DatabaseTypedSPI { String getColumnNameFromFunction(String functionName, String functionExpression); /** - * Get column name from expression. + * Get column name from expression segment. * - * @param expression expression + * @param expressionSegment expression segment * @return column name */ - String getColumnNameFromExpression(String expression); + + String getColumnNameFromExpression(ExpressionSegment expressionSegment); /** * Get column name from subquery segment. diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java index 5d69ad1c42edf..6ba201598ebb0 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -61,11 +62,12 @@ public String getColumnNameFromFunction(final String functionName, final String /** * Get column name from expression. * - * @param expression expression + * @param expressionSegment expression segment * @return column name */ - public String getColumnNameFromExpression(final String expression) { - return DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, databaseType).map(optional -> optional.getColumnNameFromExpression(expression)).orElse(expression); + public String getColumnNameFromExpression(final ExpressionSegment expressionSegment) { + return DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class, databaseType).map(optional -> optional.getColumnNameFromExpression(expressionSegment)) + .orElse(expressionSegment.getText()); } /** diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java index c5ec97785cfe7..9471b600a5cb3 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java @@ -18,6 +18,9 @@ package org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect; import org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -37,8 +40,10 @@ public String getColumnNameFromFunction(final String functionName, final String } @Override - public String getColumnNameFromExpression(final String expression) { - return "?column?"; + public String getColumnNameFromExpression(final ExpressionSegment expressionSegment) { + return expressionSegment instanceof ExpressionProjectionSegment && ((ExpressionProjectionSegment) expressionSegment).getExpr() instanceof FunctionSegment + ? ((FunctionSegment) ((ExpressionProjectionSegment) expressionSegment).getExpr()).getFunctionName() + : "?column?"; } @Override diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java index 49195645c70dd..c519cc0da2a53 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect; import org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -37,8 +38,8 @@ public String getColumnNameFromFunction(final String functionName, final String } @Override - public String getColumnNameFromExpression(final String expression) { - return expression.replace(" ", "").toUpperCase(); + public String getColumnNameFromExpression(final ExpressionSegment expressionSegment) { + return expressionSegment.getText().replace(" ", "").toUpperCase(); } @Override diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java index 720f7f0410b8b..fa641d5cc74fa 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java @@ -18,6 +18,9 @@ package org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect; import org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -37,8 +40,10 @@ public String getColumnNameFromFunction(final String functionName, final String } @Override - public String getColumnNameFromExpression(final String expression) { - return "?column?"; + public String getColumnNameFromExpression(final ExpressionSegment expressionSegment) { + return expressionSegment instanceof ExpressionProjectionSegment && ((ExpressionProjectionSegment) expressionSegment).getExpr() instanceof FunctionSegment + ? ((FunctionSegment) ((ExpressionProjectionSegment) expressionSegment).getExpr()).getFunctionName() + : "?column?"; } @Override diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java index 76f93428dc17a..3c1caf1c40088 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java @@ -52,7 +52,7 @@ public String getColumnName() { @Override public String getColumnLabel() { ProjectionIdentifierExtractEngine extractEngine = new ProjectionIdentifierExtractEngine(databaseType); - return getAlias().map(extractEngine::getIdentifierValue).orElseGet(() -> extractEngine.getColumnNameFromExpression(expressionSegment.getText())); + return getAlias().map(extractEngine::getIdentifierValue).orElseGet(() -> extractEngine.getColumnNameFromExpression(expressionSegment)); } @Override diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java index 40d640b910bd5..cafaac7a910f0 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java @@ -100,6 +100,6 @@ private static String getColumnNameFromExpression(final ExpressionSegment expres if (expressionSegment instanceof AliasAvailable && ((AliasAvailable) expressionSegment).getAlias().isPresent()) { return extractEngine.getIdentifierValue(((AliasAvailable) expressionSegment).getAlias().get()); } - return extractEngine.getColumnNameFromExpression(expressionSegment.getText()); + return extractEngine.getColumnNameFromExpression(expressionSegment); } } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java index 6e51dd14c383e..ce8e96a11d07f 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -50,7 +51,7 @@ void assertGetColumnNameFromFunction() { @Test void assertGetColumnNameFromExpression() { - assertThat(new ProjectionIdentifierExtractEngine(databaseType).getColumnNameFromExpression("expression"), is("expression")); + assertThat(new ProjectionIdentifierExtractEngine(databaseType).getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "expression")), is("expression")); } @Test diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java index e898c4c23c4b8..8afc81ef87d70 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java @@ -22,7 +22,9 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -49,7 +51,12 @@ void assertGetColumnNameFromFunction() { @Test void assertGetColumnNameFromExpression() { - assertThat(extractor.getColumnNameFromExpression("expression"), is("?column?")); + assertThat(extractor.getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "expression")), is("?column?")); + } + + @Test + void assertGetColumnNameFromFunctionExpression() { + assertThat(extractor.getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "SUM(ID)", new FunctionSegment(0, 0, "SUM", "SUM(ID)"))), is("SUM")); } @Test diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java index 563b1eca8d3cb..17ed34e40e0e8 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -49,7 +50,7 @@ void assertGetColumnNameFromFunction() { @Test void assertGetColumnNameFromExpression() { - assertThat(extractor.getColumnNameFromExpression("expression"), is("EXPRESSION")); + assertThat(extractor.getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "expression")), is("EXPRESSION")); } @Test diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java index 42f3afbb3bcd4..1bdfcd2b863c5 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java @@ -22,7 +22,9 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import org.junit.jupiter.api.Test; @@ -49,7 +51,12 @@ void assertGetColumnNameFromFunction() { @Test void assertGetColumnNameFromExpression() { - assertThat(extractor.getColumnNameFromExpression("expression"), is("?column?")); + assertThat(extractor.getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "expression")), is("?column?")); + } + + @Test + void assertGetColumnNameFromFunctionExpression() { + assertThat(extractor.getColumnNameFromExpression(new ExpressionProjectionSegment(0, 0, "SUM(ID)", new FunctionSegment(0, 0, "SUM", "SUM(ID)"))), is("SUM")); } @Test From 3ca4a31cb148a1eb3062c8f59ae54b37a53e6841 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Wed, 25 Dec 2024 17:24:00 +0800 Subject: [PATCH 142/192] Add more sql binder test case for insert statement (#34149) * Add more sql binder test case for insert statement * revert some logic --- .../ddl/CreateTableStatementBinder.java | 2 + .../statement/ddl/CursorStatementBinder.java | 1 + .../statement/dml/DeleteStatementBinder.java | 8 +- .../statement/dml/InsertStatementBinder.java | 4 +- .../statement/dml/UpdateStatementBinder.java | 5 +- .../test/resources/cases/ddl/create-index.xml | 2 +- .../src/test/resources/cases/dml/insert.xml | 188 ++++++++++++++++++ .../src/test/resources/sqls/dml/insert.xml | 22 ++ .../asserts/segment/column/ColumnAssert.java | 6 +- .../insert/DerivedInsertColumnsAssert.java | 53 +++++ .../dml/impl/InsertStatementAssert.java | 11 + .../insert/ExpectedDerivedInsertColumns.java | 36 ++++ .../dml/InsertStatementTestCase.java | 8 +- 13 files changed, 337 insertions(+), 9 deletions(-) create mode 100644 test/it/binder/src/test/resources/cases/dml/insert.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/insert.xml create mode 100644 test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/DerivedInsertColumnsAssert.java create mode 100644 test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedDerivedInsertColumns.java diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java index 99960f4fb5409..3885e86ad3367 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java @@ -53,7 +53,9 @@ private static CreateTableStatement copy(final CreateTableStatement sqlStatement result.getColumns().addAll(sqlStatement.getColumns()); sqlStatement.getLikeTable().ifPresent(result::setLikeTable); sqlStatement.getCreateTableOption().ifPresent(result::setCreateTableOption); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CursorStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CursorStatementBinder.java index 6ec851a9620e2..7f5a68f36de63 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CursorStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CursorStatementBinder.java @@ -41,6 +41,7 @@ private static CursorStatement copy(final CursorStatement sqlStatement) { result.setCursorName(sqlStatement.getCursorName()); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java index 30ad9a5519971..c1c2a3e0b7252 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java @@ -23,7 +23,9 @@ import lombok.SneakyThrows; import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; @@ -37,20 +39,22 @@ public final class DeleteStatementBinder implements SQLStatementBinder tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getWithSegment().ifPresent(optional -> result.setWithSegment(WithSegmentBinder.bind(optional, binderContext, binderContext.getExternalTableBinderContexts()))); result.setTable(TableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts, LinkedHashMultimap.create())); sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); + sqlStatement.getOrderBy().ifPresent(optional -> result.setOrderBy( + OrderBySegmentBinder.bind(optional, binderContext, LinkedHashMultimap.create(), tableBinderContexts, LinkedHashMultimap.create()))); return result; } @SneakyThrows(ReflectiveOperationException.class) private DeleteStatement copy(final DeleteStatement sqlStatement) { DeleteStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); - sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); - sqlStatement.getWithSegment().ifPresent(result::setWithSegment); sqlStatement.getOutputSegment().ifPresent(result::setOutputSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java index 5d2ac4a1780a5..f3dd10f268f32 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.SubquerySegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; @@ -44,6 +45,7 @@ public final class InsertStatementBinder implements SQLStatementBinder tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getWithSegment().ifPresent(optional -> result.setWithSegment(WithSegmentBinder.bind(optional, binderContext, binderContext.getExternalTableBinderContexts()))); sqlStatement.getTable().ifPresent(optional -> result.setTable(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); if (sqlStatement.getInsertColumns().isPresent() && !sqlStatement.getInsertColumns().get().getColumns().isEmpty()) { result.setInsertColumns(InsertColumnsSegmentBinder.bind(sqlStatement.getInsertColumns().get(), binderContext, tableBinderContexts)); @@ -61,7 +63,6 @@ private InsertStatement copy(final InsertStatement sqlStatement) { result.getValues().addAll(sqlStatement.getValues()); sqlStatement.getSetAssignment().ifPresent(result::setSetAssignment); sqlStatement.getOnDuplicateKeyColumns().ifPresent(result::setOnDuplicateKeyColumns); - sqlStatement.getWithSegment().ifPresent(result::setWithSegment); sqlStatement.getOutputSegment().ifPresent(result::setOutputSegment); sqlStatement.getMultiTableInsertType().ifPresent(result::setMultiTableInsertType); sqlStatement.getMultiTableInsertIntoSegment().ifPresent(result::setMultiTableInsertIntoSegment); @@ -69,6 +70,7 @@ private InsertStatement copy(final InsertStatement sqlStatement) { sqlStatement.getReturningSegment().ifPresent(result::setReturningSegment); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java index ba4744cc5db3a..8c753e4c83e68 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.binder.engine.segment.assign.AssignmentSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; @@ -44,16 +45,18 @@ public UpdateStatement bind(final UpdateStatement sqlStatement, final SQLStateme sqlStatement.getFrom().ifPresent(optional -> result.setFrom(TableSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); sqlStatement.getAssignmentSegment().ifPresent(optional -> result.setSetAssignment(AssignmentSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); sqlStatement.getWhere().ifPresent(optional -> result.setWhere(WhereSegmentBinder.bind(optional, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); + sqlStatement.getOrderBy().ifPresent(optional -> result.setOrderBy( + OrderBySegmentBinder.bind(optional, binderContext, LinkedHashMultimap.create(), tableBinderContexts, LinkedHashMultimap.create()))); return result; } @SneakyThrows(ReflectiveOperationException.class) private UpdateStatement copy(final UpdateStatement sqlStatement) { UpdateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); - sqlStatement.getOrderBy().ifPresent(result::setOrderBy); sqlStatement.getLimit().ifPresent(result::setLimit); result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); return result; } } diff --git a/test/it/binder/src/test/resources/cases/ddl/create-index.xml b/test/it/binder/src/test/resources/cases/ddl/create-index.xml index ae7c22542bbce..602979099b988 100644 --- a/test/it/binder/src/test/resources/cases/ddl/create-index.xml +++ b/test/it/binder/src/test/resources/cases/ddl/create-index.xml @@ -33,7 +33,7 @@ - + diff --git a/test/it/binder/src/test/resources/cases/dml/insert.xml b/test/it/binder/src/test/resources/cases/dml/insert.xml new file mode 100644 index 0000000000000..7ab41a31e2711 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/insert.xml @@ -0,0 +1,188 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/test/it/binder/src/test/resources/sqls/dml/insert.xml b/test/it/binder/src/test/resources/sqls/dml/insert.xml new file mode 100644 index 0000000000000..1f206df697672 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/insert.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/column/ColumnAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/column/ColumnAssert.java index 1c3a24bf432ee..c12cf29338f98 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/column/ColumnAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/column/ColumnAssert.java @@ -22,16 +22,17 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert; -import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.owner.OwnerAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.bound.ColumnBoundAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.identifier.IdentifierValueAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.owner.OwnerAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn; import java.util.Collection; import java.util.List; import static org.hamcrest.CoreMatchers.is; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -49,6 +50,7 @@ public final class ColumnAssert { */ public static void assertIs(final SQLCaseAssertContext assertContext, final ColumnSegment actual, final ExpectedColumn expected) { IdentifierValueAssert.assertIs(assertContext, actual.getIdentifier(), expected, "Column"); + ColumnBoundAssert.assertIs(assertContext, actual.getColumnBoundInfo(), expected.getColumnBound()); if (null == expected.getOwner()) { assertFalse(actual.getOwner().isPresent(), assertContext.getText("Actual owner should not exist.")); } else { diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/DerivedInsertColumnsAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/DerivedInsertColumnsAssert.java new file mode 100644 index 0000000000000..f3dd4be47ef3b --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/insert/DerivedInsertColumnsAssert.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedDerivedInsertColumns; + +import java.util.Collection; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +/** + * Derived insert column assert. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class DerivedInsertColumnsAssert { + + /** + * Assert actual derived insert columns is correct with expected derived insert columns. + * + * @param assertContext assert context + * @param actual actual derived insert columns + * @param expected expected derived insert columns + */ + public static void assertIs(final SQLCaseAssertContext assertContext, final Collection actual, final ExpectedDerivedInsertColumns expected) { + assertThat(assertContext.getText("Derived insert column size assertion error: "), actual.size(), is(expected.getColumns().size())); + int count = 0; + for (ColumnSegment each : actual) { + ColumnAssert.assertIs(assertContext, each, expected.getColumns().get(count)); + count++; + } + } +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java index 1a8f8e02d41f1..e58a5303d0d73 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/InsertStatementAssert.java @@ -34,6 +34,7 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.hint.WithTableHintClauseAssert; +import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.DerivedInsertColumnsAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertColumnsClauseAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertExecClauseAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertValuesClauseAssert; @@ -71,6 +72,7 @@ public final class InsertStatementAssert { public static void assertIs(final SQLCaseAssertContext assertContext, final InsertStatement actual, final InsertStatementTestCase expected) { assertTable(assertContext, actual, expected); assertInsertColumnsClause(assertContext, actual, expected); + assertDerivedInsertColumns(assertContext, actual, expected); assertInsertValuesClause(assertContext, actual, expected); assertSetClause(assertContext, actual, expected); assertInsertSelectClause(assertContext, actual, expected); @@ -104,6 +106,15 @@ private static void assertInsertColumnsClause(final SQLCaseAssertContext assertC } } + private static void assertDerivedInsertColumns(final SQLCaseAssertContext assertContext, final InsertStatement actual, final InsertStatementTestCase expected) { + if (null == expected.getDerivedInsertColumns()) { + assertTrue(actual.getDerivedInsertColumns().isEmpty(), assertContext.getText("Actual derived insert columns should not exist.")); + } else { + assertFalse(actual.getDerivedInsertColumns().isEmpty(), assertContext.getText("Actual derived insert columns should exist.")); + DerivedInsertColumnsAssert.assertIs(assertContext, actual.getDerivedInsertColumns(), expected.getDerivedInsertColumns()); + } + } + private static void assertInsertValuesClause(final SQLCaseAssertContext assertContext, final InsertStatement actual, final InsertStatementTestCase expected) { if (null == expected.getInsertValuesClause()) { assertTrue(actual.getValues().isEmpty(), assertContext.getText("Actual insert values segment should not exist.")); diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedDerivedInsertColumns.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedDerivedInsertColumns.java new file mode 100644 index 0000000000000..68e60019c33df --- /dev/null +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/insert/ExpectedDerivedInsertColumns.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert; + +import lombok.Getter; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.column.ExpectedColumn; + +import javax.xml.bind.annotation.XmlElement; +import java.util.LinkedList; +import java.util.List; + +/** + * Expected derived insert columns. + */ +@Getter +public final class ExpectedDerivedInsertColumns extends AbstractExpectedSQLSegment { + + @XmlElement(name = "column") + private final List columns = new LinkedList<>(); +} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java index 6ea8b5df0c2b9..4abfeaec8e1af 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/InsertStatementTestCase.java @@ -23,12 +23,13 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.exec.ExpectedExecClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.function.ExpectedFunction; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.hint.ExpectedWithTableHintClause; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedDerivedInsertColumns; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertColumnsClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertValuesClause; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoClause; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertIntoClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertType; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedOnDuplicateKeyColumns; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableInsertIntoClause; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedMultiTableConditionalIntoClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedReturningClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.output.ExpectedOutputClause; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.set.ExpectedSetClause; @@ -51,6 +52,9 @@ public final class InsertStatementTestCase extends SQLParserTestCase { @XmlElement(name = "columns") private ExpectedInsertColumnsClause insertColumnsClause; + @XmlElement(name = "derived-columns") + private ExpectedDerivedInsertColumns derivedInsertColumns; + @XmlElement(name = "values") private ExpectedInsertValuesClause insertValuesClause; From f4afcc30b3375faed386a01b37facbfaa46c96f8 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Wed, 25 Dec 2024 18:47:23 +0800 Subject: [PATCH 143/192] Add more sql bind test case for delete and update statement (#34150) --- .../src/test/resources/cases/dml/delete.xml | 61 +++++++++++++++ .../src/test/resources/cases/dml/update.xml | 78 +++++++++++++++++++ .../src/test/resources/sqls/dml/delete.xml | 21 +++++ .../src/test/resources/sqls/dml/update.xml | 21 +++++ 4 files changed, 181 insertions(+) create mode 100644 test/it/binder/src/test/resources/cases/dml/delete.xml create mode 100644 test/it/binder/src/test/resources/cases/dml/update.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/delete.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/update.xml diff --git a/test/it/binder/src/test/resources/cases/dml/delete.xml b/test/it/binder/src/test/resources/cases/dml/delete.xml new file mode 100644 index 0000000000000..0c3cfe4f348d0 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/delete.xml @@ -0,0 +1,61 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + = + + + + + + + + + + + + + + + + + + + +
+
diff --git a/test/it/binder/src/test/resources/cases/dml/update.xml b/test/it/binder/src/test/resources/cases/dml/update.xml new file mode 100644 index 0000000000000..d6b9141cae6cb --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/update.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + = + + + + + + + + + + + + + + + + + + + +
+
diff --git a/test/it/binder/src/test/resources/sqls/dml/delete.xml b/test/it/binder/src/test/resources/sqls/dml/delete.xml new file mode 100644 index 0000000000000..f43f586810237 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/delete.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/update.xml b/test/it/binder/src/test/resources/sqls/dml/update.xml new file mode 100644 index 0000000000000..3bbd5d917119d --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/update.xml @@ -0,0 +1,21 @@ + + + + + + From bca6f32e01792b631861dc6d17419f3c7bf0d9a9 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 26 Dec 2024 09:23:16 +0800 Subject: [PATCH 144/192] Support sql bind for select with current select projection reference (#34151) * Support sql bind for select with current select projection reference * update release note * fix unit test * fix unit test * fix unit test * fix unit test --- RELEASE-NOTES.md | 1 + .../expression/type/ColumnSegmentBinder.java | 6 +-- .../projection/ProjectionsSegmentBinder.java | 34 +++++++++++++++-- .../type/ColumnProjectionSegmentBinder.java | 9 +++-- .../driver/jdbc/JDBCExecutorCallback.java | 12 ++++-- .../driver/DriverExecutionPrepareEngine.java | 3 +- .../MySQLMultiStatementsHandlerTest.java | 9 +++-- .../OpenGaussComBatchBindExecutorTest.java | 1 + ...dBatchedStatementsCommandExecutorTest.java | 1 + ...stgreSQLBatchedStatementsExecutorTest.java | 1 + .../src/test/resources/cases/dml/select.xml | 37 +++++++++++++++++++ .../src/test/resources/sqls/dml/select.xml | 1 + 12 files changed, 97 insertions(+), 18 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 37fad67b25538..5e23492b00dc3 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -39,6 +39,7 @@ 1. SQL Parser: Support MySQL update with statement parse - [#34126](https://github.com/apache/shardingsphere/pull/34126) 1. SQL Binder: Remove TablesContext#findTableNames method and implement select order by, group by bind logic - [#34123](https://github.com/apache/shardingsphere/pull/34123) 1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) +1. SQL Binder: Support sql bind for select with current select projection reference - [#34151](https://github.com/apache/shardingsphere/pull/34151) ### Bug Fixes diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java index 6020cc3f1bbdf..d4f9cdeecbcb3 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.cedarsoftware.util.CaseInsensitiveSet; import com.google.common.base.Strings; import com.google.common.collect.Multimap; import lombok.AccessLevel; @@ -43,7 +44,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.LinkedHashSet; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -56,7 +56,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ColumnSegmentBinder { - private static final Collection EXCLUDE_BIND_COLUMNS = new LinkedHashSet<>(Arrays.asList( + private static final Collection EXCLUDE_BIND_COLUMNS = new CaseInsensitiveSet<>(Arrays.asList( "ROWNUM", "ROW_NUMBER", "ROWNUM_", "ROWID", "SYSDATE", "SYSTIMESTAMP", "CURRENT_TIMESTAMP", "LOCALTIMESTAMP", "UID", "USER", "NEXTVAL", "LEVEL")); private static final Map SEGMENT_TYPE_MESSAGES = Maps.of(SegmentType.PROJECTION, "field list", SegmentType.JOIN_ON, "on clause", SegmentType.JOIN_USING, "from clause", @@ -77,7 +77,7 @@ public final class ColumnSegmentBinder { public static ColumnSegment bind(final ColumnSegment segment, final SegmentType parentSegmentType, final SQLStatementBinderContext binderContext, final Multimap tableBinderContexts, final Multimap outerTableBinderContexts) { - if (EXCLUDE_BIND_COLUMNS.contains(segment.getIdentifier().getValue().toUpperCase())) { + if (EXCLUDE_BIND_COLUMNS.contains(segment.getIdentifier().getValue())) { return segment; } ColumnSegment result = copy(segment); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java index 83557beb1f937..9b3c92a48577b 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java @@ -25,10 +25,13 @@ import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.ColumnProjectionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.ShorthandProjectionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.SubqueryProjectionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; +import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationDistinctProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment; @@ -39,8 +42,9 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; +import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; -import java.util.stream.Collectors; +import java.util.Collection; /** * Projections segment binder. @@ -63,16 +67,30 @@ public static ProjectionsSegment bind(final ProjectionsSegment segment, final SQ final Multimap outerTableBinderContexts) { ProjectionsSegment result = new ProjectionsSegment(segment.getStartIndex(), segment.getStopIndex()); result.setDistinctRow(segment.isDistinctRow()); - result.getProjections().addAll(segment.getProjections().stream() - .map(each -> bind(each, binderContext, boundTableSegment, tableBinderContexts, outerTableBinderContexts)).collect(Collectors.toList())); + for (ProjectionSegment each : segment.getProjections()) { + Multimap currentTableBinderContexts = createCurrentTableBinderContexts(binderContext, result.getProjections()); + result.getProjections().add(bind(binderContext, boundTableSegment, currentTableBinderContexts, tableBinderContexts, outerTableBinderContexts, each)); + } return result; } + private static ProjectionSegment bind(final SQLStatementBinderContext binderContext, final TableSegment boundTableSegment, + final Multimap currentTableBinderContexts, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts, + final ProjectionSegment projectionSegment) { + try { + return bind(projectionSegment, binderContext, boundTableSegment, tableBinderContexts, outerTableBinderContexts); + } catch (final ColumnNotFoundException ignored) { + return bind(projectionSegment, binderContext, boundTableSegment, currentTableBinderContexts, outerTableBinderContexts); + } + } + private static ProjectionSegment bind(final ProjectionSegment projectionSegment, final SQLStatementBinderContext binderContext, final TableSegment boundTableSegment, final Multimap tableBinderContexts, final Multimap outerTableBinderContexts) { if (projectionSegment instanceof ColumnProjectionSegment) { - return ColumnProjectionSegmentBinder.bind((ColumnProjectionSegment) projectionSegment, binderContext, tableBinderContexts); + return ColumnProjectionSegmentBinder.bind((ColumnProjectionSegment) projectionSegment, binderContext, tableBinderContexts, outerTableBinderContexts); } if (projectionSegment instanceof ShorthandProjectionSegment) { return ShorthandProjectionSegmentBinder.bind((ShorthandProjectionSegment) projectionSegment, boundTableSegment, tableBinderContexts); @@ -125,4 +143,12 @@ private static AggregationProjectionSegment bindAggregationProjection(final Aggr aggregationSegment.getAliasSegment().ifPresent(result::setAlias); return result; } + + private static Multimap createCurrentTableBinderContexts(final SQLStatementBinderContext binderContext, + final Collection projections) { + Multimap result = LinkedHashMultimap.create(); + Collection subqueryProjections = SubqueryTableBindUtils.createSubqueryProjections(projections, new IdentifierValue(""), binderContext.getSqlStatement().getDatabaseType()); + result.put(new CaseInsensitiveString(""), new SimpleTableSegmentBinderContext(subqueryProjections)); + return result; + } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java index 371105638533c..3dd3cff32cca2 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.infra.binder.engine.segment.projection.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; -import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -41,11 +40,13 @@ public final class ColumnProjectionSegmentBinder { * @param segment table segment * @param binderContext SQL statement binder context * @param tableBinderContexts table binder contexts + * @param outerTableBinderContexts outer table binder contexts * @return bound column projection segment */ - public static ColumnProjectionSegment bind(final ColumnProjectionSegment segment, - final SQLStatementBinderContext binderContext, final Multimap tableBinderContexts) { - ColumnSegment boundColumn = ColumnSegmentBinder.bind(segment.getColumn(), SegmentType.PROJECTION, binderContext, tableBinderContexts, LinkedHashMultimap.create()); + public static ColumnProjectionSegment bind(final ColumnProjectionSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts, + final Multimap outerTableBinderContexts) { + ColumnSegment boundColumn = ColumnSegmentBinder.bind(segment.getColumn(), SegmentType.PROJECTION, binderContext, tableBinderContexts, outerTableBinderContexts); ColumnProjectionSegment result = new ColumnProjectionSegment(boundColumn); segment.getAliasSegment().ifPresent(result::setAlias); result.setVisible(segment.isVisible()); diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java index f2451cd99be68..df54c8aa51575 100644 --- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java +++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/engine/driver/jdbc/JDBCExecutorCallback.java @@ -29,6 +29,7 @@ import org.apache.shardingsphere.infra.executor.sql.hook.SQLExecutionHook; import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import java.sql.SQLException; @@ -76,12 +77,17 @@ public final Collection execute(final Collection execution */ private T execute(final JDBCExecutionUnit jdbcExecutionUnit, final boolean isTrunkThread, final String processId) throws SQLException { SQLExecutorExceptionHandler.setExceptionThrown(isExceptionThrown); - DatabaseType storageType = resourceMetaData.getStorageUnits().get(jdbcExecutionUnit.getExecutionUnit().getDataSourceName()).getStorageType(); - ConnectionProperties connectionProps = resourceMetaData.getStorageUnits().get(jdbcExecutionUnit.getExecutionUnit().getDataSourceName()).getConnectionProperties(); + String dataSourceName = jdbcExecutionUnit.getExecutionUnit().getDataSourceName(); + // TODO use metadata to replace storageUnits to support multiple logic databases + StorageUnit storageUnit = resourceMetaData.getStorageUnits().containsKey(dataSourceName) + ? resourceMetaData.getStorageUnits().get(dataSourceName) + : resourceMetaData.getStorageUnits().values().iterator().next(); + DatabaseType storageType = storageUnit.getStorageType(); + ConnectionProperties connectionProps = storageUnit.getConnectionProperties(); SQLExecutionHook sqlExecutionHook = new SPISQLExecutionHook(); try { SQLUnit sqlUnit = jdbcExecutionUnit.getExecutionUnit().getSqlUnit(); - sqlExecutionHook.start(jdbcExecutionUnit.getExecutionUnit().getDataSourceName(), sqlUnit.getSql(), sqlUnit.getParameters(), connectionProps, isTrunkThread); + sqlExecutionHook.start(dataSourceName, sqlUnit.getSql(), sqlUnit.getParameters(), connectionProps, isTrunkThread); T result = executeSQL(sqlUnit.getSql(), jdbcExecutionUnit.getStorageResource(), jdbcExecutionUnit.getConnectionMode(), storageType); sqlExecutionHook.finishSuccess(); processEngine.completeSQLUnitExecution(jdbcExecutionUnit, processId); diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java index 17dd4851ea175..463404ec0e312 100644 --- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java +++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/prepare/driver/DriverExecutionPrepareEngine.java @@ -102,7 +102,8 @@ protected List> group(final String databaseName, final String @SuppressWarnings("unchecked") private ExecutionGroup createExecutionGroup(final String dataSourceName, final List executionUnits, final C connection, final ConnectionMode connectionMode) throws SQLException { List inputs = new LinkedList<>(); - DatabaseType databaseType = storageUnits.get(dataSourceName).getStorageType(); + // TODO use metadata to replace storageUnits to support multiple logic databases + DatabaseType databaseType = storageUnits.containsKey(dataSourceName) ? storageUnits.get(dataSourceName).getStorageType() : storageUnits.values().iterator().next().getStorageType(); for (ExecutionUnit each : executionUnits) { inputs.add((T) sqlExecutionUnitBuilder.build(each, statementManager, connection, connectionMode, option, databaseType)); } diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java index 7d3e282e0796e..3fb046a90bdef 100644 --- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java +++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandlerTest.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode; import org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption; +import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; @@ -155,6 +156,7 @@ void assertExecuteWithMultiInsertOnDuplicateKey() throws SQLException { private ConnectionSession mockConnectionSession() throws SQLException { ConnectionSession result = mock(ConnectionSession.class, RETURNS_DEEP_STUBS); when(result.getCurrentDatabaseName()).thenReturn("foo_db"); + when(result.getUsedDatabaseName()).thenReturn("foo_db"); Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS); when(connection.getMetaData().getURL()).thenReturn("jdbc:mysql://127.0.0.1/db"); Statement statement = mock(Statement.class); @@ -171,11 +173,12 @@ private ConnectionSession mockConnectionSession() throws SQLException { private ContextManager mockContextManager() { ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("foo_ds")); + ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, RETURNS_DEEP_STUBS); + when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData()).thenReturn(resourceMetaData); + when(resourceMetaData.getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("foo_ds")); StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS); when(storageUnit.getStorageType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); - when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnits()) - .thenReturn(Collections.singletonMap("foo_ds", storageUnit)); + when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds", storageUnit)); when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "MySQL")); when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db").getRuleMetaData()) .thenReturn(new RuleMetaData(Collections.emptyList())); diff --git a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java index bfe13d152b8d6..88f942dd632c0 100644 --- a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java +++ b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java @@ -106,6 +106,7 @@ private ConnectionSession mockConnectionSession() throws SQLException { ConnectionSession result = mock(ConnectionSession.class); when(result.getConnectionContext()).thenReturn(new ConnectionContext(Collections::emptySet)); when(result.getCurrentDatabaseName()).thenReturn("foo_db"); + when(result.getUsedDatabaseName()).thenReturn("foo_db"); ConnectionContext connectionContext = mockConnectionContext(); when(result.getConnectionContext()).thenReturn(connectionContext); ProxyDatabaseConnectionManager databaseConnectionManager = mock(ProxyDatabaseConnectionManager.class); diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java index cb813d381c6d9..d2f3445f4bd9c 100644 --- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java +++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java @@ -114,6 +114,7 @@ private ConnectionSession mockConnectionSession() throws SQLException { SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class); when(sqlStatementContext.getSqlStatement()).thenReturn(parserEngine.parse(SQL, false)); when(result.getCurrentDatabaseName()).thenReturn("foo_db"); + when(result.getUsedDatabaseName()).thenReturn("foo_db"); ConnectionContext connectionContext = new ConnectionContext(Collections::emptySet); connectionContext.setCurrentDatabaseName("foo_db"); when(result.getConnectionContext()).thenReturn(connectionContext); diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java index 81943995dae02..5d7f1aa257b9d 100644 --- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java +++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java @@ -154,6 +154,7 @@ private ContextManager mockContextManager() { private ConnectionSession mockConnectionSession() { ConnectionSession result = mock(ConnectionSession.class); when(result.getCurrentDatabaseName()).thenReturn("db"); + when(result.getUsedDatabaseName()).thenReturn("db"); when(result.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager); when(result.getStatementManager()).thenReturn(backendStatement); ConnectionContext connectionContext = new ConnectionContext(Collections::emptySet); diff --git a/test/it/binder/src/test/resources/cases/dml/select.xml b/test/it/binder/src/test/resources/cases/dml/select.xml index 8caabdcb4d972..da40c0135de82 100644 --- a/test/it/binder/src/test/resources/cases/dml/select.xml +++ b/test/it/binder/src/test/resources/cases/dml/select.xml @@ -293,4 +293,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/select.xml b/test/it/binder/src/test/resources/sqls/dml/select.xml index cca532f1c5f25..ced2c64e8b23a 100644 --- a/test/it/binder/src/test/resources/sqls/dml/select.xml +++ b/test/it/binder/src/test/resources/sqls/dml/select.xml @@ -20,4 +20,5 @@ + From 8aaa7c7d029e42dace3b3576da1a688af01bbfb8 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 26 Dec 2024 11:49:45 +0800 Subject: [PATCH 145/192] Support alter table, drop table sql bind and add test case (#34154) * Support sql bind for select with current select projection reference * update release note * fix unit test * fix unit test * fix unit test * fix unit test * Support alter table, drop table sql bind and add test case * update release note * fix rewrite it --- RELEASE-NOTES.md | 1 + ...ShardingDropTableSupportedCheckerTest.java | 2 +- ...rdingDropTableRouteContextCheckerTest.java | 8 +- .../from/type/SimpleTableSegmentBinder.java | 14 ++ .../ddl/AlterTableStatementBinder.java | 66 +++++++++ .../ddl/DropTableStatementBinder.java | 53 +++++++ .../engine/type/DDLStatementBindEngine.java | 10 ++ .../type/DorisDDLStatementVisitor.java | 3 +- .../type/MySQLDDLStatementVisitor.java | 3 +- .../type/OpenGaussDDLStatementVisitor.java | 4 +- .../type/PostgreSQLDDLStatementVisitor.java | 4 +- .../type/PrestoDDLStatementVisitor.java | 3 +- .../type/SQLServerDDLStatementVisitor.java | 3 +- .../statement/ddl/AlterTableStatement.java | 8 + .../statement/ddl/DropTableStatement.java | 16 ++ .../doris/ddl/DorisDropTableStatement.java | 4 +- .../mysql/ddl/MySQLDropTableStatement.java | 4 +- .../ddl/OpenGaussDropTableStatement.java | 6 +- .../ddl/PostgreSQLDropTableStatement.java | 6 +- .../presto/ddl/PrestoDropTableStatement.java | 4 +- .../ddl/SQLServerDropTableStatement.java | 4 +- .../MySQLComStmtPrepareCheckerTest.java | 3 +- .../binder/dialect/doris/DorisBinderIT.java | 25 ++++ .../test/resources/cases/ddl/alter-table.xml | 50 +++++++ .../test/resources/cases/ddl/create-table.xml | 139 ++++++++++++++++++ .../test/resources/cases/ddl/drop-table.xml | 49 ++++++ .../test/resources/sqls/ddl/alter-table.xml | 22 +++ .../test/resources/sqls/ddl/create-table.xml | 2 + .../test/resources/sqls/ddl/drop-table.xml | 22 +++ .../scenario/ShardingSQLRewriterIT.java | 7 + .../sharding/case/ddl/alter-table.xml | 4 +- 31 files changed, 526 insertions(+), 23 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java create mode 100644 test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/alter-table.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/drop-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/alter-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/drop-table.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 5e23492b00dc3..0db9cb1685ab7 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -40,6 +40,7 @@ 1. SQL Binder: Remove TablesContext#findTableNames method and implement select order by, group by bind logic - [#34123](https://github.com/apache/shardingsphere/pull/34123) 1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) 1. SQL Binder: Support sql bind for select with current select projection reference - [#34151](https://github.com/apache/shardingsphere/pull/34151) +1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) ### Bug Fixes diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java index 5223b63b3747d..35726fd7e225c 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java @@ -62,7 +62,7 @@ void init() { @Test void assertCheckForMySQL() { - MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(false); + MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); DropTableStatementContext sqlStatementContext = new DropTableStatementContext(sqlStatement); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java index 4a26cb3d8aff9..4c57935c353cf 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java @@ -80,7 +80,7 @@ void init() { @Test void assertCheckWhenDropTableInUsedForMySQL() { - MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(false); + MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("db_schema"); @@ -119,7 +119,7 @@ void clean() { @Test void assertCheckWithSameRouteResultShardingTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -134,7 +134,7 @@ void assertCheckWithSameRouteResultShardingTableForPostgreSQL() { @Test void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -148,7 +148,7 @@ void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() { @Test void assertCheckWithSameRouteResultBroadcastTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_config")))); when(shardingRule.getShardingTable("t_config")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_config")); Collection routeUnits = new LinkedList<>(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java index d471cb8cf0105..a7b9198874780 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java @@ -49,7 +49,9 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; @@ -130,6 +132,14 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte || ((CreateTableStatement) binderContext.getSqlStatement()).isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; } + if (binderContext.getSqlStatement() instanceof AlterTableStatement && isRenameTable((AlterTableStatement) binderContext.getSqlStatement(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } + if (binderContext.getSqlStatement() instanceof DropTableStatement) { + ShardingSpherePreconditions.checkState(((DropTableStatement) binderContext.getSqlStatement()).isIfExists() || schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); + return; + } if ("DUAL".equalsIgnoreCase(tableName)) { return; } @@ -142,6 +152,10 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); } + private static boolean isRenameTable(final AlterTableStatement alterTableStatement, final String tableName) { + return alterTableStatement.getRenameTable().isPresent() && alterTableStatement.getRenameTable().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); + } + private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, final IdentifierValue schemaName, final SQLStatementBinderContext binderContext) { IdentifierValue tableName = segment.getTableName().getIdentifier(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java new file mode 100644 index 0000000000000..4a3f1e31b1292 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; + +/** + * Alter table statement binder. + */ +public final class AlterTableStatementBinder implements SQLStatementBinder { + + @Override + public AlterTableStatement bind(final AlterTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + AlterTableStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTable(SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts)); + sqlStatement.getRenameTable().ifPresent(optional -> result.setRenameTable(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static AlterTableStatement copy(final AlterTableStatement sqlStatement) { + AlterTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + // TODO bind column and reference table if kernel need use them + sqlStatement.getConvertTableDefinition().ifPresent(result::setConvertTableDefinition); + result.getAddColumnDefinitions().addAll(sqlStatement.getAddColumnDefinitions()); + result.getModifyColumnDefinitions().addAll(sqlStatement.getModifyColumnDefinitions()); + result.getChangeColumnDefinitions().addAll(sqlStatement.getChangeColumnDefinitions()); + result.getDropColumnDefinitions().addAll(sqlStatement.getDropColumnDefinitions()); + result.getAddConstraintDefinitions().addAll(sqlStatement.getAddConstraintDefinitions()); + result.getValidateConstraintDefinitions().addAll(sqlStatement.getValidateConstraintDefinitions()); + result.getModifyConstraintDefinitions().addAll(sqlStatement.getModifyConstraintDefinitions()); + result.getDropConstraintDefinitions().addAll(sqlStatement.getDropConstraintDefinitions()); + result.getDropIndexDefinitions().addAll(sqlStatement.getDropIndexDefinitions()); + result.getRenameColumnDefinitions().addAll(sqlStatement.getRenameColumnDefinitions()); + result.getRenameIndexDefinitions().addAll(sqlStatement.getRenameIndexDefinitions()); + sqlStatement.getModifyCollectionRetrieval().ifPresent(result::setModifyCollectionRetrieval); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java new file mode 100644 index 0000000000000..c54d2ce00bdeb --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; + +/** + * Drop table statement binder. + */ +public final class DropTableStatementBinder implements SQLStatementBinder { + + @Override + public DropTableStatement bind(final DropTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + DropTableStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getTables().forEach(each -> result.getTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropTableStatement copy(final DropTableStatement sqlStatement) { + DropTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setIfExists(sqlStatement.isIfExists()); + result.setContainsCascade(sqlStatement.isContainsCascade()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 6665fc27ec50e..2792f3fc62c44 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -19,15 +19,19 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; /** * DDL statement bind engine. @@ -55,6 +59,12 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof CreateTableStatement) { return new CreateTableStatementBinder().bind((CreateTableStatement) statement, binderContext); } + if (statement instanceof AlterTableStatement) { + return new AlterTableStatementBinder().bind((AlterTableStatement) statement, binderContext); + } + if (statement instanceof DropTableStatement) { + return new DropTableStatementBinder().bind((DropTableStatement) statement, binderContext); + } if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java index 70609a7173230..9c18804dcf91d 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java @@ -664,7 +664,8 @@ public ASTNode visitPlace(final PlaceContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - DorisDropTableStatement result = new DorisDropTableStatement(null != ctx.ifExists()); + DorisDropTableStatement result = new DorisDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue) visit(ctx.tableList())).getValue()); return result; } diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java index 97188a7353d38..9f6e311a4b56b 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java @@ -671,7 +671,8 @@ public ASTNode visitPlace(final PlaceContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - MySQLDropTableStatement result = new MySQLDropTableStatement(null != ctx.ifExists()); + MySQLDropTableStatement result = new MySQLDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue) visit(ctx.tableList())).getValue()); return result; } diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java index f0940ad4a0d17..7fad41cc99f7a 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java @@ -512,7 +512,9 @@ public ASTNode visitRenameColumnSpecification(final RenameColumnSpecificationCon @Override public ASTNode visitDropTable(final DropTableContext ctx) { boolean containsCascade = null != ctx.dropTableOpt() && null != ctx.dropTableOpt().CASCADE(); - OpenGaussDropTableStatement result = new OpenGaussDropTableStatement(null != ctx.ifExists(), containsCascade); + OpenGaussDropTableStatement result = new OpenGaussDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); + result.setContainsCascade(containsCascade); result.getTables().addAll(((CollectionValue) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java index 6a23b13361f77..5bf935cb3ff88 100644 --- a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java +++ b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java @@ -627,7 +627,9 @@ public ASTNode visitRenameColumnSpecification(final RenameColumnSpecificationCon @Override public ASTNode visitDropTable(final DropTableContext ctx) { boolean containsCascade = null != ctx.dropTableOpt() && null != ctx.dropTableOpt().CASCADE(); - PostgreSQLDropTableStatement result = new PostgreSQLDropTableStatement(null != ctx.ifExists(), containsCascade); + PostgreSQLDropTableStatement result = new PostgreSQLDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); + result.setContainsCascade(containsCascade); result.getTables().addAll(((CollectionValue) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java index 2fe88595fb6f2..d2b73e1c0be67 100644 --- a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java +++ b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java @@ -119,7 +119,8 @@ private String getText(final ParserRuleContext ctx) { @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - PrestoDropTableStatement result = new PrestoDropTableStatement(null != ctx.ifExists()); + PrestoDropTableStatement result = new PrestoDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue) visit(ctx.tableList())).getValue()); return result; } diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java index 0180b750bf390..59841bf11bc59 100644 --- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java +++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java @@ -309,7 +309,8 @@ public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - SQLServerDropTableStatement result = new SQLServerDropTableStatement(null != ctx.ifExists()); + SQLServerDropTableStatement result = new SQLServerDropTableStatement(); + result.setContainsCascade(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java index f7fec12bc6a76..400345f579200 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java @@ -92,6 +92,14 @@ public Optional getConvertTableDefinition() { return Optional.ofNullable(convertTableDefinition); } + /** + * Set modify collection retrieval. + * + * @param modifyCollectionRetrieval modify collection retrieval + */ + public void setModifyCollectionRetrieval(final ModifyCollectionRetrievalSegment modifyCollectionRetrieval) { + } + /** * Get modify collection retrieval. * diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java index c82b5b323a92c..933f46bb5504d 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java @@ -32,6 +32,14 @@ public abstract class DropTableStatement extends AbstractSQLStatement implements private final Collection tables = new LinkedList<>(); + /** + * Set if exists. + * + * @param ifExists if exists or not + */ + public void setIfExists(final boolean ifExists) { + } + /** * Judge whether contains if exists. * @@ -41,6 +49,14 @@ public boolean isIfExists() { return false; } + /** + * Set contains cascade. + * + * @param containsCascade contains cascade or not + */ + public void setContainsCascade(final boolean containsCascade) { + } + /** * Judge whether contains cascade. * diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java index 8a12cd4ff5a87..7c9ba41ddcfff 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class DorisDropTableStatement extends DropTableStatement implements DorisStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java index 40ece242d7e5f..289e86eeaf7c4 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class MySQLDropTableStatement extends DropTableStatement implements MySQLStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java index c10040398d8a3..d9d36b5ce497f 100644 --- a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java +++ b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.opengauss.OpenGaussStatement; @@ -27,9 +28,10 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class OpenGaussDropTableStatement extends DropTableStatement implements OpenGaussStatement { - private final boolean ifExists; + private boolean ifExists; - private final boolean containsCascade; + private boolean containsCascade; } diff --git a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java index 917e24e814660..983761915bdab 100644 --- a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java +++ b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.postgresql.PostgreSQLStatement; @@ -27,9 +28,10 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class PostgreSQLDropTableStatement extends DropTableStatement implements PostgreSQLStatement { - private final boolean ifExists; + private boolean ifExists; - private final boolean containsCascade; + private boolean containsCascade; } diff --git a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java index 0df13bf5aa4f1..9170d0693193f 100644 --- a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java +++ b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.presto.PrestoStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class PrestoDropTableStatement extends DropTableStatement implements PrestoStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java index 436fe796b1f85..9036747d79209 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java @@ -19,6 +19,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.sqlserver.SQLServerStatement; @@ -27,7 +28,8 @@ */ @RequiredArgsConstructor @Getter +@Setter public final class SQLServerDropTableStatement extends DropTableStatement implements SQLServerStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java index 223001a592daf..29223c817c90a 100644 --- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java +++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java @@ -85,12 +85,11 @@ class MySQLComStmtPrepareCheckerTest { @Test void assertIsStatementAllowed() { MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); - createTableStatement.setIfNotExists(false); Collection sqlStatements = Arrays.asList( new MySQLAlterTableStatement(), new MySQLAlterUserStatement(), new MySQLAnalyzeTableStatement(), new MySQLCacheIndexStatement(), new MySQLCallStatement(), new MySQLChangeMasterStatement(), new MySQLChecksumTableStatement(), new MySQLCommitStatement(), new MySQLCreateIndexStatement(), new MySQLDropIndexStatement(), new MySQLCreateDatabaseStatement(), new MySQLDropDatabaseStatement(), createTableStatement, - new MySQLDropTableStatement(false), new MySQLCreateUserStatement(), new MySQLRenameUserStatement(), new MySQLDropUserStatement(), + new MySQLDropTableStatement(), new MySQLCreateUserStatement(), new MySQLRenameUserStatement(), new MySQLDropUserStatement(), new MySQLCreateViewStatement(), new MySQLDropViewStatement(), new MySQLDeleteStatement(), new MySQLDoStatement(), new MySQLFlushStatement(), new MySQLGrantStatement(), new MySQLInsertStatement(), new MySQLInstallPluginStatement(), new MySQLKillStatement(), new MySQLLoadIndexInfoStatement(), new MySQLOptimizeTableStatement(), new MySQLRenameTableStatement(), new MySQLRepairTableStatement(), diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java new file mode 100644 index 0000000000000..18adc1a3b6af9 --- /dev/null +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.binder.dialect.doris; + +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings; + +@SQLBinderITSettings("Doris") +class DorisBinderIT extends SQLBinderIT { +} diff --git a/test/it/binder/src/test/resources/cases/ddl/alter-table.xml b/test/it/binder/src/test/resources/cases/ddl/alter-table.xml new file mode 100644 index 0000000000000..01ad10052f12f --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/alter-table.xml @@ -0,0 +1,50 @@ + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + +
+ + + + + + +
+
diff --git a/test/it/binder/src/test/resources/cases/ddl/create-table.xml b/test/it/binder/src/test/resources/cases/ddl/create-table.xml index 59815b36015b0..7d9a3c1e94feb 100644 --- a/test/it/binder/src/test/resources/cases/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/cases/ddl/create-table.xml @@ -85,4 +85,143 @@ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-table.xml b/test/it/binder/src/test/resources/cases/ddl/drop-table.xml new file mode 100644 index 0000000000000..b4c6b8a295860 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-table.xml @@ -0,0 +1,49 @@ + + + + + + + + + + +
+ + + + + +
+
+ + + + + + + +
+ + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/alter-table.xml b/test/it/binder/src/test/resources/sqls/ddl/alter-table.xml new file mode 100644 index 0000000000000..85facde2b0327 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/alter-table.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml index 35e75c68f6121..901b5bd167fba 100644 --- a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml @@ -18,4 +18,6 @@ + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/drop-table.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-table.xml new file mode 100644 index 0000000000000..7ee357740b8ee --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-table.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java index 0c939beff9665..29164a346a4a5 100644 --- a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java +++ b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java @@ -103,6 +103,13 @@ protected Collection mockSchemas(final String schemaName) tables.add(new ShardingSphereTable("t_account_view", Arrays.asList( new ShardingSphereColumn("id", Types.INTEGER, false, false, false, true, false, false), new ShardingSphereColumn("account_id", Types.INTEGER, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); + tables.add(new ShardingSphereTable("t_order", Arrays.asList( + new ShardingSphereColumn("order_id", Types.BIGINT, true, false, false, true, false, false), + new ShardingSphereColumn("user_id", Types.INTEGER, false, false, false, true, false, false), + new ShardingSphereColumn("status", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("merchant_id", Types.INTEGER, false, false, false, true, false, true), + new ShardingSphereColumn("remark", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("creation_date", Types.DATE, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); return Collections.singleton(new ShardingSphereSchema(schemaName, tables, Collections.emptyList())); } diff --git a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml index 3e78878bc497f..e33dcd23c75cd 100644 --- a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml +++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml @@ -70,8 +70,8 @@ - - + + From 7dd052b1f1c6abf19dcf7b9c5a0cfe1390d48ad6 Mon Sep 17 00:00:00 2001 From: duanzhengqiang Date: Thu, 26 Dec 2024 13:52:46 +0800 Subject: [PATCH 146/192] Support rename table statement sql bind and split segment bind to ddl and dml package --- .../column/ColumnDefinitionSegmentBinder.java | 8 +-- .../RenameTableDefinitionSegmentBinder.java | 50 ++++++++++++++ .../assign/AssignmentSegmentBinder.java | 8 +-- .../column/InsertColumnsSegmentBinder.java | 6 +- .../combine/CombineSegmentBinder.java | 4 +- .../expression/ExpressionSegmentBinder.java | 20 +++--- .../type/BetweenExpressionSegmentBinder.java | 6 +- .../type/BinaryOperationExpressionBinder.java | 6 +- .../expression/type/ColumnSegmentBinder.java | 8 +-- .../type/ExistsSubqueryExpressionBinder.java | 4 +- .../type/FunctionExpressionSegmentBinder.java | 6 +- .../expression/type/InExpressionBinder.java | 6 +- .../expression/type/NotExpressionBinder.java | 6 +- .../type/SubquerySegmentBinder.java | 4 +- .../{ => dml}/from/TableSegmentBinder.java | 14 ++-- .../context/TableSegmentBinderContext.java | 2 +- .../FunctionTableSegmentBinderContext.java | 4 +- .../type/SimpleTableSegmentBinderContext.java | 4 +- .../type/DeleteMultiTableSegmentBinder.java | 6 +- .../from/type/JoinTableSegmentBinder.java | 10 +-- .../from/type/SimpleTableSegmentBinder.java | 23 +++++-- .../from/type/SubqueryTableSegmentBinder.java | 8 +-- .../{ => dml}/lock/LockSegmentBinder.java | 6 +- .../{ => dml}/order/GroupBySegmentBinder.java | 6 +- .../{ => dml}/order/OrderBySegmentBinder.java | 6 +- .../item/ColumnOrderByItemSegmentBinder.java | 6 +- .../ExpressionOrderByItemSegmentBinder.java | 6 +- .../order/item/OrderByItemSegmentBinder.java | 4 +- .../predicate/HavingSegmentBinder.java | 6 +- .../predicate/WhereSegmentBinder.java | 6 +- .../projection/ProjectionsSegmentBinder.java | 16 ++--- .../type/ColumnProjectionSegmentBinder.java | 6 +- .../ShorthandProjectionSegmentBinder.java | 4 +- .../type/SubqueryProjectionSegmentBinder.java | 6 +- .../CommonTableExpressionSegmentBinder.java | 6 +- .../{ => dml}/with/WithSegmentBinder.java | 6 +- .../util/SubqueryTableBindUtils.java | 2 +- .../statement/SQLStatementBinderContext.java | 2 +- .../ddl/AlterTableStatementBinder.java | 4 +- .../ddl/CreateIndexStatementBinder.java | 6 +- .../ddl/CreateTableStatementBinder.java | 6 +- .../ddl/DropTableStatementBinder.java | 4 +- .../ddl/RenameTableStatementBinder.java | 51 ++++++++++++++ .../statement/dml/DeleteStatementBinder.java | 10 +-- .../statement/dml/InsertStatementBinder.java | 10 +-- .../statement/dml/SelectStatementBinder.java | 24 +++---- .../statement/dml/UpdateStatementBinder.java | 12 ++-- .../engine/type/DDLStatementBindEngine.java | 5 ++ .../assign/AssignmentSegmentBinderTest.java | 5 +- .../BinaryOperationExpressionBinderTest.java | 1 + .../type/ColumnSegmentBinderTest.java | 5 +- .../ExistsSubqueryExpressionBinderTest.java | 1 + .../FunctionExpressionSegmentBinderTest.java | 1 + .../type/InExpressionBinderTest.java | 1 + .../type/NotExpressionBinderTest.java | 1 + .../type/SubquerySegmentBinderTest.java | 5 +- .../from/type/JoinTableSegmentBinderTest.java | 3 +- .../type/SimpleTableSegmentBinderTest.java | 3 +- .../type/SubqueryTableSegmentBinderTest.java | 3 +- .../predicate/WhereSegmentBinderTest.java | 3 +- .../ShorthandProjectionSegmentBinderTest.java | 5 +- .../test/resources/cases/ddl/rename-table.xml | 68 +++++++++++++++++++ .../test/resources/sqls/ddl/rename-table.xml | 22 ++++++ 63 files changed, 395 insertions(+), 171 deletions(-) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => ddl}/column/ColumnDefinitionSegmentBinder.java (88%) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/RenameTableDefinitionSegmentBinder.java rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/assign/AssignmentSegmentBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/column/InsertColumnsSegmentBinder.java (89%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/combine/CombineSegmentBinder.java (94%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/ExpressionSegmentBinder.java (82%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/BetweenExpressionSegmentBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/BinaryOperationExpressionBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/ColumnSegmentBinder.java (97%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/ExistsSubqueryExpressionBinder.java (92%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/FunctionExpressionSegmentBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/InExpressionBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/NotExpressionBinder.java (89%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/expression/type/SubquerySegmentBinder.java (93%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/TableSegmentBinder.java (85%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/context/TableSegmentBinderContext.java (94%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/context/type/FunctionTableSegmentBinderContext.java (88%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/context/type/SimpleTableSegmentBinderContext.java (93%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/type/DeleteMultiTableSegmentBinder.java (89%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/type/JoinTableSegmentBinder.java (96%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/type/SimpleTableSegmentBinder.java (91%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/from/type/SubqueryTableSegmentBinder.java (91%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/lock/LockSegmentBinder.java (89%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/order/GroupBySegmentBinder.java (93%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/order/OrderBySegmentBinder.java (93%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/order/item/ColumnOrderByItemSegmentBinder.java (89%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/order/item/ExpressionOrderByItemSegmentBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/order/item/OrderByItemSegmentBinder.java (94%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/predicate/HavingSegmentBinder.java (88%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/predicate/WhereSegmentBinder.java (88%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/projection/ProjectionsSegmentBinder.java (92%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/projection/type/ColumnProjectionSegmentBinder.java (90%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/projection/type/ShorthandProjectionSegmentBinder.java (96%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/projection/type/SubqueryProjectionSegmentBinder.java (88%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/with/CommonTableExpressionSegmentBinder.java (91%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/{ => dml}/with/WithSegmentBinder.java (96%) rename infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/{ => segment}/util/SubqueryTableBindUtils.java (98%) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/RenameTableStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/rename-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/rename-table.xml diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java similarity index 88% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java index cffab8116b328..f9e720f7a90c5 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/ColumnDefinitionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/ColumnDefinitionSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.column; +package org.apache.shardingsphere.infra.binder.engine.segment.ddl.column; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; @@ -23,9 +23,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/RenameTableDefinitionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/RenameTableDefinitionSegmentBinder.java new file mode 100644 index 0000000000000..5083861f2a6f6 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/ddl/column/RenameTableDefinitionSegmentBinder.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.ddl.column; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment; + +/** + * Rename table definition segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class RenameTableDefinitionSegmentBinder { + + /** + * Bind rename table definition segment. + * + * @param segment rename table definition segment + * @param binderContext SQL statement binder context + * @param tableBinderContexts table binder contexts + * @return bound rename table definition segment + */ + public static RenameTableDefinitionSegment bind(final RenameTableDefinitionSegment segment, final SQLStatementBinderContext binderContext, + final Multimap tableBinderContexts) { + RenameTableDefinitionSegment result = new RenameTableDefinitionSegment(segment.getStartIndex(), segment.getStopIndex()); + result.setTable(SimpleTableSegmentBinder.bind(segment.getTable(), binderContext, tableBinderContexts)); + result.setRenameTable(SimpleTableSegmentBinder.bind(segment.getRenameTable(), binderContext, tableBinderContexts)); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/assign/AssignmentSegmentBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/assign/AssignmentSegmentBinder.java index 2d47f9c66bec0..0de9a459bc71b 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/assign/AssignmentSegmentBinder.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.assign; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.assign; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/InsertColumnsSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/column/InsertColumnsSegmentBinder.java similarity index 89% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/InsertColumnsSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/column/InsertColumnsSegmentBinder.java index 5f02778d073b8..158b778765424 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/column/InsertColumnsSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/column/InsertColumnsSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.column; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.column; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; @@ -23,8 +23,8 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.InsertColumnsSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/combine/CombineSegmentBinder.java similarity index 94% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/combine/CombineSegmentBinder.java index a818cd2860465..73c70fd7fd6d5 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/combine/CombineSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/combine/CombineSegmentBinder.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.combine; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.combine; import com.cedarsoftware.util.CaseInsensitiveMap; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java similarity index 82% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java index 78b395fc203b8..365f7fed040c5 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/ExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/ExpressionSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; @@ -23,15 +23,15 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.BetweenExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.BinaryOperationExpressionBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ExistsSubqueryExpressionBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.FunctionExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.InExpressionBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.NotExpressionBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.SubquerySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.BetweenExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.BinaryOperationExpressionBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ExistsSubqueryExpressionBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.FunctionExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.InExpressionBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.NotExpressionBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.SubquerySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BetweenExpressionSegmentBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BetweenExpressionSegmentBinder.java index b12f2c5feaaf4..ce07eb57e1f17 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BetweenExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BetweenExpressionSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BetweenExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BinaryOperationExpressionBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BinaryOperationExpressionBinder.java index 43cb19973c0df..bb244a823747e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/BinaryOperationExpressionBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java similarity index 97% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java index d4f9cdeecbcb3..0e0c59a8b1435 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ColumnSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.cedarsoftware.util.CaseInsensitiveSet; @@ -25,9 +25,9 @@ import lombok.NoArgsConstructor; import org.apache.groovy.util.Maps; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.FunctionTableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.FunctionTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ExistsSubqueryExpressionBinder.java similarity index 92% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ExistsSubqueryExpressionBinder.java index 70026051bccd0..be38cb4f4534a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/ExistsSubqueryExpressionBinder.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExistsSubqueryExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/FunctionExpressionSegmentBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/FunctionExpressionSegmentBinder.java index a169c4b5e9e01..8e952738fdda1 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/FunctionExpressionSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/InExpressionBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/InExpressionBinder.java index 8233c07b324a9..487be4d00c7ef 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/InExpressionBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/NotExpressionBinder.java similarity index 89% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/NotExpressionBinder.java index b877238d8704a..59b52baf3781d 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/NotExpressionBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; @@ -23,8 +23,8 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/SubquerySegmentBinder.java similarity index 93% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/SubquerySegmentBinder.java index 63596a38eadf6..e12eafd2e21a2 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/expression/type/SubquerySegmentBinder.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/TableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/TableSegmentBinder.java similarity index 85% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/TableSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/TableSegmentBinder.java index a29186e97c3ce..bf1f362312a97 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/TableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/TableSegmentBinder.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.FunctionTableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.DeleteMultiTableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.JoinTableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SubqueryTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.FunctionTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.DeleteMultiTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.JoinTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SubqueryTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.CollectionTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.DeleteMultiTableSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/TableSegmentBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/TableSegmentBinderContext.java similarity index 94% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/TableSegmentBinderContext.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/TableSegmentBinderContext.java index c1dda0b3420f6..685fabe34d5cc 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/TableSegmentBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/TableSegmentBinderContext.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.context; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/FunctionTableSegmentBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/FunctionTableSegmentBinderContext.java similarity index 88% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/FunctionTableSegmentBinderContext.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/FunctionTableSegmentBinderContext.java index 2de4c6a93218a..d121beadd6ac3 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/FunctionTableSegmentBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/FunctionTableSegmentBinderContext.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.context.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import java.util.Collection; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/SimpleTableSegmentBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java similarity index 93% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/SimpleTableSegmentBinderContext.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java index 48c985b1d9197..e7112afd4e8c8 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/context/type/SimpleTableSegmentBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/context/type/SimpleTableSegmentBinderContext.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.context.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type; import com.cedarsoftware.util.CaseInsensitiveMap; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/DeleteMultiTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/DeleteMultiTableSegmentBinder.java similarity index 89% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/DeleteMultiTableSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/DeleteMultiTableSegmentBinder.java index c1b7e331f81b6..a7317a25c57eb 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/DeleteMultiTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/DeleteMultiTableSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.DeleteMultiTableSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java similarity index 96% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java index 455d9d7a4936b..fda8fc2a42a47 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/JoinTableSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type; import com.cedarsoftware.util.CaseInsensitiveMap; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; @@ -24,10 +24,10 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java similarity index 91% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java index a7b9198874780..6b2561ce90a15 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java @@ -15,16 +15,16 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.util.SubqueryTableBindUtils; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; -import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; @@ -41,6 +41,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; @@ -52,6 +53,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; @@ -140,6 +142,10 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(((DropTableStatement) binderContext.getSqlStatement()).isIfExists() || schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); return; } + if (binderContext.getSqlStatement() instanceof RenameTableStatement && isRenameTable((RenameTableStatement) binderContext.getSqlStatement(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } if ("DUAL".equalsIgnoreCase(tableName)) { return; } @@ -156,6 +162,15 @@ private static boolean isRenameTable(final AlterTableStatement alterTableStateme return alterTableStatement.getRenameTable().isPresent() && alterTableStatement.getRenameTable().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); } + private static boolean isRenameTable(final RenameTableStatement renameTableStatement, final String tableName) { + for (RenameTableDefinitionSegment each : renameTableStatement.getRenameTables()) { + if (each.getRenameTable().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName)) { + return true; + } + } + return false; + } + private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, final IdentifierValue schemaName, final SQLStatementBinderContext binderContext) { IdentifierValue tableName = segment.getTableName().getIdentifier(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java similarity index 91% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java index 3ab92e9a56e48..e4c94bd49e4e1 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SubqueryTableSegmentBinder.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.from.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; -import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; +import org.apache.shardingsphere.infra.binder.engine.segment.util.SubqueryTableBindUtils; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.AliasSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/lock/LockSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/lock/LockSegmentBinder.java similarity index 89% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/lock/LockSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/lock/LockSegmentBinder.java index 5ab1ae83f8577..c4eb5e86ccf34 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/lock/LockSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/lock/LockSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.lock; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.lock; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.LockSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/GroupBySegmentBinder.java similarity index 93% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/GroupBySegmentBinder.java index 8d36597ed7460..31b4b0c780708 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/GroupBySegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/GroupBySegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.order; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.order; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.order.item.OrderByItemSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.item.OrderByItemSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.GroupBySegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/OrderBySegmentBinder.java similarity index 93% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/OrderBySegmentBinder.java index 426549e60141a..be18c8a94ecfd 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/OrderBySegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/OrderBySegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.order; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.order; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.order.item.OrderByItemSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.item.OrderByItemSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.OrderBySegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ColumnOrderByItemSegmentBinder.java similarity index 89% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ColumnOrderByItemSegmentBinder.java index abedd2763b122..3474727f2305e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ColumnOrderByItemSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ColumnOrderByItemSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.order.item; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.order.item; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ExpressionOrderByItemSegmentBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ExpressionOrderByItemSegmentBinder.java index 454fa2142f380..0f1445c71bfca 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/ExpressionOrderByItemSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/ExpressionOrderByItemSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.order.item; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.order.item; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/OrderByItemSegmentBinder.java similarity index 94% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/OrderByItemSegmentBinder.java index b1e152b4938ad..c967cc415af72 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/order/item/OrderByItemSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/order/item/OrderByItemSegmentBinder.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.order.item; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.order.item; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/HavingSegmentBinder.java similarity index 88% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/HavingSegmentBinder.java index d321b700a2fba..1015524d1cd88 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/HavingSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/HavingSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.predicate; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.HavingSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/WhereSegmentBinder.java similarity index 88% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/WhereSegmentBinder.java index c9e57d1cb7871..9698c165753de 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/predicate/WhereSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.predicate; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/ProjectionsSegmentBinder.java similarity index 92% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/ProjectionsSegmentBinder.java index 9b3c92a48577b..42f8b6eaeb068 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/ProjectionsSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/ProjectionsSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.projection; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.projection; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; @@ -23,14 +23,14 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.ExpressionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.ColumnProjectionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.ShorthandProjectionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.projection.type.SubqueryProjectionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.ExpressionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type.ColumnProjectionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type.ShorthandProjectionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type.SubqueryProjectionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; -import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; +import org.apache.shardingsphere.infra.binder.engine.segment.util.SubqueryTableBindUtils; import org.apache.shardingsphere.infra.exception.kernel.metadata.ColumnNotFoundException; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationDistinctProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ColumnProjectionSegmentBinder.java similarity index 90% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ColumnProjectionSegmentBinder.java index 3dd3cff32cca2..71bce34d34c97 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ColumnProjectionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ColumnProjectionSegmentBinder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.projection.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ShorthandProjectionSegmentBinder.java similarity index 96% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ShorthandProjectionSegmentBinder.java index 65394bf10e584..0ee6d7a9180ff 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/ShorthandProjectionSegmentBinder.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.projection.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/SubqueryProjectionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/SubqueryProjectionSegmentBinder.java similarity index 88% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/SubqueryProjectionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/SubqueryProjectionSegmentBinder.java index 4feba0cb9b1df..d4950f86e8d6c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/SubqueryProjectionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/projection/type/SubqueryProjectionSegmentBinder.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.projection.type; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.SubquerySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.SubquerySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/CommonTableExpressionSegmentBinder.java similarity index 91% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/CommonTableExpressionSegmentBinder.java index 136c33e7fbdcc..6f5d3cbe651c6 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/CommonTableExpressionSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/CommonTableExpressionSegmentBinder.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.with; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.with; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SubqueryTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SubqueryTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/WithSegmentBinder.java similarity index 96% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/WithSegmentBinder.java index ca4af9da753b7..4c5c4ef3c9e28 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/with/WithSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/with/WithSegmentBinder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.segment.with; +package org.apache.shardingsphere.infra.binder.engine.segment.dml.with; import com.cedarsoftware.util.CaseInsensitiveMap; import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; @@ -23,8 +23,8 @@ import com.google.common.collect.Multimap; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonTableExpressionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/util/SubqueryTableBindUtils.java similarity index 98% rename from infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java rename to infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/util/SubqueryTableBindUtils.java index cafaac7a910f0..1e5b4032cd5e4 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/util/SubqueryTableBindUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.binder.engine.util; +package org.apache.shardingsphere.infra.binder.engine.segment.util; import com.google.common.base.Strings; import lombok.AccessLevel; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java index 9a0afe11c165f..d21f286a08cd6 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/SQLStatementBinderContext.java @@ -23,7 +23,7 @@ import com.google.common.collect.Multimap; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java index 4a3f1e31b1292..1373f80147f90 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java @@ -21,8 +21,8 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java index 6fb91821bc6d4..33dd8e4ee1eae 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateIndexStatementBinder.java @@ -22,9 +22,9 @@ import com.google.common.collect.Multimap; import lombok.SneakyThrows; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.ColumnSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java index 3885e86ad3367..2310493a94355 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateTableStatementBinder.java @@ -21,9 +21,9 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.column.ColumnDefinitionSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.ddl.column.ColumnDefinitionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java index c54d2ce00bdeb..9d463ebc2d030 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java @@ -21,8 +21,8 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/RenameTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/RenameTableStatementBinder.java new file mode 100644 index 0000000000000..08cfcbaf9808e --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/RenameTableStatementBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.ddl.column.RenameTableDefinitionSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; + +/** + * Rename table statement binder. + */ +public final class RenameTableStatementBinder implements SQLStatementBinder { + + @Override + public RenameTableStatement bind(final RenameTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + RenameTableStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getRenameTables().forEach(each -> result.getRenameTables().add(RenameTableDefinitionSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static RenameTableStatement copy(final RenameTableStatement sqlStatement) { + RenameTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java index c1c2a3e0b7252..b0a16a9254f02 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/DeleteStatementBinder.java @@ -21,11 +21,11 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.OrderBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java index f3dd10f268f32..73eeb11fea218 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/InsertStatementBinder.java @@ -21,11 +21,11 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.column.InsertColumnsSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.expression.type.SubquerySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.column.InsertColumnsSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.SubquerySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java index 3f0cf8244b2a2..020d09e1a98f5 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/SelectStatementBinder.java @@ -22,20 +22,20 @@ import com.google.common.collect.Multimap; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.combine.CombineSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.lock.LockSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.order.GroupBySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.predicate.HavingSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.projection.ProjectionsSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.combine.CombineSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.lock.LockSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.GroupBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.OrderBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate.HavingSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.ProjectionsSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; -import org.apache.shardingsphere.infra.binder.engine.util.SubqueryTableBindUtils; +import org.apache.shardingsphere.infra.binder.engine.segment.util.SubqueryTableBindUtils; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java index 8c753e4c83e68..0b76b619a9365 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/UpdateStatementBinder.java @@ -21,12 +21,12 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import lombok.SneakyThrows; -import org.apache.shardingsphere.infra.binder.engine.segment.assign.AssignmentSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.TableSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.order.OrderBySegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.predicate.WhereSegmentBinder; -import org.apache.shardingsphere.infra.binder.engine.segment.with.WithSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.assign.AssignmentSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.TableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.order.OrderBySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate.WhereSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.with.WithSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 2792f3fc62c44..6f610e8610de6 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; @@ -32,6 +33,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; /** * DDL statement bind engine. @@ -65,6 +67,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof DropTableStatement) { return new DropTableStatementBinder().bind((DropTableStatement) statement, binderContext); } + if (statement instanceof RenameTableStatement) { + return new RenameTableStatementBinder().bind((RenameTableStatement) statement, binderContext); + } if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java index fa7e5f76aacef..41c516bb7f5db 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/assign/AssignmentSegmentBinderTest.java @@ -20,8 +20,9 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.assign.AssignmentSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinderTest.java index 25a9d68ca57ba..76684ce48fc86 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/BinaryOperationExpressionBinderTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.BinaryOperationExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java index 48dc9a9734dcb..062fef2d9f093 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ColumnSegmentBinderTest.java @@ -21,8 +21,9 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.kernel.syntax.AmbiguousColumnException; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java index d5417af227cb8..608aea0596871 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/ExistsSubqueryExpressionBinderTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.infra.binder.engine.segment.expression.type; import com.google.common.collect.LinkedHashMultimap; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ExistsSubqueryExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java index 2fe99340671d6..217d03f554f51 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/FunctionExpressionSegmentBinderTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.FunctionExpressionSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinderTest.java index b815a3e5a35df..4f5bc9e2128e4 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/InExpressionBinderTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.InExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinderTest.java index d54bc6b847083..499bd0479d435 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/NotExpressionBinderTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.LinkedHashMultimap; import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.NotExpressionBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.LiteralExpressionSegment; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java index 8e488801bae12..902ecdc8a5a4f 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/expression/type/SubquerySegmentBinderTest.java @@ -20,8 +20,9 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.SubquerySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java index 7829fcb95ba86..3cbf890c86eab 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/JoinTableSegmentBinderTest.java @@ -20,7 +20,8 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.JoinTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.hint.HintValueContext; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java index 408d70f846612..c74db06f0be82 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinderTest.java @@ -20,7 +20,8 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java index 62b74650288e2..ea2cc9842e87e 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SubqueryTableSegmentBinderTest.java @@ -20,7 +20,8 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SubqueryTableSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.hint.HintValueContext; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java index ebb18e15c6c21..6f03f9135e716 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/predicate/WhereSegmentBinderTest.java @@ -20,7 +20,8 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.predicate.WhereSegmentBinder; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinderTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinderTest.java index 329efa58d9ed8..2df48e4decbca 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinderTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/engine/segment/projection/type/ShorthandProjectionSegmentBinderTest.java @@ -20,8 +20,9 @@ import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; -import org.apache.shardingsphere.infra.binder.engine.segment.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.type.SimpleTableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.projection.type.ShorthandProjectionSegmentBinder; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment; diff --git a/test/it/binder/src/test/resources/cases/ddl/rename-table.xml b/test/it/binder/src/test/resources/cases/ddl/rename-table.xml new file mode 100644 index 0000000000000..bbde7a3b2611e --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/rename-table.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+ + + + + + + + + +
+ + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/rename-table.xml b/test/it/binder/src/test/resources/sqls/ddl/rename-table.xml new file mode 100644 index 0000000000000..df16afce93e80 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/rename-table.xml @@ -0,0 +1,22 @@ + + + + + + + From 3d8a4432fb9736757fe37a8ae3e0dce9e21fbed8 Mon Sep 17 00:00:00 2001 From: duanzhengqiang Date: Thu, 26 Dec 2024 13:55:57 +0800 Subject: [PATCH 147/192] update release note --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0db9cb1685ab7..0a0a6614430e0 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -41,6 +41,7 @@ 1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) 1. SQL Binder: Support sql bind for select with current select projection reference - [#34151](https://github.com/apache/shardingsphere/pull/34151) 1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) +1. Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) ### Bug Fixes From ef5618b93575c892748748e8d2043476bf23db0e Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 26 Dec 2024 15:27:11 +0800 Subject: [PATCH 148/192] Support copy statement sql bind and add bind test case (#34159) * Support copy statement sql bind and add bind test case * update release note --- RELEASE-NOTES.md | 3 +- .../sql/dml/ShardingCopySupportedChecker.java | 4 +- .../dml/ShardingCopySupportedCheckerTest.java | 6 +- .../statement/dml/CopyStatementContext.java | 7 +- .../binder/engine/segment/SegmentType.java | 2 +- .../PrepareStatementQuerySegmentBinder.java | 50 +++++++++ .../statement/dml/CopyStatementBinder.java | 56 ++++++++++ .../engine/type/DMLStatementBindEngine.java | 5 + .../type/OpenGaussDMLStatementVisitor.java | 2 +- .../type/PostgreSQLDMLStatementVisitor.java | 6 +- .../core/statement/dml/CopyStatement.java | 19 +++- .../src/test/resources/cases/dml/copy.xml | 105 ++++++++++++++++++ .../src/test/resources/sqls/dml/copy.xml | 22 ++++ .../dml/impl/CopyStatementAssert.java | 6 +- 14 files changed, 277 insertions(+), 16 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/prepare/PrepareStatementQuerySegmentBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/CopyStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/dml/copy.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/copy.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0a0a6614430e0..02663ad74b984 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -41,7 +41,8 @@ 1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) 1. SQL Binder: Support sql bind for select with current select projection reference - [#34151](https://github.com/apache/shardingsphere/pull/34151) 1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) -1. Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) +1. SQL Binder: Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) +1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) ### Bug Fixes diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedChecker.java index e619365e0fd61..419db60f630d7 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedChecker.java @@ -35,12 +35,12 @@ public final class ShardingCopySupportedChecker implements SupportedSQLChecker optional.getTableName().getIdentifier().getValue()).orElse(""); ShardingSpherePreconditions.checkState(!rule.isShardingTable(tableName), () -> new UnsupportedShardingOperationException("COPY", tableName)); } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java index 9b15a14b9f549..10c37fdb4ee33 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingCopySupportedCheckerTest.java @@ -45,14 +45,14 @@ class ShardingCopySupportedCheckerTest { @Test void assertCheckWhenTableSegmentForPostgreSQL() { PostgreSQLCopyStatement sqlStatement = new PostgreSQLCopyStatement(); - sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); assertDoesNotThrow(() -> new ShardingCopySupportedChecker().check(rule, mock(), mock(), new CopyStatementContext(sqlStatement))); } @Test void assertCheckWhenTableSegmentForOpenGauss() { OpenGaussCopyStatement sqlStatement = new OpenGaussCopyStatement(); - sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); assertDoesNotThrow(() -> new ShardingCopySupportedChecker().check(rule, mock(), mock(), new CopyStatementContext(sqlStatement))); } @@ -67,7 +67,7 @@ void assertCheckCopyWithShardingTableForOpenGauss() { } private void assertCheckCopyTable(final CopyStatement sqlStatement) { - sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); CopyStatementContext sqlStatementContext = new CopyStatementContext(sqlStatement); String tableName = "t_order"; when(rule.isShardingTable(tableName)).thenReturn(true); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/CopyStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/CopyStatementContext.java index ce39780ad4858..5d2f8c6db8d78 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/CopyStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/CopyStatementContext.java @@ -21,8 +21,12 @@ import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext; import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.CopyStatement; +import java.util.Collection; +import java.util.Collections; + /** * Copy statement context. */ @@ -33,7 +37,8 @@ public final class CopyStatementContext extends CommonSQLStatementContext implem public CopyStatementContext(final CopyStatement sqlStatement) { super(sqlStatement); - tablesContext = new TablesContext(sqlStatement.getTableSegment()); + Collection tables = sqlStatement.getTable().isPresent() ? Collections.singleton(sqlStatement.getTable().get()) : Collections.emptyList(); + tablesContext = new TablesContext(tables); } @Override diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java index 6cd02df131ad0..6ca1204fb71ee 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/SegmentType.java @@ -22,5 +22,5 @@ */ public enum SegmentType { - PROJECTION, PREDICATE, JOIN_ON, JOIN_USING, ORDER_BY, GROUP_BY, LOCK, SET_ASSIGNMENT, VALUES, INSERT_COLUMNS, DEFINITION_COLUMNS + PROJECTION, PREDICATE, JOIN_ON, JOIN_USING, ORDER_BY, GROUP_BY, LOCK, SET_ASSIGNMENT, VALUES, COPY, INSERT_COLUMNS, DEFINITION_COLUMNS } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/prepare/PrepareStatementQuerySegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/prepare/PrepareStatementQuerySegmentBinder.java new file mode 100644 index 0000000000000..73c3d92d9e99d --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/prepare/PrepareStatementQuerySegmentBinder.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.segment.dml.prepare; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.DeleteStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.InsertStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.UpdateStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.prepare.PrepareStatementQuerySegment; + +/** + * Prepare statement query segment binder. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PrepareStatementQuerySegmentBinder { + + /** + * Bind prepare statement query segment. + * + * @param segment prepare statement query segment + * @param binderContext SQL statement binder context + * @return bound prepare statement query segment + */ + public static PrepareStatementQuerySegment bind(final PrepareStatementQuerySegment segment, final SQLStatementBinderContext binderContext) { + PrepareStatementQuerySegment result = new PrepareStatementQuerySegment(segment.getStartIndex(), segment.getStopIndex()); + segment.getSelect().ifPresent(optional -> result.setSelect(new SelectStatementBinder().bind(optional, binderContext))); + segment.getInsert().ifPresent(optional -> result.setInsert(new InsertStatementBinder().bind(optional, binderContext))); + segment.getUpdate().ifPresent(optional -> result.setUpdate(new UpdateStatementBinder().bind(optional, binderContext))); + segment.getDelete().ifPresent(optional -> result.setDelete(new DeleteStatementBinder().bind(optional, binderContext))); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/CopyStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/CopyStatementBinder.java new file mode 100644 index 0000000000000..6f69d87d4c17a --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/CopyStatementBinder.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.dml; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.SegmentType; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.expression.type.ColumnSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.prepare.PrepareStatementQuerySegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.CopyStatement; + +/** + * Copy statement binder. + */ +public final class CopyStatementBinder implements SQLStatementBinder { + + @Override + public CopyStatement bind(final CopyStatement sqlStatement, final SQLStatementBinderContext binderContext) { + CopyStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getTable().ifPresent(optional -> result.setTable(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); + sqlStatement.getPrepareStatementQuery().ifPresent(optional -> result.setPrepareStatementQuery(PrepareStatementQuerySegmentBinder.bind(optional, binderContext))); + sqlStatement.getColumns().forEach(each -> result.getColumns().add(ColumnSegmentBinder.bind(each, SegmentType.COPY, binderContext, tableBinderContexts, LinkedHashMultimap.create()))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private CopyStatement copy(final CopyStatement sqlStatement) { + CopyStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java index b164c09bb4953..dacb5483c1eac 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java @@ -19,12 +19,14 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.CopyStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.DeleteStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.InsertStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.UpdateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.CopyStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement; @@ -63,6 +65,9 @@ public DMLStatement bind(final DMLStatement statement) { if (statement instanceof DeleteStatement) { return new DeleteStatementBinder().bind((DeleteStatement) statement, binderContext); } + if (statement instanceof CopyStatement) { + return new CopyStatementBinder().bind((CopyStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDMLStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDMLStatementVisitor.java index fe0c53ae243ec..cc2fa84df47ce 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDMLStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDMLStatementVisitor.java @@ -50,7 +50,7 @@ public ASTNode visitDoStatement(final DoStatementContext ctx) { public ASTNode visitCopy(final CopyContext ctx) { OpenGaussCopyStatement result = new OpenGaussCopyStatement(); if (null != ctx.qualifiedName()) { - result.setTableSegment((SimpleTableSegment) visit(ctx.qualifiedName())); + result.setTable((SimpleTableSegment) visit(ctx.qualifiedName())); } return result; } diff --git a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDMLStatementVisitor.java b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDMLStatementVisitor.java index ff919ad01c4ba..ce5187ac346b8 100644 --- a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDMLStatementVisitor.java +++ b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDMLStatementVisitor.java @@ -98,7 +98,7 @@ public ASTNode visitCopy(final CopyContext ctx) { public ASTNode visitCopyWithTableOrQuery(final CopyWithTableOrQueryContext ctx) { PostgreSQLCopyStatement result = new PostgreSQLCopyStatement(); if (null != ctx.qualifiedName()) { - result.setTableSegment((SimpleTableSegment) visit(ctx.qualifiedName())); + result.setTable((SimpleTableSegment) visit(ctx.qualifiedName())); if (null != ctx.columnNames()) { result.getColumns().addAll(((CollectionValue) visit(ctx.columnNames())).getValue()); } @@ -127,7 +127,7 @@ private PrepareStatementQuerySegment extractPrepareStatementQuerySegmentFromPrep public ASTNode visitCopyWithTableOrQueryBinaryCsv(final CopyWithTableOrQueryBinaryCsvContext ctx) { PostgreSQLCopyStatement result = new PostgreSQLCopyStatement(); if (null != ctx.qualifiedName()) { - result.setTableSegment((SimpleTableSegment) visit(ctx.qualifiedName())); + result.setTable((SimpleTableSegment) visit(ctx.qualifiedName())); if (null != ctx.columnNames()) { result.getColumns().addAll(((CollectionValue) visit(ctx.columnNames())).getValue()); } @@ -142,7 +142,7 @@ public ASTNode visitCopyWithTableOrQueryBinaryCsv(final CopyWithTableOrQueryBina public ASTNode visitCopyWithTableBinary(final CopyWithTableBinaryContext ctx) { PostgreSQLCopyStatement result = new PostgreSQLCopyStatement(); if (null != ctx.qualifiedName()) { - result.setTableSegment((SimpleTableSegment) visit(ctx.qualifiedName())); + result.setTable((SimpleTableSegment) visit(ctx.qualifiedName())); } return result; } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java index 3ae2d1673fd49..67912be7a646c 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/CopyStatement.java @@ -35,7 +35,24 @@ @Setter public abstract class CopyStatement extends AbstractSQLStatement implements DMLStatement { - private SimpleTableSegment tableSegment; + private SimpleTableSegment table; + + /** + * Get table. + * + * @return table + */ + public Optional getTable() { + return Optional.ofNullable(table); + } + + /** + * Set prepare statement query segment. + * + * @param prepareStatementQuery prepare statement query segment + */ + public void setPrepareStatementQuery(final PrepareStatementQuerySegment prepareStatementQuery) { + } /** * Get prepare statement query segment. diff --git a/test/it/binder/src/test/resources/cases/dml/copy.xml b/test/it/binder/src/test/resources/cases/dml/copy.xml new file mode 100644 index 0000000000000..06c673a419803 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/copy.xml @@ -0,0 +1,105 @@ + + + + + + + + + + +
+ + +
+ + + + + + +
diff --git a/test/it/binder/src/test/resources/sqls/dml/copy.xml b/test/it/binder/src/test/resources/sqls/dml/copy.xml new file mode 100644 index 0000000000000..994ffd39c8466 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/copy.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/CopyStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/CopyStatementAssert.java index 8cd762a466596..61116c2d4517f 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/CopyStatementAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/impl/CopyStatementAssert.java @@ -32,7 +32,6 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -56,9 +55,10 @@ public static void assertIs(final SQLCaseAssertContext assertContext, final Copy private static void assertTable(final SQLCaseAssertContext assertContext, final CopyStatement actual, final CopyStatementTestCase expected) { if (null == expected.getTable()) { - assertNull(actual.getTableSegment(), assertContext.getText("Actual table should not exist.")); + assertFalse(actual.getTable().isPresent(), assertContext.getText("Actual table should not exist.")); } else { - TableAssert.assertIs(assertContext, actual.getTableSegment(), expected.getTable()); + assertTrue(actual.getTable().isPresent(), assertContext.getText("Actual table should exist.")); + TableAssert.assertIs(assertContext, actual.getTable().get(), expected.getTable()); } } From 5be4af425ffe569b68dfb825178961f0dff62580 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Thu, 26 Dec 2024 16:37:50 +0800 Subject: [PATCH 149/192] Support truncate table sql bind and add test case (#34162) * add test case for cursor statement bind * Support truncate table sql bind and add test case for truncate table * update release note --- RELEASE-NOTES.md | 1 + .../ddl/TruncateStatementBinder.java | 51 ++++++++++ .../engine/type/DDLStatementBindEngine.java | 5 + .../src/test/resources/cases/ddl/cursor.xml | 93 +++++++++++++++++++ .../resources/cases/ddl/truncate-table.xml | 28 ++++++ .../resources/sqls/ddl/truncate-table.xml | 21 +++++ .../src/test/resources/sqls/dml/cursor.xml | 21 +++++ 7 files changed, 220 insertions(+) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/cursor.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/truncate-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/cursor.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 02663ad74b984..92a9855fedaa1 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -43,6 +43,7 @@ 1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) 1. SQL Binder: Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) +1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) ### Bug Fixes diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java new file mode 100644 index 0000000000000..f9a9969f71c31 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/TruncateStatementBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; + +/** + * Truncate statement binder. + */ +public final class TruncateStatementBinder implements SQLStatementBinder { + + @Override + public TruncateStatement bind(final TruncateStatement sqlStatement, final SQLStatementBinderContext binderContext) { + TruncateStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getTables().forEach(each -> result.getTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static TruncateStatement copy(final TruncateStatement sqlStatement) { + TruncateStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 6f610e8610de6..07de9be627abe 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; @@ -34,6 +35,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; /** * DDL statement bind engine. @@ -73,6 +75,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } + if (statement instanceof TruncateStatement) { + return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); + } return statement; } } diff --git a/test/it/binder/src/test/resources/cases/ddl/cursor.xml b/test/it/binder/src/test/resources/cases/ddl/cursor.xml new file mode 100644 index 0000000000000..0772e747d009c --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/cursor.xml @@ -0,0 +1,93 @@ + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml b/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml new file mode 100644 index 0000000000000..41759a903735b --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/truncate-table.xml @@ -0,0 +1,28 @@ + + + + + + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml b/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml new file mode 100644 index 0000000000000..0b49b1b2362be --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/truncate-table.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/cursor.xml b/test/it/binder/src/test/resources/sqls/dml/cursor.xml new file mode 100644 index 0000000000000..d952df8cc2fa1 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/cursor.xml @@ -0,0 +1,21 @@ + + + + + + From ad02d1637ee8a839420b4250d19c58ea2d9ba3e2 Mon Sep 17 00:00:00 2001 From: YaoFly <2465939235@qq.com> Date: Thu, 26 Dec 2024 17:21:46 +0800 Subject: [PATCH 150/192] Support alter index sql bind and add test case (#34160) * Support GroupConcat sql for aggregating multiple shards(#33797) * Check Style fix(#33797) * Check Style fix(#33797) * spotless fix (#33797) * unit test fix (#33797) * spotless fix (#33797) * group_concat distinct compatible (#33797) * group_concat distinct compatible (#33797) * unit test fix for distinct group_concat (#33797) * e2e test for group_concat (#33797) * e2e test for group_concat (#33797) * code format (#33797) * e2e test (#33797) * e2e test (#33797) * e2e test (#33797) * remove useless code(#33797) * code optimization (#33797) * sql parse unit test (#33797) * RELEASE-NOTES.md updated(#33797) * Code Optimization (#33797) * Support GroupConcat sql for aggregating multiple shards in opengauss and doris database(#33797) * doris parse unit test fix (#33797) * spotless fix (#33797) * Update RELEASE-NOTES.md * Add DBCOMPATIBILITY 'B' parameter to opengauss database (#33992) * Add DBCOMPATIBILITY 'B' parameter to opengauss database for dbtbl_with_readwrite_splitting and readwrite_splitting scenarios(#33992) * add openGauss test case for group_concat. (#33992) * Support alter index sql bind and add test case. (#34029) * code fix * spotless * code fix --------- Co-authored-by: yaofly Co-authored-by: Zhengqiang Duan --- .../ddl/AlterIndexStatementBinder.java | 56 +++++++++++++++++++ .../engine/type/DDLStatementBindEngine.java | 5 ++ .../statement/ddl/AlterIndexStatement.java | 8 +++ .../dialect/sqlserver/SQLServerBinderIT.java | 25 +++++++++ .../test/resources/cases/ddl/alter-index.xml | 30 ++++++++++ .../test/resources/sqls/ddl/alter-index.xml | 21 +++++++ 6 files changed, 145 insertions(+) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java create mode 100644 test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/sqlserver/SQLServerBinderIT.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/alter-index.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/alter-index.xml diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java new file mode 100644 index 0000000000000..848755e5ac1e6 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; + +/** + * Alter index statement binder. + */ +public class AlterIndexStatementBinder implements SQLStatementBinder { + + @Override + public AlterIndexStatement bind(final AlterIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { + if (!sqlStatement.getSimpleTable().isPresent()) { + return sqlStatement; + } + AlterIndexStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setSimpleTable(SimpleTableSegmentBinder.bind(sqlStatement.getSimpleTable().get(), binderContext, tableBinderContexts)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static AlterIndexStatement copy(final AlterIndexStatement sqlStatement) { + AlterIndexStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + sqlStatement.getIndex().ifPresent(result::setIndex); + sqlStatement.getSimpleTable().ifPresent(result::setSimpleTable); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 07de9be627abe..9bb698c5793a6 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; @@ -28,6 +29,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; @@ -75,6 +77,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } + if (statement instanceof AlterIndexStatement) { + return new AlterIndexStatementBinder().bind((AlterIndexStatement) statement, binderContext); + } if (statement instanceof TruncateStatement) { return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterIndexStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterIndexStatement.java index 0d9e8d35264aa..2492b19d93003 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterIndexStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterIndexStatement.java @@ -50,6 +50,14 @@ public Optional getSimpleTable() { return Optional.empty(); } + /** + * Set simple table segment. + * + * @param simpleTableSegment simple table segment + */ + public void setSimpleTable(final SimpleTableSegment simpleTableSegment) { + } + /** * Get rename index segment. * diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/sqlserver/SQLServerBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/sqlserver/SQLServerBinderIT.java new file mode 100644 index 0000000000000..ed9847cb74574 --- /dev/null +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/sqlserver/SQLServerBinderIT.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.it.sql.binder.dialect.sqlserver; + +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings; + +@SQLBinderITSettings("SQLServer") +class SQLServerBinderIT extends SQLBinderIT { +} diff --git a/test/it/binder/src/test/resources/cases/ddl/alter-index.xml b/test/it/binder/src/test/resources/cases/ddl/alter-index.xml new file mode 100644 index 0000000000000..c6768222d1007 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/alter-index.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/alter-index.xml b/test/it/binder/src/test/resources/sqls/ddl/alter-index.xml new file mode 100644 index 0000000000000..852ee567ac66e --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/alter-index.xml @@ -0,0 +1,21 @@ + + + + + + From 1073a043aa2dcca69b5c699f27fd3b2dba3f7e28 Mon Sep 17 00:00:00 2001 From: YaoFly <2465939235@qq.com> Date: Thu, 26 Dec 2024 19:06:11 +0800 Subject: [PATCH 151/192] Support drop index sql bind and add test case. (#34165) * Support GroupConcat sql for aggregating multiple shards(#33797) * Check Style fix(#33797) * Check Style fix(#33797) * spotless fix (#33797) * unit test fix (#33797) * spotless fix (#33797) * group_concat distinct compatible (#33797) * group_concat distinct compatible (#33797) * unit test fix for distinct group_concat (#33797) * e2e test for group_concat (#33797) * e2e test for group_concat (#33797) * code format (#33797) * e2e test (#33797) * e2e test (#33797) * e2e test (#33797) * remove useless code(#33797) * code optimization (#33797) * sql parse unit test (#33797) * RELEASE-NOTES.md updated(#33797) * Code Optimization (#33797) * Support GroupConcat sql for aggregating multiple shards in opengauss and doris database(#33797) * doris parse unit test fix (#33797) * spotless fix (#33797) * Update RELEASE-NOTES.md * Add DBCOMPATIBILITY 'B' parameter to opengauss database (#33992) * Add DBCOMPATIBILITY 'B' parameter to opengauss database for dbtbl_with_readwrite_splitting and readwrite_splitting scenarios(#33992) * add openGauss test case for group_concat. (#33992) * Support drop index sql bind and add test case. --------- Co-authored-by: yaofly Co-authored-by: Zhengqiang Duan --- .../ddl/DropIndexStatementBinder.java | 59 +++++++++++++++++++ .../engine/type/DDLStatementBindEngine.java | 5 ++ .../type/SQLServerDDLStatementVisitor.java | 3 +- .../statement/ddl/DropIndexStatement.java | 32 ++++++++++ .../ddl/SQLServerDropIndexStatement.java | 2 +- .../test/resources/cases/ddl/drop-index.xml | 49 +++++++++++++++ .../test/resources/sqls/ddl/drop-index.xml | 23 ++++++++ 7 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/drop-index.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/drop-index.xml diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java new file mode 100644 index 0000000000000..10d8ecb292606 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; + +/** + * Drop index statement binder. + */ +public class DropIndexStatementBinder implements SQLStatementBinder { + + @Override + public DropIndexStatement bind(final DropIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { + if (!sqlStatement.getSimpleTable().isPresent()) { + return sqlStatement; + } + DropIndexStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setSimpleTable(SimpleTableSegmentBinder.bind(sqlStatement.getSimpleTable().get(), binderContext, tableBinderContexts)); + sqlStatement.getIndexes().forEach(each -> result.getIndexes().add(each)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropIndexStatement copy(final DropIndexStatement sqlStatement) { + DropIndexStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + sqlStatement.getSimpleTable().ifPresent(result::setSimpleTable); + sqlStatement.getAlgorithmType().ifPresent(result::setAlgorithmType); + sqlStatement.getLockTable().ifPresent(result::setLockTable); + result.setIfExists(sqlStatement.isIfExists()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 9bb698c5793a6..1860554f46b4e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; @@ -36,6 +37,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; @@ -83,6 +85,9 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof TruncateStatement) { return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); } + if (statement instanceof DropIndexStatement) { + return new DropIndexStatementBinder().bind((DropIndexStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java index 59841bf11bc59..8d589a494af67 100644 --- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java +++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java @@ -348,7 +348,8 @@ public ASTNode visitAlterIndex(final AlterIndexContext ctx) { @Override public ASTNode visitDropIndex(final DropIndexContext ctx) { - SQLServerDropIndexStatement result = new SQLServerDropIndexStatement(null != ctx.ifExists()); + SQLServerDropIndexStatement result = new SQLServerDropIndexStatement(); + result.setIfExists(null != ctx.ifExists()); result.getIndexes().add((IndexSegment) visit(ctx.indexName())); result.setSimpleTable((SimpleTableSegment) visit(ctx.tableName())); return result; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java index bf77783b993d1..1c8edfd88c2c3 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropIndexStatement.java @@ -45,6 +45,14 @@ public Optional getSimpleTable() { return Optional.empty(); } + /** + * Set simple table. + * + * @param simpleTableSegment simple table + */ + public void setSimpleTable(final SimpleTableSegment simpleTableSegment) { + } + /** * Judge whether contains exist clause or not. * @@ -54,6 +62,14 @@ public boolean isIfExists() { return false; } + /** + * Set if exists or not. + * + * @param ifExists if exists or not + */ + public void setIfExists(final boolean ifExists) { + } + /** * Get algorithm type. * @@ -63,6 +79,14 @@ public Optional getAlgorithmType() { return Optional.empty(); } + /** + * Set algorithm type. + * + * @param algorithmTypeSegment algorithm type + */ + public void setAlgorithmType(final AlgorithmTypeSegment algorithmTypeSegment) { + } + /** * Get lock table segment. * @@ -71,4 +95,12 @@ public Optional getAlgorithmType() { public Optional getLockTable() { return Optional.empty(); } + + /** + * Set lock table segment. + * + * @param lockTableSegment lock table segment + */ + public void setLockTable(final LockTableSegment lockTableSegment) { + } } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java index 679bd86c5b8b7..e2c766cec85a9 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropIndexStatement.java @@ -34,7 +34,7 @@ @Setter public final class SQLServerDropIndexStatement extends DropIndexStatement implements SQLServerStatement { - private final boolean ifExists; + private boolean ifExists; private SimpleTableSegment simpleTable; diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml new file mode 100644 index 0000000000000..73f8237cc432a --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + +
+
+ + + + + + + +
+
+ + + + + + + +
+ + +
+
diff --git a/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml new file mode 100644 index 0000000000000..e64352098a617 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-index.xml @@ -0,0 +1,23 @@ + + + + + + + + From 6c27725c07369034428e6bbaa2c904f7a96abafe Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Thu, 26 Dec 2024 21:16:14 +0800 Subject: [PATCH 152/192] Fix invalid version exception after data source unit altered (#34168) --- .../service/ClusterMetaDataManagerPersistService.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java index 6e8bb55042376..880df297bbbb7 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java @@ -125,7 +125,7 @@ public void registerStorageUnits(final String databaseName, final Map getToBeDroppedResourceNames(final String databaseName return toBeDroppedResourceNames.stream().filter(propsMap::containsKey).collect(Collectors.toList()); } - private void afterStorageUnitsRegistered(final String databaseName, final MetaDataContexts originalMetaDataContexts, final MetaDataContexts reloadMetaDataContexts) { + private void afterStorageUnitsAltered(final String databaseName, final MetaDataContexts originalMetaDataContexts, final MetaDataContexts reloadMetaDataContexts) { Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName)) .ifPresent(optional -> optional.getSchemaData().forEach((schemaName, schemaData) -> metaDataPersistService.getShardingSphereDataPersistService() .persist(originalMetaDataContexts.getMetaData().getDatabase(databaseName), schemaName, schemaData))); @@ -187,12 +187,6 @@ private void afterStorageUnitsRegistered(final String databaseName, final MetaDa originalMetaDataContexts.getMetaData().getDatabase(databaseName)); } - private void afterStorageUnitsAltered(final String databaseName, final MetaDataContexts originalMetaDataContexts, final MetaDataContexts reloadMetaDataContexts) { - reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getAllSchemas().forEach(each -> metaDataPersistService.getDatabaseMetaDataFacade() - .getSchema().alterByRuleAltered(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(), each)); - afterStorageUnitsRegistered(databaseName, originalMetaDataContexts, reloadMetaDataContexts); - } - private void afterStorageUnitsDropped(final String databaseName, final MetaDataContexts originalMetaDataContexts, final MetaDataContexts reloadMetaDataContexts) { reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getAllSchemas().forEach(each -> metaDataPersistService.getDatabaseMetaDataFacade() .getSchema().alterByRuleDropped(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(), each)); From 470b013e16ebc84f017afc3a6d1dae2a198e14ad Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Thu, 26 Dec 2024 23:13:20 +0800 Subject: [PATCH 153/192] Refactor ClusterLockContext (#34170) --- .../mode/manager/cluster/lock/ClusterLockContext.java | 4 ++-- .../manager/cluster/lock/ClusterLockContextTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java index 7bac7d79e6175..2f51761835a81 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContext.java @@ -20,8 +20,8 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; -import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; /** * Cluster lock context. @@ -29,7 +29,7 @@ @RequiredArgsConstructor public final class ClusterLockContext implements LockContext { - private final LockPersistService globalLockPersistService; + private final GlobalLockPersistService globalLockPersistService; @Override public boolean tryLock(final LockDefinition lockDefinition, final long timeoutMillis) { diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java index 8b168bad457df..1f5b3d304ad33 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/lock/ClusterLockContextTest.java @@ -17,9 +17,9 @@ package org.apache.shardingsphere.mode.manager.cluster.lock; -import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.lock.global.GlobalLock; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; +import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -37,7 +37,7 @@ class ClusterLockContextTest { private GlobalLock globalLock; @Mock - private LockPersistService lockPersistService; + private GlobalLockPersistService globalLockPersistService; private GlobalLockDefinition lockDefinition; @@ -47,18 +47,18 @@ class ClusterLockContextTest { void init() { when(globalLock.getName()).thenReturn("foo_lock"); lockDefinition = new GlobalLockDefinition(globalLock); - lockContext = new ClusterLockContext(lockPersistService); + lockContext = new ClusterLockContext(globalLockPersistService); } @Test void assertTryLock() { - when(lockPersistService.tryLock(lockDefinition, 3000L)).thenReturn(true); + when(globalLockPersistService.tryLock(lockDefinition, 3000L)).thenReturn(true); assertTrue(lockContext.tryLock(lockDefinition, 3000L)); } @Test void assertUnlock() { lockContext.unlock(lockDefinition); - verify(lockPersistService).unlock(lockDefinition); + verify(globalLockPersistService).unlock(lockDefinition); } } From e49c72fcf11654b26ddcda722907be78569e8c76 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Thu, 26 Dec 2024 23:21:27 +0800 Subject: [PATCH 154/192] Merge GlobalLockPersistService and LockPersistService (#34171) --- .../mode/lock/LockPersistService.java | 44 ------------------- .../service/GlobalLockPersistService.java | 17 +++++-- 2 files changed, 13 insertions(+), 48 deletions(-) delete mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/lock/LockPersistService.java diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/LockPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/LockPersistService.java deleted file mode 100644 index 08c0ee4324eb5..0000000000000 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/LockPersistService.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.lock; - -import org.apache.shardingsphere.infra.lock.LockDefinition; - -/** - * Lock persist service. - * - * @param type of lock definition - */ -public interface LockPersistService { - - /** - * Try lock. - * - * @param lockDefinition lock definition - * @param timeoutMillis timeout millis - * @return is locked or not - */ - boolean tryLock(T lockDefinition, long timeoutMillis); - - /** - * Unlock. - * - * @param lockDefinition lock definition - */ - void unlock(T lockDefinition); -} diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java index f20366e5e52a5..b3a92fd61e0c0 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/GlobalLockPersistService.java @@ -19,23 +19,32 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.LockPersistService; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; /** * Global lock persist service. */ @RequiredArgsConstructor -public final class GlobalLockPersistService implements LockPersistService { +public final class GlobalLockPersistService { private final ClusterPersistRepository repository; - @Override + /** + * Try lock. + * + * @param lockDefinition lock definition + * @param timeoutMillis timeout millis + * @return is locked or not + */ public boolean tryLock(final GlobalLockDefinition lockDefinition, final long timeoutMillis) { return repository.getDistributedLockHolder().getDistributedLock(lockDefinition.getLockKey()).tryLock(timeoutMillis); } - @Override + /** + * Unlock. + * + * @param lockDefinition lock definition + */ public void unlock(final GlobalLockDefinition lockDefinition) { repository.getDistributedLockHolder().getDistributedLock(lockDefinition.getLockKey()).unlock(); } From e95517caee239fc813d22d8b39512dc1938c940c Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Fri, 27 Dec 2024 00:03:50 +0800 Subject: [PATCH 155/192] Fix sonar issue on ShardingRouteEngineFactory (#34172) --- .../route/engine/type/ShardingRouteEngineFactory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java index 49de41137a3cf..0ed4d444f444c 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java @@ -74,7 +74,7 @@ public static ShardingRouteEngine newInstance(final ShardingRule rule, final Sha SQLStatement sqlStatement = sqlStatementContext.getSqlStatement(); if (sqlStatement instanceof DDLStatement) { return sqlStatementContext instanceof CursorAvailable - ? getCursorRouteEngine(rule, database, sqlStatementContext, queryContext.getHintValueContext(), shardingConditions, logicTableNames, props) + ? getCursorRouteEngine(rule, sqlStatementContext, queryContext.getHintValueContext(), shardingConditions, logicTableNames, props) : getDDLRouteEngine(database, sqlStatementContext, logicTableNames); } if (sqlStatement instanceof DALStatement) { @@ -83,7 +83,7 @@ public static ShardingRouteEngine newInstance(final ShardingRule rule, final Sha if (sqlStatement instanceof DCLStatement) { return getDCLRouteEngine(database, sqlStatementContext, logicTableNames); } - return getDQLRouteEngine(rule, database, sqlStatementContext, queryContext, shardingConditions, logicTableNames, props); + return getDQLRouteEngine(rule, sqlStatementContext, queryContext, shardingConditions, logicTableNames, props); } private static ShardingRouteEngine getDDLRouteEngine(final ShardingSphereDatabase database, final SQLStatementContext sqlStatementContext, final Collection logicTableNames) { @@ -95,7 +95,7 @@ private static ShardingRouteEngine getDDLRouteEngine(final ShardingSphereDatabas return new ShardingTableBroadcastRouteEngine(database, sqlStatementContext, logicTableNames); } - private static ShardingRouteEngine getCursorRouteEngine(final ShardingRule rule, final ShardingSphereDatabase database, final SQLStatementContext sqlStatementContext, + private static ShardingRouteEngine getCursorRouteEngine(final ShardingRule rule, final SQLStatementContext sqlStatementContext, final HintValueContext hintValueContext, final ShardingConditions shardingConditions, final Collection logicTableNames, final ConfigurationProperties props) { boolean allBindingTables = logicTableNames.size() > 1 && rule.isBindingTablesUseShardingColumnsJoin(sqlStatementContext, logicTableNames); @@ -128,7 +128,7 @@ private static boolean isDCLForSingleTable(final SQLStatementContext sqlStatemen return false; } - private static ShardingRouteEngine getDQLRouteEngine(final ShardingRule rule, final ShardingSphereDatabase database, final SQLStatementContext sqlStatementContext, + private static ShardingRouteEngine getDQLRouteEngine(final ShardingRule rule, final SQLStatementContext sqlStatementContext, final QueryContext queryContext, final ShardingConditions shardingConditions, final Collection logicTableNames, final ConfigurationProperties props) { Collection tableNames = sqlStatementContext instanceof TableAvailable ? ((TableAvailable) sqlStatementContext).getTablesContext().getTableNames() : Collections.emptyList(); From 7f8fa57bce9b0c2c35b24fdc16ad20f4028135db Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 27 Dec 2024 07:41:54 +0800 Subject: [PATCH 156/192] Support create view, alter view, drop view sql bind logic (#34167) * Support create view, alter view, drop view sql bind logic * Support create view, alter view, drop view sql bind logic * Support create view, alter view, drop view sql bind logic * update release note * fix rewrite it --- RELEASE-NOTES.md | 1 + .../ShardingAlterViewSupportedChecker.java | 2 +- .../ddl/AlterViewStatementContext.java | 2 +- .../from/type/SimpleTableSegmentBinder.java | 21 ++++++- .../ddl/AlterIndexStatementBinder.java | 2 +- .../ddl/AlterViewStatementBinder.java | 56 +++++++++++++++++++ .../ddl/CreateViewStatementBinder.java | 54 ++++++++++++++++++ .../ddl/DropIndexStatementBinder.java | 2 +- .../ddl/DropViewStatementBinder.java | 51 +++++++++++++++++ .../engine/type/DDLStatementBindEngine.java | 25 +++++++-- .../statement/ddl/AlterViewStatement.java | 34 ++++++++++- .../doris/ddl/DorisAlterViewStatement.java | 2 +- .../mysql/ddl/MySQLAlterViewStatement.java | 2 +- .../ddl/SQLServerAlterViewStatement.java | 2 +- .../test/it/sql/binder/SQLBinderIT.java | 7 +++ .../test/resources/cases/ddl/alter-view.xml | 48 ++++++++++++++++ .../test/resources/cases/ddl/create-view.xml | 48 ++++++++++++++++ .../test/resources/cases/ddl/drop-index.xml | 2 + .../test/resources/cases/ddl/drop-view.xml | 28 ++++++++++ .../test/resources/sqls/ddl/alter-view.xml | 21 +++++++ .../test/resources/sqls/ddl/create-view.xml | 21 +++++++ .../src/test/resources/sqls/ddl/drop-view.xml | 21 +++++++ .../ddl/impl/AlterViewStatementAssert.java | 6 +- .../sharding/case/ddl/create-table.xml | 2 +- 24 files changed, 442 insertions(+), 18 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/alter-view.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/create-view.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/drop-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/alter-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/create-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/drop-view.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 92a9855fedaa1..943a601cf47c0 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -44,6 +44,7 @@ 1. SQL Binder: Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) +1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) ### Bug Fixes diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java index 81ade5d0cb6d5..7fb9b59180bb0 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java @@ -47,7 +47,7 @@ public boolean isCheck(final SQLStatementContext sqlStatementContext) { @Override public void check(final ShardingRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final AlterViewStatementContext sqlStatementContext) { AlterViewStatement alterViewStatement = sqlStatementContext.getSqlStatement(); - Optional selectStatement = alterViewStatement.getSelectStatement(); + Optional selectStatement = alterViewStatement.getSelect(); String originView = alterViewStatement.getView().getTableName().getIdentifier().getValue(); selectStatement.ifPresent(optional -> checkAlterViewShardingTables(rule, optional, originView)); alterViewStatement.getRenameView().ifPresent(optional -> checkBroadcastShardingView(rule, originView, optional.getTableName().getIdentifier().getValue())); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java index 1b0e25a3c07b0..21ed040858f1f 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java @@ -42,7 +42,7 @@ public AlterViewStatementContext(final AlterViewStatement sqlStatement) { super(sqlStatement); Collection tables = new LinkedList<>(); tables.add(sqlStatement.getView()); - Optional selectStatement = sqlStatement.getSelectStatement(); + Optional selectStatement = sqlStatement.getSelect(); selectStatement.ifPresent(optional -> { TableExtractor extractor = new TableExtractor(); extractor.extractTablesFromSelect(optional); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java index 6b2561ce90a15..3ed26ac9e9902 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java @@ -51,7 +51,9 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -129,7 +131,8 @@ private static IdentifierValue getSchemaName(final SimpleTableSegment segment, f } private static void checkTableExists(final SQLStatementBinderContext binderContext, final ShardingSphereSchema schema, final String schemaName, final String tableName) { - if (binderContext.getSqlStatement() instanceof CreateTableStatement) { + // TODO refactor table exists check with spi @duanzhengqiang + if (binderContext.getSqlStatement() instanceof CreateTableStatement && isCreateTable(((CreateTableStatement) binderContext.getSqlStatement()).getTable(), tableName)) { ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || ((CreateTableStatement) binderContext.getSqlStatement()).isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; @@ -146,6 +149,14 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; } + if (binderContext.getSqlStatement() instanceof CreateViewStatement && isCreateTable(((CreateViewStatement) binderContext.getSqlStatement()).getView(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } + if (binderContext.getSqlStatement() instanceof AlterViewStatement && isRenameView((AlterViewStatement) binderContext.getSqlStatement(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } if ("DUAL".equalsIgnoreCase(tableName)) { return; } @@ -158,6 +169,10 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); } + private static boolean isCreateTable(final SimpleTableSegment simpleTableSegment, final String tableName) { + return simpleTableSegment.getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); + } + private static boolean isRenameTable(final AlterTableStatement alterTableStatement, final String tableName) { return alterTableStatement.getRenameTable().isPresent() && alterTableStatement.getRenameTable().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); } @@ -171,6 +186,10 @@ private static boolean isRenameTable(final RenameTableStatement renameTableState return false; } + private static boolean isRenameView(final AlterViewStatement alterViewStatement, final String tableName) { + return alterViewStatement.getRenameView().isPresent() && alterViewStatement.getRenameView().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); + } + private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, final IdentifierValue schemaName, final SQLStatementBinderContext binderContext) { IdentifierValue tableName = segment.getTableName().getIdentifier(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java index 848755e5ac1e6..55533ab06ed4c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java @@ -30,7 +30,7 @@ /** * Alter index statement binder. */ -public class AlterIndexStatementBinder implements SQLStatementBinder { +public final class AlterIndexStatementBinder implements SQLStatementBinder { @Override public AlterIndexStatement bind(final AlterIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java new file mode 100644 index 0000000000000..ba455bf020435 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; + +/** + * Alter view statement binder. + */ +public final class AlterViewStatementBinder implements SQLStatementBinder { + + @Override + public AlterViewStatement bind(final AlterViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + AlterViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setView(SimpleTableSegmentBinder.bind(sqlStatement.getView(), binderContext, tableBinderContexts)); + sqlStatement.getSelect().ifPresent(optional -> result.setSelect(new SelectStatementBinder().bind(optional, binderContext))); + sqlStatement.getRenameView().ifPresent(optional -> result.setRenameView(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static AlterViewStatement copy(final AlterViewStatement sqlStatement) { + AlterViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + sqlStatement.getViewDefinition().ifPresent(result::setViewDefinition); + sqlStatement.getConstraintDefinition().ifPresent(result::setConstraintDefinition); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java new file mode 100644 index 0000000000000..91befad6c2f8f --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; + +/** + * Create view statement binder. + */ +public final class CreateViewStatementBinder implements SQLStatementBinder { + + @Override + public CreateViewStatement bind(final CreateViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + CreateViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setView(SimpleTableSegmentBinder.bind(sqlStatement.getView(), binderContext, tableBinderContexts)); + result.setSelect(new SelectStatementBinder().bind(sqlStatement.getSelect(), binderContext)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static CreateViewStatement copy(final CreateViewStatement sqlStatement) { + CreateViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setViewDefinition(sqlStatement.getViewDefinition()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java index 10d8ecb292606..56b7ec3b13995 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java @@ -30,7 +30,7 @@ /** * Drop index statement binder. */ -public class DropIndexStatementBinder implements SQLStatementBinder { +public final class DropIndexStatementBinder implements SQLStatementBinder { @Override public DropIndexStatement bind(final DropIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java new file mode 100644 index 0000000000000..1e9d2e579068d --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement; + +/** + * Drop view statement binder. + */ +public final class DropViewStatementBinder implements SQLStatementBinder { + + @Override + public DropViewStatement bind(final DropViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + DropViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getViews().forEach(each -> result.getViews().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropViewStatement copy(final DropViewStatement sqlStatement) { + DropViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 1860554f46b4e..f579afbf8ab12 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -21,23 +21,29 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterViewStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateViewStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; -import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropIndexStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropViewStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; -import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; @@ -82,12 +88,21 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof AlterIndexStatement) { return new AlterIndexStatementBinder().bind((AlterIndexStatement) statement, binderContext); } - if (statement instanceof TruncateStatement) { - return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); - } if (statement instanceof DropIndexStatement) { return new DropIndexStatementBinder().bind((DropIndexStatement) statement, binderContext); } + if (statement instanceof CreateViewStatement) { + return new CreateViewStatementBinder().bind((CreateViewStatement) statement, binderContext); + } + if (statement instanceof AlterViewStatement) { + return new AlterViewStatementBinder().bind((AlterViewStatement) statement, binderContext); + } + if (statement instanceof DropViewStatement) { + return new DropViewStatementBinder().bind((DropViewStatement) statement, binderContext); + } + if (statement instanceof TruncateStatement) { + return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java index efe898d40bffc..33d2761c9d3c8 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java @@ -40,10 +40,18 @@ public abstract class AlterViewStatement extends AbstractSQLStatement implements * * @return select statement */ - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.empty(); } + /** + * Set select statement. + * + * @param select select statement + */ + public void setSelect(final SelectStatement select) { + } + /** * Get view definition. * @@ -53,6 +61,14 @@ public Optional getViewDefinition() { return Optional.empty(); } + /** + * Get view definition. + * + * @param viewDefinition view definition + */ + public void setViewDefinition(final String viewDefinition) { + } + /** * Get rename view. * @@ -62,6 +78,14 @@ public Optional getRenameView() { return Optional.empty(); } + /** + * Get rename view. + * + * @param renameView rename view + */ + public void setRenameView(final SimpleTableSegment renameView) { + } + /** * Get constraint definition. * @@ -70,4 +94,12 @@ public Optional getRenameView() { public Optional getConstraintDefinition() { return Optional.empty(); } + + /** + * Get constraint definition. + * + * @param constraintDefinition constraint definition + */ + public void setConstraintDefinition(final ConstraintDefinitionSegment constraintDefinition) { + } } diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java index 989b20fafe641..9922da33dc408 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java @@ -35,7 +35,7 @@ public final class DorisAlterViewStatement extends AlterViewStatement implements private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java index e39847195e862..e7382e3dadeef 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java @@ -35,7 +35,7 @@ public final class MySQLAlterViewStatement extends AlterViewStatement implements private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java index 88211af3f58f8..dbe144a505c20 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java @@ -35,7 +35,7 @@ public final class SQLServerAlterViewStatement extends AlterViewStatement implem private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java index 657bc809b5384..5a2fa8de9f90a 100644 --- a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java @@ -130,6 +130,13 @@ private Collection mockFooDB1Tables() { new ShardingSphereColumn("business_code", Types.VARCHAR, false, false, false, true, false, false), new ShardingSphereColumn("telephone", Types.CHAR, false, false, false, true, false, false), new ShardingSphereColumn("creation_date", Types.DATE, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); + result.add(new ShardingSphereTable("t_order_view", Arrays.asList( + new ShardingSphereColumn("order_id", Types.BIGINT, true, false, false, true, false, false), + new ShardingSphereColumn("user_id", Types.INTEGER, false, false, false, true, false, false), + new ShardingSphereColumn("status", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("merchant_id", Types.INTEGER, false, false, false, true, false, true), + new ShardingSphereColumn("remark", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("creation_date", Types.DATE, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); return result; } diff --git a/test/it/binder/src/test/resources/cases/ddl/alter-view.xml b/test/it/binder/src/test/resources/cases/ddl/alter-view.xml new file mode 100644 index 0000000000000..b35529ede6326 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/alter-view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/create-view.xml b/test/it/binder/src/test/resources/cases/ddl/create-view.xml new file mode 100644 index 0000000000000..62682e07a1fcd --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/create-view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml index 73f8237cc432a..37e3d1e976484 100644 --- a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml +++ b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml @@ -26,6 +26,7 @@ + @@ -35,6 +36,7 @@
+ diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-view.xml b/test/it/binder/src/test/resources/cases/ddl/drop-view.xml new file mode 100644 index 0000000000000..ba9d8a9227f52 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-view.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml b/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml new file mode 100644 index 0000000000000..8cd292f6cad31 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-view.xml b/test/it/binder/src/test/resources/sqls/ddl/create-view.xml new file mode 100644 index 0000000000000..922a64857e1bb --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/create-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml new file mode 100644 index 0000000000000..6c003b3bcfeb7 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java index dabfc8ca361d7..b3fb97249681e 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java @@ -70,10 +70,10 @@ private static void assertViewDefinition(final SQLCaseAssertContext assertContex private static void assertSelect(final SQLCaseAssertContext assertContext, final AlterViewStatement actual, final AlterViewStatementTestCase expected) { if (null == expected.getSelectStatement()) { - assertFalse(actual.getSelectStatement().isPresent(), "actual select statement should not exist"); + assertFalse(actual.getSelect().isPresent(), "actual select statement should not exist"); } else { - assertTrue(actual.getSelectStatement().isPresent(), "actual select statement should exist"); - SelectStatementAssert.assertIs(assertContext, actual.getSelectStatement().get(), expected.getSelectStatement()); + assertTrue(actual.getSelect().isPresent(), "actual select statement should exist"); + SelectStatementAssert.assertIs(assertContext, actual.getSelect().get(), expected.getSelectStatement()); } } diff --git a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml index c277252794350..b4d2b8de0fed3 100644 --- a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml +++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml @@ -99,7 +99,7 @@ - + From 64cc7af869315d3e49c3d5de94c60a4be57c8009 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 27 Dec 2024 10:15:07 +0800 Subject: [PATCH 157/192] Add transaction executor for driver to handle TCL statements (#34173) * Add transaction executor for driver to handle TCL statements * Add transaction executor for driver to handle TCL statements * Add transaction executor for driver to handle TCL statements --- RELEASE-NOTES.md | 1 + .../TablelessRouteEngineFactory.java | 2 +- .../engine/DriverExecuteExecutor.java | 11 ++- .../engine/facade/DriverExecutorFacade.java | 6 +- ...DriverTransactionSQLStatementExecutor.java | 85 +++++++++++++++++++ 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/transaction/DriverTransactionSQLStatementExecutor.java diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 943a601cf47c0..37de7afcafb9c 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -45,6 +45,7 @@ 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) 1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) +1. Transaction: Support savepoint/release savepoint TCL statements in jdbc adapter -[#34173](https://github.com/apache/shardingsphere/pull/34173) ### Bug Fixes diff --git a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java index c133e01f69021..0d39734c0d966 100644 --- a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java +++ b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java @@ -74,7 +74,7 @@ public static TablelessRouteEngine newInstance(final QueryContext queryContext, if (sqlStatement instanceof DALStatement) { return getDALRouteEngine(sqlStatement, database); } - // TODO remove this logic when savepoint handle in proxy and jdbc adapter @zhangcheng + // TODO Support more TCL statements by transaction module, then remove this. if (sqlStatement instanceof TCLStatement) { return new TablelessDataSourceBroadcastRouteEngine(); } diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java index c13341e1a925e..3ee2c70fc3da7 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecuteExecutor.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.driver.executor.callback.replay.StatementReplayCallback; import org.apache.shardingsphere.driver.executor.engine.pushdown.jdbc.DriverJDBCPushDownExecuteExecutor; import org.apache.shardingsphere.driver.executor.engine.pushdown.raw.DriverRawPushDownExecuteExecutor; +import org.apache.shardingsphere.driver.executor.engine.transaction.DriverTransactionSQLStatementExecutor; import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.connection.kernel.KernelProcessor; @@ -37,6 +38,7 @@ import org.apache.shardingsphere.infra.rule.attribute.raw.RawExecutionRuleAttribute; import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefreshEngine; +import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement; import org.apache.shardingsphere.sqlfederation.engine.SQLFederationEngine; import org.apache.shardingsphere.sqlfederation.executor.context.SQLFederationContext; @@ -63,15 +65,19 @@ public final class DriverExecuteExecutor { private final SQLFederationEngine sqlFederationEngine; + private final DriverTransactionSQLStatementExecutor transactionExecutor; + private ExecuteType executeType; public DriverExecuteExecutor(final ShardingSphereConnection connection, final ShardingSphereMetaData metaData, - final JDBCExecutor jdbcExecutor, final RawExecutor rawExecutor, final SQLFederationEngine sqlFederationEngine) { + final JDBCExecutor jdbcExecutor, final RawExecutor rawExecutor, final SQLFederationEngine sqlFederationEngine, + final DriverTransactionSQLStatementExecutor transactionExecutor) { this.connection = connection; this.metaData = metaData; jdbcPushDownExecutor = new DriverJDBCPushDownExecuteExecutor(connection, metaData, jdbcExecutor); rawPushDownExecutor = new DriverRawPushDownExecuteExecutor(connection, metaData, rawExecutor); this.sqlFederationEngine = sqlFederationEngine; + this.transactionExecutor = transactionExecutor; } /** @@ -100,6 +106,9 @@ public boolean execute(final ShardingSphereDatabase database, final QueryContext metaDataRefreshEngine.refresh(queryContext.getSqlStatementContext()); return true; } + if (transactionExecutor.decide(queryContext)) { + return transactionExecutor.execute((TCLStatement) queryContext.getSqlStatementContext().getSqlStatement()); + } ExecutionContext executionContext = new KernelProcessor().generateExecutionContext(queryContext, metaData.getGlobalRuleMetaData(), metaData.getProps()); return executePushDown(database, executionContext, prepareEngine, executeCallback, addCallback, replayCallback); diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java index 8301aef3b9b52..3a193e562737b 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/facade/DriverExecutorFacade.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.driver.executor.engine.DriverExecuteExecutor; import org.apache.shardingsphere.driver.executor.engine.DriverExecuteQueryExecutor; import org.apache.shardingsphere.driver.executor.engine.DriverExecuteUpdateExecutor; +import org.apache.shardingsphere.driver.executor.engine.transaction.DriverTransactionSQLStatementExecutor; import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection; import org.apache.shardingsphere.driver.jdbc.core.statement.StatementManager; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; @@ -63,6 +64,8 @@ public final class DriverExecutorFacade implements AutoCloseable { private final SQLFederationEngine sqlFederationEngine; + private final DriverTransactionSQLStatementExecutor transactionExecutor; + private final DriverExecuteQueryExecutor queryExecutor; private final DriverExecuteUpdateExecutor updateExecutor; @@ -79,10 +82,11 @@ public DriverExecutorFacade(final ShardingSphereConnection connection, final Sta String currentSchemaName = new DatabaseTypeRegistry(metaData.getDatabase(connection.getCurrentDatabaseName()).getProtocolType()).getDefaultSchemaName(connection.getCurrentDatabaseName()); sqlFederationEngine = new SQLFederationEngine(connection.getCurrentDatabaseName(), currentSchemaName, metaData, connection.getContextManager().getMetaDataContexts().getStatistics(), jdbcExecutor); + transactionExecutor = new DriverTransactionSQLStatementExecutor(connection); RawExecutor rawExecutor = new RawExecutor(connection.getContextManager().getExecutorEngine(), connection.getDatabaseConnectionManager().getConnectionContext()); queryExecutor = new DriverExecuteQueryExecutor(connection, metaData, jdbcExecutor, rawExecutor, sqlFederationEngine); updateExecutor = new DriverExecuteUpdateExecutor(connection, metaData, jdbcExecutor, rawExecutor); - executeExecutor = new DriverExecuteExecutor(connection, metaData, jdbcExecutor, rawExecutor, sqlFederationEngine); + executeExecutor = new DriverExecuteExecutor(connection, metaData, jdbcExecutor, rawExecutor, sqlFederationEngine, transactionExecutor); } /** diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/transaction/DriverTransactionSQLStatementExecutor.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/transaction/DriverTransactionSQLStatementExecutor.java new file mode 100644 index 0000000000000..1c15a8047aeb6 --- /dev/null +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/transaction/DriverTransactionSQLStatementExecutor.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.driver.executor.engine.transaction; + +import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection; +import org.apache.shardingsphere.driver.jdbc.core.savepoint.ShardingSphereSavepoint; +import org.apache.shardingsphere.infra.session.query.QueryContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.ReleaseSavepointStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SavepointStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement; +import org.apache.shardingsphere.transaction.core.TransactionOperationType; + +import java.sql.SQLException; + +/** + * Driver transaction statement executor. + */ +public final class DriverTransactionSQLStatementExecutor { + + private final ShardingSphereConnection connection; + + private TransactionOperationType operationType; + + public DriverTransactionSQLStatementExecutor(final ShardingSphereConnection connection) { + this.connection = connection; + } + + /** + * Decide whether to execute TCL statement. + * + * @param queryContext query context + * @return whether to execute TCL statement or not + */ + public boolean decide(final QueryContext queryContext) { + if (!(queryContext.getSqlStatementContext().getSqlStatement() instanceof TCLStatement)) { + return false; + } + TCLStatement tclStatement = (TCLStatement) queryContext.getSqlStatementContext().getSqlStatement(); + if (tclStatement instanceof SavepointStatement) { + operationType = TransactionOperationType.SAVEPOINT; + return true; + } + if (tclStatement instanceof ReleaseSavepointStatement) { + operationType = TransactionOperationType.RELEASE_SAVEPOINT; + return true; + } + // TODO support more TCL statements + return false; + } + + /** + * Execute TCL statement. + * + * @param tclStatement SQL statement + * @return whether to execute TCL statement or not + * @throws SQLException SQL exception + */ + public boolean execute(final TCLStatement tclStatement) throws SQLException { + if (TransactionOperationType.SAVEPOINT == operationType) { + connection.setSavepoint(((SavepointStatement) tclStatement).getSavepointName()); + return true; + } + if (TransactionOperationType.RELEASE_SAVEPOINT == operationType) { + ShardingSphereSavepoint savepoint = new ShardingSphereSavepoint(((ReleaseSavepointStatement) tclStatement).getSavepointName()); + connection.releaseSavepoint(savepoint); + return true; + } + return false; + } +} From 39a58578787fa4cc9a2aeac339ee333b3941da9d Mon Sep 17 00:00:00 2001 From: jiangML <1060319118@qq.com> Date: Fri, 27 Dec 2024 10:19:00 +0800 Subject: [PATCH 158/192] Optimize DatabaseExportMetaDataGenerator, null value properties are not exported (#34166) * Optimize DatabaseExportMetaDataGenerator, null value properties are not exported * Fix test error * Fix test error * Fix test error --- .../util/DatabaseExportMetaDataGenerator.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java index 570e9f9694416..c0eb39fc3bcf5 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java @@ -71,12 +71,16 @@ private void appendDataSourceConfigurations(final ShardingSphereDatabase databas private void appendDataSourceConfiguration(final String dataSourceName, final DataSourcePoolProperties props, final StringBuilder stringBuilder) { stringBuilder.append(createIndentation(2)).append(dataSourceName).append(':').append(System.lineSeparator()); for (Entry entry : props.getConnectionPropertySynonyms().getStandardProperties().entrySet()) { - String value = null == entry.getValue() ? "" : entry.getValue().toString(); - stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + if (null != entry.getValue()) { + String value = entry.getValue().toString(); + stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + } } for (Entry entry : props.getPoolPropertySynonyms().getStandardProperties().entrySet()) { - String value = null == entry.getValue() ? "" : entry.getValue().toString(); - stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + if (null != entry.getValue()) { + String value = entry.getValue().toString(); + stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(": ").append(value).append(System.lineSeparator()); + } } } From bd99347c129842546cddbd2aa98c75dcccc55b68 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 27 Dec 2024 13:39:51 +0800 Subject: [PATCH 159/192] Move multiple logic database check to QueryContext (#34174) * Move multiple logic database check to QueryContext * fix unit test * fix unit test * fix unit test * fix pipeline error --- .../context/segment/table/TablesContext.java | 2 -- .../segment/table/TablesContextTest.java | 19 ------------- .../sql/process/ProcessEngineTest.java | 2 -- .../infra/session/query/QueryContext.java | 28 +++++++++++++------ .../backend/session/ConnectionSession.java | 2 +- .../OpenGaussComBatchBindExecutorTest.java | 2 -- 6 files changed, 20 insertions(+), 35 deletions(-) diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java index b274f0d8eaa05..d7804d9e06a9a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContext.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.infra.binder.context.segment.table; import com.cedarsoftware.util.CaseInsensitiveSet; -import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.Getter; import lombok.ToString; @@ -110,7 +109,6 @@ private Map> createSubqueryTables(final * @return database name */ public Optional getDatabaseName() { - Preconditions.checkState(databaseNames.size() <= 1, "Can not support multiple different database."); return databaseNames.isEmpty() ? Optional.empty() : Optional.of(databaseNames.iterator().next()); } diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java index 20fd15c36b2ff..d0510d024d660 100644 --- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java +++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/table/TablesContextTest.java @@ -33,7 +33,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -99,24 +98,6 @@ void assertGetSchemaNameWithSameSchemaAndDifferentTable() { assertThat(tablesContext.getDatabaseName().get(), is("sharding_db_1")); } - @Test - void assertGetSchemaNameWithDifferentSchemaAndSameTable() { - SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - tableSegment1.setOwner(new OwnerSegment(0, 0, new IdentifierValue("sharding_db_1"))); - SimpleTableSegment tableSegment2 = createTableSegment("table_1", "tbl_1", "sharding_db_2"); - tableSegment2.setOwner(new OwnerSegment(0, 0, new IdentifierValue("sharding_db_2"))); - assertThrows(IllegalStateException.class, () -> new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).getDatabaseName()); - } - - @Test - void assertGetSchemaNameWithDifferentSchemaAndDifferentTable() { - SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); - tableSegment1.setOwner(new OwnerSegment(0, 0, new IdentifierValue("sharding_db_1"))); - SimpleTableSegment tableSegment2 = createTableSegment("table_2", "tbl_2", "sharding_db_2"); - tableSegment2.setOwner(new OwnerSegment(0, 0, new IdentifierValue("sharding_db_2"))); - assertThrows(IllegalStateException.class, () -> new TablesContext(Arrays.asList(tableSegment1, tableSegment2)).getDatabaseName()); - } - @Test void assertGetSchemaName() { SimpleTableSegment tableSegment1 = createTableSegment("table_1", "tbl_1", "sharding_db_1"); diff --git a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java index 88450ae0fbd8e..79f01bd8481be 100644 --- a/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java +++ b/infra/executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessEngineTest.java @@ -39,7 +39,6 @@ import org.mockito.Mock; import java.util.Collections; -import java.util.Optional; import java.util.UUID; import static org.mockito.ArgumentMatchers.any; @@ -62,7 +61,6 @@ void setUp() { @Test void assertExecuteSQL() { ConnectionContext connectionContext = mock(ConnectionContext.class); - when(connectionContext.getCurrentDatabaseName()).thenReturn(Optional.of("foo_db")); ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class); ExecutionGroupContext executionGroupContext = mockExecutionGroupContext(); new ProcessEngine().executeSQL(executionGroupContext, diff --git a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java index cf092c7cd59ea..aee2d8fe593cc 100644 --- a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java +++ b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java @@ -17,17 +17,20 @@ package org.apache.shardingsphere.infra.session.query; +import com.google.common.base.Joiner; import lombok.Getter; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; -import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException; +import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -48,7 +51,7 @@ public final class QueryContext { private final ShardingSphereMetaData metaData; - private final String usedDatabaseName; + private final Collection usedDatabaseNames; private final boolean useCache; @@ -65,15 +68,20 @@ public QueryContext(final SQLStatementContext sqlStatementContext, final String this.hintValueContext = hintValueContext; this.connectionContext = connectionContext; this.metaData = metaData; - usedDatabaseName = findUsedDatabaseNameFromSQLStatement(sqlStatementContext, connectionContext); + usedDatabaseNames = getUsedDatabaseNames(sqlStatementContext, connectionContext); this.useCache = useCache; } - private String findUsedDatabaseNameFromSQLStatement(final SQLStatementContext sqlStatementContext, final ConnectionContext connectionContext) { + private Collection getUsedDatabaseNames(final SQLStatementContext sqlStatementContext, final ConnectionContext connectionContext) { if (sqlStatementContext instanceof TableAvailable) { - return ((TableAvailable) sqlStatementContext).getTablesContext().getDatabaseName().orElse(connectionContext.getCurrentDatabaseName().orElse(null)); + Collection result = ((TableAvailable) sqlStatementContext).getTablesContext().getDatabaseNames(); + return result.isEmpty() ? getCurrentDatabaseNames(connectionContext) : result; } - return connectionContext.getCurrentDatabaseName().orElse(null); + return getCurrentDatabaseNames(connectionContext); + } + + private Collection getCurrentDatabaseNames(final ConnectionContext connectionContext) { + return connectionContext.getCurrentDatabaseName().isPresent() ? Collections.singleton(connectionContext.getCurrentDatabaseName().get()) : Collections.emptyList(); } /** @@ -82,8 +90,10 @@ private String findUsedDatabaseNameFromSQLStatement(final SQLStatementContext sq * @return used database */ public ShardingSphereDatabase getUsedDatabase() { - ShardingSpherePreconditions.checkNotNull(usedDatabaseName, NoDatabaseSelectedException::new); - ShardingSpherePreconditions.checkState(metaData.containsDatabase(usedDatabaseName), () -> new UnknownDatabaseException(usedDatabaseName)); - return metaData.getDatabase(usedDatabaseName); + ShardingSpherePreconditions.checkState(usedDatabaseNames.size() <= 1, + () -> new UnsupportedSQLOperationException(String.format("Can not support multiple logic databases [%s]", Joiner.on(", ").join(usedDatabaseNames)))); + String databaseName = usedDatabaseNames.iterator().next(); + ShardingSpherePreconditions.checkState(metaData.containsDatabase(databaseName), () -> new UnknownDatabaseException(databaseName)); + return metaData.getDatabase(databaseName); } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java index 636c0ccdc8d8b..1ea9963767650 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSession.java @@ -119,7 +119,7 @@ public ConnectionContext getConnectionContext() { * @return used database name */ public String getUsedDatabaseName() { - return null == queryContext ? currentDatabaseName : queryContext.getUsedDatabaseName(); + return null == queryContext || queryContext.getUsedDatabaseNames().isEmpty() ? currentDatabaseName : queryContext.getUsedDatabaseNames().iterator().next(); } /** diff --git a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java index 88f942dd632c0..ea5629c58c348 100644 --- a/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java +++ b/proxy/frontend/type/opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java @@ -62,7 +62,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; -import java.util.Optional; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; @@ -124,7 +123,6 @@ private ConnectionSession mockConnectionSession() throws SQLException { private ConnectionContext mockConnectionContext() { ConnectionContext result = mock(ConnectionContext.class); - when(result.getCurrentDatabaseName()).thenReturn(Optional.of("foo_db")); when(result.getTransactionContext()).thenReturn(mock(TransactionConnectionContext.class)); return result; } From 5736aab5bdfa1b344db4f5f02a8d7616fe5a5fd8 Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 27 Dec 2024 13:40:13 +0800 Subject: [PATCH 160/192] Add WithAvailable interface and encrypt with, combine, insert select support checker (#34175) * Add WithAvailable interface and encrypt with support checker * Add combine and insert select checker * update release note and doc * remove unsupported test case --- RELEASE-NOTES.md | 1 + .../content/features/encrypt/appendix.cn.md | 2 + .../content/features/encrypt/appendix.en.md | 2 + .../EncryptSupportedSQLCheckersBuilder.java | 8 ++- .../EncryptCombineClauseSupportedChecker.java | 63 +++++++++++++++++ .../EncryptInsertSelectSupportedChecker.java | 51 ++++++++++++++ .../EncryptWithClauseSupportedChecker.java | 51 ++++++++++++++ ...ryptCombineClauseSupportedCheckerTest.java | 67 +++++++++++++++++++ ...cryptInsertSelectSupportedCheckerTest.java | 67 +++++++++++++++++++ ...EncryptWithClauseSupportedCheckerTest.java | 67 +++++++++++++++++++ .../statement/dml/DeleteStatementContext.java | 14 +++- .../statement/dml/InsertStatementContext.java | 9 ++- .../statement/dml/SelectStatementContext.java | 19 ++++-- .../statement/dml/UpdateStatementContext.java | 10 ++- .../binder/context/type/WithAvailable.java | 35 ++++++++++ .../encrypt/insert_select_user_table.xml | 60 ----------------- .../tbl/batch_insert_all_into_order_table.xml | 48 ------------- .../batch_insert_into_order_with_select.xml | 51 -------------- .../insert_into_order_table_with_select.xml | 50 -------------- .../resources/cases/dml/e2e-dml-insert.xml | 18 +---- 20 files changed, 455 insertions(+), 238 deletions(-) create mode 100644 features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedChecker.java create mode 100644 features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedChecker.java create mode 100644 features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedChecker.java create mode 100644 features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedCheckerTest.java create mode 100644 features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedCheckerTest.java create mode 100644 features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedCheckerTest.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/type/WithAvailable.java delete mode 100644 test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml delete mode 100644 test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_all_into_order_table.xml delete mode 100644 test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_into_order_with_select.xml delete mode 100644 test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/insert_into_order_table_with_select.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 37de7afcafb9c..09a9827742982 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -46,6 +46,7 @@ 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) 1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) 1. Transaction: Support savepoint/release savepoint TCL statements in jdbc adapter -[#34173](https://github.com/apache/shardingsphere/pull/34173) +1. Kernel: Add WithAvailable interface and encrypt with, combine, insert select support checker - [#34175](https://github.com/apache/shardingsphere/pull/34175) ### Bug Fixes diff --git a/docs/document/content/features/encrypt/appendix.cn.md b/docs/document/content/features/encrypt/appendix.cn.md index 43adc4bce47f0..c1ab43bb03dff 100644 --- a/docs/document/content/features/encrypt/appendix.cn.md +++ b/docs/document/content/features/encrypt/appendix.cn.md @@ -9,6 +9,8 @@ weight = 3 - 加密字段无法支持比较操作,如:大于、小于、ORDER BY、BETWEEN 等; - 加密字段无法支持计算操作,如:AVG、SUM 以及计算表达式; - 不支持子查询中包含加密字段,并且外层投影使用星号的 SQL; +- 不支持 WITH 语句中包含加密列; +- 不支持 INSERT SELECT 语句中包含加密列; - 不支持 UNION、INTERSECT、EXCEPT 等集合运算语句中包含加密列。 其他: diff --git a/docs/document/content/features/encrypt/appendix.en.md b/docs/document/content/features/encrypt/appendix.en.md index a729ee62cc496..e347d56a0e434 100644 --- a/docs/document/content/features/encrypt/appendix.en.md +++ b/docs/document/content/features/encrypt/appendix.en.md @@ -9,6 +9,8 @@ Unsupported SQL: - Comparison operations are not supported for encrypted fields, such as GREATER THAN, LESS THAN, ORDER BY, BETWEEN. - Calculation operations are not supported for encrypted fields, such as AVG, SUM, and computation expressions. - SQL that contains encrypt column in subquery and uses asterisks for outer projection is not supported. +- SQL that contains encrypt column in WITH is not supported. +- SQL that contains encrypt column in INSERT SELECT is not supported. - SQL that contains encrypt column in UNION, INTERSECT, and EXCEPT statements is not supported. Other: diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java index fce03c66f1094..a74b1d0c64d45 100644 --- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptSupportedSQLCheckersBuilder.java @@ -17,10 +17,13 @@ package org.apache.shardingsphere.encrypt.checker.sql; +import org.apache.shardingsphere.encrypt.checker.sql.combine.EncryptCombineClauseSupportedChecker; +import org.apache.shardingsphere.encrypt.checker.sql.insert.EncryptInsertSelectSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.orderby.EncryptOrderByItemSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.predicate.EncryptPredicateColumnSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptInsertSelectProjectionSupportedChecker; import org.apache.shardingsphere.encrypt.checker.sql.projection.EncryptSelectProjectionSupportedChecker; +import org.apache.shardingsphere.encrypt.checker.sql.with.EncryptWithClauseSupportedChecker; import org.apache.shardingsphere.encrypt.constant.EncryptOrder; import org.apache.shardingsphere.encrypt.rule.EncryptRule; import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; @@ -40,7 +43,10 @@ public Collection> getSupportedSQLCheckers() new EncryptSelectProjectionSupportedChecker(), new EncryptInsertSelectProjectionSupportedChecker(), new EncryptPredicateColumnSupportedChecker(), - new EncryptOrderByItemSupportedChecker()); + new EncryptOrderByItemSupportedChecker(), + new EncryptWithClauseSupportedChecker(), + new EncryptCombineClauseSupportedChecker(), + new EncryptInsertSelectSupportedChecker()); } @Override diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedChecker.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedChecker.java new file mode 100644 index 0000000000000..d1ae2995bfb35 --- /dev/null +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedChecker.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.combine; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; +import org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; +import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; + +import java.util.Collection; + +/** + * Combine clause supported checker for encrypt. + */ +@HighFrequencyInvocation +public final class EncryptCombineClauseSupportedChecker implements SupportedSQLChecker { + + @Override + public boolean isCheck(final SQLStatementContext sqlStatementContext) { + if (isContainsCombine(sqlStatementContext)) { + return true; + } + for (SelectStatementContext each : SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext)) { + if (isContainsCombine(each)) { + return true; + } + } + return false; + } + + private static boolean isContainsCombine(final SQLStatementContext sqlStatementContext) { + return sqlStatementContext instanceof SelectStatementContext && ((SelectStatementContext) sqlStatementContext).isContainsCombine(); + } + + @Override + public void check(final EncryptRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final SQLStatementContext sqlStatementContext) { + Collection tableNames = SQLStatementContextExtractor.getTableNames(database, sqlStatementContext); + for (String each : tableNames) { + ShardingSpherePreconditions.checkState(!rule.findEncryptTable(each).isPresent(), () -> new UnsupportedEncryptSQLException("COMBINE")); + } + } +} diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedChecker.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedChecker.java new file mode 100644 index 0000000000000..a5746d2e3fac6 --- /dev/null +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedChecker.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.insert; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; +import org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext; +import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; + +import java.util.Collection; + +/** + * Insert select supported checker for encrypt. + */ +@HighFrequencyInvocation +public final class EncryptInsertSelectSupportedChecker implements SupportedSQLChecker { + + @Override + public boolean isCheck(final SQLStatementContext sqlStatementContext) { + return sqlStatementContext instanceof InsertStatementContext && ((InsertStatementContext) sqlStatementContext).getSqlStatement().getInsertSelect().isPresent(); + } + + @Override + public void check(final EncryptRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final InsertStatementContext sqlStatementContext) { + Collection tableNames = SQLStatementContextExtractor.getTableNames(database, sqlStatementContext); + for (String each : tableNames) { + ShardingSpherePreconditions.checkState(!rule.findEncryptTable(each).isPresent(), () -> new UnsupportedEncryptSQLException("INSERT ... SELECT ...")); + } + } +} diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedChecker.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedChecker.java new file mode 100644 index 0000000000000..7b0687eeaf4b9 --- /dev/null +++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedChecker.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.with; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rule.EncryptRule; +import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation; +import org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.type.WithAvailable; +import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; +import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; + +import java.util.Collection; + +/** + * With clause supported checker for encrypt. + */ +@HighFrequencyInvocation +public final class EncryptWithClauseSupportedChecker implements SupportedSQLChecker { + + @Override + public boolean isCheck(final SQLStatementContext sqlStatementContext) { + return sqlStatementContext instanceof WithAvailable && ((WithAvailable) sqlStatementContext).getWith().isPresent(); + } + + @Override + public void check(final EncryptRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final SQLStatementContext sqlStatementContext) { + Collection tableNames = SQLStatementContextExtractor.getTableNames(database, sqlStatementContext); + for (String each : tableNames) { + ShardingSpherePreconditions.checkState(!rule.findEncryptTable(each).isPresent(), () -> new UnsupportedEncryptSQLException("WITH")); + } + } +} diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedCheckerTest.java new file mode 100644 index 0000000000000..58b5bbe032d9c --- /dev/null +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/combine/EncryptCombineClauseSupportedCheckerTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.combine; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rewrite.token.generator.fixture.EncryptGeneratorFixtureBuilder; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +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.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class EncryptCombineClauseSupportedCheckerTest { + + @Test + void assertIsCheck() { + SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); + when(sqlStatementContext.isContainsCombine()).thenReturn(true); + assertTrue(new EncryptCombineClauseSupportedChecker().isCheck(sqlStatementContext)); + } + + @Test + void assertIsCheckWithoutCombineClause() { + assertFalse(new EncryptCombineClauseSupportedChecker().isCheck(mock(SQLStatementContext.class))); + } + + @Test + void assertCheckWithoutEncryptTable() { + assertDoesNotThrow(() -> new EncryptCombineClauseSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockSelectStatementContext("t_order"))); + } + + @Test + void assertCheckWithEncryptTable() { + assertThrows(UnsupportedEncryptSQLException.class, () -> new EncryptCombineClauseSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockSelectStatementContext("t_user"))); + } + + private SQLStatementContext mockSelectStatementContext(final String tableName) { + SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); + when(result.getTablesContext().getTableNames()).thenReturn(Collections.singleton(tableName)); + return result; + } +} diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedCheckerTest.java new file mode 100644 index 0000000000000..fc3dd9beb83c5 --- /dev/null +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/insert/EncryptInsertSelectSupportedCheckerTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.insert; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rewrite.token.generator.fixture.EncryptGeneratorFixtureBuilder; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +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.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class EncryptInsertSelectSupportedCheckerTest { + + @Test + void assertIsCheck() { + InsertStatementContext sqlStatementContext = mock(InsertStatementContext.class, RETURNS_DEEP_STUBS); + when(sqlStatementContext.getSqlStatement().getInsertSelect().isPresent()).thenReturn(true); + assertTrue(new EncryptInsertSelectSupportedChecker().isCheck(sqlStatementContext)); + } + + @Test + void assertIsCheckWithoutCombineClause() { + assertFalse(new EncryptInsertSelectSupportedChecker().isCheck(mock(SQLStatementContext.class))); + } + + @Test + void assertCheckWithoutEncryptTable() { + assertDoesNotThrow(() -> new EncryptInsertSelectSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockInsertStatementContext("t_order"))); + } + + @Test + void assertCheckWithEncryptTable() { + assertThrows(UnsupportedEncryptSQLException.class, () -> new EncryptInsertSelectSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockInsertStatementContext("t_user"))); + } + + private InsertStatementContext mockInsertStatementContext(final String tableName) { + InsertStatementContext result = mock(InsertStatementContext.class, RETURNS_DEEP_STUBS); + when(result.getTablesContext().getTableNames()).thenReturn(Collections.singleton(tableName)); + return result; + } +} diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedCheckerTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedCheckerTest.java new file mode 100644 index 0000000000000..31489bebfc470 --- /dev/null +++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/with/EncryptWithClauseSupportedCheckerTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.encrypt.checker.sql.with; + +import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLException; +import org.apache.shardingsphere.encrypt.rewrite.token.generator.fixture.EncryptGeneratorFixtureBuilder; +import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +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.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class EncryptWithClauseSupportedCheckerTest { + + @Test + void assertIsCheck() { + SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); + when(sqlStatementContext.getWith().isPresent()).thenReturn(true); + assertTrue(new EncryptWithClauseSupportedChecker().isCheck(sqlStatementContext)); + } + + @Test + void assertIsCheckWithoutWithAvailable() { + assertFalse(new EncryptWithClauseSupportedChecker().isCheck(mock(SQLStatementContext.class))); + } + + @Test + void assertCheckWithoutEncryptTable() { + assertDoesNotThrow(() -> new EncryptWithClauseSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockSelectStatementContext("t_order"))); + } + + @Test + void assertCheckWithEncryptTable() { + assertThrows(UnsupportedEncryptSQLException.class, () -> new EncryptWithClauseSupportedChecker() + .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), null, null, mockSelectStatementContext("t_user"))); + } + + private SQLStatementContext mockSelectStatementContext(final String tableName) { + SelectStatementContext result = mock(SelectStatementContext.class, RETURNS_DEEP_STUBS); + when(result.getTablesContext().getTableNames()).thenReturn(Collections.singleton(tableName)); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java index d5a01ab9b1eb8..a7bdfb95a387e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/DeleteStatementContext.java @@ -22,25 +22,28 @@ import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; +import org.apache.shardingsphere.infra.binder.context.type.WithAvailable; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DeleteStatement; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; +import java.util.Optional; /** * Delete statement context. */ @Getter -public final class DeleteStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable { +public final class DeleteStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable, WithAvailable { private final TablesContext tablesContext; @@ -103,4 +106,9 @@ public Collection getColumnSegments() { public Collection getJoinConditions() { return joinConditions; } + + @Override + public Optional getWith() { + return getSqlStatement().getWithSegment(); + } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java index 4b8de3e31b5e6..a2a30fbea340a 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java @@ -29,6 +29,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; +import org.apache.shardingsphere.infra.binder.context.type.WithAvailable; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException; @@ -48,6 +49,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement; @@ -65,7 +67,7 @@ /** * Insert SQL statement context. */ -public final class InsertStatementContext extends CommonSQLStatementContext implements TableAvailable, ParameterAware, WhereAvailable { +public final class InsertStatementContext extends CommonSQLStatementContext implements TableAvailable, ParameterAware, WhereAvailable, WithAvailable { private final ShardingSphereMetaData metaData; @@ -331,4 +333,9 @@ public Collection getColumnSegments() { public Collection getJoinConditions() { return null == insertSelectContext ? Collections.emptyList() : insertSelectContext.getSelectStatementContext().getJoinConditions(); } + + @Override + public Optional getWith() { + return getSqlStatement().getWithSegment(); + } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java index 36d9a28221d11..455401038778d 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/SelectStatementContext.java @@ -40,6 +40,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; +import org.apache.shardingsphere.infra.binder.context.type.WithAvailable; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException; @@ -48,6 +49,11 @@ import org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute; import org.apache.shardingsphere.sql.parser.statement.core.enums.ParameterMarkerType; import org.apache.shardingsphere.sql.parser.statement.core.enums.SubqueryType; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.SubqueryExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.WhereExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment; @@ -59,17 +65,13 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.TextOrderByItemSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.JoinTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SubqueryTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.util.SQLUtils; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.SubqueryExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.WhereExtractor; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; @@ -86,7 +88,7 @@ */ @Getter @Setter -public final class SelectStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable, ParameterAware { +public final class SelectStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable, ParameterAware, WithAvailable { private final TablesContext tablesContext; @@ -419,4 +421,9 @@ public Collection getJoinConditions() { public void setUpParameters(final List params) { paginationContext = new PaginationContextEngine(getDatabaseType()).createPaginationContext(getSqlStatement(), projectionsContext, params, whereSegments); } + + @Override + public Optional getWith() { + return getSqlStatement().getWithSegment(); + } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java index b8f1ad79bdcf4..999c576a55885 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/UpdateStatementContext.java @@ -22,23 +22,26 @@ import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; import org.apache.shardingsphere.infra.binder.context.type.TableAvailable; import org.apache.shardingsphere.infra.binder.context.type.WhereAvailable; +import org.apache.shardingsphere.infra.binder.context.type.WithAvailable; import org.apache.shardingsphere.sql.parser.statement.core.extractor.ColumnExtractor; import org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor; import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression; import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; import java.util.Collection; import java.util.LinkedList; +import java.util.Optional; /** * Update SQL statement context. */ @Getter -public final class UpdateStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable { +public final class UpdateStatementContext extends CommonSQLStatementContext implements TableAvailable, WhereAvailable, WithAvailable { private final TablesContext tablesContext; @@ -76,4 +79,9 @@ public Collection getWhereSegments() { public Collection getColumnSegments() { return columnSegments; } + + @Override + public Optional getWith() { + return getSqlStatement().getWithSegment(); + } } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/type/WithAvailable.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/type/WithAvailable.java new file mode 100644 index 0000000000000..310c7b1380a0f --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/type/WithAvailable.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.context.type; + +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment; + +import java.util.Optional; + +/** + * With available. + */ +public interface WithAvailable { + + /** + * Get with segement. + * + * @return with segement + */ + Optional getWith(); +} diff --git a/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml b/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml deleted file mode 100644 index f6b7dd5e98afd..0000000000000 --- a/test/e2e/sql/src/test/resources/cases/dml/dataset/encrypt/insert_select_user_table.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_all_into_order_table.xml b/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_all_into_order_table.xml deleted file mode 100644 index 0d828f0bbef01..0000000000000 --- a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_all_into_order_table.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_into_order_with_select.xml b/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_into_order_with_select.xml deleted file mode 100644 index 2b8e29be71af8..0000000000000 --- a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/batch_insert_into_order_with_select.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/insert_into_order_table_with_select.xml b/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/insert_into_order_table_with_select.xml deleted file mode 100644 index 829a818245586..0000000000000 --- a/test/e2e/sql/src/test/resources/cases/dml/dataset/tbl/insert_into_order_table_with_select.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml b/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml index 6e7f7a24d3cdc..d3a30fe3a08b3 100644 --- a/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml +++ b/test/e2e/sql/src/test/resources/cases/dml/e2e-dml-insert.xml @@ -93,26 +93,10 @@ - - - - - - - - - - - - - - - - - + From 428af0d11cc8442817bebbc1896987757509f36b Mon Sep 17 00:00:00 2001 From: cccchen <385558455@qq.com> Date: Fri, 27 Dec 2024 14:09:09 +0800 Subject: [PATCH 161/192] Add lock timeout in DistSQL LOCK CLUSTER WITH lockStrategy and UNLOCK CLUSTER (#34169) * Add lock timeout in DistSQL * Modify the parameter name and type, fix checkstyle. * Update document of DistSQL * fix checkstyle --- .../syntax/ral/lock-cluster-with.cn.md | 53 +++++++++++++++++++ .../syntax/ral/lock-cluster-with.en.md | 50 +++++++++++++++++ .../distsql/syntax/ral/unlock-cluster.cn.md | 52 ++++++++++++++++++ .../distsql/syntax/ral/unlock-cluster.en.md | 48 +++++++++++++++++ .../engine/src/main/antlr4/imports/Keyword.g4 | 4 ++ .../src/main/antlr4/imports/RALStatement.g4 | 4 +- .../kernel/KernelDistSQLStatementVisitor.java | 4 +- .../ral/updatable/LockClusterStatement.java | 8 +++ .../ral/updatable/UnlockClusterStatement.java | 8 +++ .../ral/updatable/LockClusterExecutor.java | 4 +- .../ral/updatable/UnlockClusterExecutor.java | 4 +- .../updatable/LockClusterExecutorTest.java | 12 ++++- .../updatable/UnlockClusterExecutorTest.java | 11 +++- 13 files changed, 251 insertions(+), 11 deletions(-) create mode 100644 docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md create mode 100644 docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md create mode 100644 docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md create mode 100644 docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md new file mode 100644 index 0000000000000..ad51c5bafbb19 --- /dev/null +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md @@ -0,0 +1,53 @@ ++++ +title = "LOCK CLUSTER WITH" +weight = 16 ++++ + +### 描述 + +`LOCK CLUSTER WITH` 语法用于向 `CLUSTER` 施加特定算法的锁。 + +### 语法 + +{{< tabs >}} +{{% tab name="语法" %}} +```sql +LockClusterWith ::= + 'LOCK' 'CLUSTER' 'WITH' lockStrategy ('TIMEOUT' timeoutMillis)? + +timeoutmillis ::= + long +``` +{{% /tab %}} +{{% tab name="铁路图" %}} + +{{% /tab %}} +{{< /tabs >}} + +### 补充说明 + +- 当 `CLUSTER` 已经处于被锁状态时,无法重复加锁,否则会抛出异常。 +- `lockStrategy` 当前支持两种锁策略,分别是排他锁 `WRITE` 与读写锁 `READ_WRITE`。 +- `timeoutMillis` 用于表明尝试加锁的超时时间,其单位为毫秒,未指定时,默认为 3000 毫秒。 + +### 示例 + +- 采用排他锁锁定 `CLUSTER` ,不设置超时时间 + +```sql +LOCK CLUSTER WITH WRITE; +``` + +- 采用读写锁锁定 `CLUSTER` ,并设置超时时间为 2000 毫秒 + +```sql +LOCK CLUSTER WITH READ_WRITE TIMEOUT 2000; +``` + +### 保留字 + +`LOCK`、`CLUSTER`、`WITH` + +### 相关链接 + +- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/) diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md new file mode 100644 index 0000000000000..469e038648887 --- /dev/null +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md @@ -0,0 +1,50 @@ ++++ +title = "LOCK CLUSTER WITH" +weight = 16 ++++ + +### Description + +The `LOCK CLUSTER WITH` syntax is utilized to apply a lock with a specific algorithm to the `CLUSTER`. + +### Syntax + +{{< tabs >}} +{{% tab name="Grammar" %}} +```sql +LockClusterWith ::= + 'LOCK' 'CLUSTER' 'WITH' lockStrategy ('TIMEOUT' timeoutMillis)? + +timeoutmillis ::= + long +``` + +{{% /tab %}} +{{% tab name="Railroad diagram" %}} + +{{% /tab %}}{{< /tabs >}} + +### Supplement + +- When the `CLUSTER` is already locked, it is impossible to re-lock it, otherwise an exception will be thrown. +- Currently, the `lockStrategy` supports two lock strategies, namely the exclusive lock `WRITE` and the read-write lock `READ_WRITE` . +- The `timeoutMillis` is used to indicate the timeout period for attempting to acquire the lock, with the unit being milliseconds. When not specified, the default value is 3,000 milliseconds. + +### Example + +- Lock the `CLUSTER` with an exclusive lock without setting the timeout. +```sql +LOCK CLUSTER WITH WRITE; +``` +- Lock the CLUSTER with a read-write lock and set the timeout to 2000 milliseconds. +```sql +LOCK CLUSTER WITH READ_WRITE TIMEOUT 2000; +``` + +### Reserved words + +`LOCK`,`CLUSTER`,`WITH` + +### Related links + +- [Reserved word](/en/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/) diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md new file mode 100644 index 0000000000000..4fb0e462d2a05 --- /dev/null +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md @@ -0,0 +1,52 @@ ++++ +title = "UNLOCK CLUSTER" +weight = 17 ++++ + +### 描述 + +`UNLOCK CLUSTER` 语法用于解除通过 `LOCK CLUSTER WITH` 语句施加在 `CLUSTER` 上的锁。 + +### 语法 + +{{< tabs >}} +{{% tab name="语法" %}} +```sql +UnlockCluster ::= + 'UNLOCK' 'CLUSTER' ('TIMEOUT' timeoutMillis)? + +timeoutmillis ::= + long +``` +{{% /tab %}} +{{% tab name="铁路图" %}} + +{{% /tab %}} +{{< /tabs >}} + +### 补充说明 + +- 当 `CLUSTER` 不处于被锁状态时,无法解除锁,否则会抛出异常。 +- `timeoutMillis` 表明尝试解锁的超时时间,其单位为毫秒,未指定时,默认为 3000 毫秒。 + +### 示例 + +- 解锁 `CLUSTER` ,不设置超时时间。 + +```sql +UNLOCK CLUSTER; +``` + +- 解锁 `CLUSTER` ,并设置超时时间为 2000 毫秒。 + +```sql +UNLOCK CLUSTER TIMEOUT 2000; +``` + +### 保留字 + +`UNLOCK`、`CLUSTER` + +### 相关链接 + +- [保留字](/cn/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/) diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md new file mode 100644 index 0000000000000..b7114d80ccc6d --- /dev/null +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md @@ -0,0 +1,48 @@ ++++ +title = "UNLOCK CLUSTER" +weight = 17 ++++ + +### Description + +The `UNLOCK CLUSTER` syntax is used to release the lock applied to the `CLUSTER` by the `LOCK CLUSTER WITH` statement. + +### Syntax + +{{< tabs >}} +{{% tab name="Grammar" %}} +```sql +UnlockCluster ::= + 'UNLOCK' 'CLUSTER' ('TIMEOUT' timeoutMillis)? + +timeoutmillis ::= + long +``` + +{{% /tab %}} +{{% tab name="Railroad diagram" %}} + +{{% /tab %}}{{< /tabs >}} + +### Supplement + +- When the `CLUSTER` is not in a locked state, it is impossible to release the lock; otherwise, an exception will be thrown. +- `timeoutMillis` is used to indicate the timeout duration for attempting to unlock, with the unit being milliseconds. When not specified, the default value is 3,000 milliseconds. +### Example + +- Unlock the `CLUSTER` without setting a timeout. +```sql +UNLOCK CLUSTER; +``` +- Unlock the `CLUSTER` and set the timeout to 2000 milliseconds. +```sql +UNLOCK CLUSTER TIMEOUT 2000; +``` + +### Reserved words + +`UNLOCK`,`CLUSTER` + +### Related links + +- [Reserved word](/en/user-manual/shardingsphere-proxy/distsql/syntax/reserved-word/) diff --git a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 index 310000c14ae1e..00e963e553674 100644 --- a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 +++ b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 @@ -342,3 +342,7 @@ FORCE CHECK_PRIVILEGES : C H E C K UL_ P R I V I L E G E S ; + +TIMEOUT + : T I M E O U T + ; \ No newline at end of file diff --git a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4 b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4 index 5d9e356e55f7a..e5f63ffc2097c 100644 --- a/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4 +++ b/parser/distsql/engine/src/main/antlr4/imports/RALStatement.g4 @@ -100,11 +100,11 @@ convertYamlConfiguration ; lockCluster - : LOCK CLUSTER WITH lockStrategy + : LOCK CLUSTER WITH lockStrategy (TIMEOUT INT_)? ; unlockCluster - : UNLOCK CLUSTER + : UNLOCK CLUSTER (TIMEOUT INT_)? ; showPluginImplementations diff --git a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java index 82f3e5c973ae4..c725b1e642cba 100644 --- a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java +++ b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java @@ -322,12 +322,12 @@ private Properties buildProperties(final PropertiesDefinitionContext ctx) { @Override public ASTNode visitLockCluster(final LockClusterContext ctx) { - return new LockClusterStatement((AlgorithmSegment) visitAlgorithmDefinition(ctx.lockStrategy().algorithmDefinition())); + return new LockClusterStatement((AlgorithmSegment) visitAlgorithmDefinition(ctx.lockStrategy().algorithmDefinition()), Long.parseLong(getIdentifierValue(ctx.INT_()))); } @Override public ASTNode visitUnlockCluster(final UnlockClusterContext ctx) { - return new UnlockClusterStatement(); + return new UnlockClusterStatement(Long.parseLong(getIdentifierValue(ctx.INT_()))); } private String getIdentifierValue(final ParseTree context) { diff --git a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java index 215ab4885787f..04915e9038abc 100644 --- a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java +++ b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java @@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.distsql.segment.AlgorithmSegment; +import java.util.Optional; + /** * Lock cluster statement. */ @@ -29,4 +31,10 @@ public final class LockClusterStatement extends UpdatableRALStatement { private final AlgorithmSegment lockStrategy; + + private final Long timeoutMillis; + + public Optional getTimeoutMillis() { + return Optional.of(timeoutMillis); + } } diff --git a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java index 8f588abd89d5c..fe584b661af48 100644 --- a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java +++ b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java @@ -19,9 +19,17 @@ import lombok.RequiredArgsConstructor; +import java.util.Optional; + /** * Unlock cluster statement. */ @RequiredArgsConstructor public final class UnlockClusterStatement extends UpdatableRALStatement { + + private final Long timeoutMillis; + + public Optional getTimeoutMillis() { + return Optional.of(timeoutMillis); + } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index f490b58143aea..00cd54cd9fe97 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -44,8 +44,8 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context checkAlgorithm(sqlStatement); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new ClusterLock()); - // TODO should configured in SQL Statement - if (lockContext.tryLock(lockDefinition, 3000L)) { + long timeoutMillis = sqlStatement.getTimeoutMillis().orElse(3000L); + if (lockContext.tryLock(lockDefinition, timeoutMillis)) { try { checkState(contextManager); TypedSPILoader.getService(ClusterLockStrategy.class, sqlStatement.getLockStrategy().getName()).lock(); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index 9b744e649564d..94d992aaac8de 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -39,8 +39,8 @@ public void executeUpdate(final UnlockClusterStatement sqlStatement, final Conte checkState(contextManager); LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); GlobalLockDefinition lockDefinition = new GlobalLockDefinition(new ClusterLock()); - // TODO should configured in SQL Statement - if (lockContext.tryLock(lockDefinition, 3000L)) { + long timeoutMillis = sqlStatement.getTimeoutMillis().orElse(3000L); + if (lockContext.tryLock(lockDefinition, timeoutMillis)) { try { checkState(contextManager); contextManager.getPersistServiceFacade().getStatePersistService().update(ClusterState.OK); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java index 00e5083fc0e28..4fae2b0b407f9 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java @@ -32,6 +32,7 @@ import java.util.Properties; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -46,13 +47,20 @@ class LockClusterExecutorTest { void assertExecuteUpdateWithLockedCluster() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.UNAVAILABLE); - assertThrows(LockedClusterException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties())), contextManager)); + assertThrows(LockedClusterException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties()), null), contextManager)); } @Test void assertExecuteUpdateWithWrongAlgorithm() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); - assertThrows(ServiceProviderNotFoundException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties())), contextManager)); + assertThrows(ServiceProviderNotFoundException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties()), null), contextManager)); + } + + @Test + void assertExecuteUpdateWithUsingTimeout() { + ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); + when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); + assertDoesNotThrow(() -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("WRITE", new Properties()), 2000L), contextManager)); } } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java index 02edc049cd977..076ff500c77a8 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java @@ -28,6 +28,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -43,6 +44,14 @@ void assertExecuteUpdateWithNotLockedCluster() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - assertThrows(NotLockedClusterException.class, () -> executor.executeUpdate(new UnlockClusterStatement(), contextManager)); + assertThrows(NotLockedClusterException.class, () -> executor.executeUpdate(new UnlockClusterStatement(null), contextManager)); + } + + @Test + void assertExecuteUpdateWithUsingTimeout() { + ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); + when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.UNAVAILABLE); + when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); + assertDoesNotThrow(() -> executor.executeUpdate(new UnlockClusterStatement(2000L), contextManager)); } } From 829099da5b051e083546777a389616657c0b347d Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Fri, 27 Dec 2024 14:20:31 +0800 Subject: [PATCH 162/192] Revise code format for #34169 (#34176) * Revise code format for #34169 * Revise code format for #34169 --- .../distsql/syntax/ral/lock-cluster-with.cn.md | 2 ++ .../distsql/syntax/ral/lock-cluster-with.en.md | 4 ++++ .../distsql/syntax/ral/unlock-cluster.cn.md | 2 ++ .../distsql/syntax/ral/unlock-cluster.en.md | 5 +++++ parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 | 2 +- .../statement/ral/updatable/LockClusterStatement.java | 5 +++++ .../statement/ral/updatable/UnlockClusterStatement.java | 5 +++++ 7 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md index ad51c5bafbb19..f3082e0396bf0 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.cn.md @@ -11,6 +11,7 @@ weight = 16 {{< tabs >}} {{% tab name="语法" %}} + ```sql LockClusterWith ::= 'LOCK' 'CLUSTER' 'WITH' lockStrategy ('TIMEOUT' timeoutMillis)? @@ -18,6 +19,7 @@ LockClusterWith ::= timeoutmillis ::= long ``` + {{% /tab %}} {{% tab name="铁路图" %}} diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md index 469e038648887..989ee638559b1 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/lock-cluster-with.en.md @@ -11,6 +11,7 @@ The `LOCK CLUSTER WITH` syntax is utilized to apply a lock with a specific algor {{< tabs >}} {{% tab name="Grammar" %}} + ```sql LockClusterWith ::= 'LOCK' 'CLUSTER' 'WITH' lockStrategy ('TIMEOUT' timeoutMillis)? @@ -33,10 +34,13 @@ timeoutmillis ::= ### Example - Lock the `CLUSTER` with an exclusive lock without setting the timeout. +- ```sql LOCK CLUSTER WITH WRITE; ``` + - Lock the CLUSTER with a read-write lock and set the timeout to 2000 milliseconds. +- ```sql LOCK CLUSTER WITH READ_WRITE TIMEOUT 2000; ``` diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md index 4fb0e462d2a05..ab9e748279a15 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.cn.md @@ -11,6 +11,7 @@ weight = 17 {{< tabs >}} {{% tab name="语法" %}} + ```sql UnlockCluster ::= 'UNLOCK' 'CLUSTER' ('TIMEOUT' timeoutMillis)? @@ -18,6 +19,7 @@ UnlockCluster ::= timeoutmillis ::= long ``` + {{% /tab %}} {{% tab name="铁路图" %}} diff --git a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md index b7114d80ccc6d..2f64bddf7c49e 100644 --- a/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md +++ b/docs/document/content/user-manual/shardingsphere-proxy/distsql/syntax/ral/unlock-cluster.en.md @@ -11,6 +11,7 @@ The `UNLOCK CLUSTER` syntax is used to release the lock applied to the `CLUSTER` {{< tabs >}} {{% tab name="Grammar" %}} + ```sql UnlockCluster ::= 'UNLOCK' 'CLUSTER' ('TIMEOUT' timeoutMillis)? @@ -28,13 +29,17 @@ timeoutmillis ::= - When the `CLUSTER` is not in a locked state, it is impossible to release the lock; otherwise, an exception will be thrown. - `timeoutMillis` is used to indicate the timeout duration for attempting to unlock, with the unit being milliseconds. When not specified, the default value is 3,000 milliseconds. + ### Example - Unlock the `CLUSTER` without setting a timeout. +- ```sql UNLOCK CLUSTER; ``` + - Unlock the `CLUSTER` and set the timeout to 2000 milliseconds. + ```sql UNLOCK CLUSTER TIMEOUT 2000; ``` diff --git a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 index 00e963e553674..d369824714b12 100644 --- a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 +++ b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 @@ -345,4 +345,4 @@ CHECK_PRIVILEGES TIMEOUT : T I M E O U T - ; \ No newline at end of file + ; diff --git a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java index 04915e9038abc..d8f11fa74403d 100644 --- a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java +++ b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/LockClusterStatement.java @@ -34,6 +34,11 @@ public final class LockClusterStatement extends UpdatableRALStatement { private final Long timeoutMillis; + /** + * Get lock timeout milliseconds. + * + * @return lock timeout milliseconds + */ public Optional getTimeoutMillis() { return Optional.of(timeoutMillis); } diff --git a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java index fe584b661af48..870edede5cd22 100644 --- a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java +++ b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/ral/updatable/UnlockClusterStatement.java @@ -29,6 +29,11 @@ public final class UnlockClusterStatement extends UpdatableRALStatement { private final Long timeoutMillis; + /** + * Get lock timeout milliseconds. + * + * @return lock timeout milliseconds + */ public Optional getTimeoutMillis() { return Optional.of(timeoutMillis); } From 5d34661af580836662cec52f16015e862f65827f Mon Sep 17 00:00:00 2001 From: Haoran Meng Date: Fri, 27 Dec 2024 17:30:09 +0800 Subject: [PATCH 163/192] Only delete versions smaller than the current active version (#34182) --- .../persist/service/version/MetaDataVersionPersistService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java index 7e7820493e43b..ea7a36d1800ed 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java @@ -43,7 +43,7 @@ public void switchActiveVersion(final Collection metaDataVersio } repository.persist(each.getActiveVersionNodePath(), each.getNextActiveVersion()); getVersions(each.getVersionsPath()).stream() - .filter(version -> !version.equals(each.getNextActiveVersion())) + .filter(version -> Integer.parseInt(version) < Integer.parseInt(each.getNextActiveVersion())) .forEach(version -> repository.delete(each.getVersionsNodePath(version))); } } From 079fb94374beae87f82ace1b9738d6d8e4386486 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 27 Dec 2024 17:51:31 +0800 Subject: [PATCH 164/192] Add jdbc data source config for transaction E2E (#34183) --- .../mysql/database-sharding-xa-atomikos.yaml | 33 +++++++++++++++++++ .../mysql/database-sharding-xa-narayana.yaml | 33 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-atomikos.yaml b/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-atomikos.yaml index e653140e92fa3..db32497ef3231 100644 --- a/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-atomikos.yaml +++ b/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-atomikos.yaml @@ -22,6 +22,39 @@ ###################################################################################################### databaseName: sharding_db + +dataSources: + ds_0: + url: jdbc:mysql://mysql.default.host:3306/ds_0?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + ds_1: + url: jdbc:mysql://mysql.default.host:3306/ds_1?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + ds_2: + url: jdbc:mysql://mysql.default.host:3306/ds_2?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + rules: - !SHARDING tables: diff --git a/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-narayana.yaml b/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-narayana.yaml index 4aa7346308d08..36c313876c327 100644 --- a/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-narayana.yaml +++ b/test/e2e/operation/transaction/src/test/resources/env/jdbc/mysql/database-sharding-xa-narayana.yaml @@ -22,6 +22,39 @@ ###################################################################################################### databaseName: sharding_db + +dataSources: + ds_0: + url: jdbc:mysql://mysql.default.host:3306/ds_0?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + ds_1: + url: jdbc:mysql://mysql.default.host:3306/ds_1?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + ds_2: + url: jdbc:mysql://mysql.default.host:3306/ds_2?useSSL=true&requireSSL=true&enabledTLSProtocols=TLSv1.2,TLSv1.3&verifyServerCertificate=false&useServerPrepStmts=true&useLocalSessionState=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&rewriteBatchedStatements=true + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + username: test_user + password: Test@123 + connectionTimeoutMilliseconds: 30000 + idleTimeoutMilliseconds: 60000 + maxLifetimeMilliseconds: 1800000 + maxPoolSize: 50 + minPoolSize: 2 + rules: - !SHARDING tables: From de840f78207ac2e68d0873c11c7e20bd62adbf48 Mon Sep 17 00:00:00 2001 From: YaoFly <2465939235@qq.com> Date: Fri, 27 Dec 2024 18:35:52 +0800 Subject: [PATCH 165/192] Support load data and load xml sql bind and add test case. (#34177) * Support GroupConcat sql for aggregating multiple shards(#33797) * Check Style fix(#33797) * Check Style fix(#33797) * spotless fix (#33797) * unit test fix (#33797) * spotless fix (#33797) * group_concat distinct compatible (#33797) * group_concat distinct compatible (#33797) * unit test fix for distinct group_concat (#33797) * e2e test for group_concat (#33797) * e2e test for group_concat (#33797) * code format (#33797) * e2e test (#33797) * e2e test (#33797) * e2e test (#33797) * remove useless code(#33797) * code optimization (#33797) * sql parse unit test (#33797) * RELEASE-NOTES.md updated(#33797) * Code Optimization (#33797) * Support GroupConcat sql for aggregating multiple shards in opengauss and doris database(#33797) * doris parse unit test fix (#33797) * spotless fix (#33797) * Update RELEASE-NOTES.md * Add DBCOMPATIBILITY 'B' parameter to opengauss database (#33992) * Add DBCOMPATIBILITY 'B' parameter to opengauss database for dbtbl_with_readwrite_splitting and readwrite_splitting scenarios(#33992) * add openGauss test case for group_concat. (#33992) * Support load data and load xml sql bind and add test case. * code fix * code fix --------- Co-authored-by: yaofly Co-authored-by: Zhengqiang Duan --- RELEASE-NOTES.md | 1 + .../ShardingLoadDataSupportedCheckerTest.java | 6 ++- .../ShardingLoadXmlSupportedCheckerTest.java | 6 ++- .../dml/LoadDataStatementBinder.java | 51 +++++++++++++++++++ .../statement/dml/LoadXMLStatementBinder.java | 51 +++++++++++++++++++ .../engine/type/DMLStatementBindEngine.java | 10 ++++ .../type/DorisDMLStatementVisitor.java | 8 ++- .../type/MySQLDMLStatementVisitor.java | 8 ++- .../core/statement/dml/LoadDataStatement.java | 6 +-- .../core/statement/dml/LoadXMLStatement.java | 6 +-- .../doris/dml/DorisLoadDataStatement.java | 5 -- .../doris/dml/DorisLoadXMLStatement.java | 5 -- .../mysql/dml/MySQLLoadDataStatement.java | 5 -- .../mysql/dml/MySQLLoadXMLStatement.java | 5 -- .../test/resources/cases/dml/load-data.xml | 29 +++++++++++ .../src/test/resources/cases/dml/load-xml.xml | 29 +++++++++++ .../src/test/resources/sqls/dml/load-data.xml | 21 ++++++++ .../src/test/resources/sqls/dml/load-xml.xml | 21 ++++++++ 18 files changed, 239 insertions(+), 34 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadDataStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadXMLStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/dml/load-data.xml create mode 100644 test/it/binder/src/test/resources/cases/dml/load-xml.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/load-data.xml create mode 100644 test/it/binder/src/test/resources/sqls/dml/load-xml.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 09a9827742982..81431f4b4d5dd 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -45,6 +45,7 @@ 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) 1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) +1. SQL Binder: Support load data and load xml sql bind and add test case - [#34177](https://github.com/apache/shardingsphere/pull/34177) 1. Transaction: Support savepoint/release savepoint TCL statements in jdbc adapter -[#34173](https://github.com/apache/shardingsphere/pull/34173) 1. Kernel: Add WithAvailable interface and encrypt with, combine, insert select support checker - [#34175](https://github.com/apache/shardingsphere/pull/34175) diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java index 37c8bfd91fb57..01dc30303f94f 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadDataSupportedCheckerTest.java @@ -42,13 +42,15 @@ class ShardingLoadDataSupportedCheckerTest { @Test void assertCheckWithSingleTable() { - MySQLLoadDataStatement sqlStatement = new MySQLLoadDataStatement(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + MySQLLoadDataStatement sqlStatement = new MySQLLoadDataStatement(); + sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); assertDoesNotThrow(() -> new ShardingLoadDataSupportedChecker().check(rule, mock(), mock(), new LoadDataStatementContext(sqlStatement))); } @Test void assertCheckWithShardingTable() { - MySQLLoadDataStatement sqlStatement = new MySQLLoadDataStatement(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + MySQLLoadDataStatement sqlStatement = new MySQLLoadDataStatement(); + sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(rule.isShardingTable("t_order")).thenReturn(true); assertThrows(UnsupportedShardingOperationException.class, () -> new ShardingLoadDataSupportedChecker().check(rule, mock(), mock(), new LoadDataStatementContext(sqlStatement))); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java index 0538a83d47873..8340aefc3c9b8 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/dml/ShardingLoadXmlSupportedCheckerTest.java @@ -42,13 +42,15 @@ class ShardingLoadXmlSupportedCheckerTest { @Test void assertCheckWithSingleTable() { - MySQLLoadXMLStatement sqlStatement = new MySQLLoadXMLStatement(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + MySQLLoadXMLStatement sqlStatement = new MySQLLoadXMLStatement(); + sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); assertDoesNotThrow(() -> new ShardingLoadXmlSupportedChecker().check(rule, mock(), mock(), new LoadXMLStatementContext(sqlStatement))); } @Test void assertCheckWithShardingTable() { - MySQLLoadXMLStatement sqlStatement = new MySQLLoadXMLStatement(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); + MySQLLoadXMLStatement sqlStatement = new MySQLLoadXMLStatement(); + sqlStatement.setTableSegment(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(rule.isShardingTable("t_order")).thenReturn(true); assertThrows(UnsupportedShardingOperationException.class, () -> new ShardingLoadXmlSupportedChecker().check(rule, mock(), mock(), new LoadXMLStatementContext(sqlStatement))); } diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadDataStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadDataStatementBinder.java new file mode 100644 index 0000000000000..2c69c1281b0ba --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadDataStatementBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.dml; + +import com.cedarsoftware.util.CaseInsensitiveMap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement; + +/** + * Load data statement binder. + */ +public final class LoadDataStatementBinder implements SQLStatementBinder { + + @Override + public LoadDataStatement bind(final LoadDataStatement sqlStatement, final SQLStatementBinderContext binderContext) { + LoadDataStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTableSegment(SimpleTableSegmentBinder.bind(sqlStatement.getTableSegment(), binderContext, tableBinderContexts)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static LoadDataStatement copy(final LoadDataStatement sqlStatement) { + LoadDataStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadXMLStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadXMLStatementBinder.java new file mode 100644 index 0000000000000..2e70c0f21a6c1 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/dml/LoadXMLStatementBinder.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.binder.engine.statement.dml; + +import com.cedarsoftware.util.CaseInsensitiveMap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement; + +/** + * Load XML statement binder. + */ +public final class LoadXMLStatementBinder implements SQLStatementBinder { + + @Override + public LoadXMLStatement bind(final LoadXMLStatement sqlStatement, final SQLStatementBinderContext binderContext) { + LoadXMLStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setTableSegment(SimpleTableSegmentBinder.bind(sqlStatement.getTableSegment(), binderContext, tableBinderContexts)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static LoadXMLStatement copy(final LoadXMLStatement sqlStatement) { + LoadXMLStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java index dacb5483c1eac..32d1aa397ea1e 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DMLStatementBindEngine.java @@ -24,6 +24,8 @@ import org.apache.shardingsphere.infra.binder.engine.statement.dml.InsertStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.SelectStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.dml.UpdateStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.LoadDataStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.dml.LoadXMLStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.CopyStatement; @@ -32,6 +34,8 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.InsertStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement; /** * DML statement bind engine. @@ -68,6 +72,12 @@ public DMLStatement bind(final DMLStatement statement) { if (statement instanceof CopyStatement) { return new CopyStatementBinder().bind((CopyStatement) statement, binderContext); } + if (statement instanceof LoadDataStatement) { + return new LoadDataStatementBinder().bind((LoadDataStatement) statement, binderContext); + } + if (statement instanceof LoadXMLStatement) { + return new LoadXMLStatementBinder().bind((LoadXMLStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDMLStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDMLStatementVisitor.java index 1fa290099a5cb..446fdcf4e874b 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDMLStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDMLStatementVisitor.java @@ -94,12 +94,16 @@ public ASTNode visitLoadStatement(final LoadStatementContext ctx) { @Override public ASTNode visitLoadDataStatement(final LoadDataStatementContext ctx) { - return new DorisLoadDataStatement((SimpleTableSegment) visit(ctx.tableName())); + DorisLoadDataStatement result = new DorisLoadDataStatement(); + result.setTableSegment((SimpleTableSegment) visit(ctx.tableName())); + return result; } @Override public ASTNode visitLoadXmlStatement(final LoadXmlStatementContext ctx) { - return new DorisLoadXMLStatement((SimpleTableSegment) visit(ctx.tableName())); + DorisLoadXMLStatement result = new DorisLoadXMLStatement(); + result.setTableSegment((SimpleTableSegment) visit(ctx.tableName())); + return result; } @Override diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java index 06b9a9e227086..ec34030efa2c0 100644 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java +++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDMLStatementVisitor.java @@ -100,12 +100,16 @@ public ASTNode visitLoadStatement(final LoadStatementContext ctx) { @Override public ASTNode visitLoadDataStatement(final LoadDataStatementContext ctx) { - return new MySQLLoadDataStatement((SimpleTableSegment) visit(ctx.tableName())); + MySQLLoadDataStatement result = new MySQLLoadDataStatement(); + result.setTableSegment((SimpleTableSegment) visit(ctx.tableName())); + return result; } @Override public ASTNode visitLoadXmlStatement(final LoadXmlStatementContext ctx) { - return new MySQLLoadXMLStatement((SimpleTableSegment) visit(ctx.tableName())); + MySQLLoadXMLStatement result = new MySQLLoadXMLStatement(); + result.setTableSegment((SimpleTableSegment) visit(ctx.tableName())); + return result; } @Override diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java index 089d1fe9b7bf2..11a2cbd5d4803 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadDataStatement.java @@ -18,16 +18,16 @@ package org.apache.shardingsphere.sql.parser.statement.core.statement.dml; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement; /** * Load data statement. */ -@RequiredArgsConstructor @Getter +@Setter public abstract class LoadDataStatement extends AbstractSQLStatement implements DMLStatement { - private final SimpleTableSegment tableSegment; + private SimpleTableSegment tableSegment; } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java index 2a1da0a302469..1c6707d49cc5e 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/dml/LoadXMLStatement.java @@ -18,16 +18,16 @@ package org.apache.shardingsphere.sql.parser.statement.core.statement.dml; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement; /** * Load xml statement. */ -@RequiredArgsConstructor +@Setter @Getter public abstract class LoadXMLStatement extends AbstractSQLStatement implements DMLStatement { - private final SimpleTableSegment tableSegment; + private SimpleTableSegment tableSegment; } diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadDataStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadDataStatement.java index 3f242b3620e90..c151ee98036a7 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadDataStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadDataStatement.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sql.parser.statement.doris.dml; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement; import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; @@ -25,8 +24,4 @@ * Doris load data statement. */ public final class DorisLoadDataStatement extends LoadDataStatement implements DorisStatement { - - public DorisLoadDataStatement(final SimpleTableSegment tableSegment) { - super(tableSegment); - } } diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadXMLStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadXMLStatement.java index dd499da9fb322..189b403ac1ac4 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadXMLStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/dml/DorisLoadXMLStatement.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sql.parser.statement.doris.dml; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement; import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; @@ -25,8 +24,4 @@ * Doris load xml statement. */ public final class DorisLoadXMLStatement extends LoadXMLStatement implements DorisStatement { - - public DorisLoadXMLStatement(final SimpleTableSegment tableSegment) { - super(tableSegment); - } } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadDataStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadDataStatement.java index 37a521edf7f72..065eb2acaac37 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadDataStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadDataStatement.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sql.parser.statement.mysql.dml; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadDataStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; @@ -25,8 +24,4 @@ * MySQL load data statement. */ public final class MySQLLoadDataStatement extends LoadDataStatement implements MySQLStatement { - - public MySQLLoadDataStatement(final SimpleTableSegment tableSegment) { - super(tableSegment); - } } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadXMLStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadXMLStatement.java index f5c8c6afd5c42..b8c68ff1efe31 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadXMLStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dml/MySQLLoadXMLStatement.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.sql.parser.statement.mysql.dml; -import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.dml.LoadXMLStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; @@ -25,8 +24,4 @@ * MySQL load xml statement. */ public final class MySQLLoadXMLStatement extends LoadXMLStatement implements MySQLStatement { - - public MySQLLoadXMLStatement(final SimpleTableSegment tableSegment) { - super(tableSegment); - } } diff --git a/test/it/binder/src/test/resources/cases/dml/load-data.xml b/test/it/binder/src/test/resources/cases/dml/load-data.xml new file mode 100644 index 0000000000000..3b15de0e09031 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/load-data.xml @@ -0,0 +1,29 @@ + + + + + +
+ + + + + +
+ + diff --git a/test/it/binder/src/test/resources/cases/dml/load-xml.xml b/test/it/binder/src/test/resources/cases/dml/load-xml.xml new file mode 100644 index 0000000000000..0472ab389284d --- /dev/null +++ b/test/it/binder/src/test/resources/cases/dml/load-xml.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + +
+
+
diff --git a/test/it/binder/src/test/resources/sqls/dml/load-data.xml b/test/it/binder/src/test/resources/sqls/dml/load-data.xml new file mode 100644 index 0000000000000..7df11c945810e --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/load-data.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/dml/load-xml.xml b/test/it/binder/src/test/resources/sqls/dml/load-xml.xml new file mode 100644 index 0000000000000..8a25add48f440 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/dml/load-xml.xml @@ -0,0 +1,21 @@ + + + + + + From 42286465a48006e02e155da4ed31b2010a40d54a Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Fri, 27 Dec 2024 18:45:03 +0800 Subject: [PATCH 166/192] Use same transaction manager in one transaction (#34181) * Use same transaction manager in one transaction * Use same transaction manager in one transaction * Fix test * Fix test * fix * fix --- .../TransactionConnectionContext.java | 18 ++++++++++++-- .../transaction/TransactionManager.java | 24 +++++++++++++++++++ .../TransactionConnectionContextTest.java | 11 +++++---- .../DriverDatabaseConnectionManager.java | 2 +- .../connection/ShardingSphereConnection.java | 3 ++- ...ngSphereDistributedTransactionManager.java | 3 ++- .../transaction/ConnectionTransaction.java | 7 +++++- .../ConnectionTransactionTest.java | 17 +++++++++---- .../BackendTransactionManager.java | 2 +- .../transaction/TransactionXAHandler.java | 9 +++---- .../TransactionBackendHandlerTest.java | 5 +++- .../session/ConnectionSessionTest.java | 5 +++- 12 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionManager.java diff --git a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java index 1b62261baf772..67f058db78db6 100644 --- a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java +++ b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java @@ -41,14 +41,18 @@ public final class TransactionConnectionContext implements AutoCloseable { @Setter private volatile String readWriteSplitReplicaRoute; + private volatile TransactionManager transactionManager; + /** * Begin transaction. * - * @param transactionType transaction type + * @param transactionType transaction type + * @param transactionManager transaction manager */ - public void beginTransaction(final String transactionType) { + public void beginTransaction(final String transactionType, final TransactionManager transactionManager) { this.transactionType = transactionType; inTransaction = true; + this.transactionManager = transactionManager; } /** @@ -78,6 +82,15 @@ public Optional getReadWriteSplitReplicaRoute() { return Optional.ofNullable(readWriteSplitReplicaRoute); } + /** + * Get transaction manager. + * + * @return transaction manager + */ + public Optional getTransactionManager() { + return Optional.ofNullable(transactionManager); + } + @Override public void close() { transactionType = null; @@ -85,5 +98,6 @@ public void close() { beginMills = 0L; exceptionOccur = false; readWriteSplitReplicaRoute = null; + transactionManager = null; } } diff --git a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionManager.java b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionManager.java new file mode 100644 index 0000000000000..b38dcbc195a00 --- /dev/null +++ b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionManager.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.session.connection.transaction; + +/** + * Transaction manager. + */ +public interface TransactionManager { +} diff --git a/infra/session/src/test/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContextTest.java b/infra/session/src/test/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContextTest.java index eb4bc69cc2623..0d0dd0d0993e4 100644 --- a/infra/session/src/test/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContextTest.java +++ b/infra/session/src/test/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContextTest.java @@ -25,6 +25,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; class TransactionConnectionContextTest { @@ -32,7 +33,7 @@ class TransactionConnectionContextTest { @Test void assertBeginTransaction() { - transactionConnectionContext.beginTransaction("XA"); + transactionConnectionContext.beginTransaction("XA", mock(TransactionManager.class)); assertThat(transactionConnectionContext.getTransactionType(), is(Optional.of("XA"))); assertTrue(transactionConnectionContext.isInTransaction()); } @@ -44,19 +45,19 @@ void assertIsNotInDistributedTransactionWhenNotBegin() { @Test void assertIsNotInDistributedTransactionWithLocal() { - transactionConnectionContext.beginTransaction("LOCAL"); + transactionConnectionContext.beginTransaction("LOCAL", mock(TransactionManager.class)); assertFalse(transactionConnectionContext.isInDistributedTransaction()); } @Test void assertIsInDistributedTransactionWithXA() { - transactionConnectionContext.beginTransaction("XA"); + transactionConnectionContext.beginTransaction("XA", mock(TransactionManager.class)); assertTrue(transactionConnectionContext.isInDistributedTransaction()); } @Test void assertIsInDistributedTransactionWithBASE() { - transactionConnectionContext.beginTransaction("BASE"); + transactionConnectionContext.beginTransaction("BASE", mock(TransactionManager.class)); assertTrue(transactionConnectionContext.isInDistributedTransaction()); } @@ -68,7 +69,7 @@ void assertGetReadWriteSplitReplicaRoute() { @Test void assertClose() { - transactionConnectionContext.beginTransaction("XA"); + transactionConnectionContext.beginTransaction("XA", mock(TransactionManager.class)); transactionConnectionContext.close(); assertFalse(transactionConnectionContext.getTransactionType().isPresent()); assertFalse(transactionConnectionContext.isInTransaction()); diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java index bc4779a15039f..5218b69f5a800 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java @@ -118,7 +118,7 @@ public void begin() throws SQLException { close(); connectionTransaction.begin(); } - connectionContext.getTransactionContext().beginTransaction(String.valueOf(connectionTransaction.getTransactionType())); + connectionContext.getTransactionContext().beginTransaction(String.valueOf(connectionTransaction.getTransactionType()), connectionTransaction.getDistributedTransactionManager()); } /** diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java index 7da8af0ac3531..c41917e774504 100644 --- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java +++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java @@ -171,7 +171,8 @@ private void processLocalTransaction() throws SQLException { return; } if (!autoCommit && !transactionContext.isInTransaction()) { - transactionContext.beginTransaction(String.valueOf(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class).getDefaultType())); + transactionContext.beginTransaction(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class).getDefaultType().name(), + databaseConnectionManager.getConnectionTransaction().getDistributedTransactionManager()); } } diff --git a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/ShardingSphereDistributedTransactionManager.java b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/ShardingSphereDistributedTransactionManager.java index 8a61f60b89803..94c53b99ae178 100644 --- a/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/ShardingSphereDistributedTransactionManager.java +++ b/kernel/transaction/api/src/main/java/org/apache/shardingsphere/transaction/spi/ShardingSphereDistributedTransactionManager.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.transaction.spi; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.session.connection.transaction.TransactionManager; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; import org.apache.shardingsphere.transaction.api.TransactionType; @@ -29,7 +30,7 @@ /** * ShardingSphere distributed transaction manager. */ -public interface ShardingSphereDistributedTransactionManager extends TypedSPI, AutoCloseable { +public interface ShardingSphereDistributedTransactionManager extends TypedSPI, AutoCloseable, TransactionManager { /** * Initialize distributed transaction manager. diff --git a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java index c0456ef3ab3c4..aa82ded550159 100644 --- a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java +++ b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java @@ -35,6 +35,7 @@ public final class ConnectionTransaction { @Getter private final TransactionType transactionType; + @Getter private final ShardingSphereDistributedTransactionManager distributedTransactionManager; private final TransactionConnectionContext transactionContext; @@ -42,7 +43,11 @@ public final class ConnectionTransaction { public ConnectionTransaction(final TransactionRule rule, final TransactionConnectionContext transactionContext) { transactionType = transactionContext.getTransactionType().isPresent() ? TransactionType.valueOf(transactionContext.getTransactionType().get()) : rule.getDefaultType(); this.transactionContext = transactionContext; - distributedTransactionManager = TransactionType.LOCAL == transactionType ? null : rule.getResource().getTransactionManager(rule.getDefaultType()); + if (transactionContext.getTransactionManager().isPresent()) { + distributedTransactionManager = (ShardingSphereDistributedTransactionManager) transactionContext.getTransactionManager().get(); + } else { + distributedTransactionManager = TransactionType.LOCAL == this.transactionType ? null : rule.getResource().getTransactionManager(rule.getDefaultType()); + } } /** diff --git a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java index 3fde297470451..23a832a7e370d 100644 --- a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java +++ b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java @@ -48,21 +48,23 @@ void assertIsNotInDistributedTransactionWhenTransactionIsNotBegin() { @Test void assertIsNotInDistributedTransactionWhenIsNotDistributedTransaction() { TransactionConnectionContext context = new TransactionConnectionContext(); - context.beginTransaction("LOCAL"); + context.beginTransaction("LOCAL", mock(ShardingSphereDistributedTransactionManager.class)); assertFalse(new ConnectionTransaction(mock(TransactionRule.class), context).isInDistributedTransaction(context)); } @Test void assertIsNotInDistributedTransactionWhenDistributedTransactionIsNotBegin() { TransactionConnectionContext context = new TransactionConnectionContext(); - context.beginTransaction("XA"); + context.beginTransaction("XA", mock(ShardingSphereDistributedTransactionManager.class)); assertFalse(new ConnectionTransaction(mock(TransactionRule.class, RETURNS_DEEP_STUBS), context).isInDistributedTransaction(context)); } @Test void assertIsInDistributedTransaction() { TransactionConnectionContext context = new TransactionConnectionContext(); - context.beginTransaction("XA"); + ShardingSphereDistributedTransactionManager distributedTransactionManager = mock(ShardingSphereDistributedTransactionManager.class); + when(distributedTransactionManager.isInTransaction()).thenReturn(true); + context.beginTransaction("XA", distributedTransactionManager); TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS); when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true); assertTrue(new ConnectionTransaction(rule, context).isInDistributedTransaction(context)); @@ -95,7 +97,9 @@ void assertIsHoldTransactionWithXAAndAutoCommit() { when(rule.getDefaultType()).thenReturn(TransactionType.XA); when(rule.getResource().getTransactionManager(TransactionType.XA).isInTransaction()).thenReturn(true); TransactionConnectionContext context = new TransactionConnectionContext(); - context.beginTransaction("XA"); + ShardingSphereDistributedTransactionManager distributedTransactionManager = mock(ShardingSphereDistributedTransactionManager.class); + when(distributedTransactionManager.isInTransaction()).thenReturn(true); + context.beginTransaction("XA", distributedTransactionManager); assertTrue(new ConnectionTransaction(rule, context).isHoldTransaction(true)); } @@ -144,7 +148,10 @@ void assertGetConnectionWithoutInDistributeTransaction() throws SQLException { @Test void assertGetConnectionWithInDistributeTransaction() throws SQLException { TransactionConnectionContext context = new TransactionConnectionContext(); - context.beginTransaction("XA"); + ShardingSphereDistributedTransactionManager distributedTransactionManager = mock(ShardingSphereDistributedTransactionManager.class); + when(distributedTransactionManager.isInTransaction()).thenReturn(true); + when(distributedTransactionManager.getConnection("foo_db", "foo_ds")).thenReturn(mock(Connection.class)); + context.beginTransaction("XA", distributedTransactionManager); TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS); when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true); when(rule.getResource().getTransactionManager(rule.getDefaultType()).getConnection("foo_db", "foo_ds")).thenReturn(mock(Connection.class)); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java index 384c0e3445062..53bad50aceca1 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java @@ -70,7 +70,7 @@ public BackendTransactionManager(final ProxyDatabaseConnectionManager databaseCo public void begin() { if (!connection.getConnectionSession().getTransactionStatus().isInTransaction()) { connection.getConnectionSession().getTransactionStatus().setInTransaction(true); - getTransactionContext().beginTransaction(String.valueOf(transactionType)); + getTransactionContext().beginTransaction(transactionType.name(), distributedTransactionManager); connection.closeHandlers(true); connection.closeConnections(false); } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java index 2cce1c63bac7d..6b404c50e2219 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java @@ -29,13 +29,13 @@ import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow; import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader; import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; -import org.apache.shardingsphere.proxy.backend.util.TransactionUtils; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XABeginStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XACommitStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XARecoveryStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XARollbackStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XAStatement; -import org.apache.shardingsphere.transaction.api.TransactionType; +import org.apache.shardingsphere.transaction.ShardingSphereTransactionManagerEngine; +import org.apache.shardingsphere.transaction.rule.TransactionRule; import org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionNestedBeginException; import java.sql.SQLException; @@ -88,8 +88,9 @@ public ResponseHeader execute() throws SQLException { private ResponseHeader begin() throws SQLException { ShardingSpherePreconditions.checkState(!connectionSession.getTransactionStatus().isInTransaction(), XATransactionNestedBeginException::new); ResponseHeader result = backendHandler.execute(); - TransactionType transactionType = TransactionUtils.getTransactionType(connectionSession.getConnectionContext().getTransactionContext()); - connectionSession.getConnectionContext().getTransactionContext().beginTransaction(String.valueOf(transactionType)); + TransactionRule transactionRule = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class); + ShardingSphereTransactionManagerEngine engine = transactionRule.getResource(); + connectionSession.getConnectionContext().getTransactionContext().beginTransaction(transactionRule.getDefaultType().name(), engine.getTransactionManager(transactionRule.getDefaultType())); return result; } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerTest.java index c08e8350e919d..4ab0b3005b65f 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerTest.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; +import org.apache.shardingsphere.transaction.api.TransactionType; import org.apache.shardingsphere.transaction.core.TransactionOperationType; import org.apache.shardingsphere.transaction.rule.TransactionRule; import org.junit.jupiter.api.Test; @@ -58,7 +59,9 @@ void assertExecute() throws SQLException { private ContextManager mockContextManager() { ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(mock(TransactionRule.class)))); + TransactionRule transactionRule = mock(TransactionRule.class); + when(transactionRule.getDefaultType()).thenReturn(TransactionType.LOCAL); + when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(transactionRule))); return result; } } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java index 96da820ed6335..9ae58ecc1b721 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/session/ConnectionSessionTest.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; +import org.apache.shardingsphere.transaction.api.TransactionType; import org.apache.shardingsphere.transaction.rule.TransactionRule; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -82,7 +83,9 @@ void assertSwitchSchemaWhileBegin() { private ContextManager mockContextManager() { ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(mock(TransactionRule.class)))); + TransactionRule transactionRule = mock(TransactionRule.class); + when(transactionRule.getDefaultType()).thenReturn(TransactionType.LOCAL); + when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(transactionRule))); return result; } From 47a698a4943f65cee6baeb6264666e9e2fe70a3a Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 27 Dec 2024 19:17:23 +0800 Subject: [PATCH 167/192] update release note (#34184) --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 81431f4b4d5dd..aecb969312432 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -139,6 +139,7 @@ 1. Pipeline: Support page query for inventory dumper and data consistency streaming query 1. Pipeline: Use case-insensitive identifiers to enhance the table metadata loader 1. Pipeline: Support primary key columns ordering for standard pipeline table metadata loader +1. Sharding: Optimize sharding table index name rewriting rules and remove unnecessary suffix rewriting - [#31171](https://github.com/apache/shardingsphere/issues/31171) ### Bug Fixes From 30f306c9b42a62a90135a2c933e297308d12a9ba Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 21:07:58 +0800 Subject: [PATCH 168/192] Move ComputeNodeInstanceContext.LockContext to ContextManager (#34186) * Move ComputeNodeInstanceContext.LockContext to ContextManager * Move ComputeNodeInstanceContext.LockContext to ContextManager * Move ComputeNodeInstanceContext.LockContext to ContextManager * Move ComputeNodeInstanceContext.LockContext to ContextManager * Move ComputeNodeInstanceContext.LockContext to ContextManager --- .../PrometheusPluginLifecycleServiceTest.java | 4 ++-- .../ShardingRouteCacheableCheckerTest.java | 2 +- .../instance/ComputeNodeInstanceContext.java | 18 +--------------- .../ComputeNodeInstanceContextTest.java | 21 ++++++++----------- .../preparer/MigrationJobPreparer.java | 6 ++---- .../mode/manager/ContextManager.java | 6 +++++- .../mode/manager/ContextManagerTest.java | 3 ++- .../cluster/ClusterContextManagerBuilder.java | 6 ++---- .../StandaloneContextManagerBuilder.java | 4 ++-- .../BackendTransactionManager.java | 4 ++-- .../ral/updatable/LockClusterExecutor.java | 6 ++---- .../ral/updatable/UnlockClusterExecutor.java | 6 ++---- .../ProxyDatabaseConnectionManagerTest.java | 3 ++- .../connector/ProxySQLExecutorTest.java | 5 +++-- .../backend/context/ProxyContextTest.java | 3 ++- .../DatabaseAdminQueryBackendHandlerTest.java | 3 ++- .../DistSQLQueryBackendHandlerTest.java | 3 ++- .../queryable/ExportMetaDataExecutorTest.java | 3 +-- .../updatable/ImportMetaDataExecutorTest.java | 3 +-- .../SetDistVariableExecutorTest.java | 5 +++-- .../FrontDatabaseProtocolTypeFactoryTest.java | 3 ++- .../frontend/state/impl/OKProxyStateTest.java | 3 ++- .../PostgreSQLCommandExecuteEngineTest.java | 3 ++- .../core/util/PipelineContextUtils.java | 3 ++- 24 files changed, 56 insertions(+), 70 deletions(-) diff --git a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java index 63a883710dd63..6789ce55f8618 100644 --- a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java +++ b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java @@ -73,7 +73,7 @@ private ContextManager mockContextManager() { MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); - return new ContextManager(metaDataContexts, computeNodeInstanceContext, mock(PersistRepository.class)); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); + return new ContextManager(metaDataContexts, mock(LockContext.class), computeNodeInstanceContext, mock(PersistRepository.class)); } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java index 1af0543e4fad6..e70046f99e35f 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java @@ -113,7 +113,7 @@ private ShardingRule createShardingRule() { ruleConfig.getTables().add(nonCacheableTableSharding); ruleConfig.setShardingCache(new ShardingCacheConfiguration(100, new ShardingCacheOptionsConfiguration(true, 0, 0))); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(mock(ComputeNodeInstance.class), null, null); - instanceContext.init(props -> 0, null); + instanceContext.init(props -> 0); return new ShardingRule(ruleConfig, Maps.of("ds_0", new MockedDataSource(), "ds_1", new MockedDataSource()), instanceContext, Collections.emptyList()); } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index a3d8cb81b6eaa..afc7277a00594 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -48,9 +47,6 @@ public final class ComputeNodeInstanceContext { @Getter(AccessLevel.NONE) private final AtomicReference workerIdGenerator; - @Getter(AccessLevel.NONE) - private final AtomicReference lockContext; - private final ClusterInstanceRegistry clusterInstanceRegistry; public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfiguration, final EventBusContext eventBusContext) { @@ -58,7 +54,6 @@ public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final Mode this.modeConfiguration = modeConfiguration; this.eventBusContext = eventBusContext; workerIdGenerator = new AtomicReference<>(); - lockContext = new AtomicReference<>(); clusterInstanceRegistry = new ClusterInstanceRegistry(); } @@ -66,11 +61,9 @@ public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final Mode * Initialize compute node instance context. * * @param workerIdGenerator worker id generator - * @param lockContext lock context */ - public void init(final WorkerIdGenerator workerIdGenerator, final LockContext lockContext) { + public void init(final WorkerIdGenerator workerIdGenerator) { this.workerIdGenerator.set(workerIdGenerator); - this.lockContext.set(lockContext); } /** @@ -142,13 +135,4 @@ public int generateWorkerId(final Properties props) { instance.setWorkerId(result); return result; } - - /** - * Get lock context. - * - * @return lock context - */ - public LockContext getLockContext() { - return Optional.ofNullable(lockContext.get()).orElseThrow(() -> new IllegalStateException("Lock context is not initialized.")); - } } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java index e0c39e3b0b51c..24138d3c2c029 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java @@ -21,7 +21,6 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; import org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.junit.jupiter.api.Test; @@ -42,18 +41,16 @@ class ComputeNodeInstanceContextTest { void assertInit() { ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class); - LockContext lockContext = mock(LockContext.class); - context.init(workerIdGenerator, lockContext); + context.init(workerIdGenerator); context.generateWorkerId(new Properties()); verify(workerIdGenerator).generate(new Properties()); - assertThat(context.getLockContext(), is(lockContext)); } @Test void assertUpdateStatusWithInvalidInstanceState() { InstanceMetaData instanceMetaData = mock(InstanceMetaData.class); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.updateStatus("id", "INVALID"); verify(instanceMetaData, times(0)).getId(); } @@ -62,7 +59,7 @@ void assertUpdateStatusWithInvalidInstanceState() { void assertUpdateStatusWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("foo_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.CIRCUIT_BREAK)); @@ -72,7 +69,7 @@ void assertUpdateStatusWithCurrentInstance() { void assertUpdateStatusWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("bar_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.OK)); @@ -82,7 +79,7 @@ void assertUpdateStatusWithOtherInstance() { void assertUpdateLabelsWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.updateLabels("foo_instance_id", Arrays.asList("label_1", "label_2")); assertThat(instanceContext.getInstance().getLabels(), is(Arrays.asList("label_1", "label_2"))); } @@ -91,7 +88,7 @@ void assertUpdateLabelsWithCurrentInstance() { void assertUpdateLabelsWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateLabels("bar_instance_id", Arrays.asList("label_1", "label_2")); assertTrue(instanceContext.getInstance().getLabels().isEmpty()); @@ -102,7 +99,7 @@ void assertUpdateLabelsWithOtherInstance() { void assertUpdateWorkerIdWithCurrentInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.updateWorkerId("foo_instance_id", 10); assertThat(instanceContext.getWorkerId(), is(10)); } @@ -111,7 +108,7 @@ void assertUpdateWorkerIdWithCurrentInstance() { void assertUpdateWorkerIdWithOtherInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateWorkerId("bar_instance_id", 10); assertThat(instanceContext.getWorkerId(), is(-1)); @@ -121,7 +118,7 @@ void assertUpdateWorkerIdWithOtherInstance() { @Test void assertGenerateWorkerId() { ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + instanceContext.init(mock(WorkerIdGenerator.class)); assertThat(instanceContext.generateWorkerId(new Properties()), is(0)); } } diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index 1d2314aa29e43..b8c1ab2e4bbf7 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -65,7 +65,6 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; @@ -113,13 +112,12 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem String jobId = jobConfig.getJobId(); PipelineContextKey contextKey = PipelineJobIdUtils.parseContextKey(jobId); ContextManager contextManager = PipelineContextManager.getContext(contextKey).getContextManager(); - LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); if (!jobItemManager.getProgress(jobId, jobItemContext.getShardingItem()).isPresent()) { jobItemManager.persistProgress(jobItemContext); } LockDefinition lockDefinition = new GlobalLockDefinition(new MigrationPrepareLock(jobConfig.getJobId())); long startTimeMillis = System.currentTimeMillis(); - if (lockContext.tryLock(lockDefinition, 600 * 1000L)) { + if (contextManager.getLockContext().tryLock(lockDefinition, 600 * 1000L)) { log.info("Lock success, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); try { PipelineJobOffsetGovernanceRepository offsetRepository = PipelineAPIFactory.getPipelineGovernanceFacade(contextKey).getJobFacade().getOffset(); @@ -132,7 +130,7 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem } } finally { log.info("Unlock, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); - lockContext.unlock(lockDefinition); + contextManager.getLockContext().unlock(lockDefinition); } } else { log.warn("Lock failed, jobId={}, shardingItem={}.", jobId, jobItemContext.getShardingItem()); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 5afaf40b62535..bc4a73e0c0645 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; @@ -54,6 +55,8 @@ public final class ContextManager implements AutoCloseable { private final AtomicReference metaDataContexts; + private final LockContext lockContext; + private final ComputeNodeInstanceContext computeNodeInstanceContext; private final ExecutorEngine executorEngine; @@ -64,8 +67,9 @@ public final class ContextManager implements AutoCloseable { private final MetaDataContextManager metaDataContextManager; - public ContextManager(final MetaDataContexts metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext, final PersistRepository repository) { + public ContextManager(final MetaDataContexts metaDataContexts, final LockContext lockContext, final ComputeNodeInstanceContext computeNodeInstanceContext, final PersistRepository repository) { this.metaDataContexts = new AtomicReference<>(metaDataContexts); + this.lockContext = lockContext; this.computeNodeInstanceContext = computeNodeInstanceContext; metaDataContextManager = new MetaDataContextManager(this.metaDataContexts, computeNodeInstanceContext, repository); persistServiceFacade = new PersistServiceFacade(repository, computeNodeInstanceContext.getModeConfiguration(), metaDataContextManager); diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java index d06f2292f89e8..856c702a6c5cd 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData; import org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; @@ -89,7 +90,7 @@ void setUp() throws SQLException { when(metaDataContexts.getMetaData().getAllDatabases()).thenReturn(Collections.singleton(database)); when(computeNodeInstanceContext.getInstance()).thenReturn(new ComputeNodeInstance(new ProxyInstanceMetaData("foo_id", 3307), Collections.emptyList())); when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class)); - contextManager = new ContextManager(metaDataContexts, computeNodeInstanceContext, mock(PersistRepository.class)); + contextManager = new ContextManager(metaDataContexts, mock(LockContext.class), computeNodeInstanceContext, mock(PersistRepository.class)); } private ShardingSphereDatabase mockDatabase() throws SQLException { diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index cdca1a7fdab09..5f75ef8dd506e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -59,11 +58,10 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev ClusterPersistRepositoryConfiguration config = (ClusterPersistRepositoryConfiguration) modeConfig.getRepository(); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData(), param.getLabels()), modeConfig, eventBusContext); ClusterPersistRepository repository = getClusterPersistRepository(config, computeNodeInstanceContext); - LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); - computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), lockContext); + computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId())); MetaDataPersistService metaDataPersistService = new MetaDataPersistService(repository); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(metaDataPersistService, param, computeNodeInstanceContext); - ContextManager result = new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); + ContextManager result = new ContextManager(metaDataContexts, new ClusterLockContext(new GlobalLockPersistService(repository)), computeNodeInstanceContext, repository); registerOnline(computeNodeInstanceContext, param, result, repository); return result; } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index d7f51278f9a78..0c8b10fc7ffd1 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -47,9 +47,9 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev StandalonePersistRepository.class, null == repositoryConfig ? null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() : repositoryConfig.getProps()); MetaDataPersistService persistService = new MetaDataPersistService(repository); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), param.getModeConfiguration(), eventBusContext); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new StandaloneLockContext()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, computeNodeInstanceContext); - return new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); + return new ContextManager(metaDataContexts, new StandaloneLockContext(), computeNodeInstanceContext, repository); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java index 53bad50aceca1..ad98389b49ee4 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java @@ -93,7 +93,7 @@ public void commit() throws SQLException { DatabaseType databaseType = ProxyContext.getInstance().getDatabaseType(); for (Entry entry : transactionHooks.entrySet()) { entry.getValue().beforeCommit(entry.getKey(), databaseType, - connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext()); + connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getLockContext()); } if (connection.getConnectionSession().getTransactionStatus().isInTransaction()) { try { @@ -105,7 +105,7 @@ public void commit() throws SQLException { } finally { for (Entry entry : transactionHooks.entrySet()) { entry.getValue().afterCommit(entry.getKey(), databaseType, - connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext()); + connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getLockContext()); } for (Connection each : connection.getCachedConnections().values()) { ConnectionSavepointManager.getInstance().transactionFinished(each); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 00cd54cd9fe97..6c5304acd1ca0 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -23,7 +23,6 @@ import org.apache.shardingsphere.infra.algorithm.core.exception.MissingRequiredAlgorithmException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.LockedClusterException; @@ -42,15 +41,14 @@ public final class LockClusterExecutor implements DistSQLUpdateExecutor new DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class), connectionSession).execute()); } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java index 6967b4e51f3c8..712ef28928d39 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java @@ -32,7 +32,6 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -139,7 +138,7 @@ private ContextManager mockContextManager() { new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java index f0a7cb00bb60d..cbbd9b6a2b98f 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java @@ -33,7 +33,6 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; @@ -120,7 +119,7 @@ private ContextManager mockContextManager() { new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java index 0d0c811034f41..ef5da1e39587a 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java @@ -110,7 +110,8 @@ private ContextManager mockContextManager() { when(metaDataPersistService.getPropsService()).thenReturn(mock(PropertiesPersistService.class)); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), computeNodeInstanceContext, mock(PersistRepository.class)); + computeNodeInstanceContext.init(mock(WorkerIdGenerator.class)); + return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), mock(LockContext.class), computeNodeInstanceContext, + mock(PersistRepository.class)); } } diff --git a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java index c2468079e3cc5..9e7e1ca1b3dc3 100644 --- a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java +++ b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; @@ -99,6 +100,6 @@ private ContextManager mockContextManager(final Collection Date: Sat, 28 Dec 2024 21:28:35 +0800 Subject: [PATCH 169/192] Revert "Move ComputeNodeInstanceContext.LockContext to ContextManager (#34186)" (#34187) This reverts commit 30f306c9b42a62a90135a2c933e297308d12a9ba. --- .../PrometheusPluginLifecycleServiceTest.java | 4 ++-- .../ShardingRouteCacheableCheckerTest.java | 2 +- .../instance/ComputeNodeInstanceContext.java | 18 +++++++++++++++- .../ComputeNodeInstanceContextTest.java | 21 +++++++++++-------- .../preparer/MigrationJobPreparer.java | 6 ++++-- .../mode/manager/ContextManager.java | 6 +----- .../mode/manager/ContextManagerTest.java | 3 +-- .../cluster/ClusterContextManagerBuilder.java | 6 ++++-- .../StandaloneContextManagerBuilder.java | 4 ++-- .../BackendTransactionManager.java | 4 ++-- .../ral/updatable/LockClusterExecutor.java | 6 ++++-- .../ral/updatable/UnlockClusterExecutor.java | 6 ++++-- .../ProxyDatabaseConnectionManagerTest.java | 3 +-- .../connector/ProxySQLExecutorTest.java | 5 ++--- .../backend/context/ProxyContextTest.java | 3 +-- .../DatabaseAdminQueryBackendHandlerTest.java | 3 +-- .../DistSQLQueryBackendHandlerTest.java | 3 +-- .../queryable/ExportMetaDataExecutorTest.java | 3 ++- .../updatable/ImportMetaDataExecutorTest.java | 3 ++- .../SetDistVariableExecutorTest.java | 5 ++--- .../FrontDatabaseProtocolTypeFactoryTest.java | 3 +-- .../frontend/state/impl/OKProxyStateTest.java | 3 +-- .../PostgreSQLCommandExecuteEngineTest.java | 3 +-- .../core/util/PipelineContextUtils.java | 3 +-- 24 files changed, 70 insertions(+), 56 deletions(-) diff --git a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java index 6789ce55f8618..63a883710dd63 100644 --- a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java +++ b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/prometheus/PrometheusPluginLifecycleServiceTest.java @@ -73,7 +73,7 @@ private ContextManager mockContextManager() { MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); - return new ContextManager(metaDataContexts, mock(LockContext.class), computeNodeInstanceContext, mock(PersistRepository.class)); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); + return new ContextManager(metaDataContexts, computeNodeInstanceContext, mock(PersistRepository.class)); } } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java index e70046f99e35f..1af0543e4fad6 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java @@ -113,7 +113,7 @@ private ShardingRule createShardingRule() { ruleConfig.getTables().add(nonCacheableTableSharding); ruleConfig.setShardingCache(new ShardingCacheConfiguration(100, new ShardingCacheOptionsConfiguration(true, 0, 0))); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(mock(ComputeNodeInstance.class), null, null); - instanceContext.init(props -> 0); + instanceContext.init(props -> 0, null); return new ShardingRule(ruleConfig, Maps.of("ds_0", new MockedDataSource(), "ds_1", new MockedDataSource()), instanceContext, Collections.emptyList()); } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java index afc7277a00594..a3d8cb81b6eaa 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContext.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -47,6 +48,9 @@ public final class ComputeNodeInstanceContext { @Getter(AccessLevel.NONE) private final AtomicReference workerIdGenerator; + @Getter(AccessLevel.NONE) + private final AtomicReference lockContext; + private final ClusterInstanceRegistry clusterInstanceRegistry; public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final ModeConfiguration modeConfiguration, final EventBusContext eventBusContext) { @@ -54,6 +58,7 @@ public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final Mode this.modeConfiguration = modeConfiguration; this.eventBusContext = eventBusContext; workerIdGenerator = new AtomicReference<>(); + lockContext = new AtomicReference<>(); clusterInstanceRegistry = new ClusterInstanceRegistry(); } @@ -61,9 +66,11 @@ public ComputeNodeInstanceContext(final ComputeNodeInstance instance, final Mode * Initialize compute node instance context. * * @param workerIdGenerator worker id generator + * @param lockContext lock context */ - public void init(final WorkerIdGenerator workerIdGenerator) { + public void init(final WorkerIdGenerator workerIdGenerator, final LockContext lockContext) { this.workerIdGenerator.set(workerIdGenerator); + this.lockContext.set(lockContext); } /** @@ -135,4 +142,13 @@ public int generateWorkerId(final Properties props) { instance.setWorkerId(result); return result; } + + /** + * Get lock context. + * + * @return lock context + */ + public LockContext getLockContext() { + return Optional.ofNullable(lockContext.get()).orElseThrow(() -> new IllegalStateException("Lock context is not initialized.")); + } } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java index 24138d3c2c029..e0c39e3b0b51c 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/ComputeNodeInstanceContextTest.java @@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; import org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.junit.jupiter.api.Test; @@ -41,16 +42,18 @@ class ComputeNodeInstanceContextTest { void assertInit() { ComputeNodeInstanceContext context = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class); - context.init(workerIdGenerator); + LockContext lockContext = mock(LockContext.class); + context.init(workerIdGenerator, lockContext); context.generateWorkerId(new Properties()); verify(workerIdGenerator).generate(new Properties()); + assertThat(context.getLockContext(), is(lockContext)); } @Test void assertUpdateStatusWithInvalidInstanceState() { InstanceMetaData instanceMetaData = mock(InstanceMetaData.class); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.updateStatus("id", "INVALID"); verify(instanceMetaData, times(0)).getId(); } @@ -59,7 +62,7 @@ void assertUpdateStatusWithInvalidInstanceState() { void assertUpdateStatusWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("foo_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.CIRCUIT_BREAK)); @@ -69,7 +72,7 @@ void assertUpdateStatusWithCurrentInstance() { void assertUpdateStatusWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateStatus("bar_instance_id", InstanceState.CIRCUIT_BREAK.name()); assertThat(instanceContext.getInstance().getState().getCurrentState(), is(InstanceState.OK)); @@ -79,7 +82,7 @@ void assertUpdateStatusWithOtherInstance() { void assertUpdateLabelsWithCurrentInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.updateLabels("foo_instance_id", Arrays.asList("label_1", "label_2")); assertThat(instanceContext.getInstance().getLabels(), is(Arrays.asList("label_1", "label_2"))); } @@ -88,7 +91,7 @@ void assertUpdateLabelsWithCurrentInstance() { void assertUpdateLabelsWithOtherInstance() { InstanceMetaData instanceMetaData = new ProxyInstanceMetaData("foo_instance_id", 3306); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(instanceMetaData), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateLabels("bar_instance_id", Arrays.asList("label_1", "label_2")); assertTrue(instanceContext.getInstance().getLabels().isEmpty()); @@ -99,7 +102,7 @@ void assertUpdateLabelsWithOtherInstance() { void assertUpdateWorkerIdWithCurrentInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.updateWorkerId("foo_instance_id", 10); assertThat(instanceContext.getWorkerId(), is(10)); } @@ -108,7 +111,7 @@ void assertUpdateWorkerIdWithCurrentInstance() { void assertUpdateWorkerIdWithOtherInstance() { ComputeNodeInstance instance = new ComputeNodeInstance(new ProxyInstanceMetaData("foo_instance_id", 3306)); ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(instance, mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); instanceContext.getClusterInstanceRegistry().add(new ComputeNodeInstance(new ProxyInstanceMetaData("bar_instance_id", 3307))); instanceContext.updateWorkerId("bar_instance_id", 10); assertThat(instanceContext.getWorkerId(), is(-1)); @@ -118,7 +121,7 @@ void assertUpdateWorkerIdWithOtherInstance() { @Test void assertGenerateWorkerId() { ComputeNodeInstanceContext instanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(ModeConfiguration.class), new EventBusContext()); - instanceContext.init(mock(WorkerIdGenerator.class)); + instanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); assertThat(instanceContext.generateWorkerId(new Properties()), is(0)); } } diff --git a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java index b8c1ab2e4bbf7..1d2314aa29e43 100644 --- a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java +++ b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/preparer/MigrationJobPreparer.java @@ -65,6 +65,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.lock.LockDefinition; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.parser.SQLParserEngine; @@ -112,12 +113,13 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem String jobId = jobConfig.getJobId(); PipelineContextKey contextKey = PipelineJobIdUtils.parseContextKey(jobId); ContextManager contextManager = PipelineContextManager.getContext(contextKey).getContextManager(); + LockContext lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); if (!jobItemManager.getProgress(jobId, jobItemContext.getShardingItem()).isPresent()) { jobItemManager.persistProgress(jobItemContext); } LockDefinition lockDefinition = new GlobalLockDefinition(new MigrationPrepareLock(jobConfig.getJobId())); long startTimeMillis = System.currentTimeMillis(); - if (contextManager.getLockContext().tryLock(lockDefinition, 600 * 1000L)) { + if (lockContext.tryLock(lockDefinition, 600 * 1000L)) { log.info("Lock success, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); try { PipelineJobOffsetGovernanceRepository offsetRepository = PipelineAPIFactory.getPipelineGovernanceFacade(contextKey).getJobFacade().getOffset(); @@ -130,7 +132,7 @@ private void prepareAndCheckTargetWithLock(final MigrationJobItemContext jobItem } } finally { log.info("Unlock, jobId={}, shardingItem={}, cost {} ms.", jobId, jobItemContext.getShardingItem(), System.currentTimeMillis() - startTimeMillis); - contextManager.getLockContext().unlock(lockDefinition); + lockContext.unlock(lockDefinition); } } else { log.warn("Lock failed, jobId={}, shardingItem={}.", jobId, jobItemContext.getShardingItem()); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index bc4a73e0c0645..5afaf40b62535 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -26,7 +26,6 @@ import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; @@ -55,8 +54,6 @@ public final class ContextManager implements AutoCloseable { private final AtomicReference metaDataContexts; - private final LockContext lockContext; - private final ComputeNodeInstanceContext computeNodeInstanceContext; private final ExecutorEngine executorEngine; @@ -67,9 +64,8 @@ public final class ContextManager implements AutoCloseable { private final MetaDataContextManager metaDataContextManager; - public ContextManager(final MetaDataContexts metaDataContexts, final LockContext lockContext, final ComputeNodeInstanceContext computeNodeInstanceContext, final PersistRepository repository) { + public ContextManager(final MetaDataContexts metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext, final PersistRepository repository) { this.metaDataContexts = new AtomicReference<>(metaDataContexts); - this.lockContext = lockContext; this.computeNodeInstanceContext = computeNodeInstanceContext; metaDataContextManager = new MetaDataContextManager(this.metaDataContexts, computeNodeInstanceContext, repository); persistServiceFacade = new PersistServiceFacade(repository, computeNodeInstanceContext.getModeConfiguration(), metaDataContextManager); diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java index 856c702a6c5cd..d06f2292f89e8 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java @@ -27,7 +27,6 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData; import org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; @@ -90,7 +89,7 @@ void setUp() throws SQLException { when(metaDataContexts.getMetaData().getAllDatabases()).thenReturn(Collections.singleton(database)); when(computeNodeInstanceContext.getInstance()).thenReturn(new ComputeNodeInstance(new ProxyInstanceMetaData("foo_id", 3307), Collections.emptyList())); when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class)); - contextManager = new ContextManager(metaDataContexts, mock(LockContext.class), computeNodeInstanceContext, mock(PersistRepository.class)); + contextManager = new ContextManager(metaDataContexts, computeNodeInstanceContext, mock(PersistRepository.class)); } private ShardingSphereDatabase mockDatabase() throws SQLException { diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index 5f75ef8dd506e..cdca1a7fdab09 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -58,10 +59,11 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev ClusterPersistRepositoryConfiguration config = (ClusterPersistRepositoryConfiguration) modeConfig.getRepository(); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData(), param.getLabels()), modeConfig, eventBusContext); ClusterPersistRepository repository = getClusterPersistRepository(config, computeNodeInstanceContext); - computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId())); + LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); + computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), lockContext); MetaDataPersistService metaDataPersistService = new MetaDataPersistService(repository); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(metaDataPersistService, param, computeNodeInstanceContext); - ContextManager result = new ContextManager(metaDataContexts, new ClusterLockContext(new GlobalLockPersistService(repository)), computeNodeInstanceContext, repository); + ContextManager result = new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); registerOnline(computeNodeInstanceContext, param, result, repository); return result; } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index 0c8b10fc7ffd1..d7f51278f9a78 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -47,9 +47,9 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev StandalonePersistRepository.class, null == repositoryConfig ? null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() : repositoryConfig.getProps()); MetaDataPersistService persistService = new MetaDataPersistService(repository); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), param.getModeConfiguration(), eventBusContext); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), new StandaloneLockContext()); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, computeNodeInstanceContext); - return new ContextManager(metaDataContexts, new StandaloneLockContext(), computeNodeInstanceContext, repository); + return new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java index ad98389b49ee4..53bad50aceca1 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java @@ -93,7 +93,7 @@ public void commit() throws SQLException { DatabaseType databaseType = ProxyContext.getInstance().getDatabaseType(); for (Entry entry : transactionHooks.entrySet()) { entry.getValue().beforeCommit(entry.getKey(), databaseType, - connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getLockContext()); + connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext()); } if (connection.getConnectionSession().getTransactionStatus().isInTransaction()) { try { @@ -105,7 +105,7 @@ public void commit() throws SQLException { } finally { for (Entry entry : transactionHooks.entrySet()) { entry.getValue().afterCommit(entry.getKey(), databaseType, - connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getLockContext()); + connection.getCachedConnections().values(), getTransactionContext(), ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext()); } for (Connection each : connection.getCachedConnections().values()) { ConnectionSavepointManager.getInstance().transactionFinished(each); diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 6c5304acd1ca0..00cd54cd9fe97 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.algorithm.core.exception.MissingRequiredAlgorithmException; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.exception.LockedClusterException; @@ -41,14 +42,15 @@ public final class LockClusterExecutor implements DistSQLUpdateExecutor new DistSQLQueryBackendHandler(mock(ExportDatabaseConfigurationStatement.class), connectionSession).execute()); } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java index 712ef28928d39..6967b4e51f3c8 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java @@ -32,6 +32,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -138,7 +139,7 @@ private ContextManager mockContextManager() { new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java index cbbd9b6a2b98f..f0a7cb00bb60d 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java @@ -33,6 +33,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; @@ -119,7 +120,7 @@ private ContextManager mockContextManager() { new ConfigurationProperties(PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true"))))); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator()); + computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(), mock(LockContext.class)); ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java index ef5da1e39587a..0d0c811034f41 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java @@ -110,8 +110,7 @@ private ContextManager mockContextManager() { when(metaDataPersistService.getPropsService()).thenReturn(mock(PropertiesPersistService.class)); ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); - computeNodeInstanceContext.init(mock(WorkerIdGenerator.class)); - return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), mock(LockContext.class), computeNodeInstanceContext, - mock(PersistRepository.class)); + computeNodeInstanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); + return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), computeNodeInstanceContext, mock(PersistRepository.class)); } } diff --git a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java index 9e7e1ca1b3dc3..c2468079e3cc5 100644 --- a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java +++ b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/protocol/FrontDatabaseProtocolTypeFactoryTest.java @@ -22,7 +22,6 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; @@ -100,6 +99,6 @@ private ContextManager mockContextManager(final Collection Date: Sat, 28 Dec 2024 21:48:39 +0800 Subject: [PATCH 170/192] Move MetaDataChangedEventBuilder and RuleConfigurationChangedEventBuilder to cluster-mode-core module (#34188) --- .../event/dispatch/builder/MetaDataChangedEventBuilder.java | 2 +- .../builder/RuleConfigurationChangedEventBuilder.java | 2 +- .../listener/type/DatabaseMetaDataChangedListener.java | 4 ++-- .../dispatch/builder/MetaDataChangedEventBuilderTest.java | 2 +- .../builder/RuleConfigurationChangedEventBuilderTest.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) rename mode/{core/src/main/java/org/apache/shardingsphere/mode => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster}/event/dispatch/builder/MetaDataChangedEventBuilder.java (99%) rename mode/{core/src/main/java/org/apache/shardingsphere/mode => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster}/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java (98%) rename mode/{core/src/test/java/org/apache/shardingsphere/mode => type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster}/event/dispatch/builder/MetaDataChangedEventBuilderTest.java (98%) rename mode/{core/src/test/java/org/apache/shardingsphere/mode => type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster}/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java (98%) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java similarity index 99% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilder.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java index d84f4a42eeee2..dda99f4169a0e 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.builder; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java similarity index 98% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java index 11c39e6f454ee..5a638d39452c4 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.builder; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder; import com.google.common.base.Strings; import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java index 9fa7a4f77b374..d35c2a809916d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java @@ -21,8 +21,8 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.builder.MetaDataChangedEventBuilder; -import org.apache.shardingsphere.mode.event.dispatch.builder.RuleConfigurationChangedEventBuilder; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.MetaDataChangedEventBuilder; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.RuleConfigurationChangedEventBuilder; import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; import org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java similarity index 98% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilderTest.java rename to mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java index c1dbeaabd23b1..aefc76250e5f6 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/MetaDataChangedEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.builder; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java similarity index 98% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java rename to mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java index bd4de594750d2..8c0471a6c44ee 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.builder; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.mode.event.DataChangedEvent; From 97bf345714eabf5ee93c59baf9b6148b713ff107 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 22:14:03 +0800 Subject: [PATCH 171/192] Move DispatchEvent and impls into cluster-mode-core module (#34189) --- .../builder/MetaDataChangedEventBuilder.java | 26 +++++++++---------- .../RuleConfigurationChangedEventBuilder.java | 12 ++++----- .../ClusterStateDispatchEventBuilder.java | 4 +-- ...ComputeNodeOnlineDispatchEventBuilder.java | 6 ++--- .../ComputeNodeStateDispatchEventBuilder.java | 8 +++--- .../type/GlobalRuleDispatchEventBuilder.java | 4 +-- .../type/KillProcessDispatchEventBuilder.java | 6 ++--- .../ListenerAssistedDispatchEventBuilder.java | 6 ++--- .../type/PropertiesDispatchEventBuilder.java | 2 +- ...alifiedDataSourceDispatchEventBuilder.java | 4 +-- ...hardingSphereDataDispatchEventBuilder.java | 16 ++++++------ .../ShowProcessListDispatchEventBuilder.java | 6 ++--- .../event/dispatch/event}/DispatchEvent.java | 2 +- .../CreateDatabaseListenerAssistedEvent.java | 4 +-- .../DropDatabaseListenerAssistedEvent.java | 4 +-- .../AlterGlobalRuleConfigurationEvent.java | 4 +-- .../event}/config/AlterPropertiesEvent.java | 4 +-- .../node/StorageNodeAlteredEvent.java | 4 +-- .../node/StorageNodeRegisteredEvent.java | 4 +-- .../node/StorageNodeUnregisteredEvent.java | 4 +-- .../unit/StorageUnitAlteredEvent.java | 4 +-- .../unit/StorageUnitRegisteredEvent.java | 4 +-- .../unit/StorageUnitUnregisteredEvent.java | 4 +-- .../metadata/data/DatabaseDataAddedEvent.java | 4 +-- .../data/DatabaseDataDeletedEvent.java | 4 +-- .../metadata/data/SchemaDataAddedEvent.java | 4 +-- .../metadata/data/SchemaDataDeletedEvent.java | 4 +-- .../ShardingSphereRowDataChangedEvent.java | 4 +-- .../ShardingSphereRowDataDeletedEvent.java | 4 +-- .../metadata/data/TableDataChangedEvent.java | 4 +-- .../metadata/schema/SchemaAddedEvent.java | 4 +-- .../metadata/schema/SchemaDeletedEvent.java | 4 +-- .../table/TableCreatedOrAlteredEvent.java | 4 +-- .../schema/table/TableDroppedEvent.java | 4 +-- .../view/ViewCreatedOrAlteredEvent.java | 4 +-- .../schema/view/ViewDroppedEvent.java | 4 +-- .../event}/rule/RuleItemChangedEvent.java | 4 +-- .../rule/alter/AlterNamedRuleItemEvent.java | 2 +- .../event}/rule/alter/AlterRuleItemEvent.java | 4 +-- .../rule/alter/AlterUniqueRuleItemEvent.java | 2 +- .../rule/drop/DropNamedRuleItemEvent.java | 2 +- .../event}/rule/drop/DropRuleItemEvent.java | 4 +-- .../rule/drop/DropUniqueRuleItemEvent.java | 2 +- .../state/cluster/ClusterStateEvent.java | 4 +-- .../ComputeNodeInstanceStateChangedEvent.java | 4 +-- .../KillLocalProcessCompletedEvent.java | 4 +-- .../state/compute/KillLocalProcessEvent.java | 4 +-- .../event}/state/compute/LabelsEvent.java | 4 +-- .../ReportLocalProcessesCompletedEvent.java | 4 +-- .../compute/ReportLocalProcessesEvent.java | 4 +-- .../event}/state/compute/WorkerIdEvent.java | 4 +-- .../instance/InstanceOfflineEvent.java | 4 +-- .../compute/instance/InstanceOnlineEvent.java | 4 +-- .../QualifiedDataSourceStateEvent.java | 4 +-- .../type/DatabaseMetaDataChangedListener.java | 2 +- .../type/CacheEvictedSubscriber.java | 2 +- .../type/ComputeNodeStateSubscriber.java | 10 +++---- .../type/DatabaseDataChangedSubscriber.java | 14 +++++----- ...lobalRuleConfigurationEventSubscriber.java | 2 +- .../type/ListenerAssistedSubscriber.java | 4 +-- .../type/MetaDataChangedSubscriber.java | 12 ++++----- .../type/ProcessListChangedSubscriber.java | 8 +++--- .../type/PropertiesEventSubscriber.java | 2 +- .../type/QualifiedDataSourceSubscriber.java | 2 +- .../type/RuleItemChangedSubscriber.java | 12 ++++----- .../type/StateChangedSubscriber.java | 2 +- .../type/StorageUnitEventSubscriber.java | 6 ++--- .../MetaDataChangedEventBuilderTest.java | 26 +++++++++---------- ...eConfigurationChangedEventBuilderTest.java | 10 +++---- .../ClusterStateDispatchEventBuilderTest.java | 4 +-- ...uteNodeOnlineDispatchEventBuilderTest.java | 6 ++--- ...puteNodeStateDispatchEventBuilderTest.java | 8 +++--- .../GlobalRuleDispatchEventBuilderTest.java | 4 +-- .../KillProcessDispatchEventBuilderTest.java | 6 ++--- ...tenerAssistedDispatchEventBuilderTest.java | 6 ++--- .../PropertiesDispatchEventBuilderTest.java | 2 +- ...iedDataSourceDispatchEventBuilderTest.java | 4 +-- ...ingSphereDataDispatchEventBuilderTest.java | 16 ++++++------ ...owProcessListDispatchEventBuilderTest.java | 6 ++--- .../type/CacheEvictedSubscriberTest.java | 2 +- .../type/ComputeNodeStateSubscriberTest.java | 10 +++---- .../DatabaseDataChangedSubscriberTest.java | 14 +++++----- ...lRuleConfigurationEventSubscriberTest.java | 2 +- .../type/ListenerAssistedSubscriberTest.java | 4 +-- .../type/MetaDataChangedSubscriberTest.java | 12 ++++----- .../ProcessListChangedSubscriberTest.java | 8 +++--- .../type/PropertiesEventSubscriberTest.java | 2 +- .../QualifiedDataSourceSubscriberTest.java | 2 +- .../type/RuleItemChangedSubscriberTest.java | 8 +++--- .../type/StateChangedSubscriberTest.java | 2 +- .../type/StorageUnitEventSubscriberTest.java | 6 ++--- 91 files changed, 253 insertions(+), 253 deletions(-) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/DispatchEvent.java (91%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/assisted/CreateDatabaseListenerAssistedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/assisted/DropDatabaseListenerAssistedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/config/AlterGlobalRuleConfigurationEvent.java (87%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/config/AlterPropertiesEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/node/StorageNodeAlteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/node/StorageNodeRegisteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/node/StorageNodeUnregisteredEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/unit/StorageUnitAlteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/unit/StorageUnitRegisteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/datasource/unit/StorageUnitUnregisteredEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/DatabaseDataAddedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/DatabaseDataDeletedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/SchemaDataAddedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/SchemaDataDeletedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/ShardingSphereRowDataChangedEvent.java (87%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/ShardingSphereRowDataDeletedEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/data/TableDataChangedEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/SchemaAddedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/SchemaDeletedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/table/TableCreatedOrAlteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/table/TableDroppedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/view/ViewCreatedOrAlteredEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/metadata/schema/view/ViewDroppedEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/RuleItemChangedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/alter/AlterNamedRuleItemEvent.java (93%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/alter/AlterRuleItemEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/alter/AlterUniqueRuleItemEvent.java (93%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/drop/DropNamedRuleItemEvent.java (92%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/drop/DropRuleItemEvent.java (84%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/rule/drop/DropUniqueRuleItemEvent.java (92%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/cluster/ClusterStateEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/ComputeNodeInstanceStateChangedEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/KillLocalProcessCompletedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/KillLocalProcessEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/LabelsEvent.java (86%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/ReportLocalProcessesCompletedEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/ReportLocalProcessesEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/WorkerIdEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/instance/InstanceOfflineEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/compute/instance/InstanceOnlineEvent.java (85%) rename mode/{api/src/main/java/org/apache/shardingsphere/mode/event/dispatch => type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event}/state/storage/QualifiedDataSourceStateEvent.java (87%) diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java index dda99f4169a0e..44621086837c7 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilder.java @@ -23,19 +23,19 @@ import org.apache.shardingsphere.metadata.persist.node.metadata.ViewMetaDataNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeUnregisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; import java.util.Optional; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java index 5a638d39452c4..a4cd3342568ce 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java @@ -18,15 +18,15 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder; import com.google.common.base.Strings; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent; import org.apache.shardingsphere.mode.path.rule.RuleNodePath; import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath; import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java index 2ad311b44ba1d..e362ee22ea056 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java @@ -21,8 +21,8 @@ import org.apache.shardingsphere.metadata.persist.node.StatesNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.cluster.ClusterStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster.ClusterStateEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilder.java index 99e65f7619ff1..ad5ffdc9b4bf6 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilder.java @@ -27,9 +27,9 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOfflineEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOnlineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOfflineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOnlineEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilder.java index ae3507e3406d1..27dc92033138b 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilder.java @@ -22,10 +22,10 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ComputeNodeInstanceStateChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.LabelsEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.WorkerIdEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ComputeNodeInstanceStateChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.LabelsEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.WorkerIdEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.ArrayList; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilder.java index c9652ad45fb79..0c54632e5dfdc 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilder.java @@ -20,8 +20,8 @@ import org.apache.shardingsphere.metadata.persist.node.GlobalNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterGlobalRuleConfigurationEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterGlobalRuleConfigurationEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.path.GlobalNodePath; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilder.java index 19af769322733..dd6718dc9a83e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilder.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java index 79d98eabd8bb3..bd2417651b76d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java @@ -21,9 +21,9 @@ import org.apache.shardingsphere.metadata.persist.node.StatesNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted; import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilder.java index fd6783c016132..1f10eae527e25 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilder.java @@ -20,7 +20,7 @@ import org.apache.shardingsphere.metadata.persist.node.GlobalNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterPropertiesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterPropertiesEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.path.GlobalNodePath; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilder.java index cab6b92954a91..4196556bf172e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilder.java @@ -26,8 +26,8 @@ import org.apache.shardingsphere.metadata.persist.node.QualifiedDataSourceNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.storage.QualifiedDataSourceStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.storage.QualifiedDataSourceStateEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilder.java index 0ccb037e1dd8e..be8c172ecb920 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilder.java @@ -23,14 +23,14 @@ import org.apache.shardingsphere.metadata.persist.node.ShardingSphereDataNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.TableDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.TableDataChangedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilder.java index 3be60739efee5..f7a8a40e74e7e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilder.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import java.util.Arrays; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/DispatchEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/DispatchEvent.java similarity index 91% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/DispatchEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/DispatchEvent.java index bcf582ae321e2..ba41a886833d0 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/DispatchEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/DispatchEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event; /** * Dispatch event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/CreateDatabaseListenerAssistedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/CreateDatabaseListenerAssistedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/CreateDatabaseListenerAssistedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/CreateDatabaseListenerAssistedEvent.java index f5dd5cc6bbcb8..40607549bd672 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/CreateDatabaseListenerAssistedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/CreateDatabaseListenerAssistedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.assisted; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Create database listener assisted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/DropDatabaseListenerAssistedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/DropDatabaseListenerAssistedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/DropDatabaseListenerAssistedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/DropDatabaseListenerAssistedEvent.java index 0eafa259ef247..4c43fc03e2e43 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/assisted/DropDatabaseListenerAssistedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/assisted/DropDatabaseListenerAssistedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.assisted; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Drop database listener assisted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterGlobalRuleConfigurationEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterGlobalRuleConfigurationEvent.java similarity index 87% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterGlobalRuleConfigurationEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterGlobalRuleConfigurationEvent.java index df66611357a43..2ca8a6559ee3b 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterGlobalRuleConfigurationEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterGlobalRuleConfigurationEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.config; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Alter global rule configuration event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterPropertiesEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterPropertiesEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterPropertiesEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterPropertiesEvent.java index 5d0cbb63ef285..e4d6ca9942502 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/config/AlterPropertiesEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/config/AlterPropertiesEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.config; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Alter properties event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeAlteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeAlteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeAlteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeAlteredEvent.java index ba1d138f662e8..6eb93e2d7df97 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeAlteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeAlteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.node; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage node altered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeRegisteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeRegisteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeRegisteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeRegisteredEvent.java index a3629450ac091..8316a6686ce2f 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeRegisteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeRegisteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.node; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage node registered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeUnregisteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeUnregisteredEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeUnregisteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeUnregisteredEvent.java index cf0f3b6824eb2..da2f7e5a164ee 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/node/StorageNodeUnregisteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/node/StorageNodeUnregisteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.node; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage node unregistered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitAlteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitAlteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitAlteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitAlteredEvent.java index 67ba44b2a131d..f205f46675bc0 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitAlteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitAlteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.unit; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage unit altered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitRegisteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitRegisteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitRegisteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitRegisteredEvent.java index d261f41b944d4..2a61d4ce64944 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitRegisteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitRegisteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.unit; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage unit registered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitUnregisteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitUnregisteredEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitUnregisteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitUnregisteredEvent.java index 09174865ddc69..4f33e00c64c45 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/datasource/unit/StorageUnitUnregisteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/datasource/unit/StorageUnitUnregisteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.datasource.unit; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Storage unit unregistered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataAddedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataAddedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataAddedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataAddedEvent.java index 4225b01532d9f..02ba24a693b87 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataAddedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataAddedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Database data added event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataDeletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataDeletedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataDeletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataDeletedEvent.java index 09a0cfee78938..0c2ad5ebd75f9 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/DatabaseDataDeletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/DatabaseDataDeletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Database deleted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataAddedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataAddedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataAddedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataAddedEvent.java index 90a73f00dfc35..08ce0de9e127e 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataAddedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataAddedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Schema added event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataDeletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataDeletedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataDeletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataDeletedEvent.java index b0bd99aae4c83..f837cd25c3e13 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/SchemaDataDeletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/SchemaDataDeletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Schema deleted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataChangedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataChangedEvent.java similarity index 87% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataChangedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataChangedEvent.java index c5d78e039270e..f54dc3aefbc2f 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataChangedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataChangedEvent.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Row data changed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataDeletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataDeletedEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataDeletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataDeletedEvent.java index 148ba88bdeda4..a7171206fe788 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/ShardingSphereRowDataDeletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/ShardingSphereRowDataDeletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Row data deleted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/TableDataChangedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/TableDataChangedEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/TableDataChangedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/TableDataChangedEvent.java index cca93f91c589d..507a13bef1fa0 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/data/TableDataChangedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/data/TableDataChangedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.data; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Table data changed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaAddedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaAddedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaAddedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaAddedEvent.java index 72c206578415c..79a9259687ae3 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaAddedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaAddedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Schema added event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaDeletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaDeletedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaDeletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaDeletedEvent.java index b260db3498572..72efaa3eeee46 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/SchemaDeletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/SchemaDeletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Schema deleted event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableCreatedOrAlteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableCreatedOrAlteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableCreatedOrAlteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableCreatedOrAlteredEvent.java index a9f203a2f5261..bc72d30cd9c1d 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableCreatedOrAlteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableCreatedOrAlteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Table created or altered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableDroppedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableDroppedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableDroppedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableDroppedEvent.java index e0677e510f078..f8aca800dbab1 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/table/TableDroppedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/table/TableDroppedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Table dropped event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewCreatedOrAlteredEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewCreatedOrAlteredEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewCreatedOrAlteredEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewCreatedOrAlteredEvent.java index 9e56a04abe8dd..6357a4612e3e5 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewCreatedOrAlteredEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewCreatedOrAlteredEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * View created or altered event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewDroppedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewDroppedEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewDroppedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewDroppedEvent.java index d4c47b49442a8..0e5984c5636ff 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/metadata/schema/view/ViewDroppedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/metadata/schema/view/ViewDroppedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * View dropped event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java index 42aefc77aee10..61004bbfec2bd 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/RuleItemChangedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Rule item changed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java similarity index 93% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java index 237c00e0b3748..00fba8b5fc2a4 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterNamedRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java index 55e4780a6c4a0..b22f8a97f1da4 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter; -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent; /** * Alter rule item event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java similarity index 93% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java index 5bda761cae676..fc1107ede6a26 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/alter/AlterUniqueRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.alter; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java similarity index 92% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java index 6783a26c75e67..51bb4531ac9b4 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropNamedRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java similarity index 84% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java index 7a0413f92bd7b..84793caea33d0 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop; -import org.apache.shardingsphere.mode.event.dispatch.rule.RuleItemChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent; /** * Drop rule item event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java similarity index 92% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java index 561be2372c69b..1b466cdb8cf9b 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/rule/drop/DropUniqueRuleItemEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.rule.drop; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/cluster/ClusterStateEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/cluster/ClusterStateEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java index 635e99b219cf0..d46ffc02b7433 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/cluster/ClusterStateEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.cluster; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.infra.state.cluster.ClusterState; /** diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ComputeNodeInstanceStateChangedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ComputeNodeInstanceStateChangedEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ComputeNodeInstanceStateChangedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ComputeNodeInstanceStateChangedEvent.java index 164244ba22b1b..430a9ccfcaf57 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ComputeNodeInstanceStateChangedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ComputeNodeInstanceStateChangedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Compute node instance state changed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessCompletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessCompletedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessCompletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessCompletedEvent.java index 8899510c9b4b6..45f6bc4a2489e 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessCompletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessCompletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Kill local process completed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessEvent.java index d5ac080daeef5..bfe759c6ce68f 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/KillLocalProcessEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/KillLocalProcessEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Kill local process event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/LabelsEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/LabelsEvent.java similarity index 86% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/LabelsEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/LabelsEvent.java index 9d04ff7fc9bc8..636d645beb11b 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/LabelsEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/LabelsEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import java.util.Collection; diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesCompletedEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesCompletedEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesCompletedEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesCompletedEvent.java index 9d7f7c69d2171..64ccd05402fcf 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesCompletedEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesCompletedEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Report local processes completed event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesEvent.java index b472b35671c7c..6cd9916b3d888 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/ReportLocalProcessesEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/ReportLocalProcessesEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Report local processes event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/WorkerIdEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/WorkerIdEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/WorkerIdEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/WorkerIdEvent.java index 4453ac4175e2c..8bd6d9cd89074 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/WorkerIdEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/WorkerIdEvent.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Worker id event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOfflineEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOfflineEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOfflineEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOfflineEvent.java index a7f949e535dd3..bdc19a2a5e35d 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOfflineEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOfflineEvent.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute.instance; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Compute node instance offline event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOnlineEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOnlineEvent.java similarity index 85% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOnlineEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOnlineEvent.java index 74d6e9c109e7b..95942775f0868 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/compute/instance/InstanceOnlineEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/compute/instance/InstanceOnlineEvent.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.compute.instance; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; /** * Compute node instance online event. diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/storage/QualifiedDataSourceStateEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/storage/QualifiedDataSourceStateEvent.java similarity index 87% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/storage/QualifiedDataSourceStateEvent.java rename to mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/storage/QualifiedDataSourceStateEvent.java index a8d2aa6e2d11a..6a71ef77a286a 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/dispatch/state/storage/QualifiedDataSourceStateEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/storage/QualifiedDataSourceStateEvent.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.dispatch.state.storage; +package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.storage; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDataSource; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.infra.state.datasource.qualified.QualifiedDataSourceState; /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java index d35c2a809916d..b6d3322e8b45e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.MetaDataChangedEventBuilder; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.RuleConfigurationChangedEventBuilder; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener; import java.util.Optional; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriber.java index ef02905d65d6c..7dcd394ce0e67 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriber.java @@ -19,7 +19,7 @@ import com.google.common.eventbus.Subscribe; import org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java index c01a1210caaa2..069734a88f408 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriber.java @@ -20,11 +20,11 @@ import com.google.common.eventbus.Subscribe; import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ComputeNodeInstanceStateChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.LabelsEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.WorkerIdEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOfflineEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOnlineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ComputeNodeInstanceStateChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.LabelsEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.WorkerIdEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOfflineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOnlineEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriber.java index 4264ad3dcc5ea..9a1cc2aa6f7fb 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriber.java @@ -18,13 +18,13 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import com.google.common.eventbus.Subscribe; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.TableDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.TableDataChangedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.metadata.manager.ShardingSphereDatabaseDataManager; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriber.java index d9ff986b01e3d..d5cab08d6443b 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriber.java @@ -22,7 +22,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterGlobalRuleConfigurationEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterGlobalRuleConfigurationEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.spi.RuleConfigurationPersistDecorator; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index 0f09b38c08662..831e4fe3e6b3d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -21,8 +21,8 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; -import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java index a3cc283ef21fb..52d6aeae4db0d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java @@ -22,12 +22,12 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java index b64dec3645df8..4e9c64cd2c84e 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java @@ -25,10 +25,10 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.metadata.persist.node.ProcessNode; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.spi.PersistRepository; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriber.java index 0665147e7033e..ba3d0df017f42 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriber.java @@ -20,7 +20,7 @@ import com.google.common.base.Preconditions; import com.google.common.eventbus.Subscribe; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterPropertiesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterPropertiesEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriber.java index 2de68b4e98b98..13c4e4babecfd 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriber.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDataSource; import org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute; -import org.apache.shardingsphere.mode.event.dispatch.state.storage.QualifiedDataSourceStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.storage.QualifiedDataSourceStateEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java index 9db8351b9dd3a..0dc53fd1c9c94 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java @@ -19,12 +19,12 @@ import com.google.common.eventbus.Subscribe; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java index 809b3bc400005..99d28be93e196 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java @@ -19,7 +19,7 @@ import com.google.common.eventbus.Subscribe; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.mode.event.dispatch.state.cluster.ClusterStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster.ClusterStateEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriber.java index cf8627d6d9dac..257039b94553d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriber.java @@ -21,9 +21,9 @@ import com.google.common.eventbus.Subscribe; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitUnregisteredEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java index aefc76250e5f6..1e6f71f6af0da 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/MetaDataChangedEventBuilderTest.java @@ -19,19 +19,19 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeUnregisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.node.StorageNodeUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java index 8c0471a6c44ee..719cee3b2b72c 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java @@ -20,11 +20,11 @@ import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent; import org.apache.shardingsphere.mode.path.rule.RuleNodePath; import org.apache.shardingsphere.mode.spi.RuleNodePathProvider; import org.apache.shardingsphere.test.mock.AutoMockExtension; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java index aad9757d62766..a52973c4333a7 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java @@ -20,8 +20,8 @@ import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.cluster.ClusterStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster.ClusterStateEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilderTest.java index 6f2cf795b2b10..7f01064280cde 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeOnlineDispatchEventBuilderTest.java @@ -18,11 +18,11 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.type; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOfflineEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOnlineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOfflineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOnlineEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilderTest.java index faab13d4a2d71..da793b58ffe4e 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ComputeNodeStateDispatchEventBuilderTest.java @@ -21,10 +21,10 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ComputeNodeInstanceStateChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.LabelsEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.WorkerIdEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ComputeNodeInstanceStateChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.LabelsEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.WorkerIdEvent; import org.junit.jupiter.api.Test; import java.util.Arrays; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilderTest.java index 011e644bdb7d9..b112cdd27c536 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/GlobalRuleDispatchEventBuilderTest.java @@ -19,8 +19,8 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterGlobalRuleConfigurationEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterGlobalRuleConfigurationEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilderTest.java index f4ed553625cc3..dbd281442b894 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/KillProcessDispatchEventBuilderTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java index 7fdfd5fc24f99..237e4d6dc5391 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java @@ -19,9 +19,9 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilderTest.java index 5b3bcbd53e2a6..ac2b04b0b25b2 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/PropertiesDispatchEventBuilderTest.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterPropertiesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterPropertiesEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilderTest.java index ad3d7fe64742e..07f8158be28e9 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/QualifiedDataSourceDispatchEventBuilderTest.java @@ -17,11 +17,11 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.infra.state.datasource.DataSourceState; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.state.storage.QualifiedDataSourceStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.storage.QualifiedDataSourceStateEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilderTest.java index dc2d3824fa06f..2120e3df0260d 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShardingSphereDataDispatchEventBuilderTest.java @@ -19,14 +19,14 @@ import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.TableDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.TableDataChangedEvent; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilderTest.java index f6a3165437c6b..51eb09873ed50 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ShowProcessListDispatchEventBuilderTest.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; -import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; import org.junit.jupiter.api.Test; import java.util.Optional; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriberTest.java index 78ae91f2135f8..ab788919b27e3 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/CacheEvictedSubscriberTest.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache; -import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; import org.junit.jupiter.api.Test; import java.util.Collections; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java index e2c76070bd9ed..c04be8ad8af1e 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ComputeNodeStateSubscriberTest.java @@ -19,11 +19,11 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ComputeNodeInstanceStateChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.LabelsEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.WorkerIdEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOfflineEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.instance.InstanceOnlineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ComputeNodeInstanceStateChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.LabelsEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.WorkerIdEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOfflineEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.instance.InstanceOnlineEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriberTest.java index 9d7bd49f1be7c..b920fc57fee81 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/DatabaseDataChangedSubscriberTest.java @@ -18,13 +18,13 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.DatabaseDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.SchemaDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataChangedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.ShardingSphereRowDataDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.data.TableDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.DatabaseDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.SchemaDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataChangedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.ShardingSphereRowDataDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.data.TableDataChangedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriberTest.java index 588a7f4cd31ad..5b772b53bdb27 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/GlobalRuleConfigurationEventSubscriberTest.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterGlobalRuleConfigurationEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterGlobalRuleConfigurationEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriberTest.java index 6debc68126376..02b0094c87093 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriberTest.java @@ -18,8 +18,8 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; -import org.apache.shardingsphere.mode.event.dispatch.assisted.CreateDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.event.dispatch.assisted.DropDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.BeforeEach; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java index 9f15ff53d66f4..b693761c13bd0 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java @@ -21,12 +21,12 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.BeforeEach; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java index 63d069f8a1c2e..2dab71dc3d4ff 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java @@ -20,10 +20,10 @@ import org.apache.shardingsphere.infra.executor.sql.process.Process; import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.KillLocalProcessEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesCompletedEvent; -import org.apache.shardingsphere.mode.event.dispatch.state.compute.ReportLocalProcessesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.apache.shardingsphere.test.mock.AutoMockExtension; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriberTest.java index a2267d31a078b..e6aea84fb9936 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/PropertiesEventSubscriberTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; -import org.apache.shardingsphere.mode.event.dispatch.config.AlterPropertiesEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.config.AlterPropertiesEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriberTest.java index 05fe5b9b8852a..4342022497831 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/QualifiedDataSourceSubscriberTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute; import org.apache.shardingsphere.infra.state.datasource.DataSourceState; import org.apache.shardingsphere.infra.state.datasource.qualified.QualifiedDataSourceState; -import org.apache.shardingsphere.mode.event.dispatch.state.storage.QualifiedDataSourceStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.storage.QualifiedDataSourceStateEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java index 5f04a35b00a69..7b842beb04212 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java @@ -17,10 +17,10 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropNamedRuleItemEvent; -import org.apache.shardingsphere.mode.event.dispatch.rule.drop.DropRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropRuleItemEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; import org.apache.shardingsphere.mode.spi.item.DropRuleItem; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java index 8567b2ca8c9f5..fb03144774414 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import org.apache.shardingsphere.infra.state.cluster.ClusterState; -import org.apache.shardingsphere.mode.event.dispatch.state.cluster.ClusterStateEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster.ClusterStateEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriberTest.java index 951d4610cd5b0..60598865b7bdf 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StorageUnitEventSubscriberTest.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent; -import org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitAlteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitRegisteredEvent; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.datasource.unit.StorageUnitUnregisteredEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 0a1c8e53680f707b700bf5301d01f378eb0cfae3 Mon Sep 17 00:00:00 2001 From: Joshua Chen <27291761@qq.com> Date: Sat, 28 Dec 2024 22:39:50 +0800 Subject: [PATCH 172/192] Support modifying Hikari-CP configurations via props in standalone mode (#34185) * Support modifying Hikari-CP configurations via props in standalone mode * update release notes * Fix Spotless run failure --- RELEASE-NOTES.md | 1 + .../standalone/jdbc/JDBCRepository.java | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index aecb969312432..3217d36b5b359 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -48,6 +48,7 @@ 1. SQL Binder: Support load data and load xml sql bind and add test case - [#34177](https://github.com/apache/shardingsphere/pull/34177) 1. Transaction: Support savepoint/release savepoint TCL statements in jdbc adapter -[#34173](https://github.com/apache/shardingsphere/pull/34173) 1. Kernel: Add WithAvailable interface and encrypt with, combine, insert select support checker - [#34175](https://github.com/apache/shardingsphere/pull/34175) +1. Mode: Support modifying Hikari-CP configurations via props in standalone mode [#34185](https://github.com/apache/shardingsphere/pull/34185) ### Bug Fixes diff --git a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java index 098b9e965725c..25ddab133d17e 100644 --- a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java +++ b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java @@ -18,7 +18,9 @@ package org.apache.shardingsphere.mode.repository.standalone.jdbc; import com.google.common.base.Strings; +import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.util.PropertyElf; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository; @@ -58,11 +60,21 @@ public final class JDBCRepository implements StandalonePersistRepository { public void init(final Properties props) { JDBCRepositoryProperties jdbcRepositoryProps = new JDBCRepositoryProperties(props); repositorySQL = JDBCRepositorySQLLoader.load(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PROVIDER)); - dataSource = new HikariDataSource(); - dataSource.setDriverClassName(repositorySQL.getDriverClassName()); - dataSource.setJdbcUrl(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.JDBC_URL)); - dataSource.setUsername(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.USERNAME)); - dataSource.setPassword(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PASSWORD)); + + Properties hikariProperties = PropertyElf.copyProperties(props); + hikariProperties.remove(JDBCRepositoryPropertyKey.PROVIDER.getKey()); + hikariProperties.remove(JDBCRepositoryPropertyKey.JDBC_URL.getKey()); + hikariProperties.remove(JDBCRepositoryPropertyKey.USERNAME.getKey()); + hikariProperties.remove(JDBCRepositoryPropertyKey.PASSWORD.getKey()); + + HikariConfig hikariConfig = new HikariConfig(hikariProperties); + hikariConfig.setDriverClassName(repositorySQL.getDriverClassName()); + hikariConfig.setJdbcUrl(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.JDBC_URL)); + hikariConfig.setUsername(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.USERNAME)); + hikariConfig.setPassword(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PASSWORD)); + + dataSource = new HikariDataSource(hikariConfig); + try ( Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement()) { From b1061ec94e2ad8f714ff5507e02f48a7ea7ed18d Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 22:40:13 +0800 Subject: [PATCH 173/192] Move QualifiedDataSourceDeletedEvent to readwrite-splitting-core module (#34190) --- .../cluster}/QualifiedDataSourceDeletedEvent.java | 2 +- .../ReadwriteSplittingQualifiedDataSourceDeletedSubscriber.java | 1 - .../ReadwriteSplittingStaticDataSourceRuleAttribute.java | 2 +- ...dwriteSplittingQualifiedDataSourceDeletedSubscriberTest.java | 1 - .../ReadwriteSplittingStaticDataSourceRuleAttributeTest.java | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) rename {mode/api/src/main/java/org/apache/shardingsphere/mode/event/deliver => features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster}/QualifiedDataSourceDeletedEvent.java (95%) diff --git a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/deliver/QualifiedDataSourceDeletedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/QualifiedDataSourceDeletedEvent.java similarity index 95% rename from mode/api/src/main/java/org/apache/shardingsphere/mode/event/deliver/QualifiedDataSourceDeletedEvent.java rename to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/QualifiedDataSourceDeletedEvent.java index 90111b5030584..0c04ed76e80a8 100644 --- a/mode/api/src/main/java/org/apache/shardingsphere/mode/event/deliver/QualifiedDataSourceDeletedEvent.java +++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/QualifiedDataSourceDeletedEvent.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.event.deliver; +package org.apache.shardingsphere.readwritesplitting.cluster; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriber.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriber.java index c24ee7f195e85..842ac068f42ef 100644 --- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriber.java +++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriber.java @@ -21,7 +21,6 @@ import lombok.Setter; import org.apache.shardingsphere.metadata.persist.node.QualifiedDataSourceNode; import org.apache.shardingsphere.mode.event.deliver.DeliverEventSubscriber; -import org.apache.shardingsphere.mode.event.deliver.QualifiedDataSourceDeletedEvent; import org.apache.shardingsphere.mode.spi.PersistRepository; /** diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttribute.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttribute.java index da04999107789..80dc61ccf115c 100644 --- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttribute.java +++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttribute.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDataSource; import org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute; import org.apache.shardingsphere.infra.state.datasource.DataSourceState; -import org.apache.shardingsphere.mode.event.deliver.QualifiedDataSourceDeletedEvent; +import org.apache.shardingsphere.readwritesplitting.cluster.QualifiedDataSourceDeletedEvent; import org.apache.shardingsphere.readwritesplitting.exception.logic.ReadwriteSplittingDataSourceRuleNotFoundException; import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceGroupRule; diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriberTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriberTest.java index 9f25aea262fa0..837bd8bcc2aa7 100644 --- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriberTest.java +++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/cluster/ReadwriteSplittingQualifiedDataSourceDeletedSubscriberTest.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.readwritesplitting.cluster; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDataSource; -import org.apache.shardingsphere.mode.event.deliver.QualifiedDataSourceDeletedEvent; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttributeTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttributeTest.java index be5f44050592b..eac337870a67e 100644 --- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttributeTest.java +++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/attribute/ReadwriteSplittingStaticDataSourceRuleAttributeTest.java @@ -20,7 +20,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDataSource; import org.apache.shardingsphere.infra.state.datasource.DataSourceState; -import org.apache.shardingsphere.mode.event.deliver.QualifiedDataSourceDeletedEvent; +import org.apache.shardingsphere.readwritesplitting.cluster.QualifiedDataSourceDeletedEvent; import org.apache.shardingsphere.readwritesplitting.exception.logic.ReadwriteSplittingDataSourceRuleNotFoundException; import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceGroupRule; import org.junit.jupiter.api.Test; From 877f83653042227b834594dad860f5cea9279f44 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 22:46:31 +0800 Subject: [PATCH 174/192] Update release note (#34191) --- RELEASE-NOTES.md | 52 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 3217d36b5b359..0df46139d40c5 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -11,29 +11,15 @@ 1. Kernel: Add arguments not null check when creating RouteUnit - [#33382](https://github.com/apache/shardingsphere/pull/33382) 1. Kernel: Add index columns not empty judgement for IndexColumnTokenGenerator - [#33384](https://github.com/apache/shardingsphere/pull/33384) 1. Kernel: Add binding to owner table - [#33533](https://github.com/apache/shardingsphere/pull/33533) +1. Kernel: Add binding to owner table - [#33533](https://github.com/apache/shardingsphere/pull/33533) +1. Kernel: Add WithAvailable interface and encrypt with, combine, insert select support checker - [#34175](https://github.com/apache/shardingsphere/pull/34175) +1. Metadata: Add load-table-metadata-batch-size props to concurrent load table metadata - [#34009](https://github.com/apache/shardingsphere/pull/34009) 1. DistSQL: Check inline expression when create sharding table rule with inline sharding algorithm - [#33735](https://github.com/apache/shardingsphere/pull/33735) 1. SQL Parser: Support parsing Doris BITXOR - [#33258](https://github.com/apache/shardingsphere/pull/33258) 1. SQL Parser: Support parsing Doris INSTR - [#33289](https://github.com/apache/shardingsphere/pull/33289) 1. SQL Parser: Support parsing Doris STRRIGHT - [#33393](https://github.com/apache/shardingsphere/pull/33393) 1. SQL Parser: Support parsing MySQL by adding non-reserved keywords in BaseRule.g4 file according to MySQL 8.4 doc - [#33846](https://github.com/apache/shardingsphere/pull/33846) -1. Storage: Support setting `hive_conf_list`, `hive_var_list` and `sess_var_list` for jdbcURL when connecting to HiveServer2 - [#33749](https://github.com/apache/shardingsphere/pull/33749) -1. Storage: Support connecting to HiveServer2 through database connection pools other than HikariCP - [#33762](https://github.com/apache/shardingsphere/pull/33762) -1. Storage: Partial support for connecting to embedded ClickHouse `chDB` - [#33786](https://github.com/apache/shardingsphere/pull/33786) -1. SQL Federation: Upgrade calcite version to 1.38.0 and update all license info in LICENSE file - [#33279](https://github.com/apache/shardingsphere/pull/33279) -1. Transaction: Bump the minimum Seata Client version for Seata AT integration to 2.2.0 - [#33872](https://github.com/apache/shardingsphere/pull/33872) -1. JDBC: Add show database name for JDBC when execute SHOW COMPUTE NODES - [#33437](https://github.com/apache/shardingsphere/pull/33437) -1. Kernel: Add binding to owner table - [#33533](https://github.com/apache/shardingsphere/pull/33533) 1. SQL Parser: Support parsing Doris EXTRACT\_URL\_PARAMETER - [#33571](https://github.com/apache/shardingsphere/pull/33571) -1. JDBC: Support ZonedDateTime on ResultSet - [#33660](https://github.com/apache/shardingsphere/issues/33660) -1. Proxy: Add query parameters and check for MySQL kill processId - [#33274](https://github.com/apache/shardingsphere/pull/33274) -1. Proxy: Support table not exist exception for PostgreSQL proxy - [#33885](https://github.com/apache/shardingsphere/pull/33274) -1. Proxy Native: Change the Base Docker Image of ShardingSphere Proxy Native - [#33263](https://github.com/apache/shardingsphere/issues/33263) -1. Proxy Native: Support connecting to HiveServer2 with ZooKeeper Service Discovery enabled in GraalVM Native Image - [#33768](https://github.com/apache/shardingsphere/pull/33768) -1. Proxy Native: Support local transactions of ClickHouse under GraalVM Native Image - [#33801](https://github.com/apache/shardingsphere/pull/33801) -1. Sharding: Support GroupConcat function for aggregating multiple shards in MySQL, OpenGauss, Doris - [#33808](https://github.com/apache/shardingsphere/pull/33808) -1. Proxy Native: Support Seata AT integration under Proxy Native in GraalVM Native Image - [#33889](https://github.com/apache/shardingsphere/pull/33889) -1. Agent: Simplify the use of Agent's Docker Image - [#33356](https://github.com/apache/shardingsphere/pull/33356) -1. Metadata: Add load-table-metadata-batch-size props to concurrent load table metadata - [#34009](https://github.com/apache/shardingsphere/pull/34009) 1. SQL Binder: Add sql bind logic for create table statement - [#34074](https://github.com/apache/shardingsphere/pull/34074) 1. SQL Binder: Support create index statement sql bind - [#34112](https://github.com/apache/shardingsphere/pull/34112) 1. SQL Parser: Support MySQL update with statement parse - [#34126](https://github.com/apache/shardingsphere/pull/34126) @@ -46,32 +32,46 @@ 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) 1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) 1. SQL Binder: Support load data and load xml sql bind and add test case - [#34177](https://github.com/apache/shardingsphere/pull/34177) +1. Storage: Support setting `hive_conf_list`, `hive_var_list` and `sess_var_list` for jdbcURL when connecting to HiveServer2 - [#33749](https://github.com/apache/shardingsphere/pull/33749) +1. Storage: Support connecting to HiveServer2 through database connection pools other than HikariCP - [#33762](https://github.com/apache/shardingsphere/pull/33762) +1. Storage: Partial support for connecting to embedded ClickHouse `chDB` - [#33786](https://github.com/apache/shardingsphere/pull/33786) 1. Transaction: Support savepoint/release savepoint TCL statements in jdbc adapter -[#34173](https://github.com/apache/shardingsphere/pull/34173) -1. Kernel: Add WithAvailable interface and encrypt with, combine, insert select support checker - [#34175](https://github.com/apache/shardingsphere/pull/34175) +1. Transaction: Bump the minimum Seata Client version for Seata AT integration to 2.2.0 - [#33872](https://github.com/apache/shardingsphere/pull/33872) +1. SQL Federation: Upgrade calcite version to 1.38.0 and update all license info in LICENSE file - [#33279](https://github.com/apache/shardingsphere/pull/33279) +1. JDBC: Add show database name for JDBC when execute SHOW COMPUTE NODES - [#33437](https://github.com/apache/shardingsphere/pull/33437) +1. JDBC: Support ZonedDateTime on ResultSet - [#33660](https://github.com/apache/shardingsphere/issues/33660) +1. Proxy: Add query parameters and check for MySQL kill processId - [#33274](https://github.com/apache/shardingsphere/pull/33274) +1. Proxy: Support table not exist exception for PostgreSQL proxy - [#33885](https://github.com/apache/shardingsphere/pull/33274) +1. Proxy Native: Change the Base Docker Image of ShardingSphere Proxy Native - [#33263](https://github.com/apache/shardingsphere/issues/33263) +1. Proxy Native: Support connecting to HiveServer2 with ZooKeeper Service Discovery enabled in GraalVM Native Image - [#33768](https://github.com/apache/shardingsphere/pull/33768) +1. Proxy Native: Support local transactions of ClickHouse under GraalVM Native Image - [#33801](https://github.com/apache/shardingsphere/pull/33801) +1. Proxy Native: Support Seata AT integration under Proxy Native in GraalVM Native Image - [#33889](https://github.com/apache/shardingsphere/pull/33889) +1. Sharding: Support GroupConcat function for aggregating multiple shards in MySQL, OpenGauss, Doris - [#33808](https://github.com/apache/shardingsphere/pull/33808) +1. Agent: Simplify the use of Agent's Docker Image - [#33356](https://github.com/apache/shardingsphere/pull/33356) 1. Mode: Support modifying Hikari-CP configurations via props in standalone mode [#34185](https://github.com/apache/shardingsphere/pull/34185) ### Bug Fixes -1. Mode: Fixes `JDBCRepository` improper handling of H2-database in memory mode - [#33281](https://github.com/apache/shardingsphere/issues/33281) -1. Mode: Fixes duplicate column names added when index changed in DDL - [#33982](https://github.com/apache/shardingsphere/issues/33281) -1. SQL Binder: Fixes table does not exist exception when use HintManager#setDatabaseName to transparent - [#33370](https://github.com/apache/shardingsphere/pull/33370) 1. SQL Parser: Fixes LiteralExpressionSegment cast exception in SQL parser - [#33332](https://github.com/apache/shardingsphere/pull/33332) 1. SQL Parser: Fixes PostgreSQL and openGauss time extract function parse week and quarter error - [#33564](https://github.com/apache/shardingsphere/pull/33564) +1. SQL Parser: Fixes MySQL parse zone unreserved keyword error - [#33720](https://github.com/apache/shardingsphere/pull/33720) +1. SQL Parser: Fixes MySQL range parse error when use table owner - [#33874](https://github.com/apache/shardingsphere/pull/33874) +1. SQL Binder: Fixes table does not exist exception when use HintManager#setDatabaseName to transparent - [#33370](https://github.com/apache/shardingsphere/pull/33370) 1. SQL Binder: Use Multimap and CaseInsensitiveString to replace CaseInsensitiveMap for supporting MySQL multi table join with same table alias - [#33303](https://github.com/apache/shardingsphere/pull/33303) 1. SQL Binder: Fixes the combine statement cannot find the outer table when bind - [#33357](https://github.com/apache/shardingsphere/pull/33357) 1. SQL Binder: Fixes SQL performance issues caused by repeated subquery fetches - [#33361](https://github.com/apache/shardingsphere/pull/33361) -1. SQL Parser: Fixes MySQL parse zone unreserved keyword error - [#33720](https://github.com/apache/shardingsphere/pull/33720) -1. SQL Parser: Fixes MySQL range parse error when use table owner - [#33874](https://github.com/apache/shardingsphere/pull/33874) +1. SQL Binder: Fixes the expression segment cannot find the outer table when binding - [#34015](https://github.com/apache/shardingsphere/pull/34015) 1. Storage: Fixes cannot connect to HiveServer2 using remote Hive Metastore Server - [#33837](https://github.com/apache/shardingsphere/pull/33837) 1. Proxy: Fixes BatchUpdateException when execute INSERT INTO ON DUPLICATE KEY UPDATE in proxy adapter - [#33796](https://github.com/apache/shardingsphere/pull/33796) +1. Proxy: Fixes "ALL PRIVILEGES ON `DB`.*" is not recognized during SELECT privilege verification for MySQL - [#34037](https://github.com/apache/shardingsphere/pull/34037) +1. Proxy: Fixes MySQL longblob wrong column type returned by proxy protocol - [#34121](https://github.com/apache/shardingsphere/pull/34121) 1. Sharding: Remove ShardingRouteAlgorithmException check logic temporarily to support different actual table name configuration - [#33367](https://github.com/apache/shardingsphere/pull/33367) 1. Sharding: Fixes SQL COUNT with GROUP BY to prevent incorrect row returns - [#33380](https://github.com/apache/shardingsphere/pull/33380) 1. Sharding: Fixes avg, sum, min, max function return empty data when no query result return - [#33449](https://github.com/apache/shardingsphere/pull/33449) 1. Encrypt: Fixes merge exception without encrypt rule in database - [#33708](https://github.com/apache/shardingsphere/pull/33708) -1. SQL Binder: Fixes the expression segment cannot find the outer table when binding - [#34015](https://github.com/apache/shardingsphere/pull/34015) -1. Proxy: Fixes "ALL PRIVILEGES ON `DB`.*" is not recognized during SELECT privilege verification for MySQL - [#34037](https://github.com/apache/shardingsphere/pull/34037) 1. Encrypt: Use sql bind info in EncryptInsertPredicateColumnTokenGenerator to avoid wrong column table mapping - [#34110](https://github.com/apache/shardingsphere/pull/34110) -1. Proxy: Fix mysql longblob wrong column type returned by proxy protocol - [#34121](https://github.com/apache/shardingsphere/pull/34121) +1. Mode: Fixes `JDBCRepository` improper handling of H2-database in memory mode - [#33281](https://github.com/apache/shardingsphere/issues/33281) +1. Mode: Fixes duplicate column names added when index changed in DDL - [#33982](https://github.com/apache/shardingsphere/issues/33281) ### Change Logs From 21b951de0e0814f4e53b4d056becadda9bd8a974 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 22:51:55 +0800 Subject: [PATCH 175/192] Revise JDBCRepository (#34192) --- .../standalone/jdbc/JDBCRepository.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java index 25ddab133d17e..42686f9f1a818 100644 --- a/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java +++ b/mode/type/standalone/repository/provider/jdbc/src/main/java/org/apache/shardingsphere/mode/repository/standalone/jdbc/JDBCRepository.java @@ -60,21 +60,7 @@ public final class JDBCRepository implements StandalonePersistRepository { public void init(final Properties props) { JDBCRepositoryProperties jdbcRepositoryProps = new JDBCRepositoryProperties(props); repositorySQL = JDBCRepositorySQLLoader.load(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PROVIDER)); - - Properties hikariProperties = PropertyElf.copyProperties(props); - hikariProperties.remove(JDBCRepositoryPropertyKey.PROVIDER.getKey()); - hikariProperties.remove(JDBCRepositoryPropertyKey.JDBC_URL.getKey()); - hikariProperties.remove(JDBCRepositoryPropertyKey.USERNAME.getKey()); - hikariProperties.remove(JDBCRepositoryPropertyKey.PASSWORD.getKey()); - - HikariConfig hikariConfig = new HikariConfig(hikariProperties); - hikariConfig.setDriverClassName(repositorySQL.getDriverClassName()); - hikariConfig.setJdbcUrl(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.JDBC_URL)); - hikariConfig.setUsername(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.USERNAME)); - hikariConfig.setPassword(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PASSWORD)); - - dataSource = new HikariDataSource(hikariConfig); - + dataSource = new HikariDataSource(createHikariConfig(props, jdbcRepositoryProps)); try ( Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement()) { @@ -90,6 +76,24 @@ public void init(final Properties props) { } } + private HikariConfig createHikariConfig(final Properties props, final JDBCRepositoryProperties jdbcRepositoryProps) { + HikariConfig result = new HikariConfig(copyProperties(props)); + result.setDriverClassName(repositorySQL.getDriverClassName()); + result.setJdbcUrl(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.JDBC_URL)); + result.setUsername(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.USERNAME)); + result.setPassword(jdbcRepositoryProps.getValue(JDBCRepositoryPropertyKey.PASSWORD)); + return result; + } + + private Properties copyProperties(final Properties props) { + Properties result = PropertyElf.copyProperties(props); + result.remove(JDBCRepositoryPropertyKey.PROVIDER.getKey()); + result.remove(JDBCRepositoryPropertyKey.JDBC_URL.getKey()); + result.remove(JDBCRepositoryPropertyKey.USERNAME.getKey()); + result.remove(JDBCRepositoryPropertyKey.PASSWORD.getKey()); + return result; + } + @Override public String query(final String key) { try ( From 6d7d680b75172759619b2b095acfb9cf2f73bf72 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 23:23:43 +0800 Subject: [PATCH 176/192] Add LockSQLException (#34193) --- .../error-code/sql-error-code.cn.md | 9 +++-- .../error-code/sql-error-code.en.md | 9 +++-- .../kernel/category/LockSQLException.java | 35 +++++++++++++++++++ .../exception/LockedClusterException.java | 6 ++-- .../exception/NotLockedClusterException.java | 6 ++-- .../ral/updatable/LockClusterExecutor.java | 2 +- .../ral/updatable/UnlockClusterExecutor.java | 2 +- .../updatable/LockClusterExecutorTest.java | 2 +- .../updatable/UnlockClusterExecutorTest.java | 2 +- 9 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java rename mode/core/src/main/java/org/apache/shardingsphere/mode/{ => lock}/exception/LockedClusterException.java (87%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/{ => lock}/exception/NotLockedClusterException.java (87%) diff --git a/docs/document/content/user-manual/error-code/sql-error-code.cn.md b/docs/document/content/user-manual/error-code/sql-error-code.cn.md index 0845881f875c4..a09db6bb79fa0 100644 --- a/docs/document/content/user-manual/error-code/sql-error-code.cn.md +++ b/docs/document/content/user-manual/error-code/sql-error-code.cn.md @@ -100,6 +100,13 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供, | 14400 | 44000 | No application id within 'seata.conf' file. | | 14401 | 25000 | Seata-AT transaction has been disabled. | +### 锁 + +| Vendor Code | SQL State | 错误信息 | +|-------------|-----------|----------------------------| +| 15030 | HY000 | Cluster is already locked. | +| 15031 | HY000 | Cluster is not locked. | + ### 集群 | Vendor Code | SQL State | 错误信息 | @@ -108,8 +115,6 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供, | 17001 | HY000 | Worker ID assigned failed, which should be in [0, %s). | | 17010 | HY000 | Cluster persist repository error, reason is: %s | | 17020 | HY000 | The cluster status is %s, can not support SQL statement '%s'. | -| 17030 | HY000 | Cluster is already locked. | -| 17031 | HY000 | Cluster is not locked. | | 17100 | 42S02 | Cluster persist repository configuration is required. | ### 数据管道 diff --git a/docs/document/content/user-manual/error-code/sql-error-code.en.md b/docs/document/content/user-manual/error-code/sql-error-code.en.md index 4359e8d65c17e..282e53f2ea883 100644 --- a/docs/document/content/user-manual/error-code/sql-error-code.en.md +++ b/docs/document/content/user-manual/error-code/sql-error-code.en.md @@ -100,6 +100,13 @@ SQL error codes provide by standard `SQL State`, `Vendor Code` and `Reason`, whi | 14400 | 44000 | No application id within 'seata.conf' file. | | 14401 | 25000 | Seata-AT transaction has been disabled. | +### Lock + +| Vendor Code | SQL State | Reason | +|-------------|-----------|----------------------------| +| 15030 | HY000 | Cluster is already locked. | +| 15031 | HY000 | Cluster is not locked. | + ### Cluster | Vendor Code | SQL State | Reason | @@ -108,8 +115,6 @@ SQL error codes provide by standard `SQL State`, `Vendor Code` and `Reason`, whi | 17001 | HY000 | Worker ID assigned failed, which should be in [0, %s). | | 17010 | HY000 | Cluster persist repository error, reason is: %s | | 17020 | HY000 | The cluster status is %s, can not support SQL statement '%s'. | -| 17030 | HY000 | Cluster is already locked. | -| 17031 | HY000 | Cluster is not locked. | | 17100 | 42S02 | Cluster persist repository configuration is required. | ### Data Pipeline diff --git a/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java new file mode 100644 index 0000000000000..1797f0cdc76e0 --- /dev/null +++ b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category; + +import org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.SQLState; +import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.KernelSQLException; + +/** + * Lock SQL exception. + */ +public abstract class LockSQLException extends KernelSQLException { + + private static final long serialVersionUID = 7889797502163128147L; + + private static final int KERNEL_CODE = 5; + + public LockSQLException(final SQLState sqlState, final int errorCode, final String reason, final Object... messageArguments) { + super(sqlState, KERNEL_CODE, errorCode, reason, messageArguments); + } +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/exception/LockedClusterException.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/LockedClusterException.java similarity index 87% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/exception/LockedClusterException.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/LockedClusterException.java index 88f24c2f2531a..f41cb0ad83762 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/exception/LockedClusterException.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/LockedClusterException.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.exception; +package org.apache.shardingsphere.mode.lock.exception; import org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState; -import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.ClusterSQLException; +import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.LockSQLException; /** * Locked cluster exception. */ -public final class LockedClusterException extends ClusterSQLException { +public final class LockedClusterException extends LockSQLException { private static final long serialVersionUID = 122184861309346827L; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/exception/NotLockedClusterException.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/NotLockedClusterException.java similarity index 87% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/exception/NotLockedClusterException.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/NotLockedClusterException.java index 117cd86978a06..af2186df694ac 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/exception/NotLockedClusterException.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/lock/exception/NotLockedClusterException.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.exception; +package org.apache.shardingsphere.mode.lock.exception; import org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState; -import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.ClusterSQLException; +import org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.LockSQLException; /** * Not locked cluster exception. */ -public final class NotLockedClusterException extends ClusterSQLException { +public final class NotLockedClusterException extends LockSQLException { private static final long serialVersionUID = -9181518142445461894L; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index 00cd54cd9fe97..cba160afa02f2 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.infra.state.cluster.ClusterState; -import org.apache.shardingsphere.mode.exception.LockedClusterException; +import org.apache.shardingsphere.mode.lock.exception.LockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.lock.ClusterLock; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index 94d992aaac8de..e1d6e423fce51 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.cluster.ClusterState; -import org.apache.shardingsphere.mode.exception.NotLockedClusterException; +import org.apache.shardingsphere.mode.lock.exception.NotLockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.lock.ClusterLock; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java index 4fae2b0b407f9..7e86f7bcbec46 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.distsql.statement.ral.updatable.LockClusterStatement; import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException; import org.apache.shardingsphere.infra.state.cluster.ClusterState; -import org.apache.shardingsphere.mode.exception.LockedClusterException; +import org.apache.shardingsphere.mode.lock.exception.LockedClusterException; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.test.mock.AutoMockExtension; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java index 076ff500c77a8..58bc57722d118 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; import org.apache.shardingsphere.infra.state.cluster.ClusterState; -import org.apache.shardingsphere.mode.exception.NotLockedClusterException; +import org.apache.shardingsphere.mode.lock.exception.NotLockedClusterException; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.test.mock.AutoMockExtension; From 36c8038f6b60bc22bf79dbed266cbaadc56608bd Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sat, 28 Dec 2024 23:43:26 +0800 Subject: [PATCH 177/192] Move ClusterState to mode-core module (#34194) --- .../datasource/ShardingSphereDataSourceTest.java | 6 +++--- .../shardingsphere/mode/manager/ContextManager.java | 6 +++--- .../mode/persist/service/StatePersistService.java | 2 +- .../shardingsphere/mode/state}/ClusterState.java | 2 +- .../{StateContext.java => ClusterStateContext.java} | 12 +++++------- .../persist/service/StatePersistServiceTest.java | 2 +- .../shardingsphere/mode/state/StateContextTest.java | 11 +++++------ .../type/ClusterStateDispatchEventBuilder.java | 2 +- .../event/state/cluster/ClusterStateEvent.java | 2 +- .../subscriber/type/StateChangedSubscriber.java | 2 +- .../type/ClusterStateDispatchEventBuilderTest.java | 2 +- .../subscriber/type/StateChangedSubscriberTest.java | 4 ++-- .../backend/handler/ProxyBackendHandlerFactory.java | 4 ++-- .../distsql/ral/updatable/LockClusterExecutor.java | 4 ++-- .../distsql/ral/updatable/UnlockClusterExecutor.java | 4 ++-- .../lock/impl/ClusterReadWriteLockStrategy.java | 2 +- .../backend/lock/impl/ClusterWriteLockStrategy.java | 2 +- .../proxy/backend/context/ProxyContextTest.java | 4 ++-- .../handler/ProxyBackendHandlerFactoryTest.java | 4 ++-- .../ral/updatable/LockClusterExecutorTest.java | 8 ++++---- .../ral/updatable/UnlockClusterExecutorTest.java | 6 +++--- 21 files changed, 44 insertions(+), 47 deletions(-) rename {infra/common/src/main/java/org/apache/shardingsphere/infra/state/cluster => mode/core/src/main/java/org/apache/shardingsphere/mode/state}/ClusterState.java (94%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/state/{StateContext.java => ClusterStateContext.java} (82%) diff --git a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java index 6976e65968ad4..27b9b0b328637 100644 --- a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java +++ b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/datasource/ShardingSphereDataSourceTest.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode; import org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration; @@ -56,7 +56,7 @@ void assertNewConstructorWithModeConfigurationOnly() throws Exception { try (ShardingSphereDataSource actual = new ShardingSphereDataSource("foo_db", null)) { ContextManager contextManager = getContextManager(actual); assertNotNull(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")); - assertThat(contextManager.getStateContext().getClusterState(), is(ClusterState.OK)); + assertThat(contextManager.getStateContext().getState(), is(ClusterState.OK)); assertThat(contextManager.getComputeNodeInstanceContext().getInstance().getState().getCurrentState(), is(InstanceState.OK)); assertTrue(contextManager.getStorageUnits("foo_db").isEmpty()); } @@ -69,7 +69,7 @@ void assertNewConstructorWithAllArguments() throws Exception { try (ShardingSphereDataSource actual = createShardingSphereDataSource(new MockedDataSource(connection))) { ContextManager contextManager = getContextManager(actual); assertNotNull(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")); - assertThat(contextManager.getStateContext().getClusterState(), is(ClusterState.OK)); + assertThat(contextManager.getStateContext().getState(), is(ClusterState.OK)); assertThat(contextManager.getComputeNodeInstanceContext().getInstance().getState().getCurrentState(), is(InstanceState.OK)); assertThat(contextManager.getStorageUnits("foo_db").size(), is(1)); assertThat(contextManager.getStorageUnits("foo_db").get("ds").getDataSource().getConnection().getMetaData().getURL(), is("jdbc:mock://127.0.0.1/foo_ds")); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 5afaf40b62535..fda6a08f0d90f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -38,7 +38,7 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.persist.PersistServiceFacade; import org.apache.shardingsphere.mode.spi.PersistRepository; -import org.apache.shardingsphere.mode.state.StateContext; +import org.apache.shardingsphere.mode.state.ClusterStateContext; import java.sql.SQLException; import java.util.Collections; @@ -58,7 +58,7 @@ public final class ContextManager implements AutoCloseable { private final ExecutorEngine executorEngine; - private final StateContext stateContext; + private final ClusterStateContext stateContext; private final PersistServiceFacade persistServiceFacade; @@ -69,7 +69,7 @@ public ContextManager(final MetaDataContexts metaDataContexts, final ComputeNode this.computeNodeInstanceContext = computeNodeInstanceContext; metaDataContextManager = new MetaDataContextManager(this.metaDataContexts, computeNodeInstanceContext, repository); persistServiceFacade = new PersistServiceFacade(repository, computeNodeInstanceContext.getModeConfiguration(), metaDataContextManager); - stateContext = new StateContext(persistServiceFacade.getStatePersistService().load()); + stateContext = new ClusterStateContext(persistServiceFacade.getStatePersistService().load()); executorEngine = ExecutorEngine.createExecutorEngineWithSize(metaDataContexts.getMetaData().getProps().getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)); for (ContextManagerLifecycleListener each : ShardingSphereServiceLoader.getServiceInstances(ContextManagerLifecycleListener.class)) { each.onInitialized(this); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java index c79fc73016509..6f5a39d6ea9ab 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java @@ -19,7 +19,7 @@ import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.metadata.persist.node.StatesNode; import org.apache.shardingsphere.mode.spi.PersistRepository; diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/state/cluster/ClusterState.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterState.java similarity index 94% rename from infra/common/src/main/java/org/apache/shardingsphere/infra/state/cluster/ClusterState.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterState.java index f3fbb5d96d0b7..4c4fd72df4ad8 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/state/cluster/ClusterState.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterState.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.infra.state.cluster; +package org.apache.shardingsphere.mode.state; /** * Cluster state. diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/state/StateContext.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterStateContext.java similarity index 82% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/state/StateContext.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterStateContext.java index d5f8e289db0af..c47672be9a6f5 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/state/StateContext.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/state/ClusterStateContext.java @@ -17,18 +17,16 @@ package org.apache.shardingsphere.mode.state; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; - import java.util.concurrent.atomic.AtomicReference; /** - * State context. + * Cluster state context. */ -public final class StateContext { +public final class ClusterStateContext { private final AtomicReference clusterState; - public StateContext(final ClusterState clusterState) { + public ClusterStateContext(final ClusterState clusterState) { this.clusterState = new AtomicReference<>(clusterState); } @@ -37,7 +35,7 @@ public StateContext(final ClusterState clusterState) { * * @return cluster state */ - public ClusterState getClusterState() { + public ClusterState getState() { return clusterState.get(); } @@ -46,7 +44,7 @@ public ClusterState getClusterState() { * * @param state to be switched cluster state */ - public void switchClusterState(final ClusterState state) { + public void switchState(final ClusterState state) { clusterState.set(state); } } diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java index 901e303d5089a..8d731f7a489ce 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.persist.service; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/state/StateContextTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/state/StateContextTest.java index fd1458c7a7db3..e4dcef13a0b86 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/state/StateContextTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/state/StateContextTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.mode.state; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; @@ -25,17 +24,17 @@ class StateContextTest { - private final StateContext stateContext = new StateContext(ClusterState.OK); + private final ClusterStateContext stateContext = new ClusterStateContext(ClusterState.OK); @Test void assertGetClusterState() { - assertThat(stateContext.getClusterState(), is(ClusterState.OK)); + assertThat(stateContext.getState(), is(ClusterState.OK)); } @Test void assertSwitchClusterState() { - assertThat(stateContext.getClusterState(), is(ClusterState.OK)); - stateContext.switchClusterState(ClusterState.UNAVAILABLE); - assertThat(stateContext.getClusterState(), is(ClusterState.UNAVAILABLE)); + assertThat(stateContext.getState(), is(ClusterState.OK)); + stateContext.switchState(ClusterState.UNAVAILABLE); + assertThat(stateContext.getState(), is(ClusterState.UNAVAILABLE)); } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java index e362ee22ea056..fdc7db6c7a369 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilder.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.type; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.metadata.persist.node.StatesNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java index d46ffc02b7433..52614460681ea 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/state/cluster/ClusterStateEvent.java @@ -20,7 +20,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; /** * Cluster state event. diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java index 99d28be93e196..40728cb3315c2 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriber.java @@ -38,6 +38,6 @@ public final class StateChangedSubscriber implements DispatchEventSubscriber { */ @Subscribe public synchronized void renew(final ClusterStateEvent event) { - contextManager.getStateContext().switchClusterState(event.getClusterState()); + contextManager.getStateContext().switchState(event.getClusterState()); } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java index a52973c4333a7..c23bffcea4458 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ClusterStateDispatchEventBuilderTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.type; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java index fb03144774414..9d29ac80f9c68 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/StateChangedSubscriberTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.cluster.ClusterStateEvent; import org.apache.shardingsphere.mode.manager.ContextManager; import org.junit.jupiter.api.BeforeEach; @@ -45,6 +45,6 @@ void setUp() { @Test void assertRenew() { subscriber.renew(new ClusterStateEvent(ClusterState.READ_ONLY)); - verify(contextManager.getStateContext()).switchClusterState(ClusterState.READ_ONLY); + verify(contextManager.getStateContext()).switchState(ClusterState.READ_ONLY); } } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java index cceba19245953..4accdc98adcb4 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java @@ -38,7 +38,7 @@ import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext; import org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminBackendHandlerFactory; @@ -188,7 +188,7 @@ private static void checkUnsupportedSQLStatement(final SQLStatement sqlStatement } private static void checkClusterState(final SQLStatement sqlStatement) { - ClusterState clusterCurrentState = ProxyContext.getInstance().getContextManager().getStateContext().getClusterState(); + ClusterState clusterCurrentState = ProxyContext.getInstance().getContextManager().getStateContext().getState(); if (ClusterState.OK != clusterCurrentState) { TypedSPILoader.getService(ProxyClusterState.class, clusterCurrentState.name()).check(sqlStatement); } diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java index cba160afa02f2..ff857d28340bf 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java @@ -25,7 +25,7 @@ import org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.lock.exception.LockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; @@ -56,7 +56,7 @@ public void executeUpdate(final LockClusterStatement sqlStatement, final Context } private void checkState(final ContextManager contextManager) { - ShardingSpherePreconditions.checkState(ClusterState.OK == contextManager.getStateContext().getClusterState(), LockedClusterException::new); + ShardingSpherePreconditions.checkState(ClusterState.OK == contextManager.getStateContext().getState(), LockedClusterException::new); } private void checkAlgorithm(final LockClusterStatement sqlStatement) { diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java index e1d6e423fce51..12ee06fda82c3 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutor.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.lock.LockContext; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.lock.exception.NotLockedClusterException; import org.apache.shardingsphere.mode.lock.global.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManager; @@ -52,7 +52,7 @@ public void executeUpdate(final UnlockClusterStatement sqlStatement, final Conte } private void checkState(final ContextManager contextManager) { - ShardingSpherePreconditions.checkState(ClusterState.OK != contextManager.getStateContext().getClusterState(), NotLockedClusterException::new); + ShardingSpherePreconditions.checkState(ClusterState.OK != contextManager.getStateContext().getState(), NotLockedClusterException::new); } @Override diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterReadWriteLockStrategy.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterReadWriteLockStrategy.java index 93820e91e5603..178aa3f310188 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterReadWriteLockStrategy.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterReadWriteLockStrategy.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.proxy.backend.lock.impl; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.lock.spi.ClusterLockStrategy; diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterWriteLockStrategy.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterWriteLockStrategy.java index 081f8f6bb0d30..216123200fdcb 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterWriteLockStrategy.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/lock/impl/ClusterWriteLockStrategy.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.proxy.backend.lock.impl; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.lock.spi.ClusterLockStrategy; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java index de91f84566bb1..7b94bce84c5c1 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java @@ -25,7 +25,7 @@ import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; @@ -73,7 +73,7 @@ void assertInit() { MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); ProxyContext.init(new ContextManager(metaDataContexts, mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS), mock(PersistRepository.class))); assertThat(ProxyContext.getInstance().getContextManager().getStateContext(), is(ProxyContext.getInstance().getContextManager().getStateContext())); - assertThat(ProxyContext.getInstance().getContextManager().getStateContext().getClusterState(), is(ClusterState.OK)); + assertThat(ProxyContext.getInstance().getContextManager().getStateContext().getState(), is(ClusterState.OK)); assertThat(ProxyContext.getInstance().getContextManager().getMetaDataContexts(), is(ProxyContext.getInstance().getContextManager().getMetaDataContexts())); assertTrue(ProxyContext.getInstance().getInstanceStateContext().isPresent()); assertThat(ProxyContext.getInstance().getInstanceStateContext(), is(ProxyContext.getInstance().getInstanceStateContext())); diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java index 66421f2d0ab8a..071c4be86789e 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.infra.session.connection.ConnectionContext; import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.parser.rule.SQLParserRule; @@ -100,7 +100,7 @@ void setUp() { when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession); when(connectionSession.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager); ContextManager contextManager = mockContextManager(); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.OK); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java index 7e86f7bcbec46..8df61e0556d68 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutorTest.java @@ -20,7 +20,7 @@ import org.apache.shardingsphere.distsql.segment.AlgorithmSegment; import org.apache.shardingsphere.distsql.statement.ral.updatable.LockClusterStatement; import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.lock.exception.LockedClusterException; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; @@ -46,21 +46,21 @@ class LockClusterExecutorTest { @Test void assertExecuteUpdateWithLockedCluster() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.UNAVAILABLE); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.UNAVAILABLE); assertThrows(LockedClusterException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties()), null), contextManager)); } @Test void assertExecuteUpdateWithWrongAlgorithm() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.OK); assertThrows(ServiceProviderNotFoundException.class, () -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("FOO", new Properties()), null), contextManager)); } @Test void assertExecuteUpdateWithUsingTimeout() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.OK); assertDoesNotThrow(() -> executor.executeUpdate(new LockClusterStatement(new AlgorithmSegment("WRITE", new Properties()), 2000L), contextManager)); } } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java index 58bc57722d118..27bcd03af8aff 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlockClusterExecutorTest.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable; import org.apache.shardingsphere.distsql.statement.ral.updatable.UnlockClusterStatement; -import org.apache.shardingsphere.infra.state.cluster.ClusterState; +import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.lock.exception.NotLockedClusterException; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; @@ -42,7 +42,7 @@ class UnlockClusterExecutorTest { @Test void assertExecuteUpdateWithNotLockedCluster() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.OK); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.OK); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); assertThrows(NotLockedClusterException.class, () -> executor.executeUpdate(new UnlockClusterStatement(null), contextManager)); } @@ -50,7 +50,7 @@ void assertExecuteUpdateWithNotLockedCluster() { @Test void assertExecuteUpdateWithUsingTimeout() { ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(contextManager.getStateContext().getClusterState()).thenReturn(ClusterState.UNAVAILABLE); + when(contextManager.getStateContext().getState()).thenReturn(ClusterState.UNAVAILABLE); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); assertDoesNotThrow(() -> executor.executeUpdate(new UnlockClusterStatement(2000L), contextManager)); } From 7bee9ada5ea3f0e83deac8263f95f37a0c2ea089 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 11:41:56 +0800 Subject: [PATCH 178/192] Refactor ShardingSphereStatisticsRefreshEngine (#34195) --- .../core/job/statistics/collect/StatisticsCollectJob.java | 4 +--- .../refresher/ShardingSphereStatisticsRefreshEngine.java | 7 +++++-- .../ShardingSphereStatisticsRefreshEngineTest.java | 6 ++---- .../subscriber/type/ListenerAssistedSubscriber.java | 6 ++---- .../subscriber/type/MetaDataChangedSubscriber.java | 6 ++---- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java index bd5537db7201f..c49160cdde8b5 100644 --- a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java +++ b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java @@ -21,8 +21,6 @@ import org.apache.shardingsphere.elasticjob.api.ShardingContext; import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; -import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.apache.shardingsphere.mode.spi.PersistRepository; @@ -39,7 +37,7 @@ public final class StatisticsCollectJob implements SimpleJob { public void execute(final ShardingContext shardingContext) { PersistRepository repository = contextManager.getPersistServiceFacade().getRepository(); if (repository instanceof ClusterPersistRepository) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService((ClusterPersistRepository) repository))).refresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager).refresh(); } } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java index 61fe8413cb779..073be7e5a019b 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngine.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.mode.metadata.refresher; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; import org.apache.shardingsphere.infra.executor.kernel.thread.ExecutorThreadFactoryBuilder; @@ -51,7 +50,6 @@ /** * ShardingSphere statistics refresh engine. */ -@RequiredArgsConstructor @Slf4j public final class ShardingSphereStatisticsRefreshEngine { @@ -61,6 +59,11 @@ public final class ShardingSphereStatisticsRefreshEngine { private final LockContext lockContext; + public ShardingSphereStatisticsRefreshEngine(final ContextManager contextManager) { + this.contextManager = contextManager; + lockContext = contextManager.getComputeNodeInstanceContext().getLockContext(); + } + /** * Async refresh. */ diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java index ffc7a4e17d082..02b8937a081d1 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/ShardingSphereStatisticsRefreshEngineTest.java @@ -20,7 +20,6 @@ import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties; import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; -import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; @@ -59,9 +58,8 @@ void assertRefresh() { when(contextManager.getMetaDataContexts().getMetaData().getProps()).thenReturn(new ConfigurationProperties(new Properties())); when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps()).thenReturn(new TemporaryConfigurationProperties( PropertiesBuilder.build(new Property(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED.getKey(), Boolean.TRUE.toString())))); - LockContext lockContext = mock(LockContext.class); - when(lockContext.tryLock(any(), anyLong())).thenReturn(true); - new ShardingSphereStatisticsRefreshEngine(contextManager, lockContext).refresh(); + when(contextManager.getComputeNodeInstanceContext().getLockContext().tryLock(any(), anyLong())).thenReturn(true); + new ShardingSphereStatisticsRefreshEngine(contextManager).refresh(); verify(contextManager.getPersistServiceFacade().getMetaDataPersistService().getShardingSphereDataPersistService()).update(any()); } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java index 831e4fe3e6b3d..c8b3c2cda351b 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ListenerAssistedSubscriber.java @@ -21,13 +21,11 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type.DatabaseMetaDataChangedListener; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; -import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; -import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; @@ -75,7 +73,7 @@ public synchronized void renew(final DropDatabaseListenerAssistedEvent event) { private void refreshStatisticsData() { if (contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster() && InstanceType.PROXY == contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getType()) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager).asyncRefresh(); } } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java index 52d6aeae4db0d..ed75eb960b90f 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java @@ -22,16 +22,14 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; -import org.apache.shardingsphere.mode.manager.cluster.lock.ClusterLockContext; -import org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLockPersistService; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; @@ -128,7 +126,7 @@ public synchronized void renew(final ViewDroppedEvent event) { private void refreshStatisticsData() { if (contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster() && InstanceType.PROXY == contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getType()) { - new ShardingSphereStatisticsRefreshEngine(contextManager, new ClusterLockContext(new GlobalLockPersistService(repository))).asyncRefresh(); + new ShardingSphereStatisticsRefreshEngine(contextManager).asyncRefresh(); } } } From c627064298164703da4f0dd65a498d090dd2c2bf Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 13:23:43 +0800 Subject: [PATCH 179/192] Remove useless ListenerAssisted (#34196) * Remove useless ListenerAssisted * Remove useless ListenerAssisted * Remove useless ListenerAssisted * Remove useless ListenerAssisted --- .../{pojo => }/ListenerAssistedType.java | 2 +- .../mode/persist/pojo/ListenerAssisted.java | 38 ------------------- .../ListenerAssistedPersistService.java | 10 ++--- .../ListenerAssistedPersistServiceTest.java | 7 ++-- .../ListenerAssistedDispatchEventBuilder.java | 21 +++++----- .../ClusterMetaDataManagerPersistService.java | 7 ++-- ...tenerAssistedDispatchEventBuilderTest.java | 4 +- ...sterMetaDataManagerPersistServiceTest.java | 5 ++- 8 files changed, 26 insertions(+), 68 deletions(-) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/{pojo => }/ListenerAssistedType.java (94%) delete mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssisted.java diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssistedType.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java similarity index 94% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssistedType.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java index c5f882c1ca982..5c9cd8e6ec651 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssistedType.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.pojo; +package org.apache.shardingsphere.mode.persist; /** * Listener assisted type. diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssisted.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssisted.java deleted file mode 100644 index 1f16695f1ee43..0000000000000 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/pojo/ListenerAssisted.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.shardingsphere.mode.persist.pojo; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import org.apache.shardingsphere.infra.util.yaml.YamlConfiguration; - -/** - * Listener assisted. - */ -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -public final class ListenerAssisted implements YamlConfiguration { - - private String databaseName; - - private ListenerAssistedType listenerAssistedType; -} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java index aac44528c1d3c..9103165fe3454 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java @@ -18,9 +18,8 @@ package org.apache.shardingsphere.mode.persist.service; import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.metadata.persist.node.StatesNode; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted; +import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import org.apache.shardingsphere.mode.spi.PersistRepository; /** @@ -34,10 +33,11 @@ public final class ListenerAssistedPersistService { /** * Persist database name listener assisted. * - * @param listenerAssisted listener assisted pojo + * @param databaseName database name + * @param listenerAssistedType listener assisted type */ - public void persistDatabaseNameListenerAssisted(final ListenerAssisted listenerAssisted) { - repository.persistEphemeral(StatesNode.getDatabaseNameListenerAssistedNodePath(listenerAssisted.getDatabaseName()), YamlEngine.marshal(listenerAssisted)); + public void persistDatabaseNameListenerAssisted(final String databaseName, final ListenerAssistedType listenerAssistedType) { + repository.persistEphemeral(StatesNode.getDatabaseNameListenerAssistedNodePath(databaseName), listenerAssistedType.name()); } /** diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java index 33c32b0e90151..c48776cc74cb4 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java @@ -17,8 +17,7 @@ package org.apache.shardingsphere.mode.persist.service; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -36,8 +35,8 @@ class ListenerAssistedPersistServiceTest { @Test void assertPersistDatabaseNameListenerAssisted() { - new ListenerAssistedPersistService(repository).persistDatabaseNameListenerAssisted(new ListenerAssisted("foo_db", ListenerAssistedType.CREATE_DATABASE)); - verify(repository).persistEphemeral("/states/listener_assisted/foo_db", "databaseName: foo_db" + System.lineSeparator() + "listenerAssistedType: CREATE_DATABASE" + System.lineSeparator()); + new ListenerAssistedPersistService(repository).persistDatabaseNameListenerAssisted("foo_db", ListenerAssistedType.CREATE_DATABASE); + verify(repository).persistEphemeral("/states/listener_assisted/foo_db", ListenerAssistedType.CREATE_DATABASE.name()); } @Test diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java index bd2417651b76d..89f782b1196d8 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java @@ -17,16 +17,14 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.type; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.metadata.persist.node.StatesNode; import org.apache.shardingsphere.mode.event.DataChangedEvent; import org.apache.shardingsphere.mode.event.DataChangedEvent.Type; +import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.DispatchEventBuilder; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import java.util.Arrays; import java.util.Collection; @@ -49,13 +47,12 @@ public Collection getSubscribedTypes() { @Override public Optional build(final DataChangedEvent event) { - Optional databaseName = StatesNode.getDatabaseNameByListenerAssistedNodePath(event.getKey()); - if (!databaseName.isPresent()) { - return Optional.empty(); - } - ListenerAssistedType listenerAssistedType = YamlEngine.unmarshal(event.getValue(), ListenerAssisted.class).getListenerAssistedType(); - return Optional.of(ListenerAssistedType.CREATE_DATABASE == listenerAssistedType - ? new CreateDatabaseListenerAssistedEvent(databaseName.get()) - : new DropDatabaseListenerAssistedEvent(databaseName.get())); + return StatesNode.getDatabaseNameByListenerAssistedNodePath(event.getKey()).map(optional -> createDatabaseListenerAssistedEvent(optional, event)); + } + + private DispatchEvent createDatabaseListenerAssistedEvent(final String databaseName, final DataChangedEvent event) { + return ListenerAssistedType.CREATE_DATABASE == ListenerAssistedType.valueOf(event.getValue()) + ? new CreateDatabaseListenerAssistedEvent(databaseName) + : new DropDatabaseListenerAssistedEvent(databaseName); } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java index 880df297bbbb7..a1c4cff267c62 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java @@ -33,8 +33,7 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted; -import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; @@ -70,13 +69,13 @@ public ClusterMetaDataManagerPersistService(final PersistRepository repository, @Override public void createDatabase(final String databaseName) { metaDataPersistService.getDatabaseMetaDataFacade().getDatabase().add(databaseName); - listenerAssistedPersistService.persistDatabaseNameListenerAssisted(new ListenerAssisted(databaseName, ListenerAssistedType.CREATE_DATABASE)); + listenerAssistedPersistService.persistDatabaseNameListenerAssisted(databaseName, ListenerAssistedType.CREATE_DATABASE); } @Override public void dropDatabase(final String databaseName) { String droppedDatabaseName = metaDataContextManager.getMetaDataContexts().get().getMetaData().getDatabase(databaseName).getName(); - listenerAssistedPersistService.persistDatabaseNameListenerAssisted(new ListenerAssisted(droppedDatabaseName, ListenerAssistedType.DROP_DATABASE)); + listenerAssistedPersistService.persistDatabaseNameListenerAssisted(droppedDatabaseName, ListenerAssistedType.DROP_DATABASE); metaDataPersistService.getDatabaseMetaDataFacade().getDatabase().drop(droppedDatabaseName); } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java index 237e4d6dc5391..6d7fd4f8f5ea4 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilderTest.java @@ -42,14 +42,14 @@ void assertGetSubscribedKey() { @Test void assertBuildCreateDatabaseListenerAssistedEvent() { - Optional actual = builder.build(new DataChangedEvent("/states/listener_assisted/foo_db", "{databaseName: foo_db, listenerAssistedType: CREATE_DATABASE}", Type.ADDED)); + Optional actual = builder.build(new DataChangedEvent("/states/listener_assisted/foo_db", "CREATE_DATABASE", Type.ADDED)); assertTrue(actual.isPresent()); assertThat(((CreateDatabaseListenerAssistedEvent) actual.get()).getDatabaseName(), is("foo_db")); } @Test void assertBuildDropDatabaseListenerAssistedEvent() { - Optional actual = builder.build(new DataChangedEvent("/states/listener_assisted/foo_db", "{databaseName: foo_db, listenerAssistedType: DROP_DATABASE}", Type.ADDED)); + Optional actual = builder.build(new DataChangedEvent("/states/listener_assisted/foo_db", "DROP_DATABASE", Type.ADDED)); assertTrue(actual.isPresent()); assertThat(((DropDatabaseListenerAssistedEvent) actual.get()).getDatabaseName(), is("foo_db")); } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java index ecc993eb25f91..df20917e7099a 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java @@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; +import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; @@ -78,14 +79,14 @@ void setUp() { void assertCreateDatabase() { metaDataManagerPersistService.createDatabase("foo_db"); verify(metaDataPersistService.getDatabaseMetaDataFacade().getDatabase()).add("foo_db"); - verify(listenerAssistedPersistService).persistDatabaseNameListenerAssisted(any()); + verify(listenerAssistedPersistService).persistDatabaseNameListenerAssisted("foo_db", ListenerAssistedType.CREATE_DATABASE); } @Test void assertDropDatabase() { when(metaDataContextManager.getMetaDataContexts().get().getMetaData().getDatabase("foo_db").getName()).thenReturn("foo_db"); metaDataManagerPersistService.dropDatabase("foo_db"); - verify(listenerAssistedPersistService).persistDatabaseNameListenerAssisted(any()); + verify(listenerAssistedPersistService).persistDatabaseNameListenerAssisted("foo_db", ListenerAssistedType.DROP_DATABASE); verify(metaDataPersistService.getDatabaseMetaDataFacade().getDatabase()).drop("foo_db"); } From f72e0b606a5dd673c5ed297cb50ab1d81299452f Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 14:04:08 +0800 Subject: [PATCH 180/192] Add packages of mode.persist.service.unified and mode.persist.service.divided (#34197) --- .../CreateBroadcastTableRuleExecutorTest.java | 2 +- .../update/DropBroadcastTableRuleExecutorTest.java | 2 +- .../update/AlterEncryptRuleExecutorTest.java | 2 +- .../update/CreateEncryptRuleExecutorTest.java | 2 +- .../update/DropEncryptRuleExecutorTest.java | 2 +- .../handler/update/AlterMaskRuleExecutorTest.java | 2 +- .../handler/update/CreateMaskRuleExecutorTest.java | 2 +- .../handler/update/DropMaskRuleExecutorTest.java | 2 +- .../database/type/AlterDatabaseRuleOperator.java | 2 +- .../database/type/CreateDatabaseRuleOperator.java | 2 +- .../database/type/DropDatabaseRuleOperator.java | 2 +- .../UnregisterStorageUnitExecutorTest.java | 2 +- .../update/LoadSingleTableExecutorTest.java | 2 +- ...tDefaultSingleTableStorageUnitExecutorTest.java | 2 +- .../refresher/FederationMetaDataRefresher.java | 2 +- .../metadata/refresher/MetaDataRefreshEngine.java | 2 +- .../mode/metadata/refresher/MetaDataRefresher.java | 2 +- .../index/AlterIndexStatementSchemaRefresher.java | 2 +- .../index/CreateIndexStatementSchemaRefresher.java | 2 +- .../index/DropIndexStatementSchemaRefresher.java | 2 +- .../AlterSchemaStatementSchemaRefresher.java | 2 +- .../CreateSchemaStatementSchemaRefresher.java | 2 +- .../schema/DropSchemaStatementSchemaRefresher.java | 2 +- .../table/AlterTableStatementSchemaRefresher.java | 2 +- .../table/CreateTableStatementSchemaRefresher.java | 2 +- .../table/DropTableStatementSchemaRefresher.java | 2 +- .../table/RenameTableStatementSchemaRefresher.java | 2 +- .../view/AlterViewStatementSchemaRefresher.java | 2 +- .../view/CreateViewStatementSchemaRefresher.java | 2 +- .../view/DropViewStatementSchemaRefresher.java | 2 +- .../AlterViewFederationMetaDataRefresher.java | 2 +- .../CreateViewFederationMetaDataRefresher.java | 2 +- .../DropViewFederationMetaDataRefresher.java | 2 +- .../mode/persist/PersistServiceFacade.java | 14 +++++++------- .../MetaDataManagerPersistService.java | 2 +- .../{ => divided}/PersistServiceBuilder.java | 2 +- .../{ => divided}/ProcessPersistService.java | 2 +- .../{ => unified}/ComputeNodePersistService.java | 2 +- .../ListenerAssistedPersistService.java | 3 +-- .../unified}/ListenerAssistedType.java | 2 +- .../QualifiedDataSourceStatePersistService.java | 2 +- .../service/{ => unified}/StatePersistService.java | 2 +- .../mode/fixture/PersistServiceBuilderFixture.java | 6 +++--- .../service/ComputeNodePersistServiceTest.java | 1 + .../ListenerAssistedPersistServiceTest.java | 3 ++- ...QualifiedDataSourceStatePersistServiceTest.java | 1 + .../persist/service/StatePersistServiceTest.java | 1 + ....persist.service.divided.PersistServiceBuilder} | 0 mode/core/src/test/resources/logback-test.xml | 2 +- .../type/ListenerAssistedDispatchEventBuilder.java | 2 +- .../builder/ClusterPersistServiceBuilder.java | 6 +++--- .../ClusterMetaDataManagerPersistService.java | 6 +++--- .../service/ClusterProcessPersistService.java | 2 +- .../cluster/workerid/ClusterWorkerIdGenerator.java | 2 +- ....persist.service.divided.PersistServiceBuilder} | 0 .../builder/ClusterPersistServiceBuilderTest.java | 2 +- .../ClusterMetaDataManagerPersistServiceTest.java | 4 ++-- .../workerid/ClusterWorkerIdGeneratorTest.java | 2 +- .../SessionConnectionReconnectListener.java | 2 +- .../SessionConnectionReconnectListenerTest.java | 2 +- .../builder/StandalonePersistServiceBuilder.java | 6 +++--- .../StandaloneMetaDataManagerPersistService.java | 2 +- .../service/StandaloneProcessPersistService.java | 2 +- ....persist.service.divided.PersistServiceBuilder} | 0 .../StandalonePersistServiceBuilderTest.java | 2 +- .../distsql/DistSQLBackendHandlerFactoryTest.java | 2 +- .../update/GlobalRuleDefinitionExecutorTest.java | 2 +- 67 files changed, 80 insertions(+), 77 deletions(-) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => divided}/MetaDataManagerPersistService.java (98%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => divided}/PersistServiceBuilder.java (96%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => divided}/ProcessPersistService.java (95%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/ComputeNodePersistService.java (99%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/ListenerAssistedPersistService.java (93%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/{ => service/unified}/ListenerAssistedType.java (93%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/QualifiedDataSourceStatePersistService.java (98%) rename mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/StatePersistService.java (96%) rename mode/core/src/test/resources/META-INF/services/{org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder => org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder} (100%) rename mode/type/cluster/core/src/main/resources/META-INF/services/{org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder => org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder} (100%) rename mode/type/standalone/core/src/main/resources/META-INF/services/{org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder => org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder} (100%) diff --git a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java index ae57e0e4577a5..6cbf6a15955ed 100644 --- a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java +++ b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleExecutorTest.java b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleExecutorTest.java index c8ce8ab05a43c..fd5575ef4540f 100644 --- a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleExecutorTest.java +++ b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleExecutorTest.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import java.sql.SQLException; diff --git a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java index 1580fd1b48e04..d8bda84803256 100644 --- a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java +++ b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java @@ -31,7 +31,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutorTest.java b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutorTest.java index 417f66a712fc4..7b5455878ba76 100644 --- a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutorTest.java +++ b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutorTest.java @@ -33,7 +33,7 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; import org.junit.jupiter.api.Test; diff --git a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleExecutorTest.java b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleExecutorTest.java index 981a1a9ea3350..070bf813139d6 100644 --- a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleExecutorTest.java +++ b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleExecutorTest.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleExecutorTest.java b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleExecutorTest.java index 36d1068dcde00..ab740b021a083 100644 --- a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleExecutorTest.java +++ b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/AlterMaskRuleExecutorTest.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.mask.distsql.statement.AlterMaskRuleStatement; import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/CreateMaskRuleExecutorTest.java b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/CreateMaskRuleExecutorTest.java index 950c812c67b87..21dccc73c1e1c 100644 --- a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/CreateMaskRuleExecutorTest.java +++ b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/CreateMaskRuleExecutorTest.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.mask.distsql.statement.CreateMaskRuleStatement; import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleExecutorTest.java b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleExecutorTest.java index daa0b18fd595a..32a40d8d335f6 100644 --- a/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleExecutorTest.java +++ b/features/mask/distsql/handler/src/test/java/org/apache/shardingsphere/mask/distsql/handler/update/DropMaskRuleExecutorTest.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.mask.distsql.statement.DropMaskRuleStatement; import org.apache.shardingsphere.mask.rule.MaskRule; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java index 7c6f0598e7638..f69a3b71eaf73 100644 --- a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java +++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import java.sql.SQLException; import java.util.LinkedHashMap; diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java index 8645350a27cf8..5fceb33a8452a 100644 --- a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java +++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import java.sql.SQLException; import java.util.LinkedHashMap; diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java index 1161a594d3fc7..144ab0fff3b12 100644 --- a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java +++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java @@ -31,7 +31,7 @@ import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration; import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.mode.tuple.annotation.RepositoryTupleEntity; import java.sql.SQLException; diff --git a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutorTest.java b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutorTest.java index 18e5451b9a5a5..b023aa0e4d269 100644 --- a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutorTest.java +++ b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutorTest.java @@ -32,7 +32,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutorTest.java b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutorTest.java index 17c3edf0c9d3a..4026bdcb03407 100644 --- a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutorTest.java +++ b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutorTest.java @@ -33,7 +33,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.datanode.SingleTableDataNodeLoader; import org.apache.shardingsphere.single.distsql.segment.SingleTableSegment; diff --git a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java index 85f1824998105..4e6f1676ae12f 100644 --- a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java +++ b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.distsql.statement.rdl.SetDefaultSingleTableStorageUnitStatement; import org.apache.shardingsphere.single.rule.SingleRule; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/FederationMetaDataRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/FederationMetaDataRefresher.java index fffbf7d12e36c..1f3a0712086ce 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/FederationMetaDataRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/FederationMetaDataRefresher.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefreshEngine.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefreshEngine.java index 59e623ba9188c..b4fe1205f2fb4 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefreshEngine.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefreshEngine.java @@ -27,7 +27,7 @@ import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.infra.route.context.RouteUnit; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefresher.java index 6756535bf5fbb..1eb63ddfc94cc 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/MetaDataRefresher.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import java.sql.SQLException; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java index 812a1417f2bd5..2c7f8ef869d6f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/AlterIndexStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java index fce62478ddfa0..fc3be9fcd58ef 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/CreateIndexStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import java.util.Collection; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java index 6006b26c8f31a..996cbcada527e 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/index/DropIndexStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/AlterSchemaStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/AlterSchemaStatementSchemaRefresher.java index adbedc370609d..6ac26cdf7c119 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/AlterSchemaStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/AlterSchemaStatementSchemaRefresher.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement; import java.sql.SQLException; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/CreateSchemaStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/CreateSchemaStatementSchemaRefresher.java index 5f8c49cf8fe62..c7e83829bba89 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/CreateSchemaStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/CreateSchemaStatementSchemaRefresher.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateSchemaStatement; import java.util.Collection; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/DropSchemaStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/DropSchemaStatementSchemaRefresher.java index 13a2c515b4809..2498e8907942c 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/DropSchemaStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/schema/DropSchemaStatementSchemaRefresher.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java index d296cd3c67eb4..21f62e7852c90 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/AlterTableStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import java.sql.SQLException; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java index 2cf7f2d14c3de..e0ff1effaeb5e 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/CreateTableStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import java.sql.SQLException; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java index bc387e68fb74d..0d776e3d25619 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/DropTableStatementSchemaRefresher.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java index 435143a41f228..3e54cce7ccbe5 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/table/RenameTableStatementSchemaRefresher.java @@ -29,7 +29,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java index b1ffa59cedd1f..a6b4ee14b7d45 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/AlterViewStatementSchemaRefresher.java @@ -30,7 +30,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java index 371cfc2daab63..03bad9ce01a18 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/CreateViewStatementSchemaRefresher.java @@ -31,7 +31,7 @@ import org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; import java.sql.SQLException; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/DropViewStatementSchemaRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/DropViewStatementSchemaRefresher.java index 4e397d83203b8..8c747e57cc08f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/DropViewStatementSchemaRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/DropViewStatementSchemaRefresher.java @@ -22,7 +22,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.mode.metadata.refresher.MetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement; import java.util.Collection; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/AlterViewFederationMetaDataRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/AlterViewFederationMetaDataRefresher.java index 8fd97e5fe2014..f12fcbac6d848 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/AlterViewFederationMetaDataRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/AlterViewFederationMetaDataRefresher.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.mode.metadata.refresher.FederationMetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/CreateViewFederationMetaDataRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/CreateViewFederationMetaDataRefresher.java index 306f7e3843463..a5f39662ee617 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/CreateViewFederationMetaDataRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/CreateViewFederationMetaDataRefresher.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.mode.metadata.refresher.FederationMetaDataRefresher; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/DropViewFederationMetaDataRefresher.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/DropViewFederationMetaDataRefresher.java index 2238f726ba515..5a2762f49b9bc 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/DropViewFederationMetaDataRefresher.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/type/view/federation/DropViewFederationMetaDataRefresher.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO; import org.apache.shardingsphere.mode.metadata.refresher.FederationMetaDataRefresher; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement; /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java index 18caf6537eb00..6ea49466171ad 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java @@ -22,13 +22,13 @@ import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService; -import org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; -import org.apache.shardingsphere.mode.persist.service.QualifiedDataSourceStatePersistService; -import org.apache.shardingsphere.mode.persist.service.StatePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.unified.QualifiedDataSourceStatePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.StatePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/MetaDataManagerPersistService.java similarity index 98% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/MetaDataManagerPersistService.java index eb381b5e7b0ce..9a155c580b17c 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/MetaDataManagerPersistService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.divided; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/PersistServiceBuilder.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/PersistServiceBuilder.java similarity index 96% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/PersistServiceBuilder.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/PersistServiceBuilder.java index 855857a72c2e0..f9b6163b83f1a 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/PersistServiceBuilder.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/PersistServiceBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.divided; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ProcessPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java similarity index 95% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ProcessPersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java index 2aebe2a6df8b4..0794364a6b819 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ProcessPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.divided; import org.apache.shardingsphere.infra.executor.sql.process.Process; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistService.java similarity index 99% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistService.java index 1c6c4387f1156..e58dd08113a18 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistService.java similarity index 93% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistService.java index 9103165fe3454..1a422c3dfa39e 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistService.java @@ -15,11 +15,10 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.metadata.persist.node.StatesNode; -import org.apache.shardingsphere.mode.persist.ListenerAssistedType; import org.apache.shardingsphere.mode.spi.PersistRepository; /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedType.java similarity index 93% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedType.java index 5c9cd8e6ec651..5f3726355993a 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/ListenerAssistedType.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist; +package org.apache.shardingsphere.mode.persist.service.unified; /** * Listener assisted type. diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistService.java similarity index 98% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistService.java index 75ba907af8409..b76d992fb2d8f 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistService.java similarity index 96% rename from mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java rename to mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistService.java index 6f5a39d6ea9ab..4a0c8bc4cb4f3 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/StatePersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistService.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import com.google.common.base.Strings; import lombok.RequiredArgsConstructor; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistServiceBuilderFixture.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistServiceBuilderFixture.java index aeafd62ee52f1..7a16780753cdb 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistServiceBuilderFixture.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistServiceBuilderFixture.java @@ -18,9 +18,9 @@ package org.apache.shardingsphere.mode.fixture; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; public final class PersistServiceBuilderFixture implements PersistServiceBuilder { diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java index e1b4753580f65..51f2ba18b77b4 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.instance.yaml.YamlComputeNodeData; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java index c48776cc74cb4..ed6e91e601812 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java @@ -17,7 +17,8 @@ package org.apache.shardingsphere.mode.persist.service; -import org.apache.shardingsphere.mode.persist.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java index dfadba93ca5a3..1587994891f53 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java @@ -19,6 +19,7 @@ import org.apache.shardingsphere.infra.state.datasource.DataSourceState; import org.apache.shardingsphere.infra.state.datasource.qualified.QualifiedDataSourceState; +import org.apache.shardingsphere.mode.persist.service.unified.QualifiedDataSourceStatePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java index 8d731f7a489ce..d572c4ac4cc59 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.mode.persist.service; +import org.apache.shardingsphere.mode.persist.service.unified.StatePersistService; import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; diff --git a/mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder b/mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder similarity index 100% rename from mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder rename to mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder diff --git a/mode/core/src/test/resources/logback-test.xml b/mode/core/src/test/resources/logback-test.xml index ec5c9087b7b04..abfa9514b7fd4 100644 --- a/mode/core/src/test/resources/logback-test.xml +++ b/mode/core/src/test/resources/logback-test.xml @@ -26,7 +26,7 @@ - + diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java index 89f782b1196d8..14bc93274cc02 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/type/ListenerAssistedDispatchEventBuilder.java @@ -24,7 +24,7 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.CreateDatabaseListenerAssistedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.assisted.DropDatabaseListenerAssistedEvent; -import org.apache.shardingsphere.mode.persist.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType; import java.util.Arrays; import java.util.Collection; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilder.java index 85b83c85274c8..75a1ab762f875 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilder.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.mode.manager.cluster.persist.service.ClusterMetaDataManagerPersistService; import org.apache.shardingsphere.mode.manager.cluster.persist.service.ClusterProcessPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java index a1c4cff267c62..421ea385b9bc9 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java @@ -33,9 +33,9 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; -import org.apache.shardingsphere.mode.persist.ListenerAssistedType; -import org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java index 024eabbe2f653..3bc48b500c103 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.metadata.persist.node.ComputeNode; import org.apache.shardingsphere.metadata.persist.node.ProcessNode; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import java.util.Collection; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGenerator.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGenerator.java index 1f9bf9f76a003..8345253faffba 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGenerator.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGenerator.java @@ -23,7 +23,7 @@ import org.apache.shardingsphere.infra.instance.workerid.WorkerIdAssignedException; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; import org.apache.shardingsphere.mode.manager.cluster.persist.service.ReservationPersistService; -import org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import java.util.Collection; diff --git a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder similarity index 100% rename from mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder rename to mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilderTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilderTest.java index 52752cfb3d9a0..1268709a219ac 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilderTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/builder/ClusterPersistServiceBuilderTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.mode.manager.cluster.persist.service.ClusterMetaDataManagerPersistService; import org.apache.shardingsphere.mode.manager.cluster.persist.service.ClusterProcessPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.Test; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java index df20917e7099a..84a60aa56688e 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java @@ -25,8 +25,8 @@ import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.ListenerAssistedType; -import org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.junit.jupiter.api.BeforeEach; diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGeneratorTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGeneratorTest.java index c570cd422768e..e885965f44cd5 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGeneratorTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/workerid/ClusterWorkerIdGeneratorTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.instance.workerid.WorkerIdAssignedException; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; import org.apache.shardingsphere.mode.manager.cluster.persist.service.ReservationPersistService; -import org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.apache.shardingsphere.test.util.PropertiesBuilder; import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; diff --git a/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListener.java b/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListener.java index af38590a8cec0..1d6e227a10417 100644 --- a/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListener.java +++ b/mode/type/cluster/repository/provider/zookeeper/src/main/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListener.java @@ -24,7 +24,7 @@ import org.apache.curator.framework.state.ConnectionStateListener; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; -import org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import java.util.Properties; diff --git a/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListenerTest.java b/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListenerTest.java index 8ac280a61bb21..daf06322f0f72 100644 --- a/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListenerTest.java +++ b/mode/type/cluster/repository/provider/zookeeper/src/test/java/org/apache/shardingsphere/mode/repository/cluster/zookeeper/listener/SessionConnectionReconnectListenerTest.java @@ -21,7 +21,7 @@ import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.state.ConnectionState; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; -import org.apache.shardingsphere.mode.persist.service.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilder.java index 24b40edcb1199..13885f574606e 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilder.java @@ -20,9 +20,9 @@ import org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService; import org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneProcessPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; /** diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java index 7d067d5e4ce60..19c813848a110 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java @@ -41,7 +41,7 @@ import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; import org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.mode.spi.item.AlterRuleItem; import org.apache.shardingsphere.mode.spi.item.DropRuleItem; import org.apache.shardingsphere.mode.spi.PersistRepository; diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java index 87b2303ba1d33..135bc0a1a55a5 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.infra.executor.sql.process.Process; import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; -import org.apache.shardingsphere.mode.persist.service.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import java.sql.SQLException; import java.sql.Statement; diff --git a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder similarity index 100% rename from mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder rename to mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilderTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilderTest.java index 64c262a7669da..461b733eb8ffe 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilderTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/builder/StandalonePersistServiceBuilderTest.java @@ -21,7 +21,7 @@ import org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneMetaDataManagerPersistService; import org.apache.shardingsphere.mode.manager.standalone.persist.service.StandaloneProcessPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.PersistServiceBuilder; +import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.Test; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java index b2af07b30b415..b61fc07925a6a 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java @@ -28,7 +28,7 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader; import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader; diff --git a/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/update/GlobalRuleDefinitionExecutorTest.java b/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/update/GlobalRuleDefinitionExecutorTest.java index 2e3bdf4872089..9a696708bbcd8 100644 --- a/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/update/GlobalRuleDefinitionExecutorTest.java +++ b/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/update/GlobalRuleDefinitionExecutorTest.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.rule.scope.GlobalRule; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService; +import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import java.sql.SQLException; import java.util.Collections; From dc3138070fd8ab17afbba60639acd8f0472ca308 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 14:14:52 +0800 Subject: [PATCH 181/192] Add packages of mode.persist.service.unified and mode.persist.service.divided (#34198) --- .../service/{ => unified}/ComputeNodePersistServiceTest.java | 3 +-- .../{ => unified}/ListenerAssistedPersistServiceTest.java | 4 +--- .../QualifiedDataSourceStatePersistServiceTest.java | 3 +-- .../service/{ => unified}/StatePersistServiceTest.java | 3 +-- 4 files changed, 4 insertions(+), 9 deletions(-) rename mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/ComputeNodePersistServiceTest.java (98%) rename mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/ListenerAssistedPersistServiceTest.java (88%) rename mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/QualifiedDataSourceStatePersistServiceTest.java (94%) rename mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/{ => unified}/StatePersistServiceTest.java (94%) diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistServiceTest.java similarity index 98% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistServiceTest.java index 51f2ba18b77b4..0dc2a8d964d96 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ComputeNodePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ComputeNodePersistServiceTest.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; @@ -23,7 +23,6 @@ import org.apache.shardingsphere.infra.instance.yaml.YamlComputeNodeData; import org.apache.shardingsphere.infra.state.instance.InstanceState; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistServiceTest.java similarity index 88% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistServiceTest.java index ed6e91e601812..548b0567fb744 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/ListenerAssistedPersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/ListenerAssistedPersistServiceTest.java @@ -15,10 +15,8 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; -import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType; -import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistServiceTest.java similarity index 94% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistServiceTest.java index 1587994891f53..9bfae67bf0cbd 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/QualifiedDataSourceStatePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/QualifiedDataSourceStatePersistServiceTest.java @@ -15,11 +15,10 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; import org.apache.shardingsphere.infra.state.datasource.DataSourceState; import org.apache.shardingsphere.infra.state.datasource.qualified.QualifiedDataSourceState; -import org.apache.shardingsphere.mode.persist.service.unified.QualifiedDataSourceStatePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistServiceTest.java similarity index 94% rename from mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java rename to mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistServiceTest.java index d572c4ac4cc59..cfc33ad4a3cf7 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/StatePersistServiceTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/persist/service/unified/StatePersistServiceTest.java @@ -15,9 +15,8 @@ * limitations under the License. */ -package org.apache.shardingsphere.mode.persist.service; +package org.apache.shardingsphere.mode.persist.service.unified; -import org.apache.shardingsphere.mode.persist.service.unified.StatePersistService; import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; From 31df4616ccb938b8d55c9faa24ca059854da0495 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 18:37:50 +0800 Subject: [PATCH 182/192] Refactor StatisticsCollectJob (#34199) --- .../core/job/statistics/collect/StatisticsCollectJob.java | 5 +---- .../job/statistics/collect/StatisticsCollectJobTest.java | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java index c49160cdde8b5..ecd3d64cd2c2b 100644 --- a/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java +++ b/kernel/schedule/core/src/main/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJob.java @@ -22,8 +22,6 @@ import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; -import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; -import org.apache.shardingsphere.mode.spi.PersistRepository; /** * Statistics collect job. @@ -35,8 +33,7 @@ public final class StatisticsCollectJob implements SimpleJob { @Override public void execute(final ShardingContext shardingContext) { - PersistRepository repository = contextManager.getPersistServiceFacade().getRepository(); - if (repository instanceof ClusterPersistRepository) { + if (contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster()) { new ShardingSphereStatisticsRefreshEngine(contextManager).refresh(); } } diff --git a/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java b/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java index cdd26eb9e88a2..a37fa6c4214eb 100644 --- a/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java +++ b/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java @@ -53,6 +53,7 @@ void assertExecuteWithStandaloneMode() { @Test void assertExecuteWithClusterMode() { + when(contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster()).thenReturn(true); when(contextManager.getPersistServiceFacade().getRepository()).thenReturn(mock(ClusterPersistRepository.class)); when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps().getValue(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED)).thenReturn(false); job.execute(null); From 9245d5a737f5e382e08ad8544673013dc554428c Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 20:10:51 +0800 Subject: [PATCH 183/192] Refactor MetaDataChangedSubscriber (#34200) --- .../subscriber/type/MetaDataChangedSubscriber.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java index ed75eb960b90f..936ff6d05cf3d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriber.java @@ -19,6 +19,7 @@ import com.google.common.base.Preconditions; import com.google.common.eventbus.Subscribe; +import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; @@ -31,22 +32,15 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; import org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine; -import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; /** * Meta data changed subscriber. */ +@RequiredArgsConstructor public final class MetaDataChangedSubscriber implements DispatchEventSubscriber { private final ContextManager contextManager; - private final ClusterPersistRepository repository; - - public MetaDataChangedSubscriber(final ContextManager contextManager) { - this.contextManager = contextManager; - repository = (ClusterPersistRepository) contextManager.getPersistServiceFacade().getRepository(); - } - /** * Renew to added schema. * From 7c8fe98490b81ccdd32ed153e850a937ff9063f7 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 20:21:53 +0800 Subject: [PATCH 184/192] Add PersistServiceFacade.close (#34201) * Add PersistServiceFacade.close * Add PersistServiceFacade.close --- .../mode/manager/ContextManager.java | 3 +-- .../mode/persist/PersistServiceFacade.java | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index fda6a08f0d90f..71c3f8ab85519 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -205,7 +205,6 @@ public void close() { } executorEngine.close(); metaDataContexts.get().close(); - persistServiceFacade.getComputeNodePersistService().offline(computeNodeInstanceContext.getInstance()); - persistServiceFacade.getRepository().close(); + persistServiceFacade.close(computeNodeInstanceContext.getInstance()); } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java index 6ea49466171ad..ba0027c68ac3c 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/PersistServiceFacade.java @@ -19,14 +19,15 @@ import lombok.Getter; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; +import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; -import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; -import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.persist.service.divided.MetaDataManagerPersistService; import org.apache.shardingsphere.mode.persist.service.divided.PersistServiceBuilder; import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ComputeNodePersistService; +import org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService; import org.apache.shardingsphere.mode.persist.service.unified.QualifiedDataSourceStatePersistService; import org.apache.shardingsphere.mode.persist.service.unified.StatePersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; @@ -64,4 +65,14 @@ public PersistServiceFacade(final PersistRepository repository, final ModeConfig processPersistService = persistServiceBuilder.buildProcessPersistService(repository); listenerAssistedPersistService = new ListenerAssistedPersistService(repository); } + + /** + * Close persist service facade. + * + * @param computeNodeInstance compute node instance + */ + public void close(final ComputeNodeInstance computeNodeInstance) { + computeNodePersistService.offline(computeNodeInstance); + repository.close(); + } } From 29c4dc23b553151025cf0833115041641f84ed0e Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 20:31:58 +0800 Subject: [PATCH 185/192] Remove useless mock of ClusterPersistRepository on test cases (#34202) * Refactor MetaDataChangedSubscriberTest * Remove useless mock of ClusterPersistRepository on test cases --- .../core/job/statistics/collect/StatisticsCollectJobTest.java | 3 --- .../subscriber/type/MetaDataChangedSubscriberTest.java | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java b/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java index a37fa6c4214eb..c782e23f52066 100644 --- a/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java +++ b/kernel/schedule/core/src/test/java/org/apache/shardingsphere/schedule/core/job/statistics/collect/StatisticsCollectJobTest.java @@ -19,7 +19,6 @@ import org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey; import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -27,7 +26,6 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -54,7 +52,6 @@ void assertExecuteWithStandaloneMode() { @Test void assertExecuteWithClusterMode() { when(contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster()).thenReturn(true); - when(contextManager.getPersistServiceFacade().getRepository()).thenReturn(mock(ClusterPersistRepository.class)); when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps().getValue(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED)).thenReturn(false); job.execute(null); verify(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps()).getValue(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED); diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java index b693761c13bd0..2482e8721094f 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/MetaDataChangedSubscriberTest.java @@ -21,14 +21,13 @@ import org.apache.shardingsphere.infra.instance.metadata.InstanceType; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaAddedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.SchemaDeletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.table.TableDroppedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewCreatedOrAlteredEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.metadata.schema.view.ViewDroppedEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -53,7 +52,6 @@ class MetaDataChangedSubscriberTest { @BeforeEach void setUp() { - when(contextManager.getPersistServiceFacade().getRepository()).thenReturn(mock(ClusterPersistRepository.class)); when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps().getValue(TemporaryConfigurationPropertyKey.PROXY_META_DATA_COLLECTOR_ENABLED)).thenReturn(false); when(contextManager.getComputeNodeInstanceContext().getModeConfiguration().isCluster()).thenReturn(true); subscriber = new MetaDataChangedSubscriber(contextManager); From 237a864468cc56b4a3d85fcc986571342c170ded Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 22:03:19 +0800 Subject: [PATCH 186/192] Refactor ProcessListChangedSubscriber (#34203) * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber * Refactor ProcessListChangedSubscriber --- .../infra/executor/sql/process/Process.java | 13 ++++++ .../executor/sql/process/ProcessRegistry.java | 16 ++++++- .../divided/ProcessPersistService.java | 16 +++++++ .../type/ProcessListChangedSubscriber.java | 45 +++++-------------- .../service/ClusterProcessPersistService.java | 17 +++++++ .../ProcessListChangedSubscriberTest.java | 42 ++++------------- .../ClusterProcessPersistServiceTest.java | 27 ++++++++++- .../StandaloneProcessPersistService.java | 17 +++---- .../StandaloneProcessPersistServiceTest.java | 18 +------- .../executor/ShowProcessListExecutor.java | 2 +- 10 files changed, 118 insertions(+), 95 deletions(-) diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/Process.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/Process.java index f715b1af99b54..a1eae30a7ec5b 100644 --- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/Process.java +++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/Process.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit; import org.apache.shardingsphere.infra.metadata.user.Grantee; +import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedHashMap; import java.util.Map; @@ -151,4 +152,16 @@ public boolean isIdle() { public void removeProcessStatement(final ExecutionUnit executionUnit) { processStatements.remove(System.identityHashCode(executionUnit)); } + + /** + * Kill process. + * + * @throws SQLException SQL exception + */ + public void kill() throws SQLException { + setInterrupted(true); + for (Statement each : processStatements.values()) { + each.cancel(); + } + } } diff --git a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessRegistry.java b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessRegistry.java index 53a5c18f6c98f..1198c4245deda 100644 --- a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessRegistry.java +++ b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/process/ProcessRegistry.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.exception.kernel.connection.SQLExecutionInterruptedException; +import java.sql.SQLException; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -94,11 +95,24 @@ public void remove(final String id) { } /** - * List all process. + * List all processes. * * @return all processes */ public Collection listAll() { return processes.values(); } + + /** + * Kill process. + * + * @param processId process ID + * @throws SQLException SQL exception + */ + public void kill(final String processId) throws SQLException { + Process process = ProcessRegistry.getInstance().get(processId); + if (null != process) { + process.kill(); + } + } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java index 0794364a6b819..894424fc4b9e8 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java @@ -27,6 +27,14 @@ */ public interface ProcessPersistService { + /** + * Report local processes. + * + * @param instanceId instance ID + * @param taskId task ID + */ + void reportLocalProcesses(String instanceId, String taskId); + /** * Get process list. * @@ -41,4 +49,12 @@ public interface ProcessPersistService { * @throws SQLException SQL exception */ void killProcess(String processId) throws SQLException; + + /** + * Clean process. + * + * @param instanceId instance ID + * @param processId process ID + */ + void cleanProcess(String instanceId, String processId); } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java index 4e9c64cd2c84e..32f2243491924 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java @@ -18,57 +18,42 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; import com.google.common.eventbus.Subscribe; -import org.apache.shardingsphere.infra.executor.sql.process.Process; import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; -import org.apache.shardingsphere.infra.executor.sql.process.yaml.swapper.YamlProcessListSwapper; -import org.apache.shardingsphere.infra.util.yaml.YamlEngine; -import org.apache.shardingsphere.metadata.persist.node.ComputeNode; -import org.apache.shardingsphere.metadata.persist.node.ProcessNode; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; -import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collection; /** * Process list changed subscriber. */ public final class ProcessListChangedSubscriber implements DispatchEventSubscriber { - private final ContextManager contextManager; - - private final PersistRepository repository; + private final String instanceId; - private final YamlProcessListSwapper swapper; + private final ProcessPersistService processPersistService; public ProcessListChangedSubscriber(final ContextManager contextManager) { - this.contextManager = contextManager; - repository = contextManager.getPersistServiceFacade().getRepository(); - swapper = new YamlProcessListSwapper(); + instanceId = contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(); + processPersistService = contextManager.getPersistServiceFacade().getProcessPersistService(); } /** * Report local processes. * - * @param event show process list trigger event + * @param event report local processes event */ @Subscribe public void reportLocalProcesses(final ReportLocalProcessesEvent event) { - if (!event.getInstanceId().equals(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId())) { - return; - } - Collection processes = ProcessRegistry.getInstance().listAll(); - if (!processes.isEmpty()) { - repository.persist(ProcessNode.getProcessListInstancePath(event.getTaskId(), event.getInstanceId()), YamlEngine.marshal(swapper.swapToYamlConfiguration(processes))); + if (event.getInstanceId().equals(instanceId)) { + processPersistService.reportLocalProcesses(instanceId, event.getTaskId()); } - repository.delete(ComputeNode.getProcessTriggerInstanceNodePath(event.getInstanceId(), event.getTaskId())); } /** @@ -89,17 +74,11 @@ public synchronized void completeToReportLocalProcesses(final ReportLocalProcess */ @Subscribe public synchronized void killLocalProcess(final KillLocalProcessEvent event) throws SQLException { - if (!event.getInstanceId().equals(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId())) { + if (!event.getInstanceId().equals(instanceId)) { return; } - Process process = ProcessRegistry.getInstance().get(event.getProcessId()); - if (null != process) { - process.setInterrupted(true); - for (Statement each : process.getProcessStatements().values()) { - each.cancel(); - } - } - repository.delete(ComputeNode.getProcessKillInstanceIdNodePath(event.getInstanceId(), event.getProcessId())); + ProcessRegistry.getInstance().kill(event.getProcessId()); + processPersistService.cleanProcess(instanceId, event.getProcessId()); } /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java index 3bc48b500c103..9bcc9470062c1 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.executor.sql.process.Process; +import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; import org.apache.shardingsphere.infra.executor.sql.process.yaml.YamlProcessList; import org.apache.shardingsphere.infra.executor.sql.process.yaml.swapper.YamlProcessListSwapper; @@ -43,6 +44,17 @@ public final class ClusterProcessPersistService implements ProcessPersistService private final PersistRepository repository; + private final YamlProcessListSwapper swapper = new YamlProcessListSwapper(); + + @Override + public void reportLocalProcesses(final String instanceId, final String taskId) { + Collection processes = ProcessRegistry.getInstance().listAll(); + if (!processes.isEmpty()) { + repository.persist(ProcessNode.getProcessListInstancePath(taskId, instanceId), YamlEngine.marshal(swapper.swapToYamlConfiguration(processes))); + } + repository.delete(ComputeNode.getProcessTriggerInstanceNodePath(instanceId, taskId)); + } + @Override public Collection getProcessList() { String taskId = new UUID(ThreadLocalRandom.current().nextLong(), ThreadLocalRandom.current().nextLong()).toString().replace("-", ""); @@ -98,4 +110,9 @@ private Collection getKillProcessTriggerPaths(final String processId) { private boolean isReady(final Collection paths) { return paths.stream().noneMatch(each -> null != repository.query(each)); } + + @Override + public void cleanProcess(final String instanceId, final String processId) { + repository.delete(ComputeNode.getProcessKillInstanceIdNodePath(instanceId, processId)); + } } diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java index 2dab71dc3d4ff..5cd48c2be7b97 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java @@ -17,14 +17,13 @@ package org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type; -import org.apache.shardingsphere.infra.executor.sql.process.Process; import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessCompletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.KillLocalProcessEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; -import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; @@ -37,12 +36,9 @@ import org.mockito.quality.Strictness; import java.sql.SQLException; -import java.sql.Statement; import java.util.Collections; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -72,19 +68,10 @@ void assertReportLocalProcessesWithNotCurrentInstance() { } @Test - void assertReportEmptyLocalProcesses() { + void assertReportLocalProcesses() { when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.emptyList()); subscriber.reportLocalProcesses(new ReportLocalProcessesEvent("foo_instance_id", "foo_task_id")); - verify(contextManager.getPersistServiceFacade().getRepository(), times(0)).persist(any(), any()); - verify(contextManager.getPersistServiceFacade().getRepository()).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); - } - - @Test - void assertReportNotEmptyLocalProcesses() { - when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.singleton(mock(Process.class, RETURNS_DEEP_STUBS))); - subscriber.reportLocalProcesses(new ReportLocalProcessesEvent("foo_instance_id", "foo_task_id")); - verify(contextManager.getPersistServiceFacade().getRepository()).persist(eq("/execution_nodes/foo_task_id/foo_instance_id"), any()); - verify(contextManager.getPersistServiceFacade().getRepository()).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); + verify(contextManager.getPersistServiceFacade().getProcessPersistService()).reportLocalProcesses("foo_instance_id", "foo_task_id"); } @Test @@ -94,28 +81,15 @@ void assertCompleteToReportLocalProcesses() { } @Test - void assertKillLocalProcessWithNotCurrentInstance() throws SQLException { - subscriber.killLocalProcess(new KillLocalProcessEvent("bar_instance_id", "foo_pid")); - verify(contextManager.getPersistServiceFacade().getRepository(), times(0)).delete(any()); - } - - @Test - void assertKillLocalProcessWithoutExistedProcess() throws SQLException { - when(ProcessRegistry.getInstance().get("foo_pid")).thenReturn(null); + void assertKillLocalProcessWithCurrentInstance() throws SQLException { subscriber.killLocalProcess(new KillLocalProcessEvent("foo_instance_id", "foo_pid")); - verify(contextManager.getPersistServiceFacade().getRepository()).delete("/nodes/compute_nodes/kill_process_trigger/foo_instance_id:foo_pid"); + verify(contextManager.getPersistServiceFacade().getProcessPersistService()).cleanProcess("foo_instance_id", "foo_pid"); } @Test - void assertKillLocalProcessWithExistedProcess() throws SQLException { - Process process = mock(Process.class, RETURNS_DEEP_STUBS); - Statement statement = mock(Statement.class); - when(process.getProcessStatements()).thenReturn(Collections.singletonMap(1, statement)); - when(ProcessRegistry.getInstance().get("foo_pid")).thenReturn(process); - subscriber.killLocalProcess(new KillLocalProcessEvent("foo_instance_id", "foo_pid")); - verify(process).setInterrupted(true); - verify(statement).cancel(); - verify(contextManager.getPersistServiceFacade().getRepository()).delete("/nodes/compute_nodes/kill_process_trigger/foo_instance_id:foo_pid"); + void assertKillLocalProcessWithNotCurrentInstance() throws SQLException { + subscriber.killLocalProcess(new KillLocalProcessEvent("bar_instance_id", "foo_pid")); + verify(contextManager.getPersistServiceFacade().getProcessPersistService(), times(0)).cleanProcess("bar_instance_id", "foo_pid"); } @Test diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java index efebb308c673e..5a888875f8d56 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; import org.apache.shardingsphere.infra.executor.sql.process.Process; +import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; import org.apache.shardingsphere.infra.executor.sql.process.yaml.YamlProcess; import org.apache.shardingsphere.infra.executor.sql.process.yaml.YamlProcessList; @@ -40,12 +41,14 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.contains; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ProcessOperationLockRegistry.class) +@StaticMockSettings({ProcessRegistry.class, ProcessOperationLockRegistry.class}) class ClusterProcessPersistServiceTest { @Mock @@ -58,6 +61,22 @@ void setUp() { processPersistService = new ClusterProcessPersistService(repository); } + @Test + void assertReportEmptyLocalProcesses() { + when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.emptyList()); + processPersistService.reportLocalProcesses("foo_instance_id", "foo_task_id"); + verify(repository, times(0)).persist(any(), any()); + verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); + } + + @Test + void assertReportNotEmptyLocalProcesses() { + when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.singleton(mock(Process.class, RETURNS_DEEP_STUBS))); + processPersistService.reportLocalProcesses("foo_instance_id", "foo_task_id"); + verify(repository).persist(eq("/execution_nodes/foo_task_id/foo_instance_id"), any()); + verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); + } + @Test void assertGetCompletedProcessList() { when(ProcessOperationLockRegistry.getInstance().waitUntilReleaseReady(any(), any())).thenReturn(true); @@ -111,4 +130,10 @@ private void assertKillProcess() { processPersistService.killProcess("foo_process_id"); verify(repository).persist("/nodes/compute_nodes/kill_process_trigger/abc:foo_process_id", ""); } + + @Test + void assertCleanProcess() { + processPersistService.cleanProcess("foo_instance_id", "foo_pid"); + verify(repository).delete("/nodes/compute_nodes/kill_process_trigger/foo_instance_id:foo_pid"); + } } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java index 135bc0a1a55a5..d7c0e6e50576b 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java @@ -22,7 +22,6 @@ import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; import java.sql.SQLException; -import java.sql.Statement; import java.util.Collection; /** @@ -30,6 +29,10 @@ */ public final class StandaloneProcessPersistService implements ProcessPersistService { + @Override + public void reportLocalProcesses(final String instanceId, final String taskId) { + } + @Override public Collection getProcessList() { return ProcessRegistry.getInstance().listAll(); @@ -37,12 +40,10 @@ public Collection getProcessList() { @Override public void killProcess(final String processId) throws SQLException { - Process process = ProcessRegistry.getInstance().get(processId); - if (null == process) { - return; - } - for (Statement each : process.getProcessStatements().values()) { - each.cancel(); - } + ProcessRegistry.getInstance().kill(processId); + } + + @Override + public void cleanProcess(final String instanceId, final String processId) { } } diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistServiceTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistServiceTest.java index 45c6a36b44c54..156636d56a2fc 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistServiceTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistServiceTest.java @@ -17,7 +17,6 @@ package org.apache.shardingsphere.mode.manager.standalone.persist.service; -import org.apache.shardingsphere.infra.executor.sql.process.Process; import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; @@ -25,10 +24,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collections; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -51,19 +47,7 @@ void assertGetProcessList() { void assertKillProcess() throws SQLException { ProcessRegistry processRegistry = mock(ProcessRegistry.class); when(ProcessRegistry.getInstance()).thenReturn(processRegistry); - Process process = mock(Process.class); - Statement statement = mock(Statement.class); - when(process.getProcessStatements()).thenReturn(Collections.singletonMap(1, statement)); - when(processRegistry.get("foo_id")).thenReturn(process); processPersistService.killProcess("foo_id"); - verify(statement).cancel(); - } - - @Test - void assertKillProcessWithNotExistedProcessId() { - ProcessRegistry processRegistry = mock(ProcessRegistry.class); - when(ProcessRegistry.getInstance()).thenReturn(processRegistry); - when(processRegistry.get("foo_id")).thenReturn(null); - assertDoesNotThrow(() -> processPersistService.killProcess("foo_id")); + verify(ProcessRegistry.getInstance()).kill("foo_id"); } } diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowProcessListExecutor.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowProcessListExecutor.java index 57dd3db0bdb10..3254b62ee3f5d 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowProcessListExecutor.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowProcessListExecutor.java @@ -62,7 +62,7 @@ public void execute(final ConnectionSession connectionSession) { private QueryResult getQueryResult() { Collection processes = ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getProcessPersistService().getProcessList(); - if (null == processes || processes.isEmpty()) { + if (processes.isEmpty()) { return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList()); } List rows = processes.stream().map(this::getMemoryQueryResultDataRow).collect(Collectors.toList()); From 8d6327f97b2561e7f6e2cf4f3b2161f24395a312 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 29 Dec 2024 23:44:22 +0800 Subject: [PATCH 187/192] Add PersistCoordinatorFacade (#34205) * Add PersistCoordinatorFacade * Add PersistCoordinatorFacade * Add PersistCoordinatorFacade * Add PersistCoordinatorFacade --- .../mode/manager/ContextManager.java | 4 + .../coordinator/PersistCoordinatorFacade.java | 37 +++++++++ .../PersistCoordinatorFacadeBuilder.java | 37 +++++++++ .../ProcessPersistCoordinator.java | 40 ++++++++++ .../divided/ProcessPersistService.java | 16 ---- ...ersistCoordinatorFacadeBuilderFixture.java | 40 ++++++++++ ...oordinator.PersistCoordinatorFacadeBuilder | 18 +++++ .../type/ProcessListChangedSubscriber.java | 6 +- ...lusterPersistCoordinatorFacadeBuilder.java | 38 ++++++++++ .../ClusterProcessPersistCoordinator.java | 55 ++++++++++++++ .../service/ClusterProcessPersistService.java | 17 ----- ...oordinator.PersistCoordinatorFacadeBuilder | 18 +++++ .../ProcessListChangedSubscriberTest.java | 6 +- .../ClusterProcessPersistCoordinatorTest.java | 76 +++++++++++++++++++ .../ClusterProcessPersistServiceTest.java | 24 ------ ...dalonePersistCoordinatorFacadeBuilder.java | 43 +++++++++++ .../StandaloneProcessPersistService.java | 8 -- ...oordinator.PersistCoordinatorFacadeBuilder | 18 +++++ .../ProxyDatabaseConnectionManagerTest.java | 3 +- .../connector/ProxySQLExecutorTest.java | 3 +- .../backend/context/ProxyContextTest.java | 2 +- .../SetDistVariableExecutorTest.java | 3 +- .../frontend/state/impl/OKProxyStateTest.java | 3 +- 23 files changed, 436 insertions(+), 79 deletions(-) create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacade.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacadeBuilder.java create mode 100644 mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/ProcessPersistCoordinator.java create mode 100644 mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistCoordinatorFacadeBuilderFixture.java create mode 100644 mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder create mode 100644 mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterPersistCoordinatorFacadeBuilder.java create mode 100644 mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinator.java create mode 100644 mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder create mode 100644 mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinatorTest.java create mode 100644 mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/coordinator/StandalonePersistCoordinatorFacadeBuilder.java create mode 100644 mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 71c3f8ab85519..4ad11c2200df8 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -37,6 +37,7 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.persist.PersistServiceFacade; +import org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacade; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.mode.state.ClusterStateContext; @@ -64,6 +65,8 @@ public final class ContextManager implements AutoCloseable { private final MetaDataContextManager metaDataContextManager; + private final PersistCoordinatorFacade persistCoordinatorFacade; + public ContextManager(final MetaDataContexts metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext, final PersistRepository repository) { this.metaDataContexts = new AtomicReference<>(metaDataContexts); this.computeNodeInstanceContext = computeNodeInstanceContext; @@ -74,6 +77,7 @@ public ContextManager(final MetaDataContexts metaDataContexts, final ComputeNode for (ContextManagerLifecycleListener each : ShardingSphereServiceLoader.getServiceInstances(ContextManagerLifecycleListener.class)) { each.onInitialized(this); } + persistCoordinatorFacade = new PersistCoordinatorFacade(repository, computeNodeInstanceContext.getModeConfiguration()); } /** diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacade.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacade.java new file mode 100644 index 0000000000000..28f1a4e72de96 --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacade.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.persist.coordinator; + +import lombok.Getter; +import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; +import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +/** + * Persist coordinator facade. + */ +@Getter +public final class PersistCoordinatorFacade { + + private final ProcessPersistCoordinator processPersistCoordinator; + + public PersistCoordinatorFacade(final PersistRepository repository, final ModeConfiguration modeConfig) { + PersistCoordinatorFacadeBuilder builder = TypedSPILoader.getService(PersistCoordinatorFacadeBuilder.class, modeConfig.getType()); + processPersistCoordinator = builder.buildProcessPersistCoordinator(repository); + } +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacadeBuilder.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacadeBuilder.java new file mode 100644 index 0000000000000..be24d682a3b91 --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/PersistCoordinatorFacadeBuilder.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.persist.coordinator; + +import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI; +import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +/** + * Persist coordinator facade builder. + */ +@SingletonSPI +public interface PersistCoordinatorFacadeBuilder extends TypedSPI { + + /** + * Build process persist coordinator. + * + * @param repository persist repository + * @return built process persist coordinator + */ + ProcessPersistCoordinator buildProcessPersistCoordinator(PersistRepository repository); +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/ProcessPersistCoordinator.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/ProcessPersistCoordinator.java new file mode 100644 index 0000000000000..46d56418f797b --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/coordinator/ProcessPersistCoordinator.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.persist.coordinator; + +/** + * Process persist coordinator. + */ +public interface ProcessPersistCoordinator { + + /** + * Report local processes. + * + * @param instanceId instance ID + * @param taskId task ID + */ + void reportLocalProcesses(String instanceId, String taskId); + + /** + * Clean process. + * + * @param instanceId instance ID + * @param processId process ID + */ + void cleanProcess(String instanceId, String processId); +} diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java index 894424fc4b9e8..0794364a6b819 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/divided/ProcessPersistService.java @@ -27,14 +27,6 @@ */ public interface ProcessPersistService { - /** - * Report local processes. - * - * @param instanceId instance ID - * @param taskId task ID - */ - void reportLocalProcesses(String instanceId, String taskId); - /** * Get process list. * @@ -49,12 +41,4 @@ public interface ProcessPersistService { * @throws SQLException SQL exception */ void killProcess(String processId) throws SQLException; - - /** - * Clean process. - * - * @param instanceId instance ID - * @param processId process ID - */ - void cleanProcess(String instanceId, String processId); } diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistCoordinatorFacadeBuilderFixture.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistCoordinatorFacadeBuilderFixture.java new file mode 100644 index 0000000000000..8c780c2be3ef8 --- /dev/null +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/fixture/PersistCoordinatorFacadeBuilderFixture.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.fixture; + +import org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +public final class PersistCoordinatorFacadeBuilderFixture implements PersistCoordinatorFacadeBuilder { + + @Override + public ProcessPersistCoordinator buildProcessPersistCoordinator(final PersistRepository repository) { + return null; + } + + @Override + public Object getType() { + return "foo_type"; + } + + @Override + public boolean isDefault() { + return true; + } +} diff --git a/mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder b/mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder new file mode 100644 index 0000000000000..b662f6af13042 --- /dev/null +++ b/mode/core/src/test/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.shardingsphere.mode.fixture.PersistCoordinatorFacadeBuilderFixture diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java index 32f2243491924..4216bc6a19a1c 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriber.java @@ -26,7 +26,7 @@ import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesCompletedEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.state.compute.ReportLocalProcessesEvent; import org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber; -import org.apache.shardingsphere.mode.persist.service.divided.ProcessPersistService; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; import java.sql.SQLException; @@ -37,11 +37,11 @@ public final class ProcessListChangedSubscriber implements DispatchEventSubscrib private final String instanceId; - private final ProcessPersistService processPersistService; + private final ProcessPersistCoordinator processPersistService; public ProcessListChangedSubscriber(final ContextManager contextManager) { instanceId = contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(); - processPersistService = contextManager.getPersistServiceFacade().getProcessPersistService(); + processPersistService = contextManager.getPersistCoordinatorFacade().getProcessPersistCoordinator(); } /** diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterPersistCoordinatorFacadeBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterPersistCoordinatorFacadeBuilder.java new file mode 100644 index 0000000000000..6d16b0316e646 --- /dev/null +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterPersistCoordinatorFacadeBuilder.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.persist.coordinator; + +import org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +/** + * Cluster persist coordinator facade builder. + */ +public final class ClusterPersistCoordinatorFacadeBuilder implements PersistCoordinatorFacadeBuilder { + + @Override + public ProcessPersistCoordinator buildProcessPersistCoordinator(final PersistRepository repository) { + return new ClusterProcessPersistCoordinator(repository); + } + + @Override + public Object getType() { + return "Cluster"; + } +} diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinator.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinator.java new file mode 100644 index 0000000000000..083cb50f1cfe9 --- /dev/null +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinator.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.persist.coordinator; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.executor.sql.process.Process; +import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; +import org.apache.shardingsphere.infra.executor.sql.process.yaml.swapper.YamlProcessListSwapper; +import org.apache.shardingsphere.infra.util.yaml.YamlEngine; +import org.apache.shardingsphere.metadata.persist.node.ComputeNode; +import org.apache.shardingsphere.metadata.persist.node.ProcessNode; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +import java.util.Collection; + +/** + * Cluster process persist coordinator. + */ +@RequiredArgsConstructor +public final class ClusterProcessPersistCoordinator implements ProcessPersistCoordinator { + + private final PersistRepository repository; + + private final YamlProcessListSwapper swapper = new YamlProcessListSwapper(); + + @Override + public void reportLocalProcesses(final String instanceId, final String taskId) { + Collection processes = ProcessRegistry.getInstance().listAll(); + if (!processes.isEmpty()) { + repository.persist(ProcessNode.getProcessListInstancePath(taskId, instanceId), YamlEngine.marshal(swapper.swapToYamlConfiguration(processes))); + } + repository.delete(ComputeNode.getProcessTriggerInstanceNodePath(instanceId, taskId)); + } + + @Override + public void cleanProcess(final String instanceId, final String processId) { + repository.delete(ComputeNode.getProcessKillInstanceIdNodePath(instanceId, processId)); + } +} diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java index 9bcc9470062c1..3bc48b500c103 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistService.java @@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.executor.sql.process.Process; -import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; import org.apache.shardingsphere.infra.executor.sql.process.lock.ProcessOperationLockRegistry; import org.apache.shardingsphere.infra.executor.sql.process.yaml.YamlProcessList; import org.apache.shardingsphere.infra.executor.sql.process.yaml.swapper.YamlProcessListSwapper; @@ -44,17 +43,6 @@ public final class ClusterProcessPersistService implements ProcessPersistService private final PersistRepository repository; - private final YamlProcessListSwapper swapper = new YamlProcessListSwapper(); - - @Override - public void reportLocalProcesses(final String instanceId, final String taskId) { - Collection processes = ProcessRegistry.getInstance().listAll(); - if (!processes.isEmpty()) { - repository.persist(ProcessNode.getProcessListInstancePath(taskId, instanceId), YamlEngine.marshal(swapper.swapToYamlConfiguration(processes))); - } - repository.delete(ComputeNode.getProcessTriggerInstanceNodePath(instanceId, taskId)); - } - @Override public Collection getProcessList() { String taskId = new UUID(ThreadLocalRandom.current().nextLong(), ThreadLocalRandom.current().nextLong()).toString().replace("-", ""); @@ -110,9 +98,4 @@ private Collection getKillProcessTriggerPaths(final String processId) { private boolean isReady(final Collection paths) { return paths.stream().noneMatch(each -> null != repository.query(each)); } - - @Override - public void cleanProcess(final String instanceId, final String processId) { - repository.delete(ComputeNode.getProcessKillInstanceIdNodePath(instanceId, processId)); - } } diff --git a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder new file mode 100644 index 0000000000000..10ecee97a0722 --- /dev/null +++ b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.ClusterPersistCoordinatorFacadeBuilder diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java index 5cd48c2be7b97..c5198c25d3a26 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/ProcessListChangedSubscriberTest.java @@ -71,7 +71,7 @@ void assertReportLocalProcessesWithNotCurrentInstance() { void assertReportLocalProcesses() { when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.emptyList()); subscriber.reportLocalProcesses(new ReportLocalProcessesEvent("foo_instance_id", "foo_task_id")); - verify(contextManager.getPersistServiceFacade().getProcessPersistService()).reportLocalProcesses("foo_instance_id", "foo_task_id"); + verify(contextManager.getPersistCoordinatorFacade().getProcessPersistCoordinator()).reportLocalProcesses("foo_instance_id", "foo_task_id"); } @Test @@ -83,13 +83,13 @@ void assertCompleteToReportLocalProcesses() { @Test void assertKillLocalProcessWithCurrentInstance() throws SQLException { subscriber.killLocalProcess(new KillLocalProcessEvent("foo_instance_id", "foo_pid")); - verify(contextManager.getPersistServiceFacade().getProcessPersistService()).cleanProcess("foo_instance_id", "foo_pid"); + verify(contextManager.getPersistCoordinatorFacade().getProcessPersistCoordinator()).cleanProcess("foo_instance_id", "foo_pid"); } @Test void assertKillLocalProcessWithNotCurrentInstance() throws SQLException { subscriber.killLocalProcess(new KillLocalProcessEvent("bar_instance_id", "foo_pid")); - verify(contextManager.getPersistServiceFacade().getProcessPersistService(), times(0)).cleanProcess("bar_instance_id", "foo_pid"); + verify(contextManager.getPersistCoordinatorFacade().getProcessPersistCoordinator(), times(0)).cleanProcess("bar_instance_id", "foo_pid"); } @Test diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinatorTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinatorTest.java new file mode 100644 index 0000000000000..4ad1ddd68236c --- /dev/null +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/coordinator/ClusterProcessPersistCoordinatorTest.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster.persist.coordinator; + +import org.apache.shardingsphere.infra.executor.sql.process.Process; +import org.apache.shardingsphere.infra.executor.sql.process.ProcessRegistry; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; +import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.test.mock.AutoMockExtension; +import org.apache.shardingsphere.test.mock.StaticMockSettings; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; + +import java.util.Collections; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(AutoMockExtension.class) +@StaticMockSettings(ProcessRegistry.class) +class ClusterProcessPersistCoordinatorTest { + + @Mock + private PersistRepository repository; + + private ProcessPersistCoordinator processPersistCoordinator; + + @BeforeEach + void setUp() { + processPersistCoordinator = new ClusterProcessPersistCoordinator(repository); + } + + @Test + void assertReportEmptyLocalProcesses() { + when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.emptyList()); + processPersistCoordinator.reportLocalProcesses("foo_instance_id", "foo_task_id"); + verify(repository, times(0)).persist(any(), any()); + verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); + } + + @Test + void assertReportNotEmptyLocalProcesses() { + when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.singleton(mock(Process.class, RETURNS_DEEP_STUBS))); + processPersistCoordinator.reportLocalProcesses("foo_instance_id", "foo_task_id"); + verify(repository).persist(eq("/execution_nodes/foo_task_id/foo_instance_id"), any()); + verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); + } + + @Test + void assertCleanProcess() { + processPersistCoordinator.cleanProcess("foo_instance_id", "foo_pid"); + verify(repository).delete("/nodes/compute_nodes/kill_process_trigger/foo_instance_id:foo_pid"); + } +} diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java index 5a888875f8d56..df844197ba69d 100644 --- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java +++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterProcessPersistServiceTest.java @@ -41,8 +41,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.contains; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -61,22 +59,6 @@ void setUp() { processPersistService = new ClusterProcessPersistService(repository); } - @Test - void assertReportEmptyLocalProcesses() { - when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.emptyList()); - processPersistService.reportLocalProcesses("foo_instance_id", "foo_task_id"); - verify(repository, times(0)).persist(any(), any()); - verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); - } - - @Test - void assertReportNotEmptyLocalProcesses() { - when(ProcessRegistry.getInstance().listAll()).thenReturn(Collections.singleton(mock(Process.class, RETURNS_DEEP_STUBS))); - processPersistService.reportLocalProcesses("foo_instance_id", "foo_task_id"); - verify(repository).persist(eq("/execution_nodes/foo_task_id/foo_instance_id"), any()); - verify(repository).delete("/nodes/compute_nodes/show_process_list_trigger/foo_instance_id:foo_task_id"); - } - @Test void assertGetCompletedProcessList() { when(ProcessOperationLockRegistry.getInstance().waitUntilReleaseReady(any(), any())).thenReturn(true); @@ -130,10 +112,4 @@ private void assertKillProcess() { processPersistService.killProcess("foo_process_id"); verify(repository).persist("/nodes/compute_nodes/kill_process_trigger/abc:foo_process_id", ""); } - - @Test - void assertCleanProcess() { - processPersistService.cleanProcess("foo_instance_id", "foo_pid"); - verify(repository).delete("/nodes/compute_nodes/kill_process_trigger/foo_instance_id:foo_pid"); - } } diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/coordinator/StandalonePersistCoordinatorFacadeBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/coordinator/StandalonePersistCoordinatorFacadeBuilder.java new file mode 100644 index 0000000000000..e3d0a81c8dc9b --- /dev/null +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/coordinator/StandalonePersistCoordinatorFacadeBuilder.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.standalone.persist.coordinator; + +import org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder; +import org.apache.shardingsphere.mode.persist.coordinator.ProcessPersistCoordinator; +import org.apache.shardingsphere.mode.spi.PersistRepository; + +/** + * Standalone persist coordinator facade builder. + */ +public final class StandalonePersistCoordinatorFacadeBuilder implements PersistCoordinatorFacadeBuilder { + + @Override + public ProcessPersistCoordinator buildProcessPersistCoordinator(final PersistRepository repository) { + return null; + } + + @Override + public Object getType() { + return "Standalone"; + } + + @Override + public boolean isDefault() { + return true; + } +} diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java index d7c0e6e50576b..01f2ac8c5e831 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneProcessPersistService.java @@ -29,10 +29,6 @@ */ public final class StandaloneProcessPersistService implements ProcessPersistService { - @Override - public void reportLocalProcesses(final String instanceId, final String taskId) { - } - @Override public Collection getProcessList() { return ProcessRegistry.getInstance().listAll(); @@ -42,8 +38,4 @@ public Collection getProcessList() { public void killProcess(final String processId) throws SQLException { ProcessRegistry.getInstance().kill(processId); } - - @Override - public void cleanProcess(final String instanceId, final String processId) { - } } diff --git a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder new file mode 100644 index 0000000000000..ec4247fc7cadd --- /dev/null +++ b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.persist.coordinator.PersistCoordinatorFacadeBuilder @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +org.apache.shardingsphere.mode.manager.standalone.persist.coordinator.StandalonePersistCoordinatorFacadeBuilder diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManagerTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManagerTest.java index 41ee00216600b..a986669913d48 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManagerTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxyDatabaseConnectionManagerTest.java @@ -126,7 +126,8 @@ private ContextManager mockContextManager() { when(metaData.getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singletonList(transactionRule))); ComputeNodeInstanceContext computeNodeInstanceContext = mock(ComputeNodeInstanceContext.class); when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class)); - return new ContextManager(MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, mock(PersistRepository.class)); + return new ContextManager( + MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, mock(PersistRepository.class)); } @AfterEach diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java index 87bc4e883ed7a..6e3bbf47e2c4a 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutorTest.java @@ -108,8 +108,7 @@ void setUp() { when(metaData.getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Arrays.asList(mock(SQLFederationRule.class), transactionRule))); ComputeNodeInstanceContext computeNodeInstanceContext = mock(ComputeNodeInstanceContext.class); when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class)); - ContextManager contextManager = new ContextManager(MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, - mock(PersistRepository.class)); + ContextManager contextManager = new ContextManager(MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, mock(PersistRepository.class)); when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java index 7b94bce84c5c1..543ea1f293fc1 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/context/ProxyContextTest.java @@ -25,12 +25,12 @@ import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.state.ClusterState; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; import org.apache.shardingsphere.mode.spi.PersistRepository; +import org.apache.shardingsphere.mode.state.ClusterState; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java index 0d0c811034f41..5e37937e452b0 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java @@ -34,7 +34,6 @@ import org.apache.shardingsphere.metadata.persist.service.config.global.PropertiesPersistService; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; -import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; @@ -111,6 +110,6 @@ private ContextManager mockContextManager() { ComputeNodeInstanceContext computeNodeInstanceContext = new ComputeNodeInstanceContext( new ComputeNodeInstance(mock(InstanceMetaData.class)), new ModeConfiguration("Standalone", null), new EventBusContext()); computeNodeInstanceContext.init(mock(WorkerIdGenerator.class), mock(LockContext.class)); - return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), computeNodeInstanceContext, mock(PersistRepository.class)); + return new ContextManager(MetaDataContextsFactory.create(metaDataPersistService, new ShardingSphereMetaData()), computeNodeInstanceContext, mock()); } } diff --git a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/state/impl/OKProxyStateTest.java b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/state/impl/OKProxyStateTest.java index 7ec5669f11d46..5f0420d356b0b 100644 --- a/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/state/impl/OKProxyStateTest.java +++ b/proxy/frontend/core/src/test/java/org/apache/shardingsphere/proxy/frontend/state/impl/OKProxyStateTest.java @@ -31,7 +31,6 @@ import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory; -import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask; @@ -96,7 +95,7 @@ private ContextManager mockContextManager() { when(metaData.getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Collections.singletonList(transactionRule))); ComputeNodeInstanceContext computeNodeInstanceContext = mock(ComputeNodeInstanceContext.class); when(computeNodeInstanceContext.getModeConfiguration()).thenReturn(mock(ModeConfiguration.class)); - return new ContextManager(MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, mock(PersistRepository.class)); + return new ContextManager(MetaDataContextsFactory.create(mock(MetaDataPersistService.class), metaData), computeNodeInstanceContext, mock()); } @SuppressWarnings({"unchecked", "SameParameterValue"}) From 4c07e394c528e47d8113e8e1a539e1acc781a728 Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Mon, 30 Dec 2024 12:24:58 +0800 Subject: [PATCH 188/192] Use same transaction manager in one transaction (#34206) * Use same transaction manager in one transaction * Use same transaction manager in one transaction --- .../jdbc/transaction/BackendTransactionManager.java | 7 ++++++- .../transaction/TransactionBackendHandlerFactoryTest.java | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java index 53bad50aceca1..5c2331ebba152 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java @@ -60,9 +60,14 @@ public BackendTransactionManager(final ProxyDatabaseConnectionManager databaseCo connection = databaseConnectionManager; localTransactionManager = new LocalTransactionManager(databaseConnectionManager); TransactionRule transactionRule = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TransactionRule.class); + TransactionConnectionContext transactionContext = getTransactionContext(); transactionType = transactionRule.getDefaultType(); ShardingSphereTransactionManagerEngine engine = transactionRule.getResource(); - distributedTransactionManager = null == engine ? null : engine.getTransactionManager(transactionType); + if (transactionContext.getTransactionManager().isPresent()) { + distributedTransactionManager = (ShardingSphereDistributedTransactionManager) transactionContext.getTransactionManager().get(); + } else { + distributedTransactionManager = null == engine ? null : engine.getTransactionManager(transactionType); + } transactionHooks = OrderedSPILoader.getServices(TransactionHook.class, ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules()); } diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerFactoryTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerFactoryTest.java index e59ff3c652ab6..b325704dab83f 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerFactoryTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionBackendHandlerFactoryTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.session.connection.ConnectionContext; +import org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext; import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.connector.DatabaseConnector; @@ -66,6 +67,8 @@ void assertTransactionBackendHandlerReturnedWhenTCLStatementInstanceOfCommitStat ConnectionSession connectionSession = mock(ConnectionSession.class, Answers.RETURNS_DEEP_STUBS); ProxyDatabaseConnectionManager databaseConnectionManager = mock(ProxyDatabaseConnectionManager.class); when(connectionSession.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager); + when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession); + when(databaseConnectionManager.getConnectionSession().getConnectionContext().getTransactionContext()).thenReturn(new TransactionConnectionContext()); SQLStatementContext context = mock(SQLStatementContext.class); when(context.getSqlStatement()).thenReturn(mock(CommitStatement.class)); ContextManager contextManager = mockContextManager(); @@ -82,6 +85,9 @@ void assertTransactionBackendHandlerReturnedWhenTCLStatementInstanceOfRollbackSt ConnectionSession connectionSession = mock(ConnectionSession.class, Answers.RETURNS_DEEP_STUBS); ProxyDatabaseConnectionManager databaseConnectionManager = mock(ProxyDatabaseConnectionManager.class); when(connectionSession.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager); + when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession); + when(databaseConnectionManager.getConnectionSession().getConnectionContext().getTransactionContext()).thenReturn(new TransactionConnectionContext()); + when(connectionSession.getDatabaseConnectionManager().getConnectionSession().getConnectionContext().getTransactionContext()).thenReturn(new TransactionConnectionContext()); SQLStatementContext context = mock(SQLStatementContext.class); when(context.getSqlStatement()).thenReturn(mock(RollbackStatement.class)); ContextManager contextManager = mockContextManager(); From f84f01a915fff329a322e414fc3506bea355167f Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Mon, 30 Dec 2024 13:08:45 +0800 Subject: [PATCH 189/192] Add switching transaction rule test case (#34207) --- .../SwitchingTransactionRuleTestCase.java | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java diff --git a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java new file mode 100644 index 0000000000000..219cd3b5d0f59 --- /dev/null +++ b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.test.e2e.transaction.cases.alterresource; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.test.e2e.transaction.cases.base.BaseTransactionTestCase; +import org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer; +import org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase; +import org.apache.shardingsphere.test.e2e.transaction.engine.command.CommonSQLCommand; +import org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants; +import org.apache.shardingsphere.transaction.api.TransactionType; +import org.testcontainers.shaded.org.awaitility.Awaitility; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Switching transaction rule test case. + */ +@Slf4j +@TransactionTestCase(adapters = TransactionTestConstants.PROXY, dbTypes = TransactionTestConstants.MYSQL) +public final class SwitchingTransactionRuleTestCase extends BaseTransactionTestCase { + + private static final int THREAD_SIZE = 1; + + private static final int TRANSACTION_SIZE = 1000; + + private static final int MAX_SWITCH_COUNT = 6; + + private static final AtomicBoolean IS_FINISHED = new AtomicBoolean(false); + + private static final AtomicInteger SWITCH_COUNT = new AtomicInteger(); + + public SwitchingTransactionRuleTestCase(final TransactionTestCaseParameter testCaseParam) { + super(testCaseParam); + } + + @Override + protected void executeTest(final TransactionContainerComposer containerComposer) throws SQLException { + innerRun(containerComposer); + } + + @SneakyThrows(InterruptedException.class) + private void innerRun(final TransactionContainerComposer containerComposer) { + List tasks = new ArrayList<>(THREAD_SIZE); + for (int i = 0; i < THREAD_SIZE; i++) { + Thread updateThread = new Thread(new TransactionOperationsTask(getDataSource())); + updateThread.start(); + tasks.add(updateThread); + } + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(new AlterTransactionRuleTask(containerComposer, getBaseTransactionITCase().getCommonSQL())); + for (Thread each : tasks) { + each.join(); + } + IS_FINISHED.set(true); + executor.shutdown(); + } + + @RequiredArgsConstructor + @Getter + private static class AlterTransactionRuleTask implements Runnable { + + private final TransactionContainerComposer containerComposer; + + private final CommonSQLCommand commonSQL; + + @SneakyThrows({SQLException.class, InterruptedException.class}) + @Override + public void run() { + while (!IS_FINISHED.get()) { + alterLocalTransactionRule(); + TimeUnit.SECONDS.sleep(20); + alterXaTransactionRule("Narayana"); + if (SWITCH_COUNT.incrementAndGet() >= MAX_SWITCH_COUNT) { + IS_FINISHED.set(true); + break; + } + TimeUnit.SECONDS.sleep(20); + } + } + + private void alterLocalTransactionRule() throws SQLException { + try (Connection connection = containerComposer.getDataSource().getConnection()) { + if (isExpectedTransactionRule(connection, TransactionType.LOCAL, "")) { + return; + } + String alterLocalTransactionRule = commonSQL.getAlterLocalTransactionRule(); + log.info("Alter local transaction rule: {}", alterLocalTransactionRule); + SWITCH_COUNT.getAndIncrement(); + executeWithLog(connection, alterLocalTransactionRule); + } + assertTrue(waitExpectedTransactionRule(TransactionType.LOCAL, "", containerComposer)); + } + + private void alterXaTransactionRule(final String providerType) throws SQLException { + try (Connection connection = containerComposer.getDataSource().getConnection()) { + if (isExpectedTransactionRule(connection, TransactionType.XA, providerType)) { + return; + } + String alterXaTransactionRule = commonSQL.getAlterXATransactionRule().replace("${providerType}", providerType); + log.info("Alter XA transaction rule: {}", alterXaTransactionRule); + SWITCH_COUNT.getAndIncrement(); + executeWithLog(connection, alterXaTransactionRule); + } + assertTrue(waitExpectedTransactionRule(TransactionType.XA, providerType, containerComposer)); + } + + private boolean isExpectedTransactionRule(final Connection connection, final TransactionType expectedTransType, final String expectedProviderType) throws SQLException { + Map transactionRuleMap = executeShowTransactionRule(connection); + return Objects.equals(transactionRuleMap.get(TransactionTestConstants.DEFAULT_TYPE), expectedTransType.toString()) + && Objects.equals(transactionRuleMap.get(TransactionTestConstants.PROVIDER_TYPE), expectedProviderType); + } + + private Map executeShowTransactionRule(final Connection connection) throws SQLException { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("SHOW TRANSACTION RULE;"); + Map result = new HashMap<>(); + while (resultSet.next()) { + String defaultType = resultSet.getString(TransactionTestConstants.DEFAULT_TYPE); + String providerType = resultSet.getString(TransactionTestConstants.PROVIDER_TYPE); + result.put(TransactionTestConstants.DEFAULT_TYPE, defaultType); + result.put(TransactionTestConstants.PROVIDER_TYPE, providerType); + } + statement.close(); + return result; + } + + private boolean waitExpectedTransactionRule(final TransactionType expectedTransType, final String expectedProviderType, + final TransactionContainerComposer containerComposer) throws SQLException { + Awaitility.await().pollDelay(5L, TimeUnit.SECONDS).until(() -> true); + try (Connection connection = containerComposer.getDataSource().getConnection()) { + int waitTimes = 0; + do { + if (isExpectedTransactionRule(connection, expectedTransType, expectedProviderType)) { + return true; + } + Awaitility.await().pollDelay(2L, TimeUnit.SECONDS).until(() -> true); + waitTimes++; + } while (waitTimes <= 3); + return false; + } + } + } + + @RequiredArgsConstructor + @Getter + private static class TransactionOperationsTask implements Runnable { + + private static final AtomicInteger ID_COUNTER = new AtomicInteger(); + + private final DataSource dataSource; + + @SneakyThrows(SQLException.class) + public void run() { + Connection connection = dataSource.getConnection(); + for (int i = 0; i < TRANSACTION_SIZE; i++) { + log.info("Transaction {} start", i); + executeOneTransaction(connection); + if (IS_FINISHED.get()) { + break; + } + log.info("Transaction {} end", i); + } + connection.close(); + } + + private static void executeOneTransaction(final Connection connection) throws SQLException { + boolean isErrorOccured = false; + ThreadLocalRandom random = ThreadLocalRandom.current(); + try { + connection.setAutoCommit(false); + int id = ID_COUNTER.incrementAndGet(); + PreparedStatement insertStatement = connection.prepareStatement("insert into account(id, balance, transaction_id) values(?, ?, ?)"); + insertStatement.setObject(1, id); + insertStatement.setObject(2, id); + insertStatement.setObject(3, id); + insertStatement.execute(); + PreparedStatement updateStatement = connection.prepareStatement("update account set balance = balance - 1 where id = ?"); + updateStatement.setObject(1, id); + updateStatement.execute(); + PreparedStatement selectStatement = connection.prepareStatement("select * from account where id = ?"); + selectStatement.setObject(1, id); + selectStatement.executeQuery(); + PreparedStatement deleteStatement = connection.prepareStatement("delete from account where id = ?"); + deleteStatement.setObject(1, id); + deleteStatement.execute(); + Thread.sleep(random.nextInt(900) + 100); + // CHECKSTYLE:OFF + } catch (final Exception ex) { + // CHECKSTYLE:ON + log.error("Execute transaction exception occurred", ex); + isErrorOccured = true; + connection.rollback(); + } + if (!isErrorOccured) { + connection.commit(); + } + connection.setAutoCommit(true); + } + } +} From 57841557119e3a54fc1561241453feb3fb15c6af Mon Sep 17 00:00:00 2001 From: Raigor Date: Mon, 30 Dec 2024 19:43:23 +0800 Subject: [PATCH 190/192] Optimize param check in refresh table meta data executor (#34209) --- .../RefreshTableMetaDataExecutor.java | 29 +++++++-- .../DistSQLUpdateBackendHandlerTest.java | 65 +++++++++++++++---- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java index 2d0ecfd4159e7..c94dc4e7a0325 100644 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java +++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java @@ -19,12 +19,14 @@ import lombok.Setter; import org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware; -import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException; -import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException; import org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor; import org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshTableMetaDataStatement; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; import org.apache.shardingsphere.mode.manager.ContextManager; @@ -43,8 +45,8 @@ public final class RefreshTableMetaDataExecutor implements DistSQLUpdateExecutor @Override public void executeUpdate(final RefreshTableMetaDataStatement sqlStatement, final ContextManager contextManager) throws SQLException { - checkStorageUnit(contextManager.getStorageUnits(database.getName()), sqlStatement); String schemaName = getSchemaName(sqlStatement); + checkBeforeUpdate(sqlStatement, schemaName); if (sqlStatement.getStorageUnitName().isPresent()) { if (sqlStatement.getTableName().isPresent()) { contextManager.reloadTable(database, schemaName, sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get()); @@ -60,6 +62,16 @@ public void executeUpdate(final RefreshTableMetaDataStatement sqlStatement, fina } } + private String getSchemaName(final RefreshTableMetaDataStatement sqlStatement) { + return sqlStatement.getSchemaName().isPresent() ? sqlStatement.getSchemaName().get() : new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName()); + } + + private void checkBeforeUpdate(final RefreshTableMetaDataStatement sqlStatement, final String schemaName) { + checkStorageUnit(database.getResourceMetaData().getStorageUnits(), sqlStatement); + checkSchema(schemaName); + checkTable(sqlStatement, schemaName); + } + private void checkStorageUnit(final Map storageUnits, final RefreshTableMetaDataStatement sqlStatement) { ShardingSpherePreconditions.checkNotEmpty(storageUnits, () -> new EmptyStorageUnitException(database.getName())); if (sqlStatement.getStorageUnitName().isPresent()) { @@ -68,8 +80,15 @@ private void checkStorageUnit(final Map storageUnits, final } } - private String getSchemaName(final RefreshTableMetaDataStatement sqlStatement) { - return sqlStatement.getSchemaName().isPresent() ? sqlStatement.getSchemaName().get() : new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName()); + private void checkSchema(final String schemaName) { + ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), () -> new SchemaNotFoundException(schemaName)); + } + + private void checkTable(final RefreshTableMetaDataStatement sqlStatement, final String schemaName) { + if (sqlStatement.getTableName().isPresent()) { + String tableName = sqlStatement.getTableName().get(); + ShardingSpherePreconditions.checkState(database.getSchema(schemaName).containsTable(tableName), () -> new TableNotFoundException(tableName)); + } } @Override diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java index 0e6a9d9bb364b..e22e7a1a61922 100644 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java +++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLUpdateBackendHandlerTest.java @@ -19,9 +19,14 @@ import org.apache.shardingsphere.distsql.statement.ral.updatable.RefreshTableMetaDataStatement; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException; +import org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException; import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException; import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; +import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit; +import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; @@ -30,8 +35,11 @@ import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; import org.apache.shardingsphere.test.mock.AutoMockExtension; import org.apache.shardingsphere.test.mock.StaticMockSettings; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.Mock; import java.sql.SQLException; import java.util.Collections; @@ -39,7 +47,7 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -49,29 +57,62 @@ class DistSQLUpdateBackendHandlerTest { private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE"); - @Test - void assertEmptyResource() { - ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private ContextManager contextManager; + + @BeforeEach + void setUp() { when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(contextManager.getStorageUnits("foo_db")).thenReturn(Collections.emptyMap()); - when(contextManager.getDatabase("foo_db")).thenReturn(new ShardingSphereDatabase("foo_db", mock(), mock(), mock(), Collections.emptyList())); + } + + @Test + void assertEmptyStorageUnit() { + when(contextManager.getDatabase("foo_db")).thenReturn(new ShardingSphereDatabase("foo_db", databaseType, mock(), mock(), Collections.emptyList())); DistSQLUpdateBackendHandler backendHandler = new DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement(), mockConnectionSession("foo_db")); assertThrows(EmptyStorageUnitException.class, backendHandler::execute); } @Test - void assertMissingRequiredResources() { - ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); + void assertMissingRequiredStorageUnit() { + ResourceMetaData resourceMetaData = mock(ResourceMetaData.class); + when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0", mock(StorageUnit.class))); + when(contextManager.getDatabase("foo_db")).thenReturn(new ShardingSphereDatabase("foo_db", databaseType, resourceMetaData, mock(), Collections.emptyList())); DistSQLUpdateBackendHandler backendHandler = new DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order", "ds_1", null), mockConnectionSession("foo_db")); assertThrows(MissingRequiredStorageUnitsException.class, backendHandler::execute); } + @Test + void assertSchemaNotFound() { + ResourceMetaData resourceMetaData = mock(ResourceMetaData.class); + when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0", mock(StorageUnit.class))); + when(contextManager.getDatabase("foo_db")).thenReturn(new ShardingSphereDatabase("foo_db", databaseType, resourceMetaData, mock(), Collections.emptyList())); + DistSQLUpdateBackendHandler backendHandler = new DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order", "ds_0", "bar_db"), mockConnectionSession("foo_db")); + assertThrows(SchemaNotFoundException.class, backendHandler::execute); + } + + @Test + void assertTableNotFound() { + ResourceMetaData resourceMetaData = mock(ResourceMetaData.class); + when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0", mock(StorageUnit.class))); + ShardingSphereSchema schema = mock(ShardingSphereSchema.class); + ShardingSphereDatabase database = mock(ShardingSphereDatabase.class); + when(database.containsSchema("foo_db")).thenReturn(true); + when(database.getSchema("foo_db")).thenReturn(schema); + when(database.getResourceMetaData()).thenReturn(resourceMetaData); + when(contextManager.getDatabase("foo_db")).thenReturn(database); + DistSQLUpdateBackendHandler backendHandler = new DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement("t_order", "ds_0", "foo_db"), mockConnectionSession("foo_db")); + assertThrows(TableNotFoundException.class, backendHandler::execute); + } + @Test void assertUpdate() throws SQLException { - ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(contextManager.getDatabase("foo_db")).thenReturn(new ShardingSphereDatabase("foo_db", databaseType, mock(), mock(), Collections.emptyList())); + ResourceMetaData resourceMetaData = mock(ResourceMetaData.class); + when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0", mock(StorageUnit.class))); + ShardingSphereDatabase database = mock(ShardingSphereDatabase.class); + when(database.containsSchema(any())).thenReturn(true); + when(database.getProtocolType()).thenReturn(databaseType); + when(database.getResourceMetaData()).thenReturn(resourceMetaData); + when(contextManager.getDatabase("foo_db")).thenReturn(database); ResponseHeader actual = new DistSQLUpdateBackendHandler(new RefreshTableMetaDataStatement(), mockConnectionSession("foo_db")).execute(); assertThat(actual, instanceOf(UpdateResponseHeader.class)); } From 8e52107bc05ffdbfa6c180c499b02297c2eddfb9 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Mon, 30 Dec 2024 23:00:33 +0800 Subject: [PATCH 191/192] Fix sonar issue on LockSQLException (#34211) --- .../external/sql/type/kernel/category/LockSQLException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java index 1797f0cdc76e0..2c35640f490b2 100644 --- a/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java +++ b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/LockSQLException.java @@ -29,7 +29,7 @@ public abstract class LockSQLException extends KernelSQLException { private static final int KERNEL_CODE = 5; - public LockSQLException(final SQLState sqlState, final int errorCode, final String reason, final Object... messageArguments) { + protected LockSQLException(final SQLState sqlState, final int errorCode, final String reason, final Object... messageArguments) { super(sqlState, KERNEL_CODE, errorCode, reason, messageArguments); } } From 6ecd87351d9afcf895ccb14e276009bab953db8b Mon Sep 17 00:00:00 2001 From: ZhangCheng Date: Tue, 31 Dec 2024 09:52:26 +0800 Subject: [PATCH 192/192] Fix sonar issue of transaction test (#34213) * Fix snoar issue of transaction test * Fix snoar issue of transaction test * Fix sonar issue of transaction test * Add switching transaction rule test case --- .../transaction/TransactionConnectionContext.java | 7 ++++--- .../alterresource/SwitchingTransactionRuleTestCase.java | 9 +++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java index 67f058db78db6..a393a03c96964 100644 --- a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java +++ b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/connection/transaction/TransactionConnectionContext.java @@ -21,6 +21,7 @@ import lombok.Setter; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; /** * Transaction connection context. @@ -41,7 +42,7 @@ public final class TransactionConnectionContext implements AutoCloseable { @Setter private volatile String readWriteSplitReplicaRoute; - private volatile TransactionManager transactionManager; + private AtomicReference transactionManager; /** * Begin transaction. @@ -52,7 +53,7 @@ public final class TransactionConnectionContext implements AutoCloseable { public void beginTransaction(final String transactionType, final TransactionManager transactionManager) { this.transactionType = transactionType; inTransaction = true; - this.transactionManager = transactionManager; + this.transactionManager = new AtomicReference<>(transactionManager); } /** @@ -88,7 +89,7 @@ public Optional getReadWriteSplitReplicaRoute() { * @return transaction manager */ public Optional getTransactionManager() { - return Optional.ofNullable(transactionManager); + return null == transactionManager ? Optional.empty() : Optional.ofNullable(transactionManager.get()); } @Override diff --git a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java index 219cd3b5d0f59..1e9bf84b66df2 100644 --- a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java +++ b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/alterresource/SwitchingTransactionRuleTestCase.java @@ -100,18 +100,18 @@ private static class AlterTransactionRuleTask implements Runnable { private final CommonSQLCommand commonSQL; - @SneakyThrows({SQLException.class, InterruptedException.class}) + @SneakyThrows(SQLException.class) @Override public void run() { while (!IS_FINISHED.get()) { alterLocalTransactionRule(); - TimeUnit.SECONDS.sleep(20); + Awaitility.await().atMost(20L, TimeUnit.SECONDS).pollInterval(19L, TimeUnit.SECONDS).until(() -> true); alterXaTransactionRule("Narayana"); if (SWITCH_COUNT.incrementAndGet() >= MAX_SWITCH_COUNT) { IS_FINISHED.set(true); break; } - TimeUnit.SECONDS.sleep(20); + Awaitility.await().atMost(20L, TimeUnit.SECONDS).pollInterval(19L, TimeUnit.SECONDS).until(() -> true); } } @@ -220,7 +220,8 @@ private static void executeOneTransaction(final Connection connection) throws SQ PreparedStatement deleteStatement = connection.prepareStatement("delete from account where id = ?"); deleteStatement.setObject(1, id); deleteStatement.execute(); - Thread.sleep(random.nextInt(900) + 100); + long time = random.nextLong(900) + 100; + Awaitility.await().atMost(time + 10L, TimeUnit.MILLISECONDS).pollInterval(time, TimeUnit.MILLISECONDS).until(() -> true); // CHECKSTYLE:OFF } catch (final Exception ex) { // CHECKSTYLE:ON