1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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 }