This is an automated email from the ASF dual-hosted git repository. jianglongtao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 7b9cf1bf1b7 Add test for broadcast rule (#26391) 7b9cf1bf1b7 is described below commit 7b9cf1bf1b73fe7e590e7adb0d7ee144435c6597 Author: jiangML <1060319...@qq.com> AuthorDate: Sat Jun 17 14:44:56 2023 +0800 Add test for broadcast rule (#26391) * add test for broadcast * add count broadcast rule parse test * add license --- .../api/config/BroadcastRuleConfiguration.java | 7 +- .../YamlBroadcastRuleConfigurationSwapper.java | 8 +- .../route/BroadcastRouteEngineFactoryTest.java | 71 +++++++++++++++++ ...roadcastDatabaseBroadcastRoutingEngineTest.java | 51 ++++++++++++ ...roadcastInstanceBroadcastRoutingEngineTest.java | 52 ++++++++++++ .../BroadcastTableBroadcastRoutingEngineTest.java | 75 ++++++++++++++++++ .../ignore/BroadcastIgnoreRoutingEngineTest.java} | 27 +++---- .../unicast/BroadcastUnicastRoutingEngineTest.java | 92 ++++++++++++++++++++++ .../rule/builder/BroadcastRuleBuilderTest.java | 42 ++++++++++ .../yaml/BroadcastRuleConfigurationYamlIT.java | 42 ++++++++++ .../YamlBroadcastRuleConfigurationSwapperTest.java | 49 ++++++++++++ .../src/test/resources/yaml/broadcast-rule.yaml | 21 +++++ .../CreateBroadcastTableRuleStatementUpdater.java | 4 +- ...eateBroadcastTableRuleStatementUpdaterTest.java | 3 +- ...DropBroadcastTableRuleStatementUpdaterTest.java | 5 +- .../cases/parser/jaxb/RootSQLParserTestCases.java | 3 + .../CountBroadcastRuleStatementTestCase.java | 18 +---- .../it/parser/src/main/resources/case/rql/show.xml | 4 + .../src/main/resources/sql/supported/rql/show.xml | 1 + 19 files changed, 534 insertions(+), 41 deletions(-) diff --git a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java b/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java index 2003dfc6c13..da7f43f4fdc 100644 --- a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java +++ b/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java @@ -18,19 +18,18 @@ package org.apache.shardingsphere.broadcast.api.config; import lombok.Getter; -import lombok.Setter; +import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfiguration; import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration; import java.util.Collection; -import java.util.LinkedList; /** * Broadcast rule configuration. */ +@RequiredArgsConstructor @Getter -@Setter public final class BroadcastRuleConfiguration implements DatabaseRuleConfiguration, DistributedRuleConfiguration { - private Collection<String> tables = new LinkedList<>(); + private final Collection<String> tables; } diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapper.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapper.java index 85a8dbdb186..c0993be8fab 100644 --- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapper.java +++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapper.java @@ -22,6 +22,9 @@ import org.apache.shardingsphere.broadcast.constant.BroadcastOrder; import org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration; import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper; +import java.util.Collection; +import java.util.LinkedList; + /** * YAML broadcast rule configuration swapper. */ @@ -36,9 +39,8 @@ public final class YamlBroadcastRuleConfigurationSwapper implements YamlRuleConf @Override public BroadcastRuleConfiguration swapToObject(final YamlBroadcastRuleConfiguration yamlConfig) { - BroadcastRuleConfiguration result = new BroadcastRuleConfiguration(); - yamlConfig.getTables().forEach(each -> result.getTables().add(each)); - return result; + Collection<String> tables = new LinkedList<>(yamlConfig.getTables()); + return new BroadcastRuleConfiguration(tables); } @Override diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastRouteEngineFactoryTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastRouteEngineFactoryTest.java new file mode 100644 index 00000000000..3424dcb49be --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastRouteEngineFactoryTest.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.broadcast.route; + +import org.apache.shardingsphere.broadcast.route.engine.BroadcastRouteEngineFactory; +import org.apache.shardingsphere.broadcast.route.engine.type.BroadcastRouteEngine; +import org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastDatabaseBroadcastRoutingEngine; +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData; +import org.apache.shardingsphere.infra.session.connection.ConnectionContext; +import org.apache.shardingsphere.infra.session.query.QueryContext; +import org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatement; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class BroadcastRouteEngineFactoryTest { + + private BroadcastRule broadcastRule; + + private ShardingSphereDatabase database; + + private QueryContext queryContext; + + private ConfigurationProperties props; + + private ConnectionContext connectionContext; + + private ShardingSphereRuleMetaData globalRuleMetaData; + + @BeforeEach + void setUp() { + broadcastRule = mock(BroadcastRule.class); + database = mock(ShardingSphereDatabase.class); + queryContext = mock(QueryContext.class); + props = mock(ConfigurationProperties.class); + connectionContext = mock(ConnectionContext.class); + globalRuleMetaData = mock(ShardingSphereRuleMetaData.class); + } + + @Test + void assertNewInstanceWithTCLStatement() { + SQLStatementContext sqlStatementContext = mock(SQLStatementContext.class); + when(sqlStatementContext.getSqlStatement()).thenReturn(mock(TCLStatement.class)); + when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext); + BroadcastRouteEngine engine = BroadcastRouteEngineFactory.newInstance(broadcastRule, database, queryContext, props, connectionContext, globalRuleMetaData); + assertThat(engine, instanceOf(BroadcastDatabaseBroadcastRoutingEngine.class)); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRoutingEngineTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRoutingEngineTest.java new file mode 100644 index 00000000000..e5203efb2bf --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRoutingEngineTest.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.broadcast.route.engine.type.broadcast; + +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Iterator; + +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 BroadcastDatabaseBroadcastRoutingEngineTest { + + @Test + void assertRoute() { + BroadcastRule broadcastRule = mock(BroadcastRule.class); + when(broadcastRule.getAvailableDataSourceNames()).thenReturn(Arrays.asList("ds_0", "ds_1")); + BroadcastDatabaseBroadcastRoutingEngine engine = new BroadcastDatabaseBroadcastRoutingEngine(); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(2)); + Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator(); + assertDataSourceRouteMapper(iterator.next(), "ds_0"); + assertDataSourceRouteMapper(iterator.next(), "ds_1"); + } + + private void assertDataSourceRouteMapper(final RouteUnit routeUnit, final String expected) { + assertThat(routeUnit.getDataSourceMapper().getLogicName(), is(expected)); + assertThat(routeUnit.getDataSourceMapper().getActualName(), is(expected)); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRoutingEngineTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRoutingEngineTest.java new file mode 100644 index 00000000000..2c956d85e3a --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRoutingEngineTest.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.broadcast.route.engine.type.broadcast; + +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +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 BroadcastInstanceBroadcastRoutingEngineTest { + + @Test + void assertRoute() { + ShardingSphereResourceMetaData resourceMetaData = mock(ShardingSphereResourceMetaData.class); + when(resourceMetaData.getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("ds_0")); + BroadcastInstanceBroadcastRoutingEngine engine = new BroadcastInstanceBroadcastRoutingEngine(resourceMetaData); + BroadcastRule broadcastRule = mock(BroadcastRule.class); + when(broadcastRule.getAvailableDataSourceNames()).thenReturn(Arrays.asList("ds_0", "ds_1")); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(1)); + assertDataSourceRouteMapper(routeContext.getRouteUnits().iterator().next(), "ds_0"); + } + + private void assertDataSourceRouteMapper(final RouteUnit routeUnit, final String expected) { + assertThat(routeUnit.getDataSourceMapper().getLogicName(), is(expected)); + assertThat(routeUnit.getDataSourceMapper().getActualName(), is(expected)); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRoutingEngineTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRoutingEngineTest.java new file mode 100644 index 00000000000..1e1de22d899 --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRoutingEngineTest.java @@ -0,0 +1,75 @@ +/* + * 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.broadcast.route.engine.type.broadcast; + +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteMapper; +import org.apache.shardingsphere.infra.route.context.RouteUnit; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class BroadcastTableBroadcastRoutingEngineTest { + + @Test + void assertRouteWithBroadcastRuleTable() { + Collection<String> broadcastRuleTableNames = Collections.singleton("t_address"); + BroadcastTableBroadcastRoutingEngine engine = new BroadcastTableBroadcastRoutingEngine(broadcastRuleTableNames); + BroadcastRule broadcastRule = mock(BroadcastRule.class); + when(broadcastRule.getAvailableDataSourceNames()).thenReturn(Arrays.asList("ds_0", "ds_1")); + when(broadcastRule.getBroadcastRuleTableNames(any())).thenReturn(Collections.singleton("t_address")); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(2)); + Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator(); + assertRouteMapper(iterator.next(), "ds_0", "t_address"); + assertRouteMapper(iterator.next(), "ds_1", "t_address"); + } + + @Test + void assertRouteWithoutBroadcastRuleTable() { + Collection<String> broadcastRuleTableNames = Collections.singleton("t_address"); + BroadcastTableBroadcastRoutingEngine engine = new BroadcastTableBroadcastRoutingEngine(broadcastRuleTableNames); + BroadcastRule broadcastRule = mock(BroadcastRule.class); + when(broadcastRule.getAvailableDataSourceNames()).thenReturn(Arrays.asList("ds_0", "ds_1")); + when(broadcastRule.getBroadcastRuleTableNames(any())).thenReturn(Collections.emptyList()); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(2)); + Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator(); + assertRouteMapper(iterator.next(), "ds_0", ""); + assertRouteMapper(iterator.next(), "ds_1", ""); + } + + private void assertRouteMapper(final RouteUnit routeUnit, final String expectedDataSourceName, final String expectedTableName) { + assertThat(routeUnit.getDataSourceMapper().getLogicName(), is(expectedDataSourceName)); + assertThat(routeUnit.getDataSourceMapper().getActualName(), is(expectedDataSourceName)); + assertThat(routeUnit.getTableMappers().size(), is(1)); + RouteMapper tableRouteMapper = routeUnit.getTableMappers().iterator().next(); + assertThat(tableRouteMapper.getLogicName(), is(expectedTableName)); + assertThat(tableRouteMapper.getActualName(), is(expectedTableName)); + } +} diff --git a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRoutingEngineTest.java similarity index 55% copy from features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java copy to features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRoutingEngineTest.java index 2003dfc6c13..3c899198c02 100644 --- a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRoutingEngineTest.java @@ -15,22 +15,21 @@ * limitations under the License. */ -package org.apache.shardingsphere.broadcast.api.config; +package org.apache.shardingsphere.broadcast.route.engine.type.ignore; -import lombok.Getter; -import lombok.Setter; -import org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfiguration; -import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration; +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.junit.jupiter.api.Test; -import java.util.Collection; -import java.util.LinkedList; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; -/** - * Broadcast rule configuration. - */ -@Getter -@Setter -public final class BroadcastRuleConfiguration implements DatabaseRuleConfiguration, DistributedRuleConfiguration { +class BroadcastIgnoreRoutingEngineTest { - private Collection<String> tables = new LinkedList<>(); + @Test + void assertRoute() { + BroadcastIgnoreRoutingEngine engine = new BroadcastIgnoreRoutingEngine(); + RouteContext routeContext = engine.route(new RouteContext(), mock(BroadcastRule.class)); + assertTrue(routeContext.getRouteUnits().isEmpty()); + } } diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRoutingEngineTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRoutingEngineTest.java new file mode 100644 index 00000000000..d956c82d4f7 --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRoutingEngineTest.java @@ -0,0 +1,92 @@ +/* + * 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.broadcast.route.engine.type.unicast; + +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.binder.statement.ddl.CreateViewStatementContext; +import org.apache.shardingsphere.infra.route.context.RouteContext; +import org.apache.shardingsphere.infra.route.context.RouteMapper; +import org.apache.shardingsphere.infra.session.connection.ConnectionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +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.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class BroadcastUnicastRoutingEngineTest { + + private BroadcastRule broadcastRule; + + @BeforeEach + void setUp() { + broadcastRule = mock(BroadcastRule.class); + when(broadcastRule.getAvailableDataSourceNames()).thenReturn(Arrays.asList("ds_0", "ds_1")); + } + + @Test + void assertRoute() { + SQLStatementContext sqlStatementContext = mock(SQLStatementContext.class); + Collection<String> logicTables = Collections.singleton("t_address"); + ConnectionContext connectionContext = mock(ConnectionContext.class); + BroadcastUnicastRoutingEngine engine = new BroadcastUnicastRoutingEngine(sqlStatementContext, logicTables, connectionContext); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(1)); + assertTableRouteMapper(routeContext); + } + + @Test + void assertRouteWithCreateViewStatementContext() { + CreateViewStatementContext sqlStatementContext = mock(CreateViewStatementContext.class); + Collection<String> logicTables = Collections.singleton("t_address"); + ConnectionContext connectionContext = mock(ConnectionContext.class); + BroadcastUnicastRoutingEngine engine = new BroadcastUnicastRoutingEngine(sqlStatementContext, logicTables, connectionContext); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(1)); + RouteMapper dataSourceRouteMapper = routeContext.getRouteUnits().iterator().next().getDataSourceMapper(); + assertThat(dataSourceRouteMapper.getLogicName(), is("ds_0")); + assertTableRouteMapper(routeContext); + } + + @Test + void assertRouteWithCursorStatement() { + CreateViewStatementContext sqlStatementContext = mock(CreateViewStatementContext.class); + Collection<String> logicTables = Collections.singleton("t_address"); + ConnectionContext connectionContext = mock(ConnectionContext.class); + BroadcastUnicastRoutingEngine engine = new BroadcastUnicastRoutingEngine(sqlStatementContext, logicTables, connectionContext); + RouteContext routeContext = engine.route(new RouteContext(), broadcastRule); + assertThat(routeContext.getRouteUnits().size(), is(1)); + RouteMapper dataSourceRouteMapper = routeContext.getRouteUnits().iterator().next().getDataSourceMapper(); + assertThat(dataSourceRouteMapper.getLogicName(), is("ds_0")); + assertTableRouteMapper(routeContext); + } + + private void assertTableRouteMapper(final RouteContext routeContext) { + Collection<RouteMapper> tableRouteMappers = routeContext.getRouteUnits().iterator().next().getTableMappers(); + assertThat(tableRouteMappers.size(), is(1)); + RouteMapper tableRouteMapper = tableRouteMappers.iterator().next(); + assertThat(tableRouteMapper.getLogicName(), is("t_address")); + assertThat(tableRouteMapper.getActualName(), is("t_address")); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.java new file mode 100644 index 00000000000..d649c2f2f1d --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/builder/BroadcastRuleBuilderTest.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.broadcast.rule.builder; + +import org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration; +import org.apache.shardingsphere.broadcast.rule.BroadcastRule; +import org.apache.shardingsphere.infra.instance.InstanceContext; +import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder; +import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +class BroadcastRuleBuilderTest { + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Test + void assertBuild() { + BroadcastRuleConfiguration ruleConfig = mock(BroadcastRuleConfiguration.class); + DatabaseRuleBuilder builder = OrderedSPILoader.getServices(DatabaseRuleBuilder.class, Collections.singleton(ruleConfig)).get(ruleConfig); + assertThat(builder.build(ruleConfig, "", Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(BroadcastRule.class)); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/BroadcastRuleConfigurationYamlIT.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/BroadcastRuleConfigurationYamlIT.java new file mode 100644 index 00000000000..7ddead9146d --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/BroadcastRuleConfigurationYamlIT.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.broadcast.yaml; + +import org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration; +import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration; +import org.apache.shardingsphere.test.it.yaml.YamlRuleConfigurationIT; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +class BroadcastRuleConfigurationYamlIT extends YamlRuleConfigurationIT { + + BroadcastRuleConfigurationYamlIT() { + super("yaml/broadcast-rule.yaml"); + } + + @Override + protected void assertYamlRootConfiguration(final YamlRootConfiguration actual) { + assertBroadcastRule((YamlBroadcastRuleConfiguration) actual.getRules().iterator().next()); + } + + private void assertBroadcastRule(final YamlBroadcastRuleConfiguration actual) { + assertThat(actual.getTables().size(), is(1)); + assertThat(actual.getTables().iterator().next(), is("t_address")); + } +} diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapperTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapperTest.java new file mode 100644 index 00000000000..eaf0a1ac517 --- /dev/null +++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/yaml/swapper/YamlBroadcastRuleConfigurationSwapperTest.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.broadcast.yaml.swapper; + +import org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration; +import org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +class YamlBroadcastRuleConfigurationSwapperTest { + + @Test + void assertSwapToYamlConfiguration() { + BroadcastRuleConfiguration ruleConfig = new BroadcastRuleConfiguration(Collections.singleton("t_address")); + YamlBroadcastRuleConfigurationSwapper swapper = new YamlBroadcastRuleConfigurationSwapper(); + YamlBroadcastRuleConfiguration yamlRuleConfig = swapper.swapToYamlConfiguration(ruleConfig); + assertThat(yamlRuleConfig.getTables().size(), is(1)); + assertThat(yamlRuleConfig.getTables().iterator().next(), is("t_address")); + } + + @Test + void assertSwapToObject() { + YamlBroadcastRuleConfiguration yamlRuleConfig = new YamlBroadcastRuleConfiguration(); + yamlRuleConfig.getTables().add("t_address"); + YamlBroadcastRuleConfigurationSwapper swapper = new YamlBroadcastRuleConfigurationSwapper(); + BroadcastRuleConfiguration ruleConfig = swapper.swapToObject(yamlRuleConfig); + assertThat(ruleConfig.getTables().size(), is(1)); + assertThat(ruleConfig.getTables().iterator().next(), is("t_address")); + } +} diff --git a/features/broadcast/core/src/test/resources/yaml/broadcast-rule.yaml b/features/broadcast/core/src/test/resources/yaml/broadcast-rule.yaml new file mode 100644 index 00000000000..d1694135d4f --- /dev/null +++ b/features/broadcast/core/src/test/resources/yaml/broadcast-rule.yaml @@ -0,0 +1,21 @@ +# +# 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. +# + +rules: + - !BROADCAST + tables: + - t_address diff --git a/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdater.java b/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdater.java index de530f232e6..da60a42effb 100644 --- a/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdater.java +++ b/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdater.java @@ -41,14 +41,12 @@ public final class CreateBroadcastTableRuleStatementUpdater implements RuleDefin @Override public BroadcastRuleConfiguration buildToBeCreatedRuleConfiguration(final BroadcastRuleConfiguration currentRuleConfig, final CreateBroadcastTableRuleStatement sqlStatement) { - BroadcastRuleConfiguration result = new BroadcastRuleConfiguration(); Collection<String> tables = sqlStatement.getTables(); if (sqlStatement.isIfNotExists()) { Collection<String> duplicatedRuleNames = getDuplicatedRuleNames(sqlStatement, currentRuleConfig); tables.removeIf(duplicatedRuleNames::contains); } - result.setTables(tables); - return result; + return new BroadcastRuleConfiguration(tables); } @Override diff --git a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdaterTest.java b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdaterTest.java index 7b0b18e9cde..fd4c4ad9b6a 100644 --- a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdaterTest.java +++ b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleStatementUpdaterTest.java @@ -26,6 +26,7 @@ import org.mockito.Answers; import org.mockito.Mock; import java.util.Collections; +import java.util.LinkedList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -50,7 +51,7 @@ class CreateBroadcastTableRuleStatementUpdaterTest { @Test void assertBuildToBeCreatedRuleConfiguration() { - BroadcastRuleConfiguration currentConfig = new BroadcastRuleConfiguration(); + BroadcastRuleConfiguration currentConfig = new BroadcastRuleConfiguration(new LinkedList<>()); CreateBroadcastTableRuleStatement statement = new CreateBroadcastTableRuleStatement(false, Collections.singleton("t_address")); updater.checkSQLStatement(database, statement, currentConfig); BroadcastRuleConfiguration toBeCreatedRuleConfig = updater.buildToBeCreatedRuleConfiguration(currentConfig, statement); diff --git a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleStatementUpdaterTest.java b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleStatementUpdaterTest.java index b6954c03826..fc228d289e1 100644 --- a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleStatementUpdaterTest.java +++ b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/DropBroadcastTableRuleStatementUpdaterTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.Collections; +import java.util.LinkedList; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -53,12 +54,12 @@ class DropBroadcastTableRuleStatementUpdaterTest { @Test void assertCheckSQLStatementWithoutToBeDroppedRule() { DropBroadcastTableRuleStatement statement = new DropBroadcastTableRuleStatement(false, Collections.singleton("t_address")); - assertThrows(MissingRequiredRuleException.class, () -> updater.checkSQLStatement(database, statement, new BroadcastRuleConfiguration())); + assertThrows(MissingRequiredRuleException.class, () -> updater.checkSQLStatement(database, statement, new BroadcastRuleConfiguration(Collections.emptyList()))); } @Test void assertUpdateCurrentRuleConfiguration() { - BroadcastRuleConfiguration configuration = new BroadcastRuleConfiguration(); + BroadcastRuleConfiguration configuration = new BroadcastRuleConfiguration(new LinkedList<>()); configuration.getTables().add("t_address"); DropBroadcastTableRuleStatement statement = new DropBroadcastTableRuleStatement(false, Collections.singleton("t_address")); assertTrue(updater.updateCurrentRuleConfiguration(statement, configuration)); diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java index ccb43599023..b8516a56e0a 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java @@ -1585,6 +1585,9 @@ public final class RootSQLParserTestCases { @XmlElement(name = "count-mask-rule") private final List<CountMaskRuleStatementTestCase> countMaskRuleStatementTestCases = new LinkedList<>(); + @XmlElement(name = "count-broadcast-rule") + private final List<CountMaskRuleStatementTestCase> countBroadcastRuleStatementTestCases = new LinkedList<>(); + @XmlElement(name = "create-collation") private final List<CreateCollationStatementTestCase> createCollationStatementTestCases = new LinkedList<>(); diff --git a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rql/rule/broadcast/CountBroadcastRuleStatementTestCase.java similarity index 59% copy from features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java copy to test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rql/rule/broadcast/CountBroadcastRuleStatementTestCase.java index 2003dfc6c13..a15040c34d8 100644 --- a/features/broadcast/api/src/main/java/org/apache/shardingsphere/broadcast/api/config/BroadcastRuleConfiguration.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rql/rule/broadcast/CountBroadcastRuleStatementTestCase.java @@ -15,22 +15,12 @@ * limitations under the License. */ -package org.apache.shardingsphere.broadcast.api.config; +package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rql.rule.broadcast; -import lombok.Getter; -import lombok.Setter; -import org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfiguration; -import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration; - -import java.util.Collection; -import java.util.LinkedList; +import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.DatabaseContainedTestCase; /** - * Broadcast rule configuration. + * Count broadcast rule statement test case. */ -@Getter -@Setter -public final class BroadcastRuleConfiguration implements DatabaseRuleConfiguration, DistributedRuleConfiguration { - - private Collection<String> tables = new LinkedList<>(); +public class CountBroadcastRuleStatementTestCase extends DatabaseContainedTestCase { } diff --git a/test/it/parser/src/main/resources/case/rql/show.xml b/test/it/parser/src/main/resources/case/rql/show.xml index abafa0a5d4b..983f47e3f4c 100644 --- a/test/it/parser/src/main/resources/case/rql/show.xml +++ b/test/it/parser/src/main/resources/case/rql/show.xml @@ -157,6 +157,10 @@ <count-mask-rule sql-case-id="count-mask-rule"> <database name="db1" start-index="21" stop-index="23" /> </count-mask-rule> + + <count-broadcast-rule sql-case-id="count-broadcast-rule"> + <database name="db1" start-index="26" stop-index="28" /> + </count-broadcast-rule> <show-storage-units sql-case-id="show-storage-units" /> diff --git a/test/it/parser/src/main/resources/sql/supported/rql/show.xml b/test/it/parser/src/main/resources/sql/supported/rql/show.xml index 1109317fdfc..18e1c0a1545 100644 --- a/test/it/parser/src/main/resources/sql/supported/rql/show.xml +++ b/test/it/parser/src/main/resources/sql/supported/rql/show.xml @@ -52,6 +52,7 @@ <sql-case id="count-encrypt-rule" value="COUNT ENCRYPT RULE FROM db1" db-types="ShardingSphere" /> <sql-case id="count-shadow-rule" value="COUNT SHADOW RULE FROM db1" db-types="ShardingSphere" /> <sql-case id="count-mask-rule" value="COUNT MASK RULE FROM db1" db-types="ShardingSphere" /> + <sql-case id="count-broadcast-rule" value="COUNT BROADCAST RULE FROM db1" db-types="ShardingSphere" /> <sql-case id="show-storage-units" value="SHOW STORAGE UNITS" db-types="ShardingSphere" /> <sql-case id="show-storage-units-from" value="SHOW STORAGE UNITS FROM sharding_db" db-types="ShardingSphere" /> <sql-case id="show-storage-units-where-usage-count" value="SHOW STORAGE UNITS FROM sharding_db WHERE USAGE_COUNT = 0" db-types="ShardingSphere" />