This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new ac7ea0b add support show replica_query rule (#9028)
ac7ea0b is described below
commit ac7ea0be29884fcd6256aa7b2d6d02b9d95cddb6
Author: JingShang Lu <[email protected]>
AuthorDate: Fri Jan 15 15:02:21 2021 +0800
add support show replica_query rule (#9028)
* add support show replica_query rule
---
.../text/distsql/rql/RQLBackendHandlerFactory.java | 15 +++-
.../impl/ReplicaQueryRuleQueryBackendHandler.java | 97 ++++++++++++++++++++++
2 files changed, 111 insertions(+), 1 deletion(-)
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 994fb82..d8057e2 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
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRuleState
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;
+import
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.ReplicaQueryRuleQueryBackendHandler;
import
org.apache.shardingsphere.proxy.backend.text.distsql.rql.impl.RuleQueryBackendHandler;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -44,7 +45,19 @@ public final class RQLBackendHandlerFactory {
*/
public static Optional<TextProtocolBackendHandler> newInstance(final
SQLStatement sqlStatement, final BackendConnection backendConnection) {
if (sqlStatement instanceof ShowRuleStatement) {
- return Optional.of(new RuleQueryBackendHandler((ShowRuleStatement)
sqlStatement, backendConnection));
+ String ruleType = ((ShowRuleStatement) sqlStatement).getRuleType();
+ switch (ruleType.toUpperCase()) {
+ case "SHARDING":
+ return Optional.of(new
RuleQueryBackendHandler((ShowRuleStatement) sqlStatement, backendConnection));
+ case "REPLICA_QUERY":
+ return Optional.of(new
ReplicaQueryRuleQueryBackendHandler((ShowRuleStatement) sqlStatement,
backendConnection));
+ case "ENCRYPT":
+ return Optional.of(new
RuleQueryBackendHandler((ShowRuleStatement) sqlStatement, backendConnection));
+ case "SHADOW":
+ return Optional.of(new
RuleQueryBackendHandler((ShowRuleStatement) sqlStatement, backendConnection));
+ default:
+ throw new UnsupportedOperationException(ruleType);
+ }
}
if (sqlStatement instanceof ShowResourcesStatement) {
return Optional.of(new
DataSourcesQueryBackendHandler((ShowResourcesStatement) sqlStatement,
backendConnection));
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReplicaQueryRuleQueryBackendHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReplicaQueryRuleQueryBackendHandler.java
new file mode 100644
index 0000000..20ea166
--- /dev/null
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/impl/ReplicaQueryRuleQueryBackendHandler.java
@@ -0,0 +1,97 @@
+/*
+ * 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.replicaquery.api.config.ReplicaQueryRuleConfiguration;
+import
org.apache.shardingsphere.replicaquery.api.config.rule.ReplicaQueryDataSourceRuleConfiguration;
+
+import java.sql.Types;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Backend handler for show replica query rule.
+ */
+public final class ReplicaQueryRuleQueryBackendHandler extends
SchemaRequiredBackendHandler<ShowRuleStatement> {
+
+ private Iterator<ReplicaQueryDataSourceRuleConfiguration> data;
+
+ private final String schema;
+
+ public ReplicaQueryRuleQueryBackendHandler(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) {
+ loadRuleConfiguration(schema);
+ return new QueryResponseHeader(getQueryHeader());
+ }
+
+ private void loadRuleConfiguration(final String schemaName) {
+ Optional<ReplicaQueryRuleConfiguration> ruleConfig =
ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+ .stream().filter(each -> each instanceof
ReplicaQueryRuleConfiguration).map(each -> (ReplicaQueryRuleConfiguration)
each).findAny();
+ if (ruleConfig.isPresent()) {
+ data = ruleConfig.get().getDataSources().iterator();
+ } else {
+ data = Collections.emptyIterator();
+ }
+ }
+
+ 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, "", "primaryDataSourceName",
"primaryDataSourceName", Types.CHAR, "CHAR", 255, 0, false, false, false,
false));
+ result.add(new QueryHeader(schema, "", "replicaDataSourceNames",
"replicaDataSourceNames", Types.CHAR, "CHAR", 255, 0, false, false, false,
false));
+ result.add(new QueryHeader(schema, "", "loadBalancerName",
"loadBalancerName", Types.CHAR, "CHAR", 255, 0, false, false, false, false));
+ return result;
+ }
+
+ @Override
+ public boolean next() {
+ return data.hasNext();
+ }
+
+ @Override
+ public Collection<Object> getRowData() {
+ ReplicaQueryDataSourceRuleConfiguration ruleConfig = data.next();
+ String name = ruleConfig.getName();
+ String primaryDataSourceName = ruleConfig.getPrimaryDataSourceName();
+ String replicaDataSourceNames = (new
Gson()).toJson(ruleConfig.getReplicaDataSourceNames());
+ String loadBalancerName = ruleConfig.getLoadBalancerName();
+ return Arrays.asList(name, primaryDataSourceName,
replicaDataSourceNames, loadBalancerName);
+ }
+}