You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/06/17 06:45:04 UTC
[shardingsphere] branch master updated: Add test for broadcast rule (#26391)
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 <10...@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" />