View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Shadow delete statement routing engine.
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  }