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.UpdateStatementContext;
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.column.ColumnSegment;
25  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
26  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
27  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.WhereSegment;
28  import org.apache.shardingsphere.sql.parser.sql.common.util.ColumnExtractor;
29  import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtils;
30  
31  import java.util.Collection;
32  import java.util.LinkedList;
33  import java.util.List;
34  
35  /**
36   * Shadow update statement routing engine.
37   */
38  public final class ShadowUpdateStatementRoutingEngine extends AbstractShadowDMLStatementRouteEngine {
39      
40      private final UpdateStatementContext sqlStatementContext;
41      
42      private final List<Object> parameters;
43      
44      public ShadowUpdateStatementRoutingEngine(final UpdateStatementContext sqlStatementContext, final List<Object> parameters) {
45          super(sqlStatementContext, ShadowOperationType.UPDATE);
46          this.sqlStatementContext = sqlStatementContext;
47          this.parameters = parameters;
48      }
49      
50      @Override
51      protected Collection<ShadowColumnCondition> getShadowColumnConditions(final String shadowColumnName) {
52          Collection<ShadowColumnCondition> result = new LinkedList<>();
53          for (ExpressionSegment each : getWhereSegment()) {
54              Collection<ColumnSegment> columns = ColumnExtractor.extract(each);
55              if (1 != columns.size()) {
56                  continue;
57              }
58              ShadowExtractor.extractValues(each, parameters).map(values -> new ShadowColumnCondition(getSingleTableName(), shadowColumnName, values)).ifPresent(result::add);
59          }
60          return result;
61      }
62      
63      private Collection<ExpressionSegment> getWhereSegment() {
64          Collection<ExpressionSegment> result = new LinkedList<>();
65          for (WhereSegment each : sqlStatementContext.getWhereSegments()) {
66              for (AndPredicate predicate : ExpressionExtractUtils.getAndPredicates(each.getExpr())) {
67                  result.addAll(predicate.getPredicates());
68              }
69          }
70          return result;
71      }
72  }