You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/05/27 11:16:56 UTC
[shardingsphere] branch master updated: Show sharding table rules %
show sharding table rule table (#10503)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 e18d3cf Show sharding table rules % show sharding table rule table (#10503)
e18d3cf is described below
commit e18d3cf6e02f2a26fb8e2c76094863fbd37e0cc9
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Thu May 27 19:16:34 2021 +0800
Show sharding table rules % show sharding table rule table (#10503)
Co-authored-by: menghaoranss <me...@apache.org>
---
.../src/main/antlr4/imports/RQLStatement.g4 | 12 +-
.../distsql/parser/autogen/DistSQLStatement.g4 | 2 +-
.../distsql/parser/core/DistSQLVisitor.java | 24 +--
...t.java => ShowShardingTableRulesStatement.java} | 26 +--
.../text/distsql/rql/RQLBackendHandlerFactory.java | 5 +
.../distsql/rql/impl/RuleQueryBackendHandler.java | 94 --------
.../rql/impl/ShardingRuleQueryBackendHandler.java | 157 --------------
.../ShardingTableRulesQueryBackendHandler.java | 238 +++++++++++++++++++++
.../ShardingTableRulesQueryBackendHandlerTest.java | 121 +++++++++++
.../src/test/resources/yaml/config-sharding.yaml | 51 +++++
10 files changed, 439 insertions(+), 291 deletions(-)
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RQLStatement.g4 b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RQLStatement.g4
index 2714e30..a275d96 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RQLStatement.g4
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RQLStatement.g4
@@ -23,10 +23,6 @@ showResources
: SHOW RESOURCES (FROM schemaName)?
;
-showRule
- : SHOW ruleType RULE (FROM schemaName)?
- ;
-
showShardingBindingTableRules
: SHOW SHARDING BINDING TABLE RULES (FROM schemaName)?
;
@@ -51,8 +47,12 @@ showEncryptTableRule
: SHOW ENCRYPT TABLE RULE tableName (FROM schemaName)?
;
-ruleType
- : SHARDING | REPLICA_QUERY | ENCRYPT | SHADOW
+showShardingTableRules
+ : SHOW SHARDING TABLE (tableRule | RULES) (FROM schemaName)?
+ ;
+
+tableRule
+ : RULE tableName
;
schemaName
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4 b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
index 2798467..a7bb380 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
@@ -41,13 +41,13 @@ execute
| alterEncryptRule
| dropEncryptRule
| showResources
- | showRule
| showShardingBindingTableRules
| showShardingBroadcastTableRules
| showReadwriteSplittingRules
| showDatabaseDiscoveryRules
| showEncryptRules
| showEncryptTableRule
+ | showShardingTableRules
| showScalingJobList
| showScalingJobStatus
| startScalingJob
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
index 771900b..3af5c2b 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
@@ -41,11 +41,10 @@ import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.S
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowEncryptTableRuleContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowReadwriteSplittingRulesContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowResourcesContext;
-import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowRuleContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowScalingJobListContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowScalingJobStatusContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowShardingBroadcastTableRulesContext;
-import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowShardingRuleContext;
+import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowShardingTableRulesContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.StartScalingJobContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.StopScalingJobContext;
import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.TableNameContext;
@@ -89,9 +88,9 @@ import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowEncryptRu
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowEncryptTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowReadwriteSplittingRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowResourcesStatement;
-import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingBroadcastTableRulesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingTableRulesStatement;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.SchemaSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
@@ -370,24 +369,11 @@ public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
result.getRuleNames().addAll(ctx.IDENTIFIER().stream().map(TerminalNode::getText).collect(Collectors.toList()));
return result;
}
-
- @Override
- public ASTNode visitShowShardingRule(final ShowShardingRuleContext ctx) {
- if (null != ctx.schemaName()) {
- return new ShowRuleStatement("sharding", (SchemaSegment) visitSchemaName(ctx.schemaName()));
- }
- return new ShowRuleStatement("sharding", null);
- }
@Override
public ASTNode visitShowResources(final ShowResourcesContext ctx) {
return new ShowResourcesStatement(null == ctx.schemaName() ? null : (SchemaSegment) visit(ctx.schemaName()));
}
-
- @Override
- public ASTNode visitShowRule(final ShowRuleContext ctx) {
- return new ShowRuleStatement(ctx.ruleType().getText(), null == ctx.schemaName() ? null : (SchemaSegment) visit(ctx.schemaName()));
- }
@Override
public ASTNode visitShowShardingBindingTableRules(final DistSQLStatementParser.ShowShardingBindingTableRulesContext ctx) {
@@ -435,6 +421,12 @@ public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
}
@Override
+ public ASTNode visitShowShardingTableRules(final ShowShardingTableRulesContext ctx) {
+ return new ShowShardingTableRulesStatement(Objects.nonNull(ctx.tableRule()) ? ctx.tableRule().tableName().getText() : null,
+ Objects.nonNull(ctx.schemaName()) ? (SchemaSegment) visit(ctx.schemaName()) : null);
+ }
+
+ @Override
public ASTNode visitShowDatabaseDiscoveryRules(final ShowDatabaseDiscoveryRulesContext ctx) {
return new ShowDatabaseDiscoveryRulesStatement(Objects.nonNull(ctx.schemaName()) ? (SchemaSegment) visit(ctx.schemaName()) : null);
}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowRuleStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowShardingTableRulesStatement.java
similarity index 62%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowRuleStatement.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowShardingTableRulesStatement.java
index bf248b9..717f3cd 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowRuleStatement.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowShardingTableRulesStatement.java
@@ -18,26 +18,18 @@
package org.apache.shardingsphere.distsql.parser.statement.rql.show;
import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.SchemaSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.available.FromSchemaAvailable;
-
-import java.util.Optional;
/**
- * Show rule statement.
+ * Show sharding table rules statement.
*/
-@RequiredArgsConstructor
-public final class ShowRuleStatement extends RQLStatement implements FromSchemaAvailable {
-
- @Getter
- private final String ruleType;
-
- private final SchemaSegment schema;
-
- @Override
- public Optional<SchemaSegment> getSchema() {
- return Optional.ofNullable(schema);
+@Getter
+public final class ShowShardingTableRulesStatement extends ShowRulesStatement {
+
+ private final String tableName;
+
+ public ShowShardingTableRulesStatement(final String tableName, final SchemaSegment schema) {
+ super(schema);
+ this.tableName = tableName;
}
}
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 e945d1e..4924b08 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
@@ -26,6 +26,7 @@ import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowReadwrite
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowResourcesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingBroadcastTableRulesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingTableRulesStatement;
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.DataSourcesQueryBackendHandler;
@@ -35,6 +36,7 @@ import org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.EncryptTabl
import org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ReadwriteSplittingRulesQueryBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingBindingTableRulesQueryBackendHandler;
import org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingBroadcastTableRulesQueryBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ShardingTableRulesQueryBackendHandler;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.util.Optional;
@@ -74,6 +76,9 @@ public final class RQLBackendHandlerFactory {
if (sqlStatement instanceof ShowEncryptTableRuleStatement) {
return Optional.of(new EncryptTableRuleQueryBackendHandler((ShowEncryptTableRuleStatement) sqlStatement, backendConnection));
}
+ if (sqlStatement instanceof ShowShardingTableRulesStatement) {
+ return Optional.of(new ShardingTableRulesQueryBackendHandler((ShowShardingTableRulesStatement) sqlStatement, backendConnection));
+ }
return Optional.empty();
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/RuleQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/RuleQueryBackendHandler.java
deleted file mode 100644
index 1c8413f..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/RuleQueryBackendHandler.java
+++ /dev/null
@@ -1,94 +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.distsql.parser.statement.rql.show.ShowRuleStatement;
-import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.infra.yaml.config.YamlRuleConfiguration;
-import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
-import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
-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.proxy.backend.text.SchemaRequiredBackendHandler;
-import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
-
-/**
- * Backend handler for show rules.
- */
-public final class RuleQueryBackendHandler extends SchemaRequiredBackendHandler<ShowRuleStatement> {
-
- private Iterator<RuleConfiguration> data;
-
- public RuleQueryBackendHandler(final ShowRuleStatement sqlStatement, final BackendConnection backendConnection) {
- super(sqlStatement, backendConnection);
- }
-
- @Override
- protected ResponseHeader execute(final String schemaName, final ShowRuleStatement sqlStatement) {
- String ruleType = sqlStatement.getRuleType();
- QueryHeader queryHeader = new QueryHeader(schemaName, "", ruleType, ruleType, Types.CHAR, "CHAR", 255, 0, false, false, false, false);
- data = loadRuleConfiguration(schemaName, ruleType);
- return new QueryResponseHeader(Collections.singletonList(queryHeader));
- }
-
- private Iterator<RuleConfiguration> loadRuleConfiguration(final String schemaName, final String ruleType) {
- Class<? extends RuleConfiguration> ruleConfigurationClass = getRuleConfigurationClass(ruleType);
- Optional<RuleConfiguration> ruleConfig = ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
- .stream().filter(each -> ruleConfigurationClass.isAssignableFrom(each.getClass())).findAny();
- return ruleConfig.map(optional -> Collections.singleton(optional).iterator()).orElse(Collections.emptyIterator());
- }
-
- private Class<? extends RuleConfiguration> getRuleConfigurationClass(final String ruleType) {
- switch (ruleType.toUpperCase()) {
- case "SHARDING":
- return ShardingRuleConfiguration.class;
- case "REPLICA_QUERY":
- return ReadwriteSplittingRuleConfiguration.class;
- case "ENCRYPT":
- return EncryptRuleConfiguration.class;
- case "SHADOW":
- return ShadowRuleConfiguration.class;
- default:
- throw new UnsupportedOperationException(ruleType);
- }
- }
-
- @Override
- public boolean next() {
- return data.hasNext();
- }
-
- @Override
- public Collection<Object> getRowData() {
- RuleConfiguration ruleConfig = data.next();
- YamlRuleConfiguration yamlRuleConfig = new YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(Collections.singleton(ruleConfig)).iterator().next();
- return Collections.singleton(YamlEngine.marshal(yamlRuleConfig));
- }
-}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingRuleQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingRuleQueryBackendHandler.java
deleted file mode 100644
index 9d49e8f..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingRuleQueryBackendHandler.java
+++ /dev/null
@@ -1,157 +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 com.google.gson.Gson;
-import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRuleStatement;
-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.proxy.backend.text.SchemaRequiredBackendHandler;
-import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
-import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
-import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
-import org.apache.shardingsphere.sharding.rule.BindingTableRule;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
-
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Backend handler for show sharding rules.
- */
-public final class ShardingRuleQueryBackendHandler extends SchemaRequiredBackendHandler<ShowRuleStatement> {
-
- private Iterator<Map<String, Object>> data;
-
- private final String schema;
-
- public ShardingRuleQueryBackendHandler(final ShowRuleStatement sqlStatement, final BackendConnection backendConnection) {
- super(sqlStatement, backendConnection);
- if (sqlStatement.getSchema().isPresent()) {
- schema = sqlStatement.getSchema().get().getIdentifier().getValue();
- } else {
- schema = backendConnection.getSchemaName();
- }
- }
-
- @Override
- protected ResponseHeader execute(final String schemaName, final ShowRuleStatement sqlStatement) {
- List<QueryHeader> queryHeader = getQueryHeader();
- data = loadRuleConfiguration();
- return new QueryResponseHeader(queryHeader);
- }
-
- private List<QueryHeader> getQueryHeader() {
- List<QueryHeader> result = new LinkedList<>();
- result.add(new QueryHeader(schema, "", "name", "name", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- result.add(new QueryHeader(schema, "", "actualDataNodes", "actualDataNodes", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- result.add(new QueryHeader(schema, "", "tableStrategy", "tableStrategy", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- result.add(new QueryHeader(schema, "", "databaseStrategy", "databaseStrategy", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- result.add(new QueryHeader(schema, "", "keyGenerateStrategy", "keyGenerateStrategy", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- result.add(new QueryHeader(schema, "", "bindingTable", "bindingTable", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
- return result;
- }
-
- private Iterator<Map<String, Object>> loadRuleConfiguration() {
- List<Map<String, Object>> result = new LinkedList<>();
- Optional<ShardingRule> ruleConfig = ProxyContext.getInstance().getMetaData(schema).getRuleMetaData().getRules()
- .stream().filter(each -> each instanceof ShardingRule).map(each -> (ShardingRule) each).findFirst();
- if (ruleConfig.isPresent()) {
- Collection<Collection<String>> bindingTables = ruleConfig.get().getBindingTableRules().stream().map(BindingTableRule::getAllLogicTables).collect(Collectors.toList());
- for (TableRule each : ruleConfig.get().getTableRules()) {
- Map<String, Object> table = new HashMap<>();
- table.put("name", each.getLogicTable());
- table.put("actualDataNodes", each.getActualDataNodes());
- ShardingStrategyConfiguration tableShardingStrategy = null != each.getTableShardingStrategyConfig()
- ? each.getTableShardingStrategyConfig() : ruleConfig.get().getDefaultTableShardingStrategyConfig();
- table.put("tableStrategy", generateShardingStrategy(ruleConfig.get(), tableShardingStrategy));
- ShardingStrategyConfiguration databaseShardingStrategy = null != each.getDatabaseShardingStrategyConfig()
- ? each.getDatabaseShardingStrategyConfig() : ruleConfig.get().getDefaultDatabaseShardingStrategyConfig();
- table.put("databaseStrategy", generateShardingStrategy(ruleConfig.get(), databaseShardingStrategy));
- table.put("keyGenerateStrategy", generateKeyGenerateStrategy(ruleConfig.get(), each));
- table.put("bindingTable", generateBindingTable(bindingTables, each.getLogicTable()));
- result.add(table);
- }
- }
-
- return result.iterator();
- }
-
- private String generateBindingTable(final Collection<Collection<String>> bindingTableGroups, final String tableName) {
- Set<String> bindingTable = new HashSet<>();
- for (Collection<String> each : bindingTableGroups) {
- if (each.contains(tableName)) {
- for (String table : each) {
- if (!table.equals(tableName)) {
- bindingTable.add(table);
- }
- }
- }
- }
- return (new Gson()).toJson(bindingTable);
- }
-
- private String generateShardingStrategy(final ShardingRule rule, final ShardingStrategyConfiguration shardingStrategy) {
- StringBuilder result = new StringBuilder();
- if (shardingStrategy instanceof ComplexShardingStrategyConfiguration) {
- result.append("shardingColumns:");
- result.append(((ComplexShardingStrategyConfiguration) shardingStrategy).getShardingColumns());
- result.append(" ");
- } else if (shardingStrategy instanceof StandardShardingStrategyConfiguration) {
- result.append("shardingColumn:");
- result.append(((StandardShardingStrategyConfiguration) shardingStrategy).getShardingColumn());
- result.append(" ");
- }
- result.append((new Gson()).toJson(rule.getShardingAlgorithms().get(shardingStrategy.getShardingAlgorithmName())));
- return result.toString();
- }
-
- private String generateKeyGenerateStrategy(final ShardingRule rule, final TableRule tableRule) {
- StringBuilder result = new StringBuilder();
- result.append("column:");
- result.append(tableRule.getGenerateKeyColumn());
- result.append(" ");
- result.append((new Gson()).toJson(rule.getKeyGenerators().get(tableRule.getKeyGeneratorName())));
- return result.toString();
- }
-
- @Override
- public boolean next() {
- return data.hasNext();
- }
-
- @Override
- public Collection<Object> getRowData() {
- Map<String, Object> table = data.next();
- return Arrays.asList(table.get("name"), table.get("actualDataNodes"), table.get("tableStrategy"), table.get("databaseStrategy"), table.get("keyGenerateStrategy"), table.get("bindingTable"));
- }
-}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandler.java
new file mode 100644
index 0000000..6371499
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandler.java
@@ -0,0 +1,238 @@
+/*
+ * 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 com.google.common.base.Joiner;
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingTableRulesStatement;
+import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+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.proxy.backend.text.SchemaRequiredBackendHandler;
+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.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
+
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+/**
+ * Backend handler for show sharding table rules.
+ */
+public final class ShardingTableRulesQueryBackendHandler extends SchemaRequiredBackendHandler<ShowShardingTableRulesStatement> {
+
+ private Iterator<ShardingTableRuleConfiguration> tables;
+
+ private Iterator<ShardingAutoTableRuleConfiguration> autoTables;
+
+ private ShardingRuleConfiguration shardingRuleConfiguration;
+
+ public ShardingTableRulesQueryBackendHandler(final ShowShardingTableRulesStatement sqlStatement, final BackendConnection backendConnection) {
+ super(sqlStatement, backendConnection);
+ }
+
+ @Override
+ protected ResponseHeader execute(final String schemaName, final ShowShardingTableRulesStatement sqlStatement) {
+ loadRuleConfiguration(schemaName, sqlStatement.getTableName());
+ return new QueryResponseHeader(getQueryHeader(schemaName));
+ }
+
+ private void loadRuleConfiguration(final String schemaName, final String tableName) {
+ Optional<ShardingRuleConfiguration> ruleConfig = ProxyContext.getInstance().getMetaData(schemaName).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());
+ autoTables = ruleConfig.map(optional -> optional.getAutoTables().iterator()).orElse(Collections.emptyIterator());
+ } else {
+ tables = ruleConfig.isPresent() ? ruleConfig.get().getTables().stream().filter(each -> tableName.equalsIgnoreCase(each.getLogicTable()))
+ .collect(Collectors.toList()).iterator() : Collections.emptyIterator();
+ autoTables = ruleConfig.isPresent() ? ruleConfig.get().getAutoTables().stream().filter(each -> tableName.equalsIgnoreCase(each.getLogicTable()))
+ .collect(Collectors.toList()).iterator() : Collections.emptyIterator();
+ }
+ shardingRuleConfiguration = ruleConfig.isPresent() ? ruleConfig.get() : null;
+ }
+
+ private List<QueryHeader> getQueryHeader(final String schemaName) {
+ List<QueryHeader> result = new LinkedList<>();
+ result.add(new QueryHeader(schemaName, "", "table", "table", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "actualDataNodes", "actualDataNodes", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "actualDataSources", "actualDataSources", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "databaseStrategyType", "databaseStrategyType", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "databaseShardingColumn", "databaseShardingColumn", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "databaseShardingAlgorithmType", "databaseShardingAlgorithmType", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "databaseShardingAlgorithmProps", "databaseShardingAlgorithmProps", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "tableStrategyType", "tableStrategyType", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "tableShardingColumn", "tableShardingColumn", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "tableShardingAlgorithmType", "tableShardingAlgorithmType", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "tableShardingAlgorithmProps", "tableShardingAlgorithmProps", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "keyGenerateColumn", "keyGenerateColumn", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "keyGeneratorType", "keyGeneratorType", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ result.add(new QueryHeader(schemaName, "", "keyGeneratorProps", "keyGeneratorProps", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ return result;
+ }
+
+ @Override
+ public boolean next() {
+ return tables.hasNext() || autoTables.hasNext();
+ }
+
+ @Override
+ public Collection<Object> getRowData() {
+ return tables.hasNext() ? buildTableRowData(tables.next()) : buildAutoTableRowData(autoTables.next());
+ }
+
+ private Collection<Object> buildTableRowData(final ShardingTableRuleConfiguration shardingTableRuleConfiguration) {
+ Collection<Object> result = new LinkedList<>();
+ result.add(shardingTableRuleConfiguration.getLogicTable());
+ result.add(shardingTableRuleConfiguration.getActualDataNodes());
+ result.add("");
+ result.add(getDatabaseStrategyType(shardingTableRuleConfiguration));
+ result.add(getDatabaseShardingColumn(shardingTableRuleConfiguration));
+ result.add(getAlgorithmType(getDatabaseShardingStrategy(shardingTableRuleConfiguration)));
+ result.add(getAlgorithmProps(getDatabaseShardingStrategy(shardingTableRuleConfiguration)));
+ result.add(getTableStrategyType(shardingTableRuleConfiguration.getTableShardingStrategy()));
+ result.add(getTableShardingColumn(shardingTableRuleConfiguration.getTableShardingStrategy()));
+ result.add(getAlgorithmType(getTableShardingStrategy(shardingTableRuleConfiguration.getTableShardingStrategy())));
+ result.add(getAlgorithmProps(getTableShardingStrategy(shardingTableRuleConfiguration.getTableShardingStrategy())));
+ result.add(getKeyGenerateColumn(shardingTableRuleConfiguration.getKeyGenerateStrategy()));
+ result.add(getKeyGeneratorType(shardingTableRuleConfiguration.getKeyGenerateStrategy()));
+ result.add(getKeyGeneratorProps(shardingTableRuleConfiguration.getKeyGenerateStrategy()));
+ return result;
+ }
+
+ private Collection<Object> buildAutoTableRowData(final ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfiguration) {
+ Collection<Object> result = new LinkedList<>();
+ result.add(shardingAutoTableRuleConfiguration.getLogicTable());
+ result.add("");
+ result.add(shardingAutoTableRuleConfiguration.getActualDataSources());
+ result.add("");
+ result.add("");
+ result.add("");
+ result.add("");
+ result.add(getTableStrategyType(shardingAutoTableRuleConfiguration.getShardingStrategy()));
+ result.add(getTableShardingColumn(shardingAutoTableRuleConfiguration.getShardingStrategy()));
+ result.add(getAlgorithmType(getTableShardingStrategy(shardingAutoTableRuleConfiguration.getShardingStrategy())));
+ result.add(getAlgorithmProps(getTableShardingStrategy(shardingAutoTableRuleConfiguration.getShardingStrategy())));
+ result.add(getKeyGenerateColumn(shardingAutoTableRuleConfiguration.getKeyGenerateStrategy()));
+ result.add(getKeyGeneratorType(shardingAutoTableRuleConfiguration.getKeyGenerateStrategy()));
+ result.add(getKeyGeneratorProps(shardingAutoTableRuleConfiguration.getKeyGenerateStrategy()));
+ return result;
+ }
+
+ private String getDatabaseStrategyType(final ShardingTableRuleConfiguration shardingTableRuleConfiguration) {
+ Optional<ShardingStrategyConfiguration> databaseShardingStrategy = getDatabaseShardingStrategy(shardingTableRuleConfiguration);
+ return databaseShardingStrategy.isPresent() && !(databaseShardingStrategy.get() instanceof NoneShardingStrategyConfiguration)
+ ? getAlgorithmConfiguration(databaseShardingStrategy.get().getShardingAlgorithmName()).getType() : "";
+ }
+
+ private String getDatabaseShardingColumn(final ShardingTableRuleConfiguration shardingTableRuleConfiguration) {
+ Optional<ShardingStrategyConfiguration> databaseShardingStrategy = getDatabaseShardingStrategy(shardingTableRuleConfiguration);
+ return databaseShardingStrategy.isPresent() ? getShardingColumn(databaseShardingStrategy.get()) : "";
+ }
+
+ private String getShardingColumn(final ShardingStrategyConfiguration shardingStrategyConfiguration) {
+ if (shardingStrategyConfiguration instanceof StandardShardingStrategyConfiguration) {
+ return ((StandardShardingStrategyConfiguration) shardingStrategyConfiguration).getShardingColumn();
+ } else if (shardingStrategyConfiguration instanceof ComplexShardingStrategyConfiguration) {
+ return ((ComplexShardingStrategyConfiguration) shardingStrategyConfiguration).getShardingColumns();
+ }
+ return "";
+ }
+
+ private String getAlgorithmType(final Optional<ShardingStrategyConfiguration> databaseShardingStrategy) {
+ return databaseShardingStrategy.isPresent() && !(databaseShardingStrategy.get() instanceof NoneShardingStrategyConfiguration)
+ ? getAlgorithmConfiguration(databaseShardingStrategy.get().getShardingAlgorithmName()).getType() : "";
+ }
+
+ private String getAlgorithmProps(final Optional<ShardingStrategyConfiguration> databaseShardingStrategy) {
+ return databaseShardingStrategy.isPresent() && !(databaseShardingStrategy.get() instanceof NoneShardingStrategyConfiguration)
+ ? buildProperties(getAlgorithmConfiguration(databaseShardingStrategy.get().getShardingAlgorithmName()).getProps()) : "";
+ }
+
+ private Optional<ShardingStrategyConfiguration> getDatabaseShardingStrategy(final ShardingTableRuleConfiguration shardingTableRuleConfiguration) {
+ return Objects.nonNull(shardingTableRuleConfiguration.getDatabaseShardingStrategy())
+ ? Optional.ofNullable(shardingTableRuleConfiguration.getDatabaseShardingStrategy())
+ : Optional.ofNullable(shardingRuleConfiguration.getDefaultDatabaseShardingStrategy());
+ }
+
+ private ShardingSphereAlgorithmConfiguration getAlgorithmConfiguration(final String algorithmName) {
+ return shardingRuleConfiguration.getShardingAlgorithms().get(algorithmName);
+ }
+
+ private String getTableStrategyType(final ShardingStrategyConfiguration shardingStrategyConfiguration) {
+ Optional<ShardingStrategyConfiguration> tableShardingStrategy = getTableShardingStrategy(shardingStrategyConfiguration);
+ return tableShardingStrategy.isPresent() ? getStrategyType(tableShardingStrategy.get()) : "";
+ }
+
+ private String getStrategyType(final ShardingStrategyConfiguration shardingStrategyConfiguration) {
+ return shardingStrategyConfiguration instanceof NoneShardingStrategyConfiguration ? "none"
+ : getAlgorithmConfiguration(shardingStrategyConfiguration.getShardingAlgorithmName()).getType();
+ }
+
+ private Optional<ShardingStrategyConfiguration> getTableShardingStrategy(final ShardingStrategyConfiguration shardingStrategyConfiguration) {
+ return Objects.nonNull(shardingStrategyConfiguration)
+ ? Optional.ofNullable(shardingStrategyConfiguration)
+ : Optional.ofNullable(shardingRuleConfiguration.getDefaultTableShardingStrategy());
+ }
+
+ private String getTableShardingColumn(final ShardingStrategyConfiguration shardingStrategyConfiguration) {
+ Optional<ShardingStrategyConfiguration> tableShardingStrategy = getTableShardingStrategy(shardingStrategyConfiguration);
+ return tableShardingStrategy.isPresent() ? getShardingColumn(tableShardingStrategy.get()) : "";
+ }
+
+ private String getKeyGenerateColumn(final KeyGenerateStrategyConfiguration keyGenerateStrategyConfiguration) {
+ return getKeyGenerateStrategyConfiguration(keyGenerateStrategyConfiguration).isPresent()
+ ? getKeyGenerateStrategyConfiguration(keyGenerateStrategyConfiguration).get().getColumn() : "";
+ }
+
+ private String getKeyGeneratorType(final KeyGenerateStrategyConfiguration keyGenerateStrategyConfiguration) {
+ Optional<KeyGenerateStrategyConfiguration> optional = getKeyGenerateStrategyConfiguration(keyGenerateStrategyConfiguration);
+ return optional.isPresent() ? shardingRuleConfiguration.getKeyGenerators().get(optional.get().getKeyGeneratorName()).getType() : "";
+ }
+
+ private String getKeyGeneratorProps(final KeyGenerateStrategyConfiguration keyGenerateStrategyConfiguration) {
+ Optional<KeyGenerateStrategyConfiguration> optional = getKeyGenerateStrategyConfiguration(keyGenerateStrategyConfiguration);
+ return optional.isPresent() ? buildProperties(shardingRuleConfiguration.getKeyGenerators().get(optional.get().getKeyGeneratorName()).getProps()) : "";
+ }
+
+ private Optional<KeyGenerateStrategyConfiguration> getKeyGenerateStrategyConfiguration(final KeyGenerateStrategyConfiguration keyGenerateStrategyConfiguration) {
+ return Objects.nonNull(keyGenerateStrategyConfiguration)
+ ? Optional.ofNullable(keyGenerateStrategyConfiguration)
+ : Optional.ofNullable(shardingRuleConfiguration.getDefaultKeyGenerateStrategy());
+ }
+
+ private String buildProperties(final Properties properties) {
+ return Objects.nonNull(properties) ? Joiner.on(",").join(properties.entrySet().stream()
+ .map(each -> Joiner.on(":").join(each.getKey(), each.getValue())).collect(Collectors.toList())) : "";
+ }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandlerTest.java
new file mode 100644
index 0000000..b1a60be
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ShardingTableRulesQueryBackendHandlerTest.java
@@ -0,0 +1,121 @@
+/*
+ * 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 lombok.SneakyThrows;
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowShardingTableRulesStatement;
+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.infra.yaml.engine.YamlEngine;
+import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
+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.transaction.context.TransactionContexts;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class ShardingTableRulesQueryBackendHandlerTest {
+
+ @Mock
+ private BackendConnection backendConnection;
+
+ @Mock
+ private ShowShardingTableRulesStatement sqlStatement;
+
+ @Mock
+ private MetaDataContexts metaDataContexts;
+
+ @Mock
+ private TransactionContexts transactionContexts;
+
+ @Mock
+ private ShardingSphereMetaData shardingSphereMetaData;
+
+ @Mock
+ private ShardingSphereRuleMetaData ruleMetaData;
+
+ private ShardingTableRulesQueryBackendHandler handler;
+
+ @Before
+ public void setUp() {
+ ProxyContext.getInstance().init(metaDataContexts, transactionContexts);
+ handler = new ShardingTableRulesQueryBackendHandler(sqlStatement, backendConnection);
+ when(metaDataContexts.getAllSchemaNames()).thenReturn(Collections.singletonList("test"));
+ when(metaDataContexts.getMetaData(eq("test"))).thenReturn(shardingSphereMetaData);
+ when(shardingSphereMetaData.getRuleMetaData()).thenReturn(ruleMetaData);
+ when(ruleMetaData.getConfigurations()).thenReturn(buildShardingConfiguration());
+ }
+
+ @Test
+ public void assertExecute() {
+ ResponseHeader responseHeader = handler.execute("test", sqlStatement);
+ assertNotNull(responseHeader);
+ assertTrue(responseHeader instanceof QueryResponseHeader);
+ Collection<Object> rowData = handler.getRowData();
+ assertNotNull(rowData);
+ List<Object> rowDataList = new ArrayList<>(rowData);
+ assertThat(rowDataList.size(), is(14));
+ assertThat(rowDataList.get(0), is("t_order"));
+ assertThat(rowDataList.get(1), is("ds_${0..1}.t_order_${0..1}"));
+ assertThat(rowDataList.get(2), is(""));
+ assertThat(rowDataList.get(3), is("INLINE"));
+ assertThat(rowDataList.get(4), is("user_id"));
+ assertThat(rowDataList.get(5), is("INLINE"));
+ assertThat(rowDataList.get(6), is("algorithm-expression:ds_${user_id % 2}"));
+ assertThat(rowDataList.get(7), is("INLINE"));
+ assertThat(rowDataList.get(8), is("order_id"));
+ assertThat(rowDataList.get(9), is("INLINE"));
+ assertThat(rowDataList.get(10), is("algorithm-expression:t_order_${order_id % 2}"));
+ assertThat(rowDataList.get(11), is("order_id"));
+ assertThat(rowDataList.get(12), is("SNOWFLAKE"));
+ assertThat(rowDataList.get(13), is("worker-id:123"));
+ }
+
+ private Collection<RuleConfiguration> buildShardingConfiguration() {
+ 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());
+ }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/yaml/config-sharding.yaml b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/yaml/config-sharding.yaml
new file mode 100644
index 0000000..146b380
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/yaml/config-sharding.yaml
@@ -0,0 +1,51 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+- !SHARDING
+ tables:
+ t_order:
+ actualDataNodes: ds_${0..1}.t_order_${0..1}
+ tableStrategy:
+ standard:
+ shardingColumn: order_id
+ shardingAlgorithmName: t_order_inline
+ keyGenerateStrategy:
+ column: order_id
+ keyGeneratorName: snowflake
+ bindingTables:
+ - t_order,t_order_item
+ defaultDatabaseStrategy:
+ standard:
+ shardingColumn: user_id
+ shardingAlgorithmName: database_inline
+ defaultTableStrategy:
+ none:
+
+ shardingAlgorithms:
+ database_inline:
+ type: INLINE
+ props:
+ algorithm-expression: ds_${user_id % 2}
+ t_order_inline:
+ type: INLINE
+ props:
+ algorithm-expression: t_order_${order_id % 2}
+
+ keyGenerators:
+ snowflake:
+ type: SNOWFLAKE
+ props:
+ worker-id: 123