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

jianglongtao 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 39a6fa58c4e Refactor export storage nodes, add param databaseName 
(#24589)
39a6fa58c4e is described below

commit 39a6fa58c4e757ce9c1644010cf37400a4279382
Author: ChenJiaHao <[email protected]>
AuthorDate: Tue Mar 14 16:01:07 2023 +0800

    Refactor export storage nodes, add param databaseName (#24589)
    
    * Refactor export storage nodes, add param databaseName
    
    * Add databaseName check and related test cases;
---
 .../parser/src/main/antlr4/imports/RALStatement.g4 |  2 +-
 .../core/kernel/KernelDistSQLStatementVisitor.java |  2 +-
 .../ral/queryable/ExportStorageNodesStatement.java |  4 ++
 .../distsql/export/ExportedStorageNode.java        |  4 ++
 .../distsql/export/ExportedStorageNodes.java       |  4 ++
 .../ral/queryable/ExportStorageNodesExecutor.java  | 52 ++++++++++-------
 .../queryable/ExportStorageNodesExecutorTest.java  | 65 +++++++++++++++++++---
 .../resources/expected/export-storage-nodes.json   |  2 +-
 .../ral/impl/QueryableRALStatementAssert.java      |  5 ++
 .../ExportStorageNodesStatementAssert.java         | 47 ++++++++++++++++
 .../cases/parser/jaxb/RootSQLParserTestCases.java  |  4 ++
 .../ral/ExportStorageNodesStatementTestCase.java   | 21 ++-----
 .../src/main/resources/case/ral/queryable.xml      |  1 +
 .../main/resources/sql/supported/ral/queryable.xml |  1 +
 14 files changed, 167 insertions(+), 47 deletions(-)

diff --git a/distsql/parser/src/main/antlr4/imports/RALStatement.g4 
b/distsql/parser/src/main/antlr4/imports/RALStatement.g4
index 64a0408ec0c..1fd64287b1f 100644
--- a/distsql/parser/src/main/antlr4/imports/RALStatement.g4
+++ b/distsql/parser/src/main/antlr4/imports/RALStatement.g4
@@ -92,7 +92,7 @@ importMetaData
     ;
 
 exportStorageNodes
-    : EXPORT STORAGE NODES (TO FILE filePath)?
+    : EXPORT STORAGE NODES (FROM databaseName)? (TO FILE filePath)?
     ;
 
 convertYamlConfiguration
diff --git 
a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
 
b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index 47cd7332329..8df35ca66c6 100644
--- 
a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ 
b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -304,7 +304,7 @@ public final class KernelDistSQLStatementVisitor extends 
KernelDistSQLStatementB
     
     @Override
     public ASTNode visitExportStorageNodes(final ExportStorageNodesContext 
ctx) {
-        return new ExportStorageNodesStatement(null == ctx.filePath() ? null : 
getIdentifierValue(ctx.filePath()));
+        return new ExportStorageNodesStatement(null == ctx.databaseName() ? 
null : getIdentifierValue(ctx.databaseName()), null == ctx.filePath() ? null : 
getIdentifierValue(ctx.filePath()));
     }
     
     @Override
diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
index 2e3af2638b1..c41536a84c7 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.distsql.parser.statement.ral.queryable;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.QueryableRALStatement;
 
@@ -28,6 +29,9 @@ import java.util.Optional;
 @RequiredArgsConstructor
 public final class ExportStorageNodesStatement extends QueryableRALStatement {
     
+    @Getter
+    private final String databaseName;
+    
     private final String filePath;
     
     /**
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
index e1c88953785..8bfe13b710a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
@@ -17,7 +17,9 @@
 
 package org.apache.shardingsphere.proxy.backend.distsql.export;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 /**
@@ -25,6 +27,8 @@ import lombok.Setter;
  */
 @Getter
 @Setter
+@NoArgsConstructor
+@AllArgsConstructor
 public class ExportedStorageNode {
     
     private String ip;
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
index d9e2dff3223..c05daead53f 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
@@ -18,7 +18,9 @@
 package org.apache.shardingsphere.proxy.backend.distsql.export;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 import java.util.Collection;
@@ -28,6 +30,8 @@ import java.util.Collection;
  */
 @Getter
 @Setter
+@NoArgsConstructor
+@AllArgsConstructor
 public class ExportedStorageNodes {
     
     @JsonProperty("storage_nodes")
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
index adaf8a9c490..34e9b4c15d6 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
-import 
org.apache.shardingsphere.distsql.handler.ral.query.DatabaseRequiredQueryableRALExecutor;
+import 
org.apache.shardingsphere.distsql.handler.ral.query.MetaDataRequiredQueryableRALExecutor;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedStorageNode;
@@ -36,11 +36,12 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * Export storage nodes executor.
  */
-public final class ExportStorageNodesExecutor implements 
DatabaseRequiredQueryableRALExecutor<ExportStorageNodesStatement> {
+public final class ExportStorageNodesExecutor implements 
MetaDataRequiredQueryableRALExecutor<ExportStorageNodesStatement> {
     
     @Override
     public Collection<String> getColumnNames() {
@@ -48,8 +49,9 @@ public final class ExportStorageNodesExecutor implements 
DatabaseRequiredQueryab
     }
     
     @Override
-    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ExportStorageNodesStatement 
sqlStatement) {
-        String exportedData = generateExportData(database);
+    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereMetaData metaData, final ExportStorageNodesStatement 
sqlStatement) {
+        checkSQLStatement(metaData, sqlStatement);
+        String exportedData = generateExportData(metaData, sqlStatement);
         if (sqlStatement.getFilePath().isPresent()) {
             String filePath = sqlStatement.getFilePath().get();
             ExportUtils.exportToFile(filePath, exportedData);
@@ -60,31 +62,41 @@ public final class ExportStorageNodesExecutor implements 
DatabaseRequiredQueryab
                 new 
LocalDataQueryResultRow(ProxyContext.getInstance().getContextManager().getInstanceContext().getInstance().getCurrentInstanceId(),
 LocalDateTime.now(), exportedData));
     }
     
-    private String generateExportData(final ShardingSphereDatabase database) {
-        ExportedStorageNodes storageNodes = new ExportedStorageNodes();
-        storageNodes.setStorageNodes(generateExportStorageNodeData(database));
-        return JsonUtils.toJsonString(storageNodes);
+    private void checkSQLStatement(final ShardingSphereMetaData metaData, 
final ExportStorageNodesStatement sqlStatement) {
+        if (Objects.nonNull(sqlStatement.getDatabaseName()) && null == 
metaData.getDatabase(sqlStatement.getDatabaseName())) {
+            throw new IllegalArgumentException(String.format("database %s is 
not existed", sqlStatement.getDatabaseName()));
+        }
+    }
+    
+    private String generateExportData(final ShardingSphereMetaData metaData, 
final ExportStorageNodesStatement sqlStatement) {
+        return JsonUtils.toJsonString(new 
ExportedStorageNodes(Objects.isNull(sqlStatement.getDatabaseName()) ? 
getAllStorageNodes(metaData)
+                : 
generateExportStorageNodeData(metaData.getDatabase(sqlStatement.getDatabaseName())).values()));
+    }
+    
+    private Collection<ExportedStorageNode> getAllStorageNodes(final 
ShardingSphereMetaData metaData) {
+        Map<String, ExportedStorageNode> storageNodes = new LinkedHashMap<>();
+        metaData.getDatabases().values().forEach(each -> 
storageNodes.putAll(generateExportStorageNodeData(each)));
+        return storageNodes.values();
     }
     
-    private Collection<ExportedStorageNode> 
generateExportStorageNodeData(final ShardingSphereDatabase database) {
+    private Map<String, ExportedStorageNode> 
generateExportStorageNodeData(final ShardingSphereDatabase database) {
         Map<String, ExportedStorageNode> storageNodes = new LinkedHashMap<>();
         database.getResourceMetaData().getDataSources().forEach((key, value) 
-> {
             DataSourceMetaData dataSourceMetaData = 
database.getResourceMetaData().getDataSourceMetaData(key);
-            String databaseInstanceIp = dataSourceMetaData.getHostname() + ":" 
+ dataSourceMetaData.getPort();
+            String databaseInstanceIp = 
getDatabaseInstanceIp(dataSourceMetaData);
             if (storageNodes.containsKey(databaseInstanceIp)) {
                 return;
             }
-            ExportedStorageNode exportedStorageNode = new 
ExportedStorageNode();
-            exportedStorageNode.setIp(dataSourceMetaData.getHostname());
-            
exportedStorageNode.setPort(String.valueOf(dataSourceMetaData.getPort()));
-            exportedStorageNode.setDatabase(dataSourceMetaData.getCatalog());
-            DataSourceProperties dataSourceProps = 
DataSourcePropertiesCreator.create(value);
-            Map<String, Object> standardProperties = 
dataSourceProps.getConnectionPropertySynonyms().getStandardProperties();
-            
exportedStorageNode.setUsername(String.valueOf(standardProperties.get("username")));
-            
exportedStorageNode.setPassword(String.valueOf(standardProperties.get("password")));
+            Map<String, Object> standardProperties = 
DataSourcePropertiesCreator.create(value).getConnectionPropertySynonyms().getStandardProperties();
+            ExportedStorageNode exportedStorageNode = new 
ExportedStorageNode(dataSourceMetaData.getHostname(), 
String.valueOf(dataSourceMetaData.getPort()), dataSourceMetaData.getCatalog(),
+                    String.valueOf(standardProperties.get("username")), 
String.valueOf(standardProperties.get("password")));
             storageNodes.put(databaseInstanceIp, exportedStorageNode);
         });
-        return storageNodes.values();
+        return storageNodes;
+    }
+    
+    private String getDatabaseInstanceIp(final DataSourceMetaData 
dataSourceMetaData) {
+        return String.format("%s:%s", dataSourceMetaData.getHostname(), 
dataSourceMetaData.getPort());
     }
     
     @Override
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
index 221fdeec211..b51c9abf111 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
@@ -18,10 +18,19 @@
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
 import lombok.SneakyThrows;
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
+import 
org.apache.shardingsphere.authority.rule.builder.DefaultAuthorityRuleConfigurationBuilder;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
 import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
@@ -43,6 +52,7 @@ import java.io.IOException;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -51,6 +61,7 @@ import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -71,30 +82,70 @@ public final class ExportStorageNodesExecutorTest {
         assertThat(columnIterator.next(), is("storage_nodes"));
     }
     
+    @Test
+    public void assertExecuteWithWrongDatabaseName() {
+        ContextManager contextManager = mockEmptyContextManager();
+        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+        
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("empty_metadata"));
+        ExportStorageNodesStatement sqlStatement = new 
ExportStorageNodesStatement("foo", null);
+        assertThrows(IllegalArgumentException.class, () -> new 
ExportStorageNodesExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 sqlStatement));
+    }
+    
     @Test
     public void assertExecuteWithEmptyMetaData() {
-        when(database.getName()).thenReturn("empty_metadata");
-        
when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata"));
-        
when(database.getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
-        
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
-        ExportStorageNodesStatement sqlStatement = new 
ExportStorageNodesStatement(null);
-        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(database, sqlStatement);
+        ContextManager contextManager = mockEmptyContextManager();
+        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+        
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("empty_metadata"));
+        ExportStorageNodesStatement sqlStatement = new 
ExportStorageNodesStatement(null, null);
+        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 sqlStatement);
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
         assertThat(row.getCell(3), is("{\"storage_nodes\":[]}"));
     }
     
+    private ContextManager mockEmptyContextManager() {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(new HashMap<>(),
+                new ShardingSphereRuleMetaData(Collections.emptyList()), new 
ConfigurationProperties(new Properties())));
+        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        return result;
+    }
+    
     @Test
     public void assertExecute() throws SQLException {
         when(database.getName()).thenReturn("normal_db");
         
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
         
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createShardingRuleConfiguration()));
-        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(database, new 
ExportStorageNodesStatement(null));
+        ContextManager contextManager = mockContextManager();
+        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 new ExportStorageNodesStatement(null, null));
+        assertThat(actual.size(), is(1));
+        LocalDataQueryResultRow row = actual.iterator().next();
+        assertThat(row.getCell(3), is(loadExpectedRow()));
+    }
+    
+    @Test
+    public void assertExecuteWithDatabaseName() {
+        when(database.getName()).thenReturn("normal_db");
+        
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
+        
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createShardingRuleConfiguration()));
+        ContextManager contextManager = mockContextManager();
+        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 new ExportStorageNodesStatement("normal_db", null));
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
         assertThat(row.getCell(3), is(loadExpectedRow()));
     }
     
+    private ContextManager mockContextManager() {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(Collections.singletonMap(database.getName(), database),
+                new ShardingSphereRuleMetaData(Collections.singleton(new 
AuthorityRule(new DefaultAuthorityRuleConfigurationBuilder().build(), 
Collections.emptyMap()))),
+                new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true")))));
+        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+        return result;
+    }
+    
     private Map<String, DataSource> createDataSourceMap() {
         Map<String, DataSource> result = new LinkedHashMap<>(2, 1);
         result.put("ds_0", createDataSource("demo_ds_0"));
diff --git 
a/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json 
b/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json
index d58b25ecc5d..860094e543c 100644
--- a/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json
+++ b/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json
@@ -1 +1 @@
-{"storage_nodes":[{"port":"0","username":"root","password":""}]}
+{"storage_nodes":[{"port":"0","password":"root","database":""}]}
\ No newline at end of file
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/QueryableRALStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/QueryableRALStatementAssert.java
index a034b711499..36aa8288f5a 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/QueryableRALStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/QueryableRALStatementAssert.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.distsql.parser.statement.ral.QueryableRALStatem
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportDatabaseConfigurationStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportMetaDataStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodeInfoStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodeModeStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodesStatement;
@@ -37,6 +38,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAsse
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ConvertYamlConfigurationStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ExportDatabaseConfigurationStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ExportMetaDataStatementAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ExportStorageNodesStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ShowAuthorityRuleStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ShowComputeNodeInfoStatementAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable.ShowComputeNodeModeStatementAssert;
@@ -53,6 +55,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.S
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ConvertYamlConfigurationStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportDatabaseConfigurationStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportMetaDataStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportStorageNodesStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ShowAuthorityRuleStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ShowComputeNodeInfoStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ShowComputeNodeModeStatementTestCase;
@@ -105,6 +108,8 @@ public final class QueryableRALStatementAssert {
             ExportDatabaseConfigurationStatementAssert.assertIs(assertContext, 
(ExportDatabaseConfigurationStatement) actual, 
(ExportDatabaseConfigurationStatementTestCase) expected);
         } else if (actual instanceof ExportMetaDataStatement) {
             ExportMetaDataStatementAssert.assertIs(assertContext, 
(ExportMetaDataStatement) actual, (ExportMetaDataStatementTestCase) expected);
+        } else if (actual instanceof ExportStorageNodesStatement) {
+            ExportStorageNodesStatementAssert.assertIs(assertContext, 
(ExportStorageNodesStatement) actual, (ExportStorageNodesStatementTestCase) 
expected);
         } else if (actual instanceof ShowSQLTranslatorRuleStatement) {
             ShowSQLTranslatorRuleStatementAssert.assertIs(assertContext, 
(ShowSQLTranslatorRuleStatement) actual, 
(ShowSQLTranslatorRuleStatementTestCase) expected);
         } else if (actual instanceof ShowComputeNodeInfoStatement) {
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ExportStorageNodesStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ExportStorageNodesStatementAssert.java
new file mode 100644
index 00000000000..369ed359d66
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ral/impl/queryable/ExportStorageNodesStatementAssert.java
@@ -0,0 +1,47 @@
+/*
+ * 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.test.it.sql.parser.internal.asserts.statement.ral.impl.queryable;
+
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportStorageNodesStatementTestCase;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+/**
+ * Export storage nodes statement assert.
+ */
+public final class ExportStorageNodesStatementAssert {
+    
+    /**
+     * Assert export storage nodes statement is correct with expected parser 
result.
+     * 
+     * @param assertContext assert context
+     * @param actual actual export storage nodes statement
+     * @param expected expected export storage nodes statement test case
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final ExportStorageNodesStatement actual,
+                                final ExportStorageNodesStatementTestCase 
expected) {
+        if (null == expected) {
+            assertNull(actual, assertContext.getText("Actual statement should 
not exist."));
+        } else {
+            assertNotNull(actual, assertContext.getText("Actual statement 
should exist."));
+        }
+    }
+}
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
index da246c497e8..e21cf8f5322 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
@@ -296,6 +296,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.DiscardDistSQLStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportDatabaseConfigurationStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportMetaDataStatementTestCase;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ExportStorageNodesStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ImportDatabaseConfigurationStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.ImportMetaDataStatementTestCase;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral.LabelComputeNodeStatementTestCase;
@@ -1407,6 +1408,9 @@ public final class RootSQLParserTestCases {
     @XmlElement(name = "export-metadata")
     private final List<ExportMetaDataStatementTestCase> 
exportMetaDataStatementTestCases = new LinkedList<>();
     
+    @XmlElement(name = "export-storage-nodes")
+    private final List<ExportStorageNodesStatementTestCase> 
exportStorageNodesStatementTestCases = new LinkedList<>();
+    
     @XmlElement(name = "convert-yaml-config")
     private final List<ConvertYamlConfigurationStatementTestCase> 
convertYamlConfigurationStatementTestCases = new LinkedList<>();
     
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ExportStorageNodesStatementTestCase.java
similarity index 70%
copy from 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
copy to 
test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ExportStorageNodesStatementTestCase.java
index e1c88953785..25c4d1ac1a7 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNode.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ral/ExportStorageNodesStatementTestCase.java
@@ -15,25 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.distsql.export;
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ral;
 
-import lombok.Getter;
-import lombok.Setter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.DatabaseContainedTestCase;
 
 /**
- * Exported storage node.
+ * Export storage nodes statement test case.
  */
-@Getter
-@Setter
-public class ExportedStorageNode {
-    
-    private String ip;
-    
-    private String port;
-    
-    private String username;
-    
-    private String password;
-    
-    private String database;
+public final class ExportStorageNodesStatementTestCase extends 
DatabaseContainedTestCase {
 }
diff --git a/test/it/parser/src/main/resources/case/ral/queryable.xml 
b/test/it/parser/src/main/resources/case/ral/queryable.xml
index 4cd391b979b..6f63f1f2a07 100644
--- a/test/it/parser/src/main/resources/case/ral/queryable.xml
+++ b/test/it/parser/src/main/resources/case/ral/queryable.xml
@@ -41,6 +41,7 @@
         <database name="database_name" start-index="28" stop-index="40" />
     </export-database-config>
     <export-metadata sql-case-id="export-metadata" />
+    <export-storage-nodes sql-case-id="export-storage-nodes" />
     <convert-yaml-config sql-case-id="convert-yaml-config">
         <file-path>/yaml/config-sharding.yaml</file-path>
     </convert-yaml-config>
diff --git a/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml 
b/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
index 2eebb1ba0b0..554865c6ba3 100644
--- a/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ral/queryable.xml
@@ -36,5 +36,6 @@
     
     <sql-case id="export-database-config" value="EXPORT DATABASE CONFIGURATION 
FROM database_name" db-types="ShardingSphere" />
     <sql-case id="export-metadata" value="EXPORT METADATA" 
db-types="ShardingSphere" />
+    <sql-case id="export-storage-nodes" value="EXPORT STORAGE NODES" 
db-types="ShardingSphere" />
     <sql-case id="convert-yaml-config" value="CONVERT YAML CONFIGURATION FROM 
FILE '/yaml/config-sharding.yaml'" db-types="ShardingSphere" />
 </sql-cases>

Reply via email to