1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.shadow.route.engine.dml;
19
20 import org.apache.shardingsphere.infra.binder.context.statement.dml.DeleteStatementContext;
21 import org.apache.shardingsphere.shadow.api.shadow.ShadowOperationType;
22 import org.apache.shardingsphere.shadow.condition.ShadowColumnCondition;
23 import org.apache.shardingsphere.shadow.route.engine.util.ShadowExtractor;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
26 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
27 import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtils;
28
29 import java.util.Collection;
30 import java.util.LinkedList;
31 import java.util.List;
32
33
34
35
36 public final class ShadowDeleteStatementRoutingEngine extends AbstractShadowDMLStatementRouteEngine {
37
38 private final DeleteStatementContext sqlStatementContext;
39
40 private final List<Object> parameters;
41
42 public ShadowDeleteStatementRoutingEngine(final DeleteStatementContext sqlStatementContext, final List<Object> parameters) {
43 super(sqlStatementContext, ShadowOperationType.DELETE);
44 this.sqlStatementContext = sqlStatementContext;
45 this.parameters = parameters;
46 }
47
48 @Override
49 protected Collection<ShadowColumnCondition> getShadowColumnConditions(final String shadowColumnName) {
50 Collection<ShadowColumnCondition> result = new LinkedList<>();
51 for (ExpressionSegment each : getWhereSegment()) {
52 ShadowExtractor.extractValues(each, parameters).map(values -> new ShadowColumnCondition(getSingleTableName(), shadowColumnName, values)).ifPresent(result::add);
53 }
54 return result;
55 }
56
57 private Collection<ExpressionSegment> getWhereSegment() {
58 Collection<ExpressionSegment> result = new LinkedList<>();
59 for (WhereSegment each : sqlStatementContext.getWhereSegments()) {
60 for (AndPredicate predicate : ExpressionExtractUtils.getAndPredicates(each.getExpr())) {
61 result.addAll(predicate.getPredicates());
62 }
63 }
64 return result;
65 }
66 }