未验证 提交 3a4d474c 编写于 作者: L Liang Zhang 提交者: GitHub

Revise test cases for route module (#4857)

* use stream for RouteUnit

* fix bug for use logic data source name with RouteUnit.findTableMapper

* fix test case for RouteUnit

* fix test case for RouteUnit

* fix test case for RouteUnit

* fix test case for RouteResult

* use stream with RouteResult
上级 d1eb0557
......@@ -89,7 +89,7 @@ public final class MasterSlaveRouteDecoratorTest {
public void assertDecorateToMaster() {
RouteContext routeContext = mockSQLRouteContext(insertStatement);
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getDataSourceNames().iterator();
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_MASTER_SLAVE_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
......@@ -99,7 +99,7 @@ public final class MasterSlaveRouteDecoratorTest {
RouteContext routeContext = mockSQLRouteContext(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.empty());
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getDataSourceNames().iterator();
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_MASTER_SLAVE_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(SLAVE_DATASOURCE));
}
......@@ -109,7 +109,7 @@ public final class MasterSlaveRouteDecoratorTest {
RouteContext routeContext = mockSQLRouteContext(selectStatement);
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
RouteContext actual = routeDecorator.decorate(routeContext);
Iterator<String> routedDataSourceNames = actual.getRouteResult().getDataSourceNames().iterator();
Iterator<String> routedDataSourceNames = actual.getRouteResult().getActualDataSourceNames().iterator();
assertThat(routedDataSourceNames.next(), is(NON_MASTER_SLAVE_DATASOURCE_NAME));
assertThat(routedDataSourceNames.next(), is(MASTER_DATASOURCE));
}
......
......@@ -75,9 +75,9 @@ public final class ShardingCartesianRoutingEngine implements ShardingRouteEngine
Collection<String> result = new HashSet<>();
for (RouteResult each : routeResults) {
if (result.isEmpty()) {
result.addAll(each.getDataSourceNames());
result.addAll(each.getActualDataSourceNames());
}
result.retainAll(each.getDataSourceNames());
result.retainAll(each.getActualDataSourceNames());
}
return result;
}
......@@ -100,7 +100,7 @@ public final class ShardingCartesianRoutingEngine implements ShardingRouteEngine
private RouteMapper findRoutingTable(final String dataSource, final String actualTable) {
for (RouteResult each : routeResults) {
Optional<RouteMapper> result = each.getTableMapper(dataSource, actualTable);
Optional<RouteMapper> result = each.findTableMapper(dataSource, actualTable);
if (result.isPresent()) {
return result.get();
}
......
......@@ -77,7 +77,7 @@ public final class DatabaseTest {
SQLParserEngine sqlParserEngine = SQLParserEngineFactory.getSQLParserEngine("MySQL");
ShardingRouteContext actual = new ShardingRouter(shardingRule, properties, getMetaDataForAllRoutingSQL(), sqlParserEngine).route(originSQL, Collections.emptyList(), false);
assertThat(actual.getRouteResult().getRouteUnits().size(), is(1));
Collection<String> actualDataSources = actual.getRouteResult().getDataSourceNames();
Collection<String> actualDataSources = actual.getRouteResult().getActualDataSourceNames();
assertThat(actualDataSources.size(), is(1));
}
......
......@@ -112,7 +112,7 @@ public final class ShardingTableBroadcastRoutingEngineTest {
}
private void assertRouteResult(final RouteResult actual) {
assertThat(actual.getDataSourceNames().size(), is(2));
assertThat(actual.getActualDataSourceNames().size(), is(2));
assertThat(actual.getRouteUnits().size(), is(6));
Iterator<RouteUnit> routeUnits = actual.getRouteUnits().iterator();
assertRouteUnit(routeUnits.next(), "ds0", "t_order_0");
......
......@@ -19,7 +19,6 @@ package org.apache.shardingsphere.underlying.route.context;
import lombok.Getter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
......@@ -28,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Route result.
......@@ -47,60 +47,33 @@ public final class RouteResult {
}
/**
* Get all data source names.
* Get actual data source names.
*
* @return all data source names
* @return actual data source names
*/
public Collection<String> getDataSourceNames() {
Collection<String> result = new HashSet<>(routeUnits.size(), 1);
for (RouteUnit each : routeUnits) {
result.add(each.getDataSourceMapper().getActualName());
}
return result;
public Collection<String> getActualDataSourceNames() {
return routeUnits.stream().map(each -> each.getDataSourceMapper().getActualName()).collect(Collectors.toCollection(() -> new HashSet<>(routeUnits.size(), 1)));
}
/**
* Get table mapper via data source name and actual table name.
* Get actual tables groups.
*
* @param dataSourceName data source name
* @param actualTableName actual table name
* @return table mapper
*/
public Optional<RouteMapper> getTableMapper(final String dataSourceName, final String actualTableName) {
for (RouteUnit each : routeUnits) {
Optional<RouteMapper> result = each.findTableMapper(dataSourceName, actualTableName);
if (result.isPresent()) {
return result;
}
}
return Optional.empty();
}
/**
* Get actual tables group via data source name and logic tables' names.
* <p>
* Actual tables in same group are belong one logic name.
* </p>
*
* @param dataSourceName data source name
* @param logicTableNames logic tables' names
* @return actual tables group
* @param actualDataSourceName actual data source name
* @param logicTableNames logic table names
* @return actual table groups
*/
public List<Set<String>> getActualTableNameGroups(final String dataSourceName, final Set<String> logicTableNames) {
List<Set<String>> result = new ArrayList<>();
for (String each : logicTableNames) {
Set<String> actualTableNames = getActualTableNames(dataSourceName, each);
if (!actualTableNames.isEmpty()) {
result.add(actualTableNames);
}
}
return result;
public List<Set<String>> getActualTableNameGroups(final String actualDataSourceName, final Set<String> logicTableNames) {
return logicTableNames.stream().map(each -> getActualTableNames(actualDataSourceName, each)).filter(actualTableNames -> !actualTableNames.isEmpty()).collect(Collectors.toList());
}
private Set<String> getActualTableNames(final String dataSourceName, final String logicTableName) {
private Set<String> getActualTableNames(final String actualDataSourceName, final String logicTableName) {
Set<String> result = new HashSet<>();
for (RouteUnit each : routeUnits) {
if (dataSourceName.equalsIgnoreCase(each.getDataSourceMapper().getActualName())) {
if (actualDataSourceName.equalsIgnoreCase(each.getDataSourceMapper().getActualName())) {
result.addAll(each.getActualTableNames(logicTableName));
}
}
......@@ -108,14 +81,14 @@ public final class RouteResult {
}
/**
* Get map relationship between data source and logic tables via data sources' names.
* Get map relationship between actual data source and logic tables.
*
* @param dataSourceNames data sources' names
* @param actualDataSourceNames actual data source names
* @return map relationship between data source and logic tables
*/
public Map<String, Set<String>> getDataSourceLogicTablesMap(final Collection<String> dataSourceNames) {
public Map<String, Set<String>> getDataSourceLogicTablesMap(final Collection<String> actualDataSourceNames) {
Map<String, Set<String>> result = new HashMap<>();
for (String each : dataSourceNames) {
for (String each : actualDataSourceNames) {
Set<String> logicTableNames = getLogicTableNames(each);
if (!logicTableNames.isEmpty()) {
result.put(each, logicTableNames);
......@@ -124,13 +97,30 @@ public final class RouteResult {
return result;
}
private Set<String> getLogicTableNames(final String dataSourceName) {
private Set<String> getLogicTableNames(final String actualDataSourceName) {
Set<String> result = new HashSet<>();
for (RouteUnit each : routeUnits) {
if (dataSourceName.equalsIgnoreCase(each.getDataSourceMapper().getActualName())) {
if (actualDataSourceName.equalsIgnoreCase(each.getDataSourceMapper().getActualName())) {
result.addAll(each.getLogicTableNames());
}
}
return result;
}
/**
* Find table mapper.
*
* @param logicDataSourceName logic data source name
* @param actualTableName actual table name
* @return table mapper
*/
public Optional<RouteMapper> findTableMapper(final String logicDataSourceName, final String actualTableName) {
for (RouteUnit each : routeUnits) {
Optional<RouteMapper> result = each.findTableMapper(logicDataSourceName, actualTableName);
if (result.isPresent()) {
return result;
}
}
return Optional.empty();
}
}
......@@ -26,6 +26,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Route unit.
......@@ -41,19 +42,12 @@ public final class RouteUnit {
private final Collection<RouteMapper> tableMappers;
/**
* Find table mapper.
* Get logic table names.
*
* @param dataSourceName data source name
* @param actualTableName actual table name
* @return table mapper
* @return logic table names
*/
public Optional<RouteMapper> findTableMapper(final String dataSourceName, final String actualTableName) {
for (RouteMapper each : tableMappers) {
if (dataSourceName.equalsIgnoreCase(dataSourceMapper.getLogicName()) && actualTableName.equalsIgnoreCase(each.getActualName())) {
return Optional.of(each);
}
}
return Optional.empty();
public Set<String> getLogicTableNames() {
return tableMappers.stream().map(RouteMapper::getLogicName).collect(Collectors.toCollection(() -> new HashSet<>(tableMappers.size(), 1)));
}
/**
......@@ -63,25 +57,22 @@ public final class RouteUnit {
* @return actual table names
*/
public Set<String> getActualTableNames(final String logicTableName) {
Set<String> result = new HashSet<>();
for (RouteMapper each : tableMappers) {
if (logicTableName.equalsIgnoreCase(each.getLogicName())) {
result.add(each.getActualName());
}
}
return result;
return tableMappers.stream().filter(each -> logicTableName.equalsIgnoreCase(each.getLogicName())).map(RouteMapper::getActualName).collect(Collectors.toSet());
}
/**
* Get logic table names.
* Find table mapper.
*
* @return logic table names
* @param logicDataSourceName logic data source name
* @param actualTableName actual table name
* @return table mapper
*/
public Set<String> getLogicTableNames() {
Set<String> result = new HashSet<>(tableMappers.size(), 1);
public Optional<RouteMapper> findTableMapper(final String logicDataSourceName, final String actualTableName) {
for (RouteMapper each : tableMappers) {
result.add(each.getLogicName());
if (logicDataSourceName.equalsIgnoreCase(dataSourceMapper.getLogicName()) && actualTableName.equalsIgnoreCase(each.getActualName())) {
return Optional.of(each);
}
return result;
}
return Optional.empty();
}
}
......@@ -75,30 +75,17 @@ public final class RouteResultTest {
}
@Test
public void assertGetDataSourceNames() {
Collection<String> actual = singleRouteResult.getDataSourceNames();
public void assertGetActualDataSourceNames() {
Collection<String> actual = singleRouteResult.getActualDataSourceNames();
assertThat(actual.size(), is(1));
assertThat(actual.iterator().next(), is(DATASOURCE_NAME_0));
actual = multiRouteResult.getDataSourceNames();
actual = multiRouteResult.getActualDataSourceNames();
assertThat(actual.size(), is(2));
Iterator<String> iterator = actual.iterator();
assertThat(iterator.next(), is(DATASOURCE_NAME_0));
assertThat(iterator.next(), is(DATASOURCE_NAME_1));
}
@Test
public void assertGetTableMapper() {
Optional<RouteMapper> actual = multiRouteResult.getTableMapper(DATASOURCE_NAME_1, ACTUAL_TABLE);
assertTrue(actual.isPresent());
assertThat(actual.get(), is(new RouteMapper(LOGIC_TABLE, ACTUAL_TABLE)));
}
@Test
public void assertGetTableMapperNonExist() {
Optional<RouteMapper> actual = singleRouteResult.getTableMapper(DATASOURCE_NAME_1, ACTUAL_TABLE);
assertFalse(actual.isPresent());
}
@Test
public void assertGetActualTableNameGroups() {
Set<String> logicTableSet = new HashSet<>();
......@@ -118,4 +105,16 @@ public final class RouteResultTest {
assertThat(actual.get(DATASOURCE_NAME_1).size(), is(1));
assertThat(actual.get(DATASOURCE_NAME_1).iterator().next(), is(LOGIC_TABLE));
}
@Test
public void assertFindTableMapper() {
Optional<RouteMapper> actual = multiRouteResult.findTableMapper(DATASOURCE_NAME_1, ACTUAL_TABLE);
assertTrue(actual.isPresent());
assertThat(actual.get(), is(new RouteMapper(LOGIC_TABLE, ACTUAL_TABLE)));
}
@Test
public void assertTableMapperNotFound() {
assertFalse(singleRouteResult.findTableMapper(DATASOURCE_NAME_1, ACTUAL_TABLE).isPresent());
}
}
......@@ -17,12 +17,9 @@
package org.apache.shardingsphere.underlying.route.context;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
......@@ -33,48 +30,18 @@ import static org.junit.Assert.assertTrue;
public final class RouteUnitTest {
private static final String DATASOURCE_NAME = "ds";
private static final String LOGIC_DATA_SOURCE = "logic_ds";
private static final String LOGIC_TABLE = "table";
private static final String ACTUAL_DATA_SOURCE = "actual_ds";
private static final String SHARD_TABLE_0 = "table_0";
private static final String LOGIC_TABLE = "tbl";
private static final String SHARD_TABLE_1 = "table_1";
private static final String ACTUAL_TABLE_0 = "tbl_0";
private RouteUnit routeUnit;
private static final String ACTUAL_TABLE_1 = "tbl_1";
@Before
public void setUp() {
routeUnit = new RouteUnit(new RouteMapper(DATASOURCE_NAME, DATASOURCE_NAME), mockTableMappers());
}
private Collection<RouteMapper> mockTableMappers() {
List<RouteMapper> result = new ArrayList<>();
result.add(new RouteMapper(LOGIC_TABLE, SHARD_TABLE_0));
result.add(new RouteMapper(LOGIC_TABLE, SHARD_TABLE_1));
return result;
}
@Test
public void assertFindTableMapper() {
Optional<RouteMapper> actual = routeUnit.findTableMapper(DATASOURCE_NAME, SHARD_TABLE_0);
assertTrue(actual.isPresent());
assertThat(actual.get().getLogicName(), is(LOGIC_TABLE));
assertThat(actual.get().getActualName(), is(SHARD_TABLE_0));
}
@Test
public void assertFindTableMapperNonExist() {
assertFalse(routeUnit.findTableMapper(DATASOURCE_NAME, "").isPresent());
}
@Test
public void assertGetActualTableNames() {
Set<String> actual = routeUnit.getActualTableNames(LOGIC_TABLE);
assertThat(actual.size(), is(2));
assertTrue(actual.contains(SHARD_TABLE_0));
assertTrue(actual.contains(SHARD_TABLE_1));
}
private final RouteUnit routeUnit = new RouteUnit(
new RouteMapper(LOGIC_DATA_SOURCE, ACTUAL_DATA_SOURCE), Arrays.asList(new RouteMapper(LOGIC_TABLE, ACTUAL_TABLE_0), new RouteMapper(LOGIC_TABLE, ACTUAL_TABLE_1)));
@Test
public void assertGetLogicTableNames() {
......@@ -84,24 +51,23 @@ public final class RouteUnitTest {
}
@Test
public void assertGetDataSourceName() {
assertThat(routeUnit.getDataSourceMapper().getActualName(), is(DATASOURCE_NAME));
}
@Test
public void assertGetMasterSlaveLogicDataSourceName() {
assertThat(routeUnit.getDataSourceMapper().getLogicName(), is(DATASOURCE_NAME));
public void assertGetActualTableNames() {
Set<String> actual = routeUnit.getActualTableNames(LOGIC_TABLE);
assertThat(actual.size(), is(2));
assertTrue(actual.contains(ACTUAL_TABLE_0));
assertTrue(actual.contains(ACTUAL_TABLE_1));
}
@Test
public void assertEquals() {
assertTrue(new RouteUnit(new RouteMapper(DATASOURCE_NAME, DATASOURCE_NAME), mockTableMappers()).equals(routeUnit));
public void assertFindTableMapper() {
Optional<RouteMapper> actual = routeUnit.findTableMapper(LOGIC_DATA_SOURCE, ACTUAL_TABLE_0);
assertTrue(actual.isPresent());
assertThat(actual.get().getLogicName(), is(LOGIC_TABLE));
assertThat(actual.get().getActualName(), is(ACTUAL_TABLE_0));
}
@Test
public void assertToString() {
assertThat(routeUnit.toString(), is(String.format(
"RouteUnit(dataSourceMapper=RouteMapper(logicName=%s, actualName=%s), tableMappers=[RouteMapper(logicName=%s, actualName=%s), RouteMapper(logicName=%s, actualName=%s)])",
DATASOURCE_NAME, DATASOURCE_NAME, LOGIC_TABLE, SHARD_TABLE_0, LOGIC_TABLE, SHARD_TABLE_1)));
public void assertTableMapperNotFound() {
assertFalse(routeUnit.findTableMapper("invalid_ds", "invalid_tbl").isPresent());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册