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.infra.binder.context.statement.ddl;
19  
20  import lombok.Getter;
21  import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
22  import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
23  import org.apache.shardingsphere.infra.binder.context.type.ConstraintAvailable;
24  import org.apache.shardingsphere.infra.binder.context.type.IndexAvailable;
25  import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
26  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
27  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
28  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
29  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment;
30  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
31  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
32  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ValidateConstraintDefinitionSegment;
33  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.DropIndexDefinitionSegment;
34  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
35  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.RenameIndexDefinitionSegment;
36  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
37  import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
38  import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement;
39  
40  import java.util.Collection;
41  import java.util.LinkedList;
42  
43  /**
44   * Alter table statement context.
45   */
46  @Getter
47  public final class AlterTableStatementContext extends CommonSQLStatementContext implements TableAvailable, IndexAvailable, ConstraintAvailable {
48      
49      private final TablesContext tablesContext;
50      
51      public AlterTableStatementContext(final AlterTableStatement sqlStatement) {
52          super(sqlStatement);
53          tablesContext = new TablesContext(sqlStatement.getTable(), getDatabaseType());
54      }
55      
56      @Override
57      public AlterTableStatement getSqlStatement() {
58          return (AlterTableStatement) super.getSqlStatement();
59      }
60      
61      @Override
62      public Collection<SimpleTableSegment> getAllTables() {
63          Collection<SimpleTableSegment> result = new LinkedList<>();
64          result.add(getSqlStatement().getTable());
65          if (getSqlStatement().getRenameTable().isPresent()) {
66              result.add(getSqlStatement().getRenameTable().get());
67          }
68          for (AddColumnDefinitionSegment each : getSqlStatement().getAddColumnDefinitions()) {
69              for (ColumnDefinitionSegment columnDefinition : each.getColumnDefinitions()) {
70                  result.addAll(columnDefinition.getReferencedTables());
71              }
72          }
73          for (ModifyColumnDefinitionSegment each : getSqlStatement().getModifyColumnDefinitions()) {
74              result.addAll(each.getColumnDefinition().getReferencedTables());
75          }
76          for (AddConstraintDefinitionSegment each : getSqlStatement().getAddConstraintDefinitions()) {
77              each.getConstraintDefinition().getReferencedTable().ifPresent(result::add);
78          }
79          return result;
80      }
81      
82      @Override
83      public Collection<IndexSegment> getIndexes() {
84          Collection<IndexSegment> result = new LinkedList<>();
85          for (AddConstraintDefinitionSegment each : getSqlStatement().getAddConstraintDefinitions()) {
86              each.getConstraintDefinition().getIndexName().ifPresent(result::add);
87          }
88          getSqlStatement().getDropIndexDefinitions().stream().map(DropIndexDefinitionSegment::getIndexSegment).forEach(result::add);
89          for (RenameIndexDefinitionSegment each : getSqlStatement().getRenameIndexDefinitions()) {
90              result.add(each.getIndexSegment());
91              result.add(each.getRenameIndexSegment());
92          }
93          return result;
94      }
95      
96      @Override
97      public Collection<ConstraintSegment> getConstraints() {
98          Collection<ConstraintSegment> result = new LinkedList<>();
99          for (AddConstraintDefinitionSegment each : getSqlStatement().getAddConstraintDefinitions()) {
100             each.getConstraintDefinition().getConstraintName().ifPresent(result::add);
101         }
102         getSqlStatement().getValidateConstraintDefinitions().stream().map(ValidateConstraintDefinitionSegment::getConstraintName).forEach(result::add);
103         getSqlStatement().getDropConstraintDefinitions().stream().map(DropConstraintDefinitionSegment::getConstraintName).forEach(result::add);
104         return result;
105     }
106     
107     @Override
108     public Collection<ColumnSegment> getIndexColumns() {
109         Collection<ColumnSegment> result = new LinkedList<>();
110         for (AddConstraintDefinitionSegment each : getSqlStatement().getAddConstraintDefinitions()) {
111             result.addAll(each.getConstraintDefinition().getIndexColumns());
112         }
113         return result;
114     }
115 }