You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2022/06/22 16:12:50 UTC

[shardingsphere] branch master updated: Refactor RulesUsedResourceQueryResultSet (#18520)

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

menghaoran 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 9cdbba7caeb Refactor RulesUsedResourceQueryResultSet (#18520)
9cdbba7caeb is described below

commit 9cdbba7caebafc59be9842f7dd73aaad7721d12b
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 23 00:12:43 2022 +0800

    Refactor RulesUsedResourceQueryResultSet (#18520)
---
 ...eDiscoveryDynamicDataSourceStrategyFixture.java |   3 +-
 .../pipeline/mysql/ingest/client/MySQLClient.java  |   1 -
 .../rql/rule/RulesUsedResourceQueryResultSet.java  | 138 ++++++--------
 .../rql/RulesUsedResourceQueryResultSetTest.java   | 210 +++++++++++----------
 4 files changed, 174 insertions(+), 178 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/fixture/DatabaseDiscoveryDynamicDataSourceStrategyFixture.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/fixture/DatabaseDiscoveryDynamicDataSourceStrategyFixture.java
index 275df756dc7..ba45dddc8bc 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/fixture/DatabaseDiscoveryDynamicDataSourceStrategyFixture.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/fixture/DatabaseDiscoveryDynamicDataSourceStrategyFixture.java
@@ -26,7 +26,8 @@ import java.util.Collections;
 public class DatabaseDiscoveryDynamicDataSourceStrategyFixture implements DynamicDataSourceStrategy {
     
     @Override
-    public void init(final ShardingSphereRule rule) { }
+    public void init(final ShardingSphereRule rule) {
+    }
     
     @Override
     public String getPrimaryDataSourceName(final String dataSourceName) {
diff --git a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-dialect/shardingsphere-data-pipeline-mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/MySQLClient.java b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-dialect/shardingsphere-data-pipeline-mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/MySQLClient.java
index d10e5022555..48a4ab7aec4 100644
--- a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-dialect/shardingsphere-data-pipeline-mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/MySQLClient.java
+++ b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-dialect/shardingsphere-data-pipeline-mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/MySQLClient.java
@@ -228,7 +228,6 @@ public final class MySQLClient {
         }
     }
     
-    
     /**
      * Close netty channel.
      */
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/RulesUsedResourceQueryResultSet.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/RulesUsedResourceQueryResultSet.java
index e68123c5cf4..2729402af34 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/RulesUsedResourceQueryResultSet.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/RulesUsedResourceQueryResultSet.java
@@ -18,33 +18,37 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rql.rule;
 
 import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRulesUsedResourceStatement;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
-import org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
+import org.apache.shardingsphere.shadow.rule.ShadowRule;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
+import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Result set for show rules used resource.
  */
 public final class RulesUsedResourceQueryResultSet implements DistSQLResultSet {
     
-    private static final String TYPE = ShowRulesUsedResourceStatement.class.getName();
-    
     private static final String SHARDING = "sharding";
     
     private static final String READWRITE_SPLITTING = "readwrite_splitting";
@@ -55,108 +59,90 @@ public final class RulesUsedResourceQueryResultSet implements DistSQLResultSet {
     
     private static final String SHADOW = "shadow";
     
-    private static final Map<String, Class<? extends RuleConfiguration>> FEATURE_MAP = new HashMap<>(5, 1);
-    
     private Iterator<Collection<Object>> data;
     
-    static {
-        FEATURE_MAP.put(SHARDING, ShardingRuleConfiguration.class);
-        FEATURE_MAP.put(READWRITE_SPLITTING, ReadwriteSplittingRuleConfiguration.class);
-        FEATURE_MAP.put(DB_DISCOVERY, DatabaseDiscoveryRuleConfiguration.class);
-        FEATURE_MAP.put(ENCRYPT, EncryptRuleConfiguration.class);
-        FEATURE_MAP.put(SHADOW, ShadowRuleConfiguration.class);
-    }
-    
     @Override
     public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
-        List<Collection<Object>> data = new ArrayList<>();
+        List<Collection<Object>> data = new LinkedList<>();
         ShowRulesUsedResourceStatement statement = (ShowRulesUsedResourceStatement) sqlStatement;
         String resourceName = statement.getResourceName().orElse(null);
-        if (hasRulesConfiguration(database) && database.getResource().getDataSources().containsKey(resourceName)) {
-            getRulesConfig(database.getRuleMetaData().getConfigurations(), resourceName, data);
+        if (database.getResource().getDataSources().containsKey(resourceName)) {
+            data.addAll(getShardingData(database));
+            data.addAll(getReadwriteSplittingData(database, resourceName));
+            data.addAll(getDatabaseDiscoveryData(database, resourceName));
+            data.addAll(getEncryptData(database));
+            data.addAll(getShadowData(database, resourceName));
         }
         this.data = data.iterator();
     }
     
-    private void getRulesConfig(final Collection<RuleConfiguration> ruleConfigs, final String resourceName, final List<Collection<Object>> data) {
-        ruleConfigs.forEach(each -> {
-            getRulesConfigForSharding(each, data);
-            getRulesConfigForReadwriteSplitting(each, resourceName, data);
-            getRulesConfigForDBDiscovery(each, resourceName, data);
-            getRulesConfigForEncrypt(each, data);
-            getRulesConfigForShadow(each, resourceName, data);
-        });
-    }
-    
-    private void getRulesConfigForSharding(final RuleConfiguration ruleConfig, final List<Collection<Object>> result) {
-        if (!matchFeature(ruleConfig, SHARDING)) {
-            return;
+    private Collection<Collection<Object>> getShardingData(final ShardingSphereDatabase database) {
+        Optional<ShardingRule> rule = database.getRuleMetaData().findSingleRule(ShardingRule.class);
+        if (!rule.isPresent()) {
+            return Collections.emptyList();
+        }
+        Collection<Collection<Object>> result = new LinkedList<>();
+        ShardingRuleConfiguration config = (ShardingRuleConfiguration) rule.get().getConfiguration();
+        for (ShardingAutoTableRuleConfiguration each : config.getAutoTables()) {
+            result.add(buildRow(SHARDING, each.getLogicTable()));
+        }
+        for (ShardingTableRuleConfiguration each : config.getTables()) {
+            result.add(buildRow(SHARDING, each.getLogicTable()));
         }
-        ShardingRuleConfiguration config = (ShardingRuleConfiguration) ruleConfig;
-        config.getAutoTables().forEach(each -> result.add(buildRow(SHARDING, each.getLogicTable())));
-        config.getTables().forEach(each -> result.add(buildRow(SHARDING, each.getLogicTable())));
+        return result;
     }
     
-    private void getRulesConfigForReadwriteSplitting(final RuleConfiguration ruleConfig, final String resourceName, final List<Collection<Object>> result) {
-        if (!matchFeature(ruleConfig, READWRITE_SPLITTING)) {
-            return;
+    private Collection<Collection<Object>> getReadwriteSplittingData(final ShardingSphereDatabase database, final String resourceName) {
+        Optional<ReadwriteSplittingRule> rule = database.getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
+        if (!rule.isPresent()) {
+            return Collections.emptyList();
         }
-        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) ruleConfig;
-        config.getDataSources().forEach(each -> {
+        Collection<Collection<Object>> result = new LinkedList<>();
+        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) rule.get().getConfiguration();
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : config.getDataSources()) {
             if (each.getWriteDataSourceName().isPresent() && each.getWriteDataSourceName().get().equalsIgnoreCase(resourceName)) {
                 result.add(buildRow(READWRITE_SPLITTING, each.getName()));
             }
             if (each.getReadDataSourceNames().isPresent() && Arrays.asList(each.getReadDataSourceNames().get().split(",")).contains(resourceName)) {
                 result.add(buildRow(READWRITE_SPLITTING, each.getName()));
             }
-        });
-    }
-    
-    private void getRulesConfigForDBDiscovery(final RuleConfiguration ruleConfig, final String resourceName, final List<Collection<Object>> result) {
-        if (!matchFeature(ruleConfig, DB_DISCOVERY)) {
-            return;
         }
-        DatabaseDiscoveryRuleConfiguration config = (DatabaseDiscoveryRuleConfiguration) ruleConfig;
-        config.getDataSources().forEach(each -> {
-            if (each.getDataSourceNames().contains(resourceName)) {
-                result.add(buildRow(DB_DISCOVERY, each.getGroupName()));
-            }
-        });
+        return result;
     }
     
-    private void getRulesConfigForEncrypt(final RuleConfiguration ruleConfig, final List<Collection<Object>> result) {
-        if (!matchFeature(ruleConfig, ENCRYPT)) {
-            return;
+    private Collection<Collection<Object>> getDatabaseDiscoveryData(final ShardingSphereDatabase database, final String resourceName) {
+        Optional<DatabaseDiscoveryRule> rule = database.getRuleMetaData().findSingleRule(DatabaseDiscoveryRule.class);
+        if (!rule.isPresent()) {
+            return Collections.emptyList();
         }
-        EncryptRuleConfiguration config = (EncryptRuleConfiguration) ruleConfig;
-        config.getTables().forEach(each -> result.add(buildRow(ENCRYPT, each.getName())));
+        DatabaseDiscoveryRuleConfiguration config = (DatabaseDiscoveryRuleConfiguration) rule.get().getConfiguration();
+        return config.getDataSources().stream().filter(each -> each.getDataSourceNames().contains(resourceName)).map(each -> buildRow(DB_DISCOVERY, each.getGroupName())).collect(Collectors.toList());
     }
     
-    private void getRulesConfigForShadow(final RuleConfiguration ruleConfig, final String resourceName, final List<Collection<Object>> result) {
-        if (!matchFeature(ruleConfig, SHADOW)) {
-            return;
-        }
-        ShadowRuleConfiguration config = (ShadowRuleConfiguration) ruleConfig;
-        for (Entry<String, ShadowDataSourceConfiguration> each : config.getDataSources().entrySet()) {
-            if (each.getValue().getShadowDataSourceName().equalsIgnoreCase(resourceName) || each.getValue().getSourceDataSourceName().equalsIgnoreCase(resourceName)) {
-                result.add(buildRow(SHADOW, each.getKey()));
-            }
+    private Collection<Collection<Object>> getEncryptData(final ShardingSphereDatabase database) {
+        Optional<EncryptRule> rule = database.getRuleMetaData().findSingleRule(EncryptRule.class);
+        if (!rule.isPresent()) {
+            return Collections.emptyList();
         }
+        EncryptRuleConfiguration config = (EncryptRuleConfiguration) rule.get().getConfiguration();
+        return config.getTables().stream().map(each -> buildRow(ENCRYPT, each.getName())).collect(Collectors.toList());
     }
     
-    private boolean matchFeature(final RuleConfiguration ruleConfig, final String feature) {
-        return null != ruleConfig && ruleConfig.getClass().getName().equals(FEATURE_MAP.get(feature).getName());
+    private Collection<Collection<Object>> getShadowData(final ShardingSphereDatabase database, final String resourceName) {
+        Optional<ShadowRule> rule = database.getRuleMetaData().findSingleRule(ShadowRule.class);
+        if (!rule.isPresent()) {
+            return Collections.emptyList();
+        }
+        ShadowRuleConfiguration config = (ShadowRuleConfiguration) rule.get().getConfiguration();
+        return config.getDataSources().entrySet().stream()
+                .filter(entry -> entry.getValue().getShadowDataSourceName().equalsIgnoreCase(resourceName) || entry.getValue().getSourceDataSourceName().equalsIgnoreCase(resourceName))
+                .map(entry -> buildRow(SHADOW, entry.getKey())).collect(Collectors.toList());
     }
     
     private Collection<Object> buildRow(final String type, final String name) {
         return Arrays.asList(type, name);
     }
     
-    private boolean hasRulesConfiguration(final ShardingSphereDatabase database) {
-        Collection<RuleConfiguration> configs = database.getRuleMetaData().getConfigurations();
-        return null != configs && !configs.isEmpty();
-    }
-    
     @Override
     public Collection<String> getColumnNames() {
         return Arrays.asList("type", "name");
@@ -174,6 +160,6 @@ public final class RulesUsedResourceQueryResultSet implements DistSQLResultSet {
     
     @Override
     public String getType() {
-        return TYPE;
+        return ShowRulesUsedResourceStatement.class.getName();
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RulesUsedResourceQueryResultSetTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RulesUsedResourceQueryResultSetTest.java
index fa4a844ba47..e4dad9b7b0e 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RulesUsedResourceQueryResultSetTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RulesUsedResourceQueryResultSetTest.java
@@ -19,10 +19,11 @@ package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
 import org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
+import org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRulesUsedResourceStatement;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
@@ -30,16 +31,16 @@ import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
 import org.apache.shardingsphere.proxy.backend.text.distsql.rql.rule.RulesUsedResourceQueryResultSet;
 import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
+import org.apache.shardingsphere.shadow.rule.ShadowRule;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.test.mock.MockedDataSource;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -49,135 +50,144 @@ import java.util.Optional;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.Silent.class)
 public final class RulesUsedResourceQueryResultSetTest {
     
-    @Mock
-    private ShardingSphereDatabase database;
-    
     @Test
-    public void assertGetRowDataForSharding() {
-        init(mockShardingTableRule());
+    public void assertGetRowData() {
         DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
         ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
-        when(sqlStatement.getResourceName()).thenReturn(Optional.of("ds_0"));
-        resultSet.init(database, sqlStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("sharding"));
-        assertThat(rowData.next(), is("sharding_auto_table"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("sharding"));
-        assertThat(rowData.next(), is("sharding_table"));
+        when(sqlStatement.getResourceName()).thenReturn(Optional.of("foo_ds"));
+        resultSet.init(mockDatabase(), sqlStatement);
+        assertShardingTableData(resultSet);
+        assertReadwriteSplittingData(resultSet);
+        assertDatabaseDiscoveryData(resultSet);
+        assertEncryptData(resultSet);
+        assertShadowData(resultSet);
+        assertFalse(resultSet.next());
     }
     
-    @Test
-    public void assertGetRowDataForReadwriteSplitting() {
-        init(mockReadwriteSplittingRule());
-        DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
-        ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
-        when(sqlStatement.getResourceName()).thenReturn(Optional.of("ds_0"));
-        resultSet.init(database, sqlStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("readwrite_splitting"));
-        assertThat(rowData.next(), is("readwrite_splitting_source"));
+    private ShardingSphereDatabase mockDatabase() {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+        ShardingSphereRuleMetaData ruleMetaData = new ShardingSphereRuleMetaData(
+                Arrays.asList(mockShardingRule(), mockReadwriteSplittingRule(), mockDatabaseDiscoveryRule(), mockEncryptRule(), mockShadowRule()));
+        when(result.getRuleMetaData()).thenReturn(ruleMetaData);
+        ShardingSphereResource resource = new ShardingSphereResource(Collections.singletonMap("foo_ds", new MockedDataSource()));
+        when(result.getResource()).thenReturn(resource);
+        return result;
     }
     
-    @Test
-    public void assertGetRowDataForDBDiscovery() {
-        init(mockDBDiscoveryRule());
-        DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
-        ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
-        when(sqlStatement.getResourceName()).thenReturn(Optional.of("ds_0"));
-        resultSet.init(database, sqlStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("db_discovery"));
-        assertThat(rowData.next(), is("db_discovery_group_name"));
+    private ShardingRule mockShardingRule() {
+        ShardingRule result = mock(ShardingRule.class);
+        ShardingRuleConfiguration config = mock(ShardingRuleConfiguration.class);
+        when(config.getTables()).thenReturn(Collections.singleton(new ShardingTableRuleConfiguration("sharding_table")));
+        when(config.getAutoTables()).thenReturn(Collections.singleton(new ShardingAutoTableRuleConfiguration("sharding_auto_table")));
+        when(result.getConfiguration()).thenReturn(config);
+        return result;
     }
     
-    @Test
-    public void assertGetRowDataForEncryptRule() {
-        init(mockEncryptRule());
-        DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
-        ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
-        when(sqlStatement.getResourceName()).thenReturn(Optional.of("ds_0"));
-        resultSet.init(database, sqlStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("encrypt"));
-        assertThat(rowData.next(), is("encrypt_table"));
+    private ReadwriteSplittingRule mockReadwriteSplittingRule() {
+        ReadwriteSplittingRule result = mock(ReadwriteSplittingRule.class);
+        ReadwriteSplittingRuleConfiguration config = mock(ReadwriteSplittingRuleConfiguration.class);
+        when(config.getDataSources()).thenReturn(Collections.singleton(new ReadwriteSplittingDataSourceRuleConfiguration("readwrite_splitting_source", "", createReadwriteSplittingProperties(), "")));
+        when(result.getConfiguration()).thenReturn(config);
+        return result;
     }
     
-    @Test
-    public void assertGetRowDataForShadowRule() {
-        init(mockShadowRule());
-        DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
-        ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
-        when(sqlStatement.getResourceName()).thenReturn(Optional.of("ds_0"));
-        resultSet.init(database, sqlStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("shadow"));
-        assertThat(rowData.next(), is("shadow_source"));
+    private Properties createReadwriteSplittingProperties() {
+        Properties result = new Properties();
+        result.setProperty("write-data-source-name", "foo_ds");
+        result.setProperty("read-data-source-names", "foo_ds,bar_ds");
+        return result;
     }
     
-    private void init(final RuleConfiguration ruleConfig) {
-        ShardingSphereRuleMetaData ruleMetaData = mock(ShardingSphereRuleMetaData.class);
-        when(ruleMetaData.getConfigurations()).thenReturn(Collections.singleton(ruleConfig));
-        when(database.getRuleMetaData()).thenReturn(ruleMetaData);
-        ShardingSphereResource resource = new ShardingSphereResource(Collections.singletonMap("ds_0", new MockedDataSource()));
-        when(database.getResource()).thenReturn(resource);
+    private DatabaseDiscoveryRule mockDatabaseDiscoveryRule() {
+        DatabaseDiscoveryRule result = mock(DatabaseDiscoveryRule.class);
+        DatabaseDiscoveryRuleConfiguration config = mock(DatabaseDiscoveryRuleConfiguration.class);
+        when(config.getDataSources()).thenReturn(Collections.singleton(new DatabaseDiscoveryDataSourceRuleConfiguration("db_discovery_group_name", Arrays.asList("foo_ds", "bar_ds"), "", "")));
+        when(result.getConfiguration()).thenReturn(config);
+        return result;
     }
     
-    private RuleConfiguration mockShardingTableRule() {
-        ShardingRuleConfiguration result = mock(ShardingRuleConfiguration.class);
-        when(result.getTables()).thenReturn(Collections.singleton(new ShardingTableRuleConfiguration("sharding_table")));
-        when(result.getAutoTables()).thenReturn(Collections.singleton(new ShardingAutoTableRuleConfiguration("sharding_auto_table")));
+    private EncryptRule mockEncryptRule() {
+        EncryptRule result = mock(EncryptRule.class);
+        EncryptRuleConfiguration config = mock(EncryptRuleConfiguration.class);
+        when(config.getTables()).thenReturn(Collections.singleton(new EncryptTableRuleConfiguration("encrypt_table", Collections.emptyList(), false)));
+        when(result.getConfiguration()).thenReturn(config);
         return result;
     }
     
-    private RuleConfiguration mockReadwriteSplittingRule() {
-        ReadwriteSplittingRuleConfiguration result = mock(ReadwriteSplittingRuleConfiguration.class);
-        when(result.getDataSources()).thenReturn(Collections.singleton(new ReadwriteSplittingDataSourceRuleConfiguration("readwrite_splitting_source", "", createProperties(), "")));
+    private ShadowRule mockShadowRule() {
+        ShadowRule result = mock(ShadowRule.class);
+        ShadowRuleConfiguration config = mock(ShadowRuleConfiguration.class);
+        when(config.getDataSources()).thenReturn(Collections.singletonMap("shadow_source", new ShadowDataSourceConfiguration("foo_ds", "shadow_ds")));
+        when(result.getConfiguration()).thenReturn(config);
         return result;
     }
     
-    private Properties createProperties() {
-        Properties result = new Properties();
-        result.setProperty("write-data-source-name", "ds_0");
-        result.setProperty("read-data-source-names", "read_0,read_1");
-        return result;
+    private void assertShardingTableData(final DistSQLResultSet resultSet) {
+        Iterator<Object> actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("sharding"));
+        assertThat(actual.next(), is("sharding_auto_table"));
+        actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("sharding"));
+        assertThat(actual.next(), is("sharding_table"));
     }
     
-    private RuleConfiguration mockDBDiscoveryRule() {
-        DatabaseDiscoveryRuleConfiguration result = mock(DatabaseDiscoveryRuleConfiguration.class);
-        when(result.getDataSources()).thenReturn(Collections.singleton(new DatabaseDiscoveryDataSourceRuleConfiguration("db_discovery_group_name", Arrays.asList("ds_0", "ds_1"), "", "")));
-        return result;
+    private void assertReadwriteSplittingData(final DistSQLResultSet resultSet) {
+        Iterator<Object> actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("readwrite_splitting"));
+        assertThat(actual.next(), is("readwrite_splitting_source"));
+        actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("readwrite_splitting"));
+        assertThat(actual.next(), is("readwrite_splitting_source"));
     }
     
-    private RuleConfiguration mockEncryptRule() {
-        EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
-        when(result.getTables()).thenReturn(Collections.singleton(new EncryptTableRuleConfiguration("encrypt_table", Collections.emptyList(), false)));
-        return result;
+    private void assertDatabaseDiscoveryData(final DistSQLResultSet resultSet) {
+        Iterator<Object> actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("db_discovery"));
+        assertThat(actual.next(), is("db_discovery_group_name"));
+    }
+    
+    private void assertEncryptData(final DistSQLResultSet resultSet) {
+        Iterator<Object> actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("encrypt"));
+        assertThat(actual.next(), is("encrypt_table"));
+    }
+    
+    private void assertShadowData(final DistSQLResultSet resultSet) {
+        Iterator<Object> actual = getActualRowData(resultSet);
+        assertThat(actual.next(), is("shadow"));
+        assertThat(actual.next(), is("shadow_source"));
+    }
+    
+    private Iterator<Object> getActualRowData(final DistSQLResultSet resultSet) {
+        assertTrue(resultSet.next());
+        Collection<Object> actual = resultSet.getRowData();
+        assertThat(actual.size(), is(2));
+        return actual.iterator();
+    }
+    
+    @Test
+    public void assertGetEmptyRowData() {
+        ShardingSphereDatabase database = mockEmptyDatabase();
+        DistSQLResultSet resultSet = new RulesUsedResourceQueryResultSet();
+        ShowRulesUsedResourceStatement sqlStatement = mock(ShowRulesUsedResourceStatement.class);
+        when(sqlStatement.getResourceName()).thenReturn(Optional.of("empty_ds"));
+        resultSet.init(database, sqlStatement);
+        assertFalse(resultSet.next());
     }
     
-    private RuleConfiguration mockShadowRule() {
-        ShadowRuleConfiguration result = mock(ShadowRuleConfiguration.class);
-        when(result.getDataSources()).thenReturn(Collections.singletonMap("shadow_source", new ShadowDataSourceConfiguration("ds_0", "shadow_ds")));
+    private ShardingSphereDatabase mockEmptyDatabase() {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+        when(result.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
+        ShardingSphereResource resource = new ShardingSphereResource(Collections.singletonMap("empty_ds", new MockedDataSource()));
+        when(result.getResource()).thenReturn(resource);
         return result;
     }
 }