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>