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 1d7c45f20b6 Refactor DataNode (#36941)
1d7c45f20b6 is described below

commit 1d7c45f20b655c86672605829dba327a3abed7cf
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Oct 26 00:10:50 2025 +0800

    Refactor DataNode (#36941)
    
    * Refactor DataNode
    
    * Refactor DataNode
---
 .../shardingsphere/infra/datanode/DataNode.java    | 99 +++++++++++-----------
 1 file changed, 48 insertions(+), 51 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/datanode/DataNode.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/datanode/DataNode.java
index 094df632ef3..c85f0c08144 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/datanode/DataNode.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/datanode/DataNode.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.datanode;
 
+import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString;
 import com.google.common.base.Objects;
 import com.google.common.base.Splitter;
 import lombok.Getter;
@@ -78,55 +79,44 @@ public final class DataNode {
      */
     public DataNode(final String databaseName, final DatabaseType 
databaseType, final String dataNode) {
         ShardingSpherePreconditions.checkState(dataNode.contains(DELIMITER), 
() -> new InvalidDataNodeFormatException(dataNode));
-        boolean containsSchema = isSchemaAvailable(databaseType) && 
isValidDataNode(dataNode, 3);
+        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
+        boolean containsSchema = 
dialectDatabaseMetaData.getSchemaOption().isSchemaAvailable() && 
isValidDataNode(dataNode, 3);
         List<String> segments = Splitter.on(DELIMITER).limit(containsSchema ? 
3 : 2).splitToList(dataNode);
         dataSourceName = segments.get(0);
-        schemaName = getSchemaName(databaseName, databaseType, containsSchema, 
segments);
+        schemaName = getSchemaName(databaseName, dialectDatabaseMetaData, 
containsSchema, segments);
         tableName = containsSchema ? segments.get(2).toLowerCase() : 
segments.get(1).toLowerCase();
     }
     
-    private boolean isSchemaAvailable(final DatabaseType databaseType) {
-        return new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable();
-    }
-    
-    private String getSchemaName(final String databaseName, final DatabaseType 
databaseType, final boolean containsSchema, final List<String> segments) {
-        DialectDatabaseMetaData dialectDatabaseMetaData = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData();
-        if 
(dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().isPresent()) {
-            return containsSchema ? segments.get(1) : ASTERISK;
-        }
-        return databaseName;
+    private String getSchemaName(final String databaseName, final 
DialectDatabaseMetaData dialectDatabaseMetaData, final boolean containsSchema, 
final List<String> segments) {
+        return 
dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().map(defaultSchema 
-> containsSchema ? segments.get(1) : ASTERISK).orElse(databaseName);
     }
     
-    private boolean isValidDataNode(final String dataNodeStr, final Integer 
tier) {
-        if (!dataNodeStr.contains(DELIMITER)) {
-            return false;
-        }
-        
-        // Check for leading or trailing delimiter
-        if (dataNodeStr.startsWith(DELIMITER) || 
dataNodeStr.endsWith(DELIMITER)) {
-            return false;
-        }
-        
-        // Check for consecutive delimiters (which would create empty segments)
-        if (dataNodeStr.contains(DELIMITER + DELIMITER)) {
-            return false;
-        }
-        
-        // Check for whitespace around delimiters
-        if (dataNodeStr.contains(" " + DELIMITER) || 
dataNodeStr.contains(DELIMITER + " ")) {
+    private boolean isValidDataNode(final String dataNodeStr, final int tier) {
+        if (hasInvalidDelimiterStructure(dataNodeStr)) {
             return false;
         }
-        
         List<String> segments = 
Splitter.on(DELIMITER).splitToList(dataNodeStr);
-        
-        // Check if any segment is empty or contains only whitespace
-        for (String segment : segments) {
-            if (segment.trim().isEmpty()) {
-                return false;
-            }
-        }
-        
-        return tier == segments.size();
+        return isAnySegmentIsEmptyOrContainsOnlyWhitespace(tier, segments);
+    }
+    
+    private boolean hasInvalidDelimiterStructure(final String dataNodeStr) {
+        return !dataNodeStr.contains(DELIMITER) || 
hasLeadingOrTrailingDelimiter(dataNodeStr) || 
hasConsecutiveDelimiters(dataNodeStr) || 
hasWhitespaceAroundDelimiters(dataNodeStr);
+    }
+    
+    private boolean hasLeadingOrTrailingDelimiter(final String dataNodeStr) {
+        return dataNodeStr.startsWith(DELIMITER) || 
dataNodeStr.endsWith(DELIMITER);
+    }
+    
+    private boolean hasConsecutiveDelimiters(final String dataNodeStr) {
+        return dataNodeStr.contains(DELIMITER + DELIMITER);
+    }
+    
+    private boolean hasWhitespaceAroundDelimiters(final String dataNodeStr) {
+        return dataNodeStr.contains(" " + DELIMITER) || 
dataNodeStr.contains(DELIMITER + " ");
+    }
+    
+    private boolean isAnySegmentIsEmptyOrContainsOnlyWhitespace(final int 
tier, final List<String> segments) {
+        return segments.stream().noneMatch(each -> each.trim().isEmpty()) && 
tier == segments.size();
     }
     
     /**
@@ -136,10 +126,7 @@ public final class DataNode {
      * @throws InvalidDataNodeFormatException if the format is invalid
      */
     private void validateDataNodeFormat(final String dataNode) {
-        // Check if it's a valid 2-segment or 3-segment format
-        if (!isValidDataNode(dataNode, 2) && !isValidDataNode(dataNode, 3)) {
-            throw new InvalidDataNodeFormatException(dataNode);
-        }
+        ShardingSpherePreconditions.checkState(isValidDataNode(dataNode, 2) || 
isValidDataNode(dataNode, 3), () -> new 
InvalidDataNodeFormatException(dataNode));
     }
     
     /**
@@ -148,7 +135,7 @@ public final class DataNode {
      * @return formatted data node
      */
     public String format() {
-        return null == schemaName ? String.join(DELIMITER, dataSourceName, 
tableName) : String.join(DELIMITER, dataSourceName, schemaName, tableName);
+        return null == schemaName ? formatWithoutSchema() : formatWithSchema();
     }
     
     /**
@@ -158,9 +145,19 @@ public final class DataNode {
      * @return formatted data node
      */
     public String format(final DatabaseType databaseType) {
-        return null != schemaName && new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption().getDefaultSchema().isPresent()
-                ? String.join(DELIMITER, dataSourceName, schemaName, tableName)
-                : String.join(DELIMITER, dataSourceName, tableName);
+        return shouldIncludeSchema(databaseType) ? formatWithSchema() : 
formatWithoutSchema();
+    }
+    
+    private boolean shouldIncludeSchema(final DatabaseType databaseType) {
+        return null != schemaName && new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption().getDefaultSchema().isPresent();
+    }
+    
+    private String formatWithSchema() {
+        return String.join(DELIMITER, dataSourceName, schemaName, tableName);
+    }
+    
+    private String formatWithoutSchema() {
+        return String.join(DELIMITER, dataSourceName, tableName);
     }
     
     @Override
@@ -172,13 +169,13 @@ public final class DataNode {
             return false;
         }
         DataNode dataNode = (DataNode) object;
-        return Objects.equal(dataSourceName.toUpperCase(), 
dataNode.dataSourceName.toUpperCase())
-                && Objects.equal(tableName.toUpperCase(), 
dataNode.tableName.toUpperCase())
-                && Objects.equal(null == schemaName ? null : 
schemaName.toUpperCase(), null == dataNode.schemaName ? null : 
dataNode.schemaName.toUpperCase());
+        return Objects.equal(new CaseInsensitiveString(dataSourceName), new 
CaseInsensitiveString(dataNode.dataSourceName))
+                && Objects.equal(new CaseInsensitiveString(tableName), new 
CaseInsensitiveString(dataNode.tableName))
+                && Objects.equal(null == schemaName ? null : new 
CaseInsensitiveString(schemaName), null == dataNode.schemaName ? null : new 
CaseInsensitiveString(dataNode.schemaName));
     }
     
     @Override
     public int hashCode() {
-        return Objects.hashCode(dataSourceName.toUpperCase(), 
tableName.toUpperCase(), null == schemaName ? null : schemaName.toUpperCase());
+        return Objects.hashCode(new CaseInsensitiveString(dataSourceName), new 
CaseInsensitiveString(tableName), null == schemaName ? null : new 
CaseInsensitiveString(schemaName));
     }
 }

Reply via email to