strongduanmu commented on a change in pull request #12316:
URL: https://github.com/apache/shardingsphere/pull/12316#discussion_r705929817
##########
File path:
shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/future/engine/dml/ShadowUpdateStatementRoutingEngine.java
##########
@@ -17,20 +17,89 @@
package org.apache.shardingsphere.shadow.route.future.engine.dml;
-import org.apache.shardingsphere.infra.binder.LogicSQL;
-import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.shadow.route.future.engine.ShadowRouteEngine;
-import org.apache.shardingsphere.shadow.rule.ShadowRule;
+import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementContext;
+import org.apache.shardingsphere.shadow.api.shadow.column.ShadowOperationType;
+import
org.apache.shardingsphere.shadow.route.future.engine.AbstractShadowRouteEngine;
+import
org.apache.shardingsphere.shadow.route.future.engine.determiner.ShadowDetermineCondition;
+import
org.apache.shardingsphere.shadow.route.future.engine.util.ShadowExtractor;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
/**
* Shadow update statement routing engine.
*/
-public final class ShadowUpdateStatementRoutingEngine implements
ShadowRouteEngine {
+@RequiredArgsConstructor
+public final class ShadowUpdateStatementRoutingEngine extends
AbstractShadowRouteEngine {
+
+ private final UpdateStatementContext updateStatementContext;
+
+ private final List<Object> parameters;
+
+ @Override
+ protected Optional<Map<String, Collection<Comparable<?>>>>
parseColumnValuesMappings() {
+ Map<String, Collection<Comparable<?>>> result = new LinkedHashMap<>();
+ Optional<WhereSegment> where = updateStatementContext.getWhere();
+ where.ifPresent(whereSegment -> parseWhereSegment(whereSegment,
result));
+ return result.isEmpty() ? Optional.empty() : Optional.of(result);
+ }
+
+ private void parseWhereSegment(final WhereSegment whereSegment, final
Map<String, Collection<Comparable<?>>> columnValuesMappings) {
+
ExpressionExtractUtil.getAndPredicates(whereSegment.getExpr()).forEach(each ->
parseAndPredicate(each.getPredicates(), columnValuesMappings));
+ }
+
+ private void parseAndPredicate(final Collection<ExpressionSegment>
predicates, final Map<String, Collection<Comparable<?>>> columnValuesMappings) {
+ for (ExpressionSegment each : predicates) {
+ parseExpressionSegment(each, columnValuesMappings);
+ }
+ }
+
+ private void parseExpressionSegment(final ExpressionSegment
expressionSegment, final Map<String, Collection<Comparable<?>>>
columnValuesMappings) {
+ if (expressionSegment instanceof BinaryOperationExpression) {
+ parseBinaryOperationExpression((BinaryOperationExpression)
expressionSegment, columnValuesMappings);
+ }
+ if (expressionSegment instanceof InExpression) {
+ parseInExpression((InExpression) expressionSegment,
columnValuesMappings);
+ }
+ }
+
+ private void parseInExpression(final InExpression expression, final
Map<String, Collection<Comparable<?>>> columnValuesMappings) {
+ Optional<String> columnName =
ShadowExtractor.extractColumnName(expression);
+ columnName.ifPresent(s ->
ShadowExtractor.extractValues(expression.getRight(),
parameters).ifPresent(values -> columnValuesMappings.put(s, values)));
+ }
+
+ private void parseBinaryOperationExpression(final
BinaryOperationExpression expression, final Map<String,
Collection<Comparable<?>>> columnValuesMappings) {
+ Optional<String> columnName =
ShadowExtractor.extractColumnName(expression);
+ columnName.ifPresent(s ->
ShadowExtractor.extractValues(expression.getRight(),
parameters).ifPresent(values -> columnValuesMappings.put(s, values)));
+ }
+
+ @Override
+ protected ShadowDetermineCondition createShadowDetermineCondition() {
Review comment:
@soulasuna Why not consider extracting a ShadowConditionEngine to handle
these logics like ShardingConditionEngine?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]