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

wuweijie 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 021ce3f  Use SPI to introduce rule based RQL (#10924)
021ce3f is described below

commit 021ce3f1345dc48288406afb3eae09856a7ad919
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Jun 22 19:53:56 2021 +0800

    Use SPI to introduce rule based RQL (#10924)
    
    * Refactor DataSourcesQueryResultSet
    
    * Use SPI for RQLResultSet
    
    * Remove guava dependencies
    
    * Decouple dependency of RQLResultSet and ProxyContext
    
    * Remove BaseRuleQueryResultSet
    
    * Use SPI to introduce rule based RQL
    
    * Use SPI to introduce rule based RQL
    
    * Fix test case
---
 .../DatabaseDiscoveryRuleQueryResultSet.java       | 19 +++++---
 .../DatabaseDiscoveryRuleQueryResultSetTest.java   | 30 +++++++------
 ...pache.shardingsphere.infra.distsql.RQLResultSet | 18 ++++++++
 .../distsql}/EncryptRuleQueryResultSet.java        | 24 +++++-----
 ...pache.shardingsphere.infra.distsql.RQLResultSet | 18 ++++++++
 .../distsql}/EncryptRuleQueryResultSetTest.java    | 32 ++++++++------
 .../ReadwriteSplittingRuleQueryResultSet.java      | 19 +++++---
 ...pache.shardingsphere.infra.distsql.RQLResultSet | 18 ++++++++
 .../ReadwriteSplittingRuleQueryResultSetTest.java  | 34 ++++++++-------
 .../ShardingBindingTableRuleQueryResultSet.java    | 16 ++++---
 .../ShardingBroadcastTableRuleQueryResultSet.java  | 16 ++++---
 .../distsql}/ShardingTableRuleQueryResultSet.java  | 15 ++++---
 ...pache.shardingsphere.infra.distsql.RQLResultSet | 20 +++++++++
 ...ShardingBindingTableRuleQueryResultSetTest.java | 32 ++++++++------
 ...ardingBroadcastTableRuleQueryResultSetTest.java | 24 +++++-----
 .../ShardingTableRuleQueryResultSetTest.java       | 36 ++++++++-------
 .../yaml/distsql/sharding-rule-config.yaml         |  0
 .../infra/distsql}/RQLResultSet.java               | 13 +++---
 ...esultSet.java => DataSourceQueryResultSet.java} | 51 +++++++++++++---------
 .../text/distsql/rql/RQLBackendHandler.java        |  4 +-
 .../text/distsql/rql/RQLBackendHandlerFactory.java | 51 +++++-----------------
 ...pache.shardingsphere.infra.distsql.RQLResultSet | 18 ++++++++
 .../text/distsql/rql/RQLBackendHandlerTest.java    | 19 ++++++++
 .../distsql/rql/impl/BaseRuleQueryResultSet.java   | 49 ---------------------
 24 files changed, 338 insertions(+), 238 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSet.java
similarity index 80%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSet.java
index 592610b..3a05f89 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSet.java
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.dbdiscovery.distsql;
 
-import com.google.common.base.Joiner;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
+import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDatabaseDiscoveryRulesStatement;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.properties.PropertiesConverter;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Arrays;
@@ -43,8 +43,8 @@ public final class DatabaseDiscoveryRuleQueryResultSet 
implements RQLResultSet {
     private Map<String, ShardingSphereAlgorithmConfiguration> discoveryTypes;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        Optional<DatabaseDiscoveryRuleConfiguration> ruleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        Optional<DatabaseDiscoveryRuleConfiguration> ruleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
DatabaseDiscoveryRuleConfiguration).map(each -> 
(DatabaseDiscoveryRuleConfiguration) each).findAny();
         data = ruleConfig.map(optional -> 
optional.getDataSources().iterator()).orElse(Collections.emptyIterator());
         discoveryTypes = 
ruleConfig.map(DatabaseDiscoveryRuleConfiguration::getDiscoveryTypes).orElse(Collections.emptyMap());
@@ -63,7 +63,12 @@ public final class DatabaseDiscoveryRuleQueryResultSet 
implements RQLResultSet {
     @Override
     public Collection<Object> getRowData() {
         DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfig = 
data.next();
-        return Arrays.asList(dataSourceRuleConfig.getName(), 
Joiner.on(",").join(dataSourceRuleConfig.getDataSourceNames()), 
+        return Arrays.asList(dataSourceRuleConfig.getName(), String.join(",", 
dataSourceRuleConfig.getDataSourceNames()), 
                 
discoveryTypes.get(dataSourceRuleConfig.getDiscoveryTypeName()).getType(), 
PropertiesConverter.convert(discoveryTypes.get(dataSourceRuleConfig.getDiscoveryTypeName()).getProps()));
     }
+    
+    @Override
+    public String getType() {
+        return ShowDatabaseDiscoveryRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSetTest.java
similarity index 75%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSetTest.java
index ad9c240..08e0015 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DatabaseDiscoveryRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/DatabaseDiscoveryRuleQueryResultSetTest.java
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.dbdiscovery.distsql;
 
 import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDatabaseDiscoveryRulesStatement;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -35,27 +36,30 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class DatabaseDiscoveryRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        DatabaseDiscoveryDataSourceRuleConfiguration 
databaseDiscoveryDataSourceRuleConfig = new 
DatabaseDiscoveryDataSourceRuleConfiguration("ms_group", Arrays.asList("ds_0", 
"ds_1"), "test");
-        ShardingSphereAlgorithmConfiguration shardingSphereAlgorithmConfig = 
new ShardingSphereAlgorithmConfiguration("MGR", new Properties());
-        Map<String, ShardingSphereAlgorithmConfiguration> discoverTypes = new 
HashMap<>(1, 1);
-        discoverTypes.put("test", shardingSphereAlgorithmConfig);
-        return Collections.singleton(new 
DatabaseDiscoveryRuleConfiguration(Collections.singleton(databaseDiscoveryDataSourceRuleConfig),
 discoverTypes));
-    }
+public final class DatabaseDiscoveryRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createRuleConfiguration()));
         RQLResultSet resultSet = new DatabaseDiscoveryRuleQueryResultSet();
-        resultSet.init("test", 
mock(ShowDatabaseDiscoveryRulesStatement.class));
+        resultSet.init(metaData, 
mock(ShowDatabaseDiscoveryRulesStatement.class));
         Collection<Object> actual = resultSet.getRowData();
         assertThat(actual.size(), is(4));
         assertTrue(actual.contains("ms_group"));
         assertTrue(actual.contains("ds_0,ds_1"));
         assertTrue(actual.contains("MGR"));
     }
+    
+    private RuleConfiguration createRuleConfiguration() {
+        DatabaseDiscoveryDataSourceRuleConfiguration 
databaseDiscoveryDataSourceRuleConfig = new 
DatabaseDiscoveryDataSourceRuleConfiguration("ms_group", Arrays.asList("ds_0", 
"ds_1"), "test");
+        ShardingSphereAlgorithmConfiguration shardingSphereAlgorithmConfig = 
new ShardingSphereAlgorithmConfiguration("MGR", new Properties());
+        Map<String, ShardingSphereAlgorithmConfiguration> discoverTypes = new 
HashMap<>(1, 1);
+        discoverTypes.put("test", shardingSphereAlgorithmConfig);
+        return new 
DatabaseDiscoveryRuleConfiguration(Collections.singleton(databaseDiscoveryDataSourceRuleConfig),
 discoverTypes);
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
new file mode 100644
index 0000000..dac494f
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.dbdiscovery.distsql.DatabaseDiscoveryRuleQueryResultSet
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSet.java
similarity index 80%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSet.java
index 13be160..77e4dcb 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSet.java
@@ -15,19 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.encrypt.distsql;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Maps;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.distsql.parser.statement.ShowEncryptRulesStatement;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.properties.PropertiesConverter;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Arrays;
@@ -51,11 +48,11 @@ public final class EncryptRuleQueryResultSet implements 
RQLResultSet {
     private Map<String, ShardingSphereAlgorithmConfiguration> encryptors;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        Optional<EncryptRuleConfiguration> ruleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        Optional<EncryptRuleConfiguration> ruleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
EncryptRuleConfiguration).map(each -> (EncryptRuleConfiguration) 
each).findAny();
         data = ruleConfig.map(optional -> getAllEncryptColumns(optional, 
((ShowEncryptRulesStatement) 
sqlStatement).getTableName()).entrySet().iterator()).orElse(Collections.emptyIterator());
-        encryptors = 
ruleConfig.map(EncryptRuleConfiguration::getEncryptors).orElse(Maps.newHashMap());
+        encryptors = 
ruleConfig.map(EncryptRuleConfiguration::getEncryptors).orElse(Collections.emptyMap());
     }
     
     private Map<String, EncryptColumnRuleConfiguration> 
getAllEncryptColumns(final EncryptRuleConfiguration encryptRuleConfig, final 
String tableName) {
@@ -70,7 +67,7 @@ public final class EncryptRuleQueryResultSet implements 
RQLResultSet {
     }
     
     private Map<String, EncryptColumnRuleConfiguration> 
buildEncryptColumnRuleConfigurationMap(final EncryptTableRuleConfiguration 
encryptTableRuleConfig) {
-        return 
encryptTableRuleConfig.getColumns().stream().collect(Collectors.toMap(each -> 
Joiner.on(".").join(encryptTableRuleConfig.getName(), each.getLogicColumn()), 
each -> each));
+        return 
encryptTableRuleConfig.getColumns().stream().collect(Collectors.toMap(each -> 
String.join(".", encryptTableRuleConfig.getName(), each.getLogicColumn()), each 
-> each));
     }
     
     @Override
@@ -86,7 +83,12 @@ public final class EncryptRuleQueryResultSet implements 
RQLResultSet {
     @Override
     public Collection<Object> getRowData() {
         Entry<String, EncryptColumnRuleConfiguration> entry = data.next();
-        return 
Arrays.asList(Splitter.on(".").splitToList(entry.getKey()).get(0), 
entry.getValue().getLogicColumn(), entry.getValue().getCipherColumn(), 
entry.getValue().getPlainColumn(), 
+        return Arrays.asList(entry.getKey().split("\\.")[0], 
entry.getValue().getLogicColumn(), entry.getValue().getCipherColumn(), 
entry.getValue().getPlainColumn(), 
                 encryptors.get(entry.getValue().getEncryptorName()).getType(), 
PropertiesConverter.convert(encryptors.get(entry.getValue().getEncryptorName()).getProps()));
     }
+    
+    @Override
+    public String getType() {
+        return ShowEncryptRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
new file mode 100644
index 0000000..1140f66
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.encrypt.distsql.EncryptRuleQueryResultSet
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSetTest.java
similarity index 77%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSetTest.java
index 7ddac02..e22f846 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/EncryptRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/distsql/EncryptRuleQueryResultSetTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.encrypt.distsql;
 
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
@@ -23,7 +23,8 @@ import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfigu
 import 
org.apache.shardingsphere.encrypt.distsql.parser.statement.ShowEncryptRulesStatement;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.junit.Test;
 
 import java.util.Collection;
@@ -35,24 +36,18 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class EncryptRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", null, "user_plain", 
"test");
-        EncryptTableRuleConfiguration encryptTableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(encryptColumnRuleConfig));
-        ShardingSphereAlgorithmConfiguration shardingSphereAlgorithmConfig = 
new ShardingSphereAlgorithmConfiguration("md5", new Properties());
-        Map<String, ShardingSphereAlgorithmConfiguration> encryptors = new 
HashMap<>();
-        encryptors.put("test", shardingSphereAlgorithmConfig);
-        return Collections.singleton(new 
EncryptRuleConfiguration(Collections.singleton(encryptTableRuleConfig), 
encryptors));
-    }
+public final class EncryptRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(getRuleConfiguration()));
         RQLResultSet resultSet = new EncryptRuleQueryResultSet();
-        resultSet.init("test", mock(ShowEncryptRulesStatement.class));
+        resultSet.init(metaData, mock(ShowEncryptRulesStatement.class));
         Collection<Object> actual = resultSet.getRowData();
         assertThat(actual.size(), is(6));
         assertTrue(actual.contains("t_encrypt"));
@@ -61,4 +56,13 @@ public final class EncryptRuleQueryResultSetTest extends 
BaseRuleQueryResultSet
         assertTrue(actual.contains("user_plain"));
         assertTrue(actual.contains("md5"));
     }
+    
+    private RuleConfiguration getRuleConfiguration() {
+        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", null, "user_plain", 
"test");
+        EncryptTableRuleConfiguration encryptTableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(encryptColumnRuleConfig));
+        ShardingSphereAlgorithmConfiguration shardingSphereAlgorithmConfig = 
new ShardingSphereAlgorithmConfiguration("md5", new Properties());
+        Map<String, ShardingSphereAlgorithmConfiguration> encryptors = new 
HashMap<>();
+        encryptors.put("test", shardingSphereAlgorithmConfig);
+        return new 
EncryptRuleConfiguration(Collections.singleton(encryptTableRuleConfig), 
encryptors);
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSet.java
similarity index 82%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSet.java
index f2ca26c..e384df5 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSet.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.readwritesplitting.distsql;
 
 import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.properties.PropertiesConverter;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowReadwriteSplittingRulesStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Arrays;
@@ -44,11 +44,11 @@ public final class ReadwriteSplittingRuleQueryResultSet 
implements RQLResultSet
     private Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        Optional<ReadwriteSplittingRuleConfiguration> ruleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        Optional<ReadwriteSplittingRuleConfiguration> ruleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
ReadwriteSplittingRuleConfiguration).map(each -> 
(ReadwriteSplittingRuleConfiguration) each).findAny();
         data = ruleConfig.map(optional -> 
optional.getDataSources().iterator()).orElse(Collections.emptyIterator());
-        loadBalancers = 
ruleConfig.map(ReadwriteSplittingRuleConfiguration::getLoadBalancers).orElse(Maps.newHashMap());
+        loadBalancers = 
ruleConfig.map(ReadwriteSplittingRuleConfiguration::getLoadBalancers).orElse(Collections.emptyMap());
     }
     
     @Override
@@ -68,4 +68,9 @@ public final class ReadwriteSplittingRuleQueryResultSet 
implements RQLResultSet
                 null == loadBalancers.get(ruleConfig.getLoadBalancerName()) ? 
null : loadBalancers.get(ruleConfig.getLoadBalancerName()).getType(),
                 
PropertiesConverter.convert(loadBalancers.get(ruleConfig.getLoadBalancerName()).getProps()));
     }
+    
+    @Override
+    public String getType() {
+        return ShowReadwriteSplittingRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
new file mode 100644
index 0000000..a27c671
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.readwritesplitting.distsql.ReadwriteSplittingRuleQueryResultSet
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSetTest.java
similarity index 78%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSetTest.java
index 737ab27..4ad3ade 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReadwriteSplittingRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/ReadwriteSplittingRuleQueryResultSetTest.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.readwritesplitting.distsql;
 
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowReadwriteSplittingRulesStatement;
@@ -34,26 +35,18 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class ReadwriteSplittingRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig =
-                new ReadwriteSplittingDataSourceRuleConfiguration("pr_ds", 
"ms_group", "ds_primary", Arrays.asList("ds_slave_0", "ds_slave_1"), "test");
-        Properties props = new Properties();
-        props.setProperty("read_weight", "2:1");
-        ShardingSphereAlgorithmConfiguration 
shardingSphereAlgorithmConfiguration = new 
ShardingSphereAlgorithmConfiguration("random", props);
-        Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers = new 
HashMap<>();
-        loadBalancers.put("test", shardingSphereAlgorithmConfiguration);
-        return Collections.singleton(new 
ReadwriteSplittingRuleConfiguration(Collections.singleton(dataSourceRuleConfig),
 loadBalancers));
-    }
+public final class ReadwriteSplittingRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createRuleConfiguration()));
         ReadwriteSplittingRuleQueryResultSet resultSet = new 
ReadwriteSplittingRuleQueryResultSet();
-        resultSet.init("test", 
mock(ShowReadwriteSplittingRulesStatement.class));
+        resultSet.init(metaData, 
mock(ShowReadwriteSplittingRulesStatement.class));
         Collection<Object> actual = resultSet.getRowData();
         assertThat(actual.size(), is(6));
         assertTrue(actual.contains("pr_ds"));
@@ -63,4 +56,15 @@ public final class ReadwriteSplittingRuleQueryResultSetTest 
extends BaseRuleQuer
         assertTrue(actual.contains("random"));
         assertTrue(actual.contains("read_weight=2:1"));
     }
+    
+    private RuleConfiguration createRuleConfiguration() {
+        ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig =
+                new ReadwriteSplittingDataSourceRuleConfiguration("pr_ds", 
"ms_group", "ds_primary", Arrays.asList("ds_slave_0", "ds_slave_1"), "test");
+        Properties props = new Properties();
+        props.setProperty("read_weight", "2:1");
+        ShardingSphereAlgorithmConfiguration 
shardingSphereAlgorithmConfiguration = new 
ShardingSphereAlgorithmConfiguration("random", props);
+        Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers = new 
HashMap<>();
+        loadBalancers.put("test", shardingSphereAlgorithmConfiguration);
+        return new 
ReadwriteSplittingRuleConfiguration(Collections.singleton(dataSourceRuleConfig),
 loadBalancers);
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSet.java
similarity index 77%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSet.java
index 4ae52bb..9265894 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSet.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBindingTableRulesStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Collection;
@@ -35,8 +36,8 @@ public final class ShardingBindingTableRuleQueryResultSet 
implements RQLResultSe
     private Iterator<String> data;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        Optional<ShardingRuleConfiguration> shardingRuleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        Optional<ShardingRuleConfiguration> shardingRuleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
ShardingRuleConfiguration).map(each -> (ShardingRuleConfiguration) 
each).findFirst();
         data = shardingRuleConfig.map(shardingRuleConfiguration -> 
shardingRuleConfiguration.getBindingTableGroups().iterator()).orElse(Collections.emptyIterator());
     }
@@ -55,4 +56,9 @@ public final class ShardingBindingTableRuleQueryResultSet 
implements RQLResultSe
     public Collection<Object> getRowData() {
         return Collections.singleton(data.next());
     }
+    
+    @Override
+    public String getType() {
+        return ShowShardingBindingTableRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSet.java
similarity index 77%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSet.java
index e3f87a0..cf78bdb 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSet.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBroadcastTableRulesStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Collection;
@@ -35,8 +36,8 @@ public final class ShardingBroadcastTableRuleQueryResultSet 
implements RQLResult
     private Iterator<String> data;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        Optional<ShardingRuleConfiguration> shardingRuleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        Optional<ShardingRuleConfiguration> shardingRuleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
ShardingRuleConfiguration).map(each -> (ShardingRuleConfiguration) 
each).findFirst();
         data = shardingRuleConfig.map(optional -> 
optional.getBroadcastTables().iterator()).orElse(Collections.emptyIterator());
     }
@@ -55,4 +56,9 @@ public final class ShardingBroadcastTableRuleQueryResultSet 
implements RQLResult
     public Collection<Object> getRowData() {
         return Collections.singleton(data.next());
     }
+    
+    @Override
+    public String getType() {
+        return 
ShowShardingBroadcastTableRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSet.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSet.java
similarity index 96%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSet.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSet.java
index fabbb56..fd66056 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSet.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSet.java
@@ -15,12 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.properties.PropertiesConverter;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 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;
@@ -53,9 +53,9 @@ public final class ShardingTableRuleQueryResultSet implements 
RQLResultSet {
     private ShardingRuleConfiguration shardingRuleConfig;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
         String tableName = ((ShowShardingTableRulesStatement) 
sqlStatement).getTableName();
-        Optional<ShardingRuleConfiguration> ruleConfig = 
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+        Optional<ShardingRuleConfiguration> ruleConfig = 
metaData.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof 
ShardingRuleConfiguration).map(each -> (ShardingRuleConfiguration) 
each).findAny();
         if (Objects.isNull(tableName)) {
             tables = ruleConfig.map(optional -> 
optional.getTables().iterator()).orElse(Collections.emptyIterator());
@@ -198,4 +198,9 @@ public final class ShardingTableRuleQueryResultSet 
implements RQLResultSet {
     private Optional<KeyGenerateStrategyConfiguration> 
getKeyGenerateStrategyConfiguration(final KeyGenerateStrategyConfiguration 
keyGenerateStrategyConfig) {
         return null == keyGenerateStrategyConfig ? 
Optional.ofNullable(shardingRuleConfig.getDefaultKeyGenerateStrategy()) : 
Optional.of(keyGenerateStrategyConfig);
     }
+    
+    @Override
+    public String getType() {
+        return ShowShardingTableRulesStatement.class.getCanonicalName();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
new file mode 100644
index 0000000..cb2f956
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.sharding.distsql.ShardingTableRuleQueryResultSet
+org.apache.shardingsphere.sharding.distsql.ShardingBindingTableRuleQueryResultSet
+org.apache.shardingsphere.sharding.distsql.ShardingBroadcastTableRuleQueryResultSet
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSetTest.java
similarity index 76%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSetTest.java
index 99421f3..204f078e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBindingTableRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBindingTableRuleQueryResultSetTest.java
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBindingTableRulesStatement;
@@ -29,27 +30,30 @@ import java.util.Collections;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class ShardingBindingTableRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getTables().add(new ShardingTableRuleConfiguration("t_order"));
-        result.getTables().add(new 
ShardingTableRuleConfiguration("t_order_item"));
-        result.getTables().add(new ShardingTableRuleConfiguration("t_1"));
-        result.getTables().add(new ShardingTableRuleConfiguration("t_2"));
-        
result.getBindingTableGroups().addAll(Collections.singleton("t_order,t_order_item"));
-        return Collections.singleton(result);
-    }
+public final class ShardingBindingTableRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createRuleConfiguration()));
         ShardingBindingTableRuleQueryResultSet resultSet = new 
ShardingBindingTableRuleQueryResultSet();
-        resultSet.init("test", 
mock(ShowShardingBindingTableRulesStatement.class));
+        resultSet.init(metaData, 
mock(ShowShardingBindingTableRulesStatement.class));
         Collection<Object> actual = resultSet.getRowData();
         assertThat(actual.size(), is(1));
         assertTrue(actual.contains("t_order,t_order_item"));
     }
+    
+    private RuleConfiguration createRuleConfiguration() {
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.getTables().add(new ShardingTableRuleConfiguration("t_order"));
+        result.getTables().add(new 
ShardingTableRuleConfiguration("t_order_item"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_1"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_2"));
+        
result.getBindingTableGroups().addAll(Collections.singleton("t_order,t_order_item"));
+        return result;
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSetTest.java
similarity index 75%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSetTest.java
index 709742c..7201b5b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingBroadcastTableRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingBroadcastTableRuleQueryResultSetTest.java
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBroadcastTableRulesStatement;
 import org.junit.Test;
@@ -28,23 +29,26 @@ import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class ShardingBroadcastTableRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getBroadcastTables().addAll(Arrays.asList("t_order", 
"t_order_item"));
-        return Collections.singleton(result);
-    }
+public final class ShardingBroadcastTableRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createRuleConfiguration()));
         ShardingBroadcastTableRuleQueryResultSet resultSet = new 
ShardingBroadcastTableRuleQueryResultSet();
-        resultSet.init("test", 
mock(ShowShardingBroadcastTableRulesStatement.class));
+        resultSet.init(metaData, 
mock(ShowShardingBroadcastTableRulesStatement.class));
         Collection<Object> actual = resultSet.getRowData();
         assertThat(actual.size(), is(1));
         assertThat(actual, is(Collections.singleton("t_order")));
     }
+    
+    private RuleConfiguration createRuleConfiguration() {
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.getBroadcastTables().addAll(Arrays.asList("t_order", 
"t_order_item"));
+        return result;
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSetTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSetTest.java
similarity index 79%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSetTest.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSetTest.java
index 1f40cc1..88d3f35 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRuleQueryResultSetTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/distsql/ShardingTableRuleQueryResultSetTest.java
@@ -15,13 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.sharding.distsql;
 
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingTableRulesStatement;
 import org.junit.Test;
 
@@ -34,26 +35,18 @@ import java.util.stream.Collectors;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-public final class ShardingTableRuleQueryResultSetTest extends 
BaseRuleQueryResultSet {
-    
-    @SuppressWarnings("unchecked")
-    @Override
-    protected Collection<RuleConfiguration> buildRuleConfigurations() {
-        return new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(readYAML(),
 Collection.class));
-    }
-    
-    @SneakyThrows
-    private String readYAML() {
-        return 
Files.readAllLines(Paths.get(ClassLoader.getSystemResource("yaml/config-sharding.yaml").toURI()))
-                .stream().map(each -> each + 
System.lineSeparator()).collect(Collectors.joining());
-    }
+public final class ShardingTableRuleQueryResultSetTest {
     
     @Test
     public void assertGetRowData() {
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class, 
RETURNS_DEEP_STUBS);
+        
when(metaData.getRuleMetaData().getConfigurations()).thenReturn(createRuleConfiguration());
         RQLResultSet resultSet = new ShardingTableRuleQueryResultSet();
-        resultSet.init("test", mock(ShowShardingTableRulesStatement.class));
+        resultSet.init(metaData, mock(ShowShardingTableRulesStatement.class));
         List<Object> actual = new ArrayList<>(resultSet.getRowData());
         assertThat(actual.size(), is(14));
         assertThat(actual.get(0), is("t_order"));
@@ -71,4 +64,15 @@ public final class ShardingTableRuleQueryResultSetTest 
extends BaseRuleQueryResu
         assertThat(actual.get(12), is("SNOWFLAKE"));
         assertThat(actual.get(13), is("worker-id=123"));
     }
+    
+    @SuppressWarnings("unchecked")
+    private Collection<RuleConfiguration> createRuleConfiguration() {
+        return new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(readYAML(),
 Collection.class));
+    }
+    
+    @SneakyThrows
+    private String readYAML() {
+        return 
Files.readAllLines(Paths.get(ClassLoader.getSystemResource("yaml/distsql/sharding-rule-config.yaml").toURI()))
+                .stream().map(each -> each + 
System.lineSeparator()).collect(Collectors.joining());
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/yaml/config-sharding.yaml
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/resources/yaml/distsql/sharding-rule-config.yaml
similarity index 100%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/yaml/config-sharding.yaml
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/resources/yaml/distsql/sharding-rule-config.yaml
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLResultSet.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/distsql/RQLResultSet.java
similarity index 77%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLResultSet.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/distsql/RQLResultSet.java
index f6759bf..ce0c5ac 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLResultSet.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/distsql/RQLResultSet.java
@@ -15,8 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
+package org.apache.shardingsphere.infra.distsql;
 
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Collection;
@@ -24,14 +26,15 @@ import java.util.Collection;
 /**
  * RQL result set.
  */
-public interface RQLResultSet {
+public interface RQLResultSet extends TypedSPI {
     
     /**
-     * Initialize rule data.
-     * @param schemaName schema name
+     * Initialize data.
+     * 
+     * @param metaData meta data for ShardingSphere
      * @param sqlStatement SQL statement
      */
-    void init(String schemaName, SQLStatement sqlStatement);
+    void init(ShardingSphereMetaData metaData, SQLStatement sqlStatement);
     
     /**
      * Get result set column names.
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DataSourcesQueryResultSet.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/DataSourceQueryResultSet.java
similarity index 55%
rename from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DataSourcesQueryResultSet.java
rename to 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/DataSourceQueryResultSet.java
index fc39afe..88f4ce1 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/DataSourcesQueryResultSet.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/DataSourceQueryResultSet.java
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl;
+package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import com.google.gson.Gson;
+import 
org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowResourcesStatement;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceConverter;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceParameter;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.text.distsql.rql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import 
org.apache.shardingsphere.proxy.config.util.DataSourceParameterConverter;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -33,21 +34,20 @@ import java.util.Iterator;
 import java.util.Map;
 
 /**
- * Result set for show resources.
+ * Result set for show data source.
  */
-public final class DataSourcesQueryResultSet implements RQLResultSet {
+public final class DataSourceQueryResultSet implements RQLResultSet {
     
     private Map<String, DataSourceParameter> dataSourceParameterMap;
     
     private Iterator<String> dataSourceNames;
     
-    private String schemaName;
+    private ShardingSphereMetaData metaData;
     
     @Override
-    public void init(final String schemaName, final SQLStatement sqlStatement) 
{
-        this.schemaName = schemaName;
-        dataSourceParameterMap = 
DataSourceParameterConverter.getDataSourceParameterMap(
-                
DataSourceConverter.getDataSourceConfigurationMap(ProxyContext.getInstance().getMetaData(schemaName).getResource().getDataSources()));
+    public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
+        this.metaData = metaData;
+        dataSourceParameterMap = 
DataSourceParameterConverter.getDataSourceParameterMap(DataSourceConverter.getDataSourceConfigurationMap(metaData.getResource().getDataSources()));
         dataSourceNames = dataSourceParameterMap.keySet().iterator();
     }
     
@@ -64,19 +64,28 @@ public final class DataSourcesQueryResultSet implements 
RQLResultSet {
     @Override
     public Collection<Object> getRowData() {
         String dataSourceName = dataSourceNames.next();
-        DataSourceMetaData dataSourceMetaData = 
ProxyContext.getInstance().getMetaData(schemaName).getResource().getDataSourcesMetaData().getDataSourceMetaData(dataSourceName);
-        Map<Object, Object> attributeMap = new HashMap<>();
-        attributeMap.put("connectionTimeoutMilliseconds", 
dataSourceParameterMap.get(dataSourceName).getConnectionTimeoutMilliseconds());
-        attributeMap.put("idleTimeoutMilliseconds", 
dataSourceParameterMap.get(dataSourceName).getIdleTimeoutMilliseconds());
-        attributeMap.put("maxLifetimeMilliseconds", 
dataSourceParameterMap.get(dataSourceName).getMaxLifetimeMilliseconds());
-        attributeMap.put("maxPoolSize", 
dataSourceParameterMap.get(dataSourceName).getMaxPoolSize());
-        attributeMap.put("minPoolSize", 
dataSourceParameterMap.get(dataSourceName).getMinPoolSize());
-        attributeMap.put("maintenanceIntervalMilliseconds", 
dataSourceParameterMap.get(dataSourceName).getMaintenanceIntervalMilliseconds());
-        attributeMap.put("readOnly", 
dataSourceParameterMap.get(dataSourceName).isReadOnly());
-        String type = 
ProxyContext.getInstance().getMetaData(schemaName).getResource().getDatabaseType().getName();
+        DataSourceMetaData dataSourceMetaData = 
metaData.getResource().getDataSourcesMetaData().getDataSourceMetaData(dataSourceName);
+        String type = metaData.getResource().getDatabaseType().getName();
         String host = dataSourceMetaData.getHostName();
         int port = dataSourceMetaData.getPort();
         String db = dataSourceMetaData.getCatalog();
-        return Arrays.asList(dataSourceName, type, host, port, db, (new 
Gson()).toJson(attributeMap));
+        return Arrays.asList(dataSourceName, type, host, port, db, (new 
Gson()).toJson(getAttributeMap(dataSourceParameterMap.get(dataSourceName))));
+    }
+    
+    private Map<Object, Object> getAttributeMap(final DataSourceParameter 
dataSourceParameter) {
+        Map<Object, Object> result = new HashMap<>(7, 1);
+        result.put("connectionTimeoutMilliseconds", 
dataSourceParameter.getConnectionTimeoutMilliseconds());
+        result.put("idleTimeoutMilliseconds", 
dataSourceParameter.getIdleTimeoutMilliseconds());
+        result.put("maxLifetimeMilliseconds", 
dataSourceParameter.getMaxLifetimeMilliseconds());
+        result.put("maxPoolSize", dataSourceParameter.getMaxPoolSize());
+        result.put("minPoolSize", dataSourceParameter.getMinPoolSize());
+        result.put("maintenanceIntervalMilliseconds", 
dataSourceParameter.getMaintenanceIntervalMilliseconds());
+        result.put("readOnly", dataSourceParameter.isReadOnly());
+        return result;
+    }
+    
+    @Override
+    public String getType() {
+        return ShowResourcesStatement.class.getCanonicalName();
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandler.java
index 8eec41c..0e985d0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandler.java
@@ -18,7 +18,9 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
@@ -43,7 +45,7 @@ public final class RQLBackendHandler extends 
SchemaRequiredBackendHandler<RQLSta
     
     @Override
     protected ResponseHeader execute(final String schemaName, final 
RQLStatement sqlStatement) {
-        resultSet.init(schemaName, sqlStatement);
+        resultSet.init(ProxyContext.getInstance().getMetaData(schemaName), 
sqlStatement);
         List<QueryHeader> queryHeaders = 
resultSet.getColumnNames().stream().map(
             each -> new QueryHeader(schemaName, "", each, each, Types.CHAR, 
"CHAR", 255, 0, false, false, false, false)).collect(Collectors.toList());
         return new QueryResponseHeader(queryHeaders);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerFactory.java
index 8a5b9b7..af07978 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerFactory.java
@@ -19,23 +19,14 @@ package 
org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.ShowDatabaseDiscoveryRulesStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
-import 
org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowResourcesStatement;
-import 
org.apache.shardingsphere.encrypt.distsql.parser.statement.ShowEncryptRulesStatement;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.DataSourcesQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.DatabaseDiscoveryRuleQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.EncryptRuleQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ReadwriteSplittingRuleQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingBindingTableRuleQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingBroadcastTableRuleQueryResultSet;
-import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingTableRuleQueryResultSet;
-import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowReadwriteSplittingRulesStatement;
-import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBindingTableRulesStatement;
-import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingBroadcastTableRulesStatement;
-import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingTableRulesStatement;
+
+import java.util.Properties;
 
 /**
  * RQL backend handler factory.
@@ -43,6 +34,10 @@ import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingT
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class RQLBackendHandlerFactory {
     
+    static {
+        ShardingSphereServiceLoader.register(RQLResultSet.class);
+    }
+    
     /**
      * Create new instance of RDL backend handler.
      * 
@@ -51,31 +46,7 @@ public final class RQLBackendHandlerFactory {
      * @return RDL backend handler
      */
     public static TextProtocolBackendHandler newInstance(final RQLStatement 
sqlStatement, final BackendConnection backendConnection) {
-        return new RQLBackendHandler(sqlStatement, backendConnection, 
getRuleQueryResultSet(sqlStatement));
-    }
-    
-    private static RQLResultSet getRuleQueryResultSet(final RQLStatement 
sqlStatement) {
-        if (sqlStatement instanceof ShowResourcesStatement) {
-            return new DataSourcesQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowShardingBindingTableRulesStatement) {
-            return new ShardingBindingTableRuleQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowShardingBroadcastTableRulesStatement) {
-            return new ShardingBroadcastTableRuleQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowReadwriteSplittingRulesStatement) {
-            return new ReadwriteSplittingRuleQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowDatabaseDiscoveryRulesStatement) {
-            return new DatabaseDiscoveryRuleQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowEncryptRulesStatement) {
-            return new EncryptRuleQueryResultSet();
-        }
-        if (sqlStatement instanceof ShowShardingTableRulesStatement) {
-            return new ShardingTableRuleQueryResultSet();
-        }
-        throw new UnsupportedOperationException(String.format("Cannot support 
SQL statement %s", sqlStatement.getClass().getCanonicalName()));
+        RQLResultSet rqlResultSet = 
TypedSPIRegistry.getRegisteredService(RQLResultSet.class, 
sqlStatement.getClass().getCanonicalName(), new Properties());
+        return new RQLBackendHandler(sqlStatement, backendConnection, 
rqlResultSet);
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
new file mode 100644
index 0000000..7759fe9
--- /dev/null
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.distsql.RQLResultSet
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.proxy.backend.text.distsql.rql.DataSourceQueryResultSet
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerTest.java
index a78b3e7..6f31cd4 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/RQLBackendHandlerTest.java
@@ -18,15 +18,23 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
+import org.apache.shardingsphere.infra.distsql.RQLResultSet;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
+import org.apache.shardingsphere.transaction.context.TransactionContexts;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.sql.Types;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
@@ -37,6 +45,17 @@ import static org.mockito.Mockito.when;
 
 public final class RQLBackendHandlerTest {
     
+    @Before
+    public void setUp() {
+        MetaDataContexts metaDataContexts = mock(MetaDataContexts.class);
+        
when(metaDataContexts.getAllSchemaNames()).thenReturn(Collections.singleton("test"));
+        ShardingSphereRuleMetaData ruleMetaData = 
mock(ShardingSphereRuleMetaData.class);
+        ShardingSphereMetaData shardingSphereMetaData = 
mock(ShardingSphereMetaData.class);
+        
when(shardingSphereMetaData.getRuleMetaData()).thenReturn(ruleMetaData);
+        
when(metaDataContexts.getMetaData("test")).thenReturn(shardingSphereMetaData);
+        ProxyContext.getInstance().init(metaDataContexts, 
mock(TransactionContexts.class));
+    }
+    
     @Test
     public void assertExecute() {
         RQLResultSet resultSet = mock(RQLResultSet.class);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/BaseRuleQueryResultSet.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/BaseRuleQueryResultSet.java
deleted file mode 100644
index aa40146..0000000
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/BaseRuleQueryResultSet.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.proxy.backend.text.distsql.rql.impl;
-
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.transaction.context.TransactionContexts;
-import org.junit.Before;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public abstract class BaseRuleQueryResultSet {
-    
-    @Before
-    public final void setUp() {
-        MetaDataContexts metaDataContexts = mock(MetaDataContexts.class);
-        
when(metaDataContexts.getAllSchemaNames()).thenReturn(Collections.singleton("test"));
-        ShardingSphereRuleMetaData ruleMetaData = 
mock(ShardingSphereRuleMetaData.class);
-        
when(ruleMetaData.getConfigurations()).thenReturn(buildRuleConfigurations());
-        ShardingSphereMetaData shardingSphereMetaData = 
mock(ShardingSphereMetaData.class);
-        
when(shardingSphereMetaData.getRuleMetaData()).thenReturn(ruleMetaData);
-        
when(metaDataContexts.getMetaData("test")).thenReturn(shardingSphereMetaData);
-        ProxyContext.getInstance().init(metaDataContexts, 
mock(TransactionContexts.class));
-    }
-    
-    protected abstract Collection<RuleConfiguration> buildRuleConfigurations();
-}

Reply via email to