This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 c17837e  Fix wrong metadata when config single dataSource for 
ReadwriteSplitting (#15805)
c17837e is described below

commit c17837e35a007321f22e29fbc780f664264e6d09
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat Mar 5 22:52:27 2022 +0800

    Fix wrong metadata when config single dataSource for ReadwriteSplitting 
(#15805)
    
    * Fix wrong metadata when config single dataSource for ReadwriteSplitting
    
    * optimize param name
---
 .../singletable/route/SingleTableSQLRouter.java    |  5 ++-
 .../route/SingleTableSQLRouterTest.java            | 43 ++++++++++++++++++++--
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
index 484107a..ded2140 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
@@ -47,8 +47,9 @@ public final class SingleTableSQLRouter implements 
SQLRouter<SingleTableRule> {
     public RouteContext createRouteContext(final LogicSQL logicSQL, final 
ShardingSphereMetaData metaData, final SingleTableRule rule, final 
ConfigurationProperties props) {
         RouteContext result = new RouteContext();
         if (1 == metaData.getResource().getDataSources().size()) {
-            String singleDataSourceName = 
metaData.getResource().getDataSources().keySet().iterator().next();
-            result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(singleDataSourceName, singleDataSourceName), 
Collections.emptyList()));
+            String logicDataSource = 
rule.getDataSourceNames().iterator().next();
+            String actualDataSource = 
metaData.getResource().getDataSources().keySet().iterator().next();
+            result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(logicDataSource, actualDataSource), Collections.emptyList()));
         } else {
             route(logicSQL.getSqlStatementContext(), rule, result, props);
         }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
index 0949d7a..1dc7622 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
@@ -57,26 +57,43 @@ public final class SingleTableSQLRouterTest {
     @Test
     public void assertCreateRouteContextWithSingleDataSource() {
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class),
-                createDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
+                createSingleDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
         singleTableRule.getSingleTableDataNodes().put("t_order", 
Collections.singletonList(new DataNode("ds_0", "t_order")));
         ShardingSphereMetaData metaData = mockSingleDataSourceMetaData();
         RouteContext actual = new 
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData, 
singleTableRule, new ConfigurationProperties(new Properties()));
         List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
         assertThat(actual.getRouteUnits().size(), is(1));
+        assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), 
is("ds_0"));
         assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), 
is("ds_0"));
         assertThat(routeUnits.get(0).getTableMappers().size(), is(0));
         assertFalse(actual.isFederated());
     }
     
     @Test
+    public void assertCreateRouteContextWithReadwriteSplittingDataSource() {
+        SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class),
+                createReadwriteSplittingDataSourceMap(), 
Collections.emptyList(), new ConfigurationProperties(new Properties()));
+        singleTableRule.getSingleTableDataNodes().put("t_order", 
Collections.singletonList(new DataNode("write_ds", "t_order")));
+        ShardingSphereMetaData metaData = 
mockReadwriteSplittingDataSourceMetaData();
+        RouteContext actual = new 
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData, 
singleTableRule, new ConfigurationProperties(new Properties()));
+        List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
+        assertThat(actual.getRouteUnits().size(), is(1));
+        assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), 
is("readwrite_ds"));
+        assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), 
is("write_ds"));
+        assertThat(routeUnits.get(0).getTableMappers().size(), is(0));
+        assertFalse(actual.isFederated());
+    }
+    
+    @Test
     public void assertCreateRouteContextWithMultiDataSource() {
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class),
-                createDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
+                createMultiDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
         singleTableRule.getSingleTableDataNodes().put("t_order", 
Collections.singletonList(new DataNode("ds_0", "t_order")));
         ShardingSphereMetaData metaData = mockMultiDataSourceMetaData();
         RouteContext actual = new 
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData, 
singleTableRule, new ConfigurationProperties(new Properties()));
         List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
         assertThat(actual.getRouteUnits().size(), is(1));
+        assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), 
is("ds_0"));
         assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), 
is("ds_0"));
         assertThat(routeUnits.get(0).getTableMappers().size(), is(1));
         RouteMapper tableMapper = 
routeUnits.get(0).getTableMappers().iterator().next();
@@ -93,6 +110,14 @@ public final class SingleTableSQLRouterTest {
         return result;
     }
     
+    private ShardingSphereMetaData mockReadwriteSplittingDataSourceMetaData() {
+        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
+        dataSourceMap.put("write_ds", mock(DataSource.class, 
RETURNS_DEEP_STUBS));
+        when(result.getResource().getDataSources()).thenReturn(dataSourceMap);
+        return result;
+    }
+    
     private ShardingSphereMetaData mockMultiDataSourceMetaData() {
         ShardingSphereMetaData result = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
         Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
@@ -113,7 +138,19 @@ public final class SingleTableSQLRouterTest {
         return new LogicSQL(sqlStatementContext, "create table", 
parametersList);
     }
     
-    private Map<String, DataSource> createDataSourceMap() {
+    private Map<String, DataSource> createSingleDataSourceMap() {
+        Map<String, DataSource> result = new HashMap<>(2, 1);
+        result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
+        return result;
+    }
+    
+    private Map<String, DataSource> createReadwriteSplittingDataSourceMap() {
+        Map<String, DataSource> result = new HashMap<>(2, 1);
+        result.put("readwrite_ds", mock(DataSource.class, RETURNS_DEEP_STUBS));
+        return result;
+    }
+    
+    private Map<String, DataSource> createMultiDataSourceMap() {
         Map<String, DataSource> result = new HashMap<>(2, 1);
         result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
         result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));

Reply via email to