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 2022/06/25 16:48:41 UTC

[shardingsphere] branch master updated: Improve ExportDatabaseConfigurationHandler (#18593)

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 064509895e7 Improve ExportDatabaseConfigurationHandler (#18593)
064509895e7 is described below

commit 064509895e7c7bcbdb59480fbf4e79e9d1ebd97f
Author: 小马哥 <77...@users.noreply.github.com>
AuthorDate: Sun Jun 26 00:48:35 2022 +0800

    Improve ExportDatabaseConfigurationHandler (#18593)
---
 .../representer/processor/NoneYamlTupleProcessor.java  |  7 ++++++-
 .../shardingsphere/infra/yaml/engine/YamlEngine.java   | 18 +++++++++++++++++-
 .../processor/DefaultYamlTupleProcessor.java           |  3 ++-
 .../queryable/ExportDatabaseConfigurationHandler.java  |  8 +++++++-
 .../expected/export-database-configuration.yaml        |  8 +-------
 5 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
index a00cc868881..e27ce7cdbdd 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/yaml/engine/representer/processor/NoneYamlTupleProcessor.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.sharding.yaml.engine.representer.processor;
 
 import org.apache.shardingsphere.infra.yaml.engine.representer.processor.ShardingSphereYamlTupleProcessor;
 import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.nodes.MappingNode;
 import org.yaml.snakeyaml.nodes.Node;
 import org.yaml.snakeyaml.nodes.NodeTuple;
 import org.yaml.snakeyaml.nodes.ScalarNode;
@@ -36,13 +37,17 @@ public final class NoneYamlTupleProcessor implements ShardingSphereYamlTupleProc
     
     @Override
     public NodeTuple process(final NodeTuple nodeTuple) {
-        return isNullNode(nodeTuple.getValueNode()) ? null : processNoneTuple(nodeTuple);
+        return (isNullNode(nodeTuple.getValueNode()) || isEmptyMappingNode(nodeTuple.getValueNode())) ? null : processNoneTuple(nodeTuple);
     }
     
     private boolean isNullNode(final Node valueNode) {
         return Tag.NULL.equals(valueNode.getTag());
     }
     
+    private boolean isEmptyMappingNode(final Node valueNode) {
+        return Tag.MAP.equals(valueNode.getTag()) && ((MappingNode) valueNode).getValue().isEmpty();
+    }
+    
     private NodeTuple processNoneTuple(final NodeTuple noneTuple) {
         return new NodeTuple(noneTuple.getKeyNode(), new ScalarNode(Tag.STR, "", null, null, DumperOptions.ScalarStyle.PLAIN));
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
index b592c1cb7f8..44b346d58ed 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/YamlEngine.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.yaml.engine.constructor.ShardingSphereYam
 import org.apache.shardingsphere.infra.yaml.engine.representer.ShardingSphereYamlRepresenter;
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.nodes.Tag;
 import org.yaml.snakeyaml.representer.Representer;
 
 import java.io.ByteArrayInputStream;
@@ -106,10 +107,25 @@ public final class YamlEngine {
      * @return YAML content
      */
     public static String marshal(final Object value) {
+        return marshal(value, null);
+    }
+    
+    /**
+     * Marshal YAML.
+     *
+     * @param value object to be marshaled
+     * @param classTag class tag
+     * @return YAML content
+     */
+    public static String marshal(final Object value, final Tag classTag) {
         DumperOptions dumperOptions = new DumperOptions();
         dumperOptions.setLineBreak(DumperOptions.LineBreak.getPlatformLineBreak());
+        ShardingSphereYamlRepresenter shardingSphereYamlRepresenter = new ShardingSphereYamlRepresenter();
+        if (classTag != null) {
+            shardingSphereYamlRepresenter.addClassTag(value.getClass(), classTag);
+        }
         if (value instanceof Collection) {
-            return new Yaml(new ShardingSphereYamlRepresenter(), dumperOptions).dumpAs(value, null, DumperOptions.FlowStyle.BLOCK);
+            return new Yaml(shardingSphereYamlRepresenter, dumperOptions).dumpAs(value, null, DumperOptions.FlowStyle.BLOCK);
         }
         return new Yaml(new ShardingSphereYamlRepresenter(), dumperOptions).dumpAsMap(value);
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
index 6aa5f8a3b29..fd2a9e078a1 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/yaml/engine/representer/processor/DefaultYamlTupleProcessor.java
@@ -56,6 +56,7 @@ public final class DefaultYamlTupleProcessor {
     }
     
     private boolean isEmptyMappingNode(final Node valueNode) {
-        return Tag.MAP.equals(valueNode.getTag()) && ((MappingNode) valueNode).getValue().isEmpty();
+        return Tag.MAP.equals(valueNode.getTag()) && (((MappingNode) valueNode).getValue().isEmpty()
+                || ((MappingNode) valueNode).getValue().stream().filter(each -> Tag.NULL.equals(each.getValueNode().getTag())).findFirst().isPresent());
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
index 8d2254e5969..2b1717db9c8 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ExportDatabaseConfigurationHandler.java
@@ -33,6 +33,7 @@ import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
 import org.apache.shardingsphere.proxy.backend.text.distsql.ral.QueryableRALBackendHandler;
+import org.yaml.snakeyaml.nodes.Tag;
 
 import javax.sql.DataSource;
 import java.io.File;
@@ -111,10 +112,15 @@ public final class ExportDatabaseConfigurationHandler extends QueryableRALBacken
         }
         stringBuilder.append("rules").append(":\n");
         for (Entry<RuleConfiguration, YamlRuleConfigurationSwapper> entry : YamlRuleConfigurationSwapperFactory.getInstanceMapByRuleConfigurations(ruleConfigs).entrySet()) {
-            stringBuilder.append(YamlEngine.marshal(Collections.singleton(entry.getValue().swapToYamlConfiguration(entry.getKey()))));
+            String actual = YamlEngine.marshal(Collections.singleton(entry.getValue().swapToYamlConfiguration(entry.getKey())), Tag.MAP);
+            stringBuilder.append(rulesConfigKeywordReplace(actual));
         }
     }
     
+    private String rulesConfigKeywordReplace(final String rulesConfig) {
+        return rulesConfig.replace("? ", "- ").replace(": null\n", "");
+    }
+    
     @SuppressWarnings("ResultOfMethodCallIgnored")
     private void exportToFile(final String filePath, final String exportedData) {
         File file = new File(filePath);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
index 1a25aa4550b..4eaa70dc6e3 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/export-database-configuration.yaml
@@ -30,19 +30,14 @@ dataSources:
     minPoolSize: 1
     maxPoolSize: 50
 rules:
-!!set
-? !SHARDING
+- !SHARDING
   defaultDatabaseStrategy:
     standard:
       shardingAlgorithmName: ds_inline
       shardingColumn: order_id
-  defaultTableStrategy:
-    none: ''
   keyGenerators:
     snowflake:
       type: SNOWFLAKE
-  scaling:
-    default_scaling: null
   scalingName: default_scaling
   shardingAlgorithms:
     ds_inline:
@@ -56,4 +51,3 @@ rules:
         column: order_id
         keyGeneratorName: snowflake
       logicTable: t_order
-: null