You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/12/14 05:10:15 UTC

[shardingsphere] branch master updated: Split RDLBackendHandler to RDLQueryBackendHandler and RDLUpdateBackendHandler (#8606)

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

zhangyonglun 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 84ac999  Split RDLBackendHandler to RDLQueryBackendHandler and RDLUpdateBackendHandler (#8606)
84ac999 is described below

commit 84ac9998174630baa898f2042ab2351ac29a2a17
Author: Liang Zhang <te...@163.com>
AuthorDate: Mon Dec 14 13:09:46 2020 +0800

    Split RDLBackendHandler to RDLQueryBackendHandler and RDLUpdateBackendHandler (#8606)
---
 .../text/TextProtocolBackendHandlerFactory.java    |  9 +-
 .../text/metadata/rdl/RDLQueryBackendHandler.java  | 95 ++++++++++++++++++++++
 ...ndHandler.java => RDLUpdateBackendHandler.java} | 45 +---------
 .../text/metadata/rdl/RDLBackendHandlerTest.java   | 10 +--
 4 files changed, 110 insertions(+), 49 deletions(-)

diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index f36ab95..6e440a5 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -21,11 +21,13 @@ import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.RDLStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.show.ShowRDLStatement;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.text.data.DatabaseBackendHandlerFactory;
-import org.apache.shardingsphere.proxy.backend.text.metadata.rdl.RDLBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.metadata.rdl.RDLQueryBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.metadata.rdl.RDLUpdateBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.metadata.schema.SchemaBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.metadata.schema.SchemaBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.text.sctl.ShardingCTLBackendHandlerFactory;
@@ -70,8 +72,11 @@ public final class TextProtocolBackendHandlerFactory {
         if (schemaBackendHandler.isPresent()) {
             return schemaBackendHandler.get();
         }
+        if (sqlStatement instanceof ShowRDLStatement) {
+            return new RDLQueryBackendHandler(backendConnection, sqlStatement);
+        }
         if (sqlStatement instanceof RDLStatement || sqlStatement instanceof CreateDatabaseStatement || sqlStatement instanceof DropDatabaseStatement) {
-            return new RDLBackendHandler(backendConnection, sqlStatement);
+            return new RDLUpdateBackendHandler(backendConnection, sqlStatement);
         }
         return DatabaseBackendHandlerFactory.newInstance(sqlStatement, sql, backendConnection);
     }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java
new file mode 100644
index 0000000..8569ec3
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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.metadata.rdl;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.rdl.ShowShardingRuleStatementContext;
+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.TextProtocolBackendHandler;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Optional;
+
+/**
+ * Backend handler for RDL query.
+ */
+@RequiredArgsConstructor
+public final class RDLQueryBackendHandler implements TextProtocolBackendHandler {
+    
+    private final BackendConnection backendConnection;
+    
+    private final SQLStatement sqlStatement;
+    
+    private Iterator<RuleConfiguration> ruleConfigData;
+    
+    @Override
+    public ResponseHeader execute() {
+        SQLStatementContext<?> context = getSQLStatementContext();
+        return getResponseHeader(context);
+    }
+    
+    private ResponseHeader execute(final ShowShardingRuleStatementContext context) {
+        String schemaName = null == context.getSqlStatement().getSchemaName() ? backendConnection.getSchemaName() : context.getSqlStatement().getSchemaName().getIdentifier().getValue();
+        QueryHeader queryHeader = new QueryHeader(schemaName, "", "ShardingRule", "ShardingRule", Types.CHAR, "CHAR", 255, 0, false, false, false, false);
+        Optional<RuleConfiguration> ruleConfig = 
+                ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations().stream().filter(each -> each instanceof ShardingRuleConfiguration).findAny();
+        ruleConfig.ifPresent(shardingSphereRule -> ruleConfigData = Collections.singleton(shardingSphereRule).iterator());
+        return new QueryResponseHeader(Collections.singletonList(queryHeader));
+    }
+    
+    private SQLStatementContext<?> getSQLStatementContext() {
+        if (sqlStatement instanceof ShowShardingRuleStatement) {
+            return new ShowShardingRuleStatementContext((ShowShardingRuleStatement) sqlStatement);
+        }
+        throw new UnsupportedOperationException(sqlStatement.getClass().getName());
+    }
+    
+    private ResponseHeader getResponseHeader(final SQLStatementContext<?> context) {
+        if (context instanceof ShowShardingRuleStatementContext) {
+            return execute((ShowShardingRuleStatementContext) context);
+        }
+        throw new UnsupportedOperationException(context.getClass().getName());
+    }
+    
+    @Override
+    public boolean next() {
+        return null != ruleConfigData && ruleConfigData.hasNext();
+    }
+    
+    @Override
+    public Collection<Object> getRowData() {
+        RuleConfiguration ruleConfig = ruleConfigData.next();
+        YamlRuleConfiguration yamlRuleConfig = new YamlRuleConfigurationSwapperEngine().swapToYamlConfigurations(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/metadata/rdl/RDLBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
similarity index 78%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
index 46a33a4..edc98d8 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.proxy.backend.text.metadata.rdl;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateDataSourcesStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.show.ShowRDLStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
 import org.apache.shardingsphere.governance.core.event.model.datasource.DataSourcePersistEvent;
 import org.apache.shardingsphere.governance.core.event.model.rule.RuleConfigurationsPersistEvent;
@@ -36,21 +35,16 @@ import org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration
 import org.apache.shardingsphere.infra.context.metadata.impl.StandardMetaDataContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
-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.exception.DBCreateExistsException;
 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.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
 import org.apache.shardingsphere.proxy.config.util.DataSourceParameterConverter;
 import org.apache.shardingsphere.proxy.config.yaml.YamlDataSourceParameter;
 import org.apache.shardingsphere.proxy.converter.CreateDataSourcesStatementContextConverter;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.converter.CreateShardingRuleStatementContextConverter;
 import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -58,29 +52,24 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateDatab
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement;
 
 import java.sql.SQLException;
-import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Optional;
 
 /**
- * Backend handler for RDL.
+ * Backend handler for RDL update.
  */
 @RequiredArgsConstructor
-public final class RDLBackendHandler implements TextProtocolBackendHandler {
+public final class RDLUpdateBackendHandler implements TextProtocolBackendHandler {
     
     private final BackendConnection backendConnection;
     
     private final SQLStatement sqlStatement;
     
-    private Iterator<RuleConfiguration> ruleConfigData;
-    
     @Override
     public ResponseHeader execute() throws SQLException {
         SQLStatementContext<?> context = getSQLStatementContext();
-        if (!isRegistryCenterExisted() && !isQuery()) {
+        if (!isRegistryCenterExisted()) {
             throw new SQLException(String.format("No Registry center to execute `%s` SQL", context.getClass().getSimpleName()));
         }
         return getResponseHeader(context);
@@ -121,15 +110,6 @@ public final class RDLBackendHandler implements TextProtocolBackendHandler {
         return new UpdateResponseHeader(context.getSqlStatement());
     }
     
-    private ResponseHeader execute(final ShowShardingRuleStatementContext context) {
-        String schemaName = null == context.getSqlStatement().getSchemaName() ? backendConnection.getSchemaName() : context.getSqlStatement().getSchemaName().getIdentifier().getValue();
-        QueryHeader queryHeader = new QueryHeader(schemaName, "", "ShardingRule", "ShardingRule", Types.CHAR, "CHAR", 255, 0, false, false, false, false);
-        Optional<RuleConfiguration> ruleConfig = 
-                ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations().stream().filter(each -> each instanceof ShardingRuleConfiguration).findAny();
-        ruleConfig.ifPresent(shardingSphereRule -> ruleConfigData = Collections.singleton(shardingSphereRule).iterator());
-        return new QueryResponseHeader(Collections.singletonList(queryHeader));
-    }
-    
     private SQLStatementContext<?> getSQLStatementContext() {
         DatabaseType databaseType = ProxyContext.getInstance().getMetaDataContexts().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType();
         if (sqlStatement instanceof CreateDataSourcesStatement) {
@@ -163,29 +143,10 @@ public final class RDLBackendHandler implements TextProtocolBackendHandler {
         if (context instanceof CreateShardingRuleStatementContext) {
             return execute((CreateShardingRuleStatementContext) context);
         }
-        if (context instanceof ShowShardingRuleStatementContext) {
-            return execute((ShowShardingRuleStatementContext) context);
-        }
         throw new UnsupportedOperationException(context.getClass().getName());
     }
     
     private boolean isRegistryCenterExisted() {
         return !(ProxyContext.getInstance().getMetaDataContexts() instanceof StandardMetaDataContexts);
     }
-    
-    private boolean isQuery() {
-        return sqlStatement instanceof ShowRDLStatement;
-    }
-    
-    @Override
-    public boolean next() {
-        return null != ruleConfigData && ruleConfigData.hasNext();
-    }
-    
-    @Override
-    public Collection<Object> getRowData() {
-        RuleConfiguration ruleConfig = ruleConfigData.next();
-        YamlRuleConfiguration yamlRuleConfig = new YamlRuleConfigurationSwapperEngine().swapToYamlConfigurations(Collections.singleton(ruleConfig)).iterator().next();
-        return Collections.singleton(YamlEngine.marshal(yamlRuleConfig));
-    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandlerTest.java
index 74d9db5..f2ccc23 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLBackendHandlerTest.java
@@ -80,7 +80,7 @@ public final class RDLBackendHandlerTest {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
         sqlStatement.setDatabaseName("new_db");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(connection, sqlStatement);
+        RDLUpdateBackendHandler executeEngine = new RDLUpdateBackendHandler(connection, sqlStatement);
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {
@@ -105,7 +105,7 @@ public final class RDLBackendHandlerTest {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
         sqlStatement.setDatabaseName("schema");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(connection, sqlStatement);
+        RDLUpdateBackendHandler executeEngine = new RDLUpdateBackendHandler(connection, sqlStatement);
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {
@@ -130,7 +130,7 @@ public final class RDLBackendHandlerTest {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
         sqlStatement.setDatabaseName("schema");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(connection, sqlStatement);
+        RDLUpdateBackendHandler executeEngine = new RDLUpdateBackendHandler(connection, sqlStatement);
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {
@@ -154,7 +154,7 @@ public final class RDLBackendHandlerTest {
     public void assertExecuteDataSourcesContext() throws SQLException {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(connection, mock(CreateDataSourcesStatement.class));
+        RDLUpdateBackendHandler executeEngine = new RDLUpdateBackendHandler(connection, mock(CreateDataSourcesStatement.class));
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {
@@ -169,7 +169,7 @@ public final class RDLBackendHandlerTest {
     public void assertExecuteShardingRuleContext() throws SQLException {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(connection, mock(CreateShardingRuleStatement.class));
+        RDLUpdateBackendHandler executeEngine = new RDLUpdateBackendHandler(connection, mock(CreateShardingRuleStatement.class));
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {