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));
}
}