This is an automated email from the ASF dual-hosted git repository.
panjuan 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 5fae196979f Fix sonar issue of AbstractShadowDMLStatementRouteEngine
(#25896)
5fae196979f is described below
commit 5fae196979f2078971483233a9d734f9ad405bc0
Author: Liang Zhang <[email protected]>
AuthorDate: Thu May 25 22:13:34 2023 +0800
Fix sonar issue of AbstractShadowDMLStatementRouteEngine (#25896)
---
.../shadow/route/engine/ShadowRouteEngine.java | 10 +-
.../dml/AbstractShadowDMLStatementRouteEngine.java | 124 ++++++++-------------
.../impl/ShadowNonDMLStatementRoutingEngine.java | 25 ++---
.../mysql/command/MySQLCommandExecutorFactory.java | 1 +
4 files changed, 64 insertions(+), 96 deletions(-)
diff --git
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
index ca196d0714f..6e32191d80e 100644
---
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
+++
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/ShadowRouteEngine.java
@@ -36,24 +36,24 @@ public interface ShadowRouteEngine {
* Route.
*
* @param routeContext route context
- * @param shadowRule shadow rule
+ * @param rule shadow rule
*/
- void route(RouteContext routeContext, ShadowRule shadowRule);
+ void route(RouteContext routeContext, ShadowRule rule);
/**
* Decorate route context.
*
* @param routeContext route context to be decorated
- * @param shadowRule shadow rule
+ * @param rule shadow rule
* @param shadowDataSourceMappings shadow data source mappings
*/
- default void decorateRouteContext(final RouteContext routeContext, final
ShadowRule shadowRule, final Map<String, String> shadowDataSourceMappings) {
+ default void decorateRouteContext(final RouteContext routeContext, final
ShadowRule rule, final Map<String, String> shadowDataSourceMappings) {
Collection<RouteUnit> toBeRemovedRouteUnit = new LinkedList<>();
Collection<RouteUnit> toBeAddedRouteUnit = new LinkedList<>();
for (RouteUnit each : routeContext.getRouteUnits()) {
String logicName = each.getDataSourceMapper().getLogicName();
String actualName = each.getDataSourceMapper().getActualName();
- Optional<String> sourceDataSourceName =
shadowRule.getSourceDataSourceName(actualName);
+ Optional<String> sourceDataSourceName =
rule.getSourceDataSourceName(actualName);
if (sourceDataSourceName.isPresent()) {
String shadowDataSourceName =
shadowDataSourceMappings.get(sourceDataSourceName.get());
toBeRemovedRouteUnit.add(each);
diff --git
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
index 319e0dabfc6..1ff61eb2616 100644
---
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
+++
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/AbstractShadowDMLStatementRouteEngine.java
@@ -35,7 +35,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Optional;
@@ -48,96 +47,90 @@ public abstract class AbstractShadowDMLStatementRouteEngine
implements ShadowRou
private final Map<String, String> tableAliasNameMappings = new
LinkedHashMap<>();
@Override
- public void route(final RouteContext routeContext, final ShadowRule
shadowRule) {
- decorateRouteContext(routeContext, shadowRule,
findShadowDataSourceMappings(shadowRule));
+ public final void route(final RouteContext routeContext, final ShadowRule
rule) {
+
tableAliasNameMappings.putAll(getTableAliasNameMappings(getAllTables()));
+ decorateRouteContext(routeContext, rule,
findShadowDataSourceMappings(rule));
}
- private Map<String, String> findShadowDataSourceMappings(final ShadowRule
shadowRule) {
- Collection<String> relatedShadowTables =
getRelatedShadowTables(getAllTables(), shadowRule);
- if (relatedShadowTables.isEmpty() &&
isMatchDefaultShadowAlgorithm(shadowRule)) {
- return shadowRule.getAllShadowDataSourceMappings();
- }
- ShadowOperationType shadowOperationType = getShadowOperationType();
- Map<String, String> result = findBySQLComments(relatedShadowTables,
shadowRule, shadowOperationType);
- if (!result.isEmpty()) {
- return result;
+ private Map<String, String> getTableAliasNameMappings(final
Collection<SimpleTableSegment> tableSegments) {
+ Map<String, String> result = new LinkedHashMap<>();
+ for (SimpleTableSegment each : tableSegments) {
+ String tableName = each.getTableName().getIdentifier().getValue();
+ String alias = each.getAlias().isPresent() ? each.getAlias().get()
: tableName;
+ result.put(alias, tableName);
}
- return findByShadowColumn(relatedShadowTables, shadowRule,
shadowOperationType);
+ return result;
}
- private Collection<String> getRelatedShadowTables(final
Collection<SimpleTableSegment> simpleTableSegments, final ShadowRule
shadowRule) {
- Collection<String> tableNames = new LinkedHashSet<>();
- for (SimpleTableSegment each : simpleTableSegments) {
- String tableName = each.getTableName().getIdentifier().getValue();
- String alias = each.getAlias().isPresent() ? each.getAlias().get()
: tableName;
- tableNames.add(tableName);
- tableAliasNameMappings.put(alias, tableName);
+ private Map<String, String> findShadowDataSourceMappings(final ShadowRule
rule) {
+ Collection<String> relatedShadowTables =
rule.getRelatedShadowTables(tableAliasNameMappings.values());
+ if (relatedShadowTables.isEmpty() && isMatchDefaultAlgorithm(rule)) {
+ return rule.getAllShadowDataSourceMappings();
}
- return shadowRule.getRelatedShadowTables(tableNames);
+ ShadowOperationType shadowOperationType = getShadowOperationType();
+ Map<String, String> result = findBySQLComments(rule,
relatedShadowTables, shadowOperationType);
+ return result.isEmpty() ? findByShadowColumn(rule,
relatedShadowTables, shadowOperationType) : result;
}
@SuppressWarnings("unchecked")
- private boolean isMatchDefaultShadowAlgorithm(final ShadowRule shadowRule)
{
+ private boolean isMatchDefaultAlgorithm(final ShadowRule rule) {
Optional<Collection<String>> sqlComments = parseSQLComments();
if (!sqlComments.isPresent()) {
return false;
}
- Optional<ShadowAlgorithm> defaultShadowAlgorithm =
shadowRule.getDefaultShadowAlgorithm();
- if (defaultShadowAlgorithm.isPresent()) {
- ShadowAlgorithm shadowAlgorithm = defaultShadowAlgorithm.get();
- if (shadowAlgorithm instanceof HintShadowAlgorithm<?>) {
- ShadowDetermineCondition shadowDetermineCondition = new
ShadowDetermineCondition("", ShadowOperationType.HINT_MATCH);
- return
HintShadowAlgorithmDeterminer.isShadow((HintShadowAlgorithm<Comparable<?>>)
shadowAlgorithm, shadowDetermineCondition.initSQLComments(sqlComments.get()),
shadowRule);
- }
+ Optional<ShadowAlgorithm> defaultAlgorithm =
rule.getDefaultShadowAlgorithm();
+ if (defaultAlgorithm.isPresent() && defaultAlgorithm.get() instanceof
HintShadowAlgorithm<?>) {
+ ShadowDetermineCondition determineCondition = new
ShadowDetermineCondition("", ShadowOperationType.HINT_MATCH);
+ return
HintShadowAlgorithmDeterminer.isShadow((HintShadowAlgorithm<Comparable<?>>)
defaultAlgorithm.get(), determineCondition.initSQLComments(sqlComments.get()),
rule);
}
return false;
}
- private Map<String, String> findBySQLComments(final Collection<String>
relatedShadowTables, final ShadowRule shadowRule, final ShadowOperationType
shadowOperationType) {
+ private Map<String, String> findBySQLComments(final ShadowRule rule, final
Collection<String> relatedShadowTables, final ShadowOperationType
shadowOperationType) {
Map<String, String> result = new LinkedHashMap<>();
for (String each : relatedShadowTables) {
- if (isContainsShadowInSQLComments(each, shadowRule, new
ShadowDetermineCondition(each, shadowOperationType))) {
-
result.putAll(shadowRule.getRelatedShadowDataSourceMappings(each));
+ if (isContainsShadowInSQLComments(rule, each, new
ShadowDetermineCondition(each, shadowOperationType))) {
+ result.putAll(rule.getRelatedShadowDataSourceMappings(each));
return result;
}
}
return result;
}
- private boolean isContainsShadowInSQLComments(final String tableName,
final ShadowRule shadowRule, final ShadowDetermineCondition shadowCondition) {
- return parseSQLComments().filter(each ->
isMatchAnyHintShadowAlgorithms(shadowRule.getRelatedHintShadowAlgorithms(tableName),
shadowCondition.initSQLComments(each), shadowRule)).isPresent();
+ private boolean isContainsShadowInSQLComments(final ShadowRule rule, final
String tableName, final ShadowDetermineCondition shadowCondition) {
+ return parseSQLComments().filter(each ->
isMatchAnyHintShadowAlgorithms(rule, tableName,
shadowCondition.initSQLComments(each))).isPresent();
}
- private boolean isMatchAnyHintShadowAlgorithms(final
Collection<HintShadowAlgorithm<Comparable<?>>> shadowAlgorithms, final
ShadowDetermineCondition shadowCondition, final ShadowRule shadowRule) {
- for (HintShadowAlgorithm<Comparable<?>> each : shadowAlgorithms) {
- if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition,
shadowRule)) {
+ private boolean isMatchAnyHintShadowAlgorithms(final ShadowRule rule,
final String tableName, final ShadowDetermineCondition shadowCondition) {
+ for (HintShadowAlgorithm<Comparable<?>> each :
rule.getRelatedHintShadowAlgorithms(tableName)) {
+ if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition,
rule)) {
return true;
}
}
return false;
}
- private Map<String, String> findByShadowColumn(final Collection<String>
relatedShadowTables, final ShadowRule shadowRule, final ShadowOperationType
shadowOperationType) {
+ private Map<String, String> findByShadowColumn(final ShadowRule rule,
final Collection<String> relatedShadowTables, final ShadowOperationType
shadowOperationType) {
for (String each : relatedShadowTables) {
- Collection<String> relatedShadowColumnNames =
shadowRule.getRelatedShadowColumnNames(shadowOperationType, each);
- if (!relatedShadowColumnNames.isEmpty() &&
isMatchAnyColumnShadowAlgorithms(each, relatedShadowColumnNames, shadowRule,
shadowOperationType)) {
- return shadowRule.getRelatedShadowDataSourceMappings(each);
+ Collection<String> relatedShadowColumnNames =
rule.getRelatedShadowColumnNames(shadowOperationType, each);
+ if (!relatedShadowColumnNames.isEmpty() &&
isMatchAnyColumnShadowAlgorithms(rule, each, relatedShadowColumnNames,
shadowOperationType)) {
+ return rule.getRelatedShadowDataSourceMappings(each);
}
}
return Collections.emptyMap();
}
- private boolean isMatchAnyColumnShadowAlgorithms(final String shadowTable,
final Collection<String> shadowColumnNames, final ShadowRule shadowRule, final
ShadowOperationType shadowOperation) {
+ private boolean isMatchAnyColumnShadowAlgorithms(final ShadowRule rule,
final String shadowTable, final Collection<String> shadowColumnNames, final
ShadowOperationType shadowOperation) {
for (String each : shadowColumnNames) {
- if (isMatchAnyColumnShadowAlgorithms(shadowTable, each,
shadowOperation, shadowRule)) {
+ if (isMatchAnyColumnShadowAlgorithms(rule, shadowTable, each,
shadowOperation)) {
return true;
}
}
return false;
}
- private boolean isMatchAnyColumnShadowAlgorithms(final String shadowTable,
final String shadowColumn, final ShadowOperationType shadowOperationType, final
ShadowRule shadowRule) {
- Collection<ColumnShadowAlgorithm<Comparable<?>>>
columnShadowAlgorithms =
shadowRule.getRelatedColumnShadowAlgorithms(shadowOperationType, shadowTable,
shadowColumn);
+ private boolean isMatchAnyColumnShadowAlgorithms(final ShadowRule rule,
final String shadowTable, final String shadowColumn, final ShadowOperationType
shadowOperationType) {
+ Collection<ColumnShadowAlgorithm<Comparable<?>>>
columnShadowAlgorithms =
rule.getRelatedColumnShadowAlgorithms(shadowOperationType, shadowTable,
shadowColumn);
if (columnShadowAlgorithms.isEmpty()) {
return false;
}
@@ -145,53 +138,28 @@ public abstract class
AbstractShadowDMLStatementRouteEngine implements ShadowRou
ShadowDetermineCondition shadowDetermineCondition;
while (iterator.hasNext()) {
Optional<ShadowColumnCondition> next = iterator.next();
- if (next.isPresent()) {
- for (ColumnShadowAlgorithm<Comparable<?>> each :
columnShadowAlgorithms) {
- shadowDetermineCondition = new
ShadowDetermineCondition(shadowTable, shadowOperationType);
- if (ColumnShadowAlgorithmDeterminer.isShadow(each,
shadowDetermineCondition.initShadowColumnCondition(next.get()))) {
- return true;
- }
+ if (!next.isPresent()) {
+ continue;
+ }
+ for (ColumnShadowAlgorithm<Comparable<?>> each :
columnShadowAlgorithms) {
+ shadowDetermineCondition = new
ShadowDetermineCondition(shadowTable, shadowOperationType);
+ if (ColumnShadowAlgorithmDeterminer.isShadow(each,
shadowDetermineCondition.initShadowColumnCondition(next.get()))) {
+ return true;
}
}
}
return false;
}
- /**
- * Get all tables.
- *
- * @return all tables
- */
protected abstract Collection<SimpleTableSegment> getAllTables();
- /**
- * get shadow operation type.
- *
- * @return shadow operation type
- */
protected abstract ShadowOperationType getShadowOperationType();
- /**
- * Parse SQL Comments.
- *
- * @return SQL comments
- */
protected abstract Optional<Collection<String>> parseSQLComments();
- /**
- * Get shadow column condition iterator.
- *
- * @param shadowColumn shadow column
- * @return shadow column condition iterator
- */
protected abstract Iterator<Optional<ShadowColumnCondition>>
getShadowColumnConditionIterator(String shadowColumn);
- /**
- * Get single table tame.
- *
- * @return table tame
- */
- protected String getSingleTableName() {
+ protected final String getSingleTableName() {
return tableAliasNameMappings.entrySet().iterator().next().getValue();
}
}
diff --git
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngine.java
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngine.java
index ae709c0d8c0..fde2d2a75ef 100644
---
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngine.java
+++
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngine.java
@@ -30,7 +30,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSe
import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
import java.util.Collection;
-import java.util.LinkedHashMap;
+import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -44,19 +44,19 @@ public final class ShadowNonDMLStatementRoutingEngine
implements ShadowRouteEngi
private final SQLStatementContext sqlStatementContext;
@Override
- public void route(final RouteContext routeContext, final ShadowRule
shadowRule) {
- decorateRouteContext(routeContext, shadowRule,
findShadowDataSourceMappings(shadowRule));
+ public void route(final RouteContext routeContext, final ShadowRule rule) {
+ decorateRouteContext(routeContext, rule,
findShadowDataSourceMappings(rule));
}
- private Map<String, String> findShadowDataSourceMappings(final ShadowRule
shadowRule) {
+ private Map<String, String> findShadowDataSourceMappings(final ShadowRule
rule) {
Optional<Collection<String>> sqlComments = parseSQLComments();
if (!sqlComments.isPresent()) {
- return new LinkedHashMap<>();
+ return Collections.emptyMap();
}
- if (isMatchAnyNoteShadowAlgorithms(shadowRule,
createShadowDetermineCondition(sqlComments.get()))) {
- return shadowRule.getAllShadowDataSourceMappings();
+ if (isMatchAnyNoteShadowAlgorithms(rule,
createShadowDetermineCondition(sqlComments.get()))) {
+ return rule.getAllShadowDataSourceMappings();
}
- return new LinkedHashMap<>();
+ return Collections.emptyMap();
}
private Optional<Collection<String>> parseSQLComments() {
@@ -65,13 +65,12 @@ public final class ShadowNonDMLStatementRoutingEngine
implements ShadowRouteEngi
}
private ShadowDetermineCondition createShadowDetermineCondition(final
Collection<String> sqlComments) {
- ShadowDetermineCondition result = new ShadowDetermineCondition("",
ShadowOperationType.HINT_MATCH);
- return result.initSQLComments(sqlComments);
+ return new ShadowDetermineCondition("",
ShadowOperationType.HINT_MATCH).initSQLComments(sqlComments);
}
- private boolean isMatchAnyNoteShadowAlgorithms(final ShadowRule
shadowRule, final ShadowDetermineCondition shadowCondition) {
- for (HintShadowAlgorithm<Comparable<?>> each :
shadowRule.getAllHintShadowAlgorithms()) {
- if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition,
shadowRule)) {
+ private boolean isMatchAnyNoteShadowAlgorithms(final ShadowRule rule,
final ShadowDetermineCondition shadowCondition) {
+ for (HintShadowAlgorithm<Comparable<?>> each :
rule.getAllHintShadowAlgorithms()) {
+ if (HintShadowAlgorithmDeterminer.isShadow(each, shadowCondition,
rule)) {
return true;
}
}
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecutorFactory.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecutorFactory.java
index 8aa30b161bf..2b59731220e 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecutorFactory.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandExecutorFactory.java
@@ -66,6 +66,7 @@ public final class MySQLCommandExecutorFactory {
* @return created instance
* @throws SQLException SQL exception
*/
+ @SuppressWarnings("DataFlowIssue")
public static CommandExecutor newInstance(final MySQLCommandPacketType
commandPacketType, final CommandPacket commandPacket, final ConnectionSession
connectionSession) throws SQLException {
if (commandPacket instanceof SQLAwarePacket) {
log.debug("Execute packet type: {}, sql: {}", commandPacketType,
((SQLAwarePacket) commandPacket).getSQL());