1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.impl;
19
20 import lombok.AccessLevel;
21 import lombok.NoArgsConstructor;
22 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
23 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
27 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyCollectionRetrievalSegment;
28 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.RenameColumnSegment;
29 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
30 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
31 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.RenameIndexDefinitionSegment;
32 import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.ConvertTableDefinitionSegment;
33 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
34 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
35 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement;
36 import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterTableStatementHandler;
37 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
38 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
39 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.charset.CharsetAssert;
40 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
41 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnDefinitionAssert;
42 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnPositionAssert;
43 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ConstraintDefinitionAssert;
44 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.IndexDefinitionAssert;
45 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
46 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
47 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedAddColumnDefinition;
48 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedChangeColumnDefinition;
49 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedColumnDefinition;
50 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
51 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedModifyColumnDefinition;
52 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameIndexDefinition;
53 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameColumnDefinition;
54 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.AlterTableStatementTestCase;
55
56 import java.util.Collection;
57 import java.util.LinkedList;
58 import java.util.List;
59 import java.util.Optional;
60
61 import static org.hamcrest.CoreMatchers.is;
62 import static org.hamcrest.MatcherAssert.assertThat;
63 import static org.junit.jupiter.api.Assertions.assertFalse;
64 import static org.junit.jupiter.api.Assertions.assertNotNull;
65 import static org.junit.jupiter.api.Assertions.assertNull;
66 import static org.junit.jupiter.api.Assertions.assertTrue;
67
68
69
70
71 @NoArgsConstructor(access = AccessLevel.PRIVATE)
72 public final class AlterTableStatementAssert {
73
74
75
76
77
78
79
80
81 public static void assertIs(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
82 assertTable(assertContext, actual, expected);
83 assertRenameTable(assertContext, actual, expected);
84 assertAddColumnDefinitions(assertContext, actual, expected);
85 assertAddConstraintDefinitions(assertContext, actual, expected);
86 assertModifyConstraintDefinitions(assertContext, actual, expected);
87 assertModifyColumnDefinitions(assertContext, actual, expected);
88 assertChangeColumnDefinitions(assertContext, actual, expected);
89 assertDropColumns(assertContext, actual, expected);
90 assertRenameIndexDefinitions(assertContext, actual, expected);
91 assertRenameColumnDefinitions(assertContext, actual, expected);
92 assertConvertTable(assertContext, actual, expected);
93 assertModifyCollectionRetrievalDefinitions(assertContext, actual, expected);
94 }
95
96 private static void assertConvertTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
97 Optional<ConvertTableDefinitionSegment> convertTable = actual.getConvertTableDefinition();
98 if (null == expected.getConvertTable()) {
99 assertFalse(convertTable.isPresent(), assertContext.getText("Actual convert table segment should not exist."));
100 } else {
101 assertTrue(convertTable.isPresent(), assertContext.getText("Actual convert table segment should exist."));
102 CharsetAssert.assertIs(assertContext, convertTable.get().getCharsetName(), expected.getConvertTable().getCharsetName());
103 if (null == expected.getConvertTable().getCollateExpression()) {
104 assertNull(convertTable.get().getCollateValue(), assertContext.getText("Actual collate expression should not exist."));
105 } else {
106 ExpressionAssert.assertExpression(assertContext, convertTable.get().getCollateValue(), expected.getConvertTable().getCollateExpression().getCollateName());
107 }
108 SQLSegmentAssert.assertIs(assertContext, convertTable.get(), expected.getConvertTable());
109 }
110 }
111
112 private static void assertRenameTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
113 Optional<SimpleTableSegment> tableSegment = actual.getRenameTable();
114 if (null == expected.getRenameTable()) {
115 assertFalse(tableSegment.isPresent(), assertContext.getText("Actual table segment should not exist."));
116 } else {
117 assertTrue(tableSegment.isPresent(), assertContext.getText("Actual table segment should exist."));
118 TableAssert.assertIs(assertContext, tableSegment.get(), expected.getRenameTable());
119 }
120 }
121
122 private static void assertTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
123 TableAssert.assertIs(assertContext, actual.getTable(), expected.getTable());
124 }
125
126 private static void assertAddColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
127 assertThat(assertContext.getText("Add column definitions size assertion error: "), actual.getAddColumnDefinitions().size(), is(expected.getAddColumns().size()));
128 int count = 0;
129 for (AddColumnDefinitionSegment each : actual.getAddColumnDefinitions()) {
130 ExpectedAddColumnDefinition expectedAddColumnDefinition = expected.getAddColumns().get(count);
131 assertColumnDefinitions(assertContext, each.getColumnDefinitions(), expectedAddColumnDefinition.getColumnDefinitions());
132 if (each.getColumnPosition().isPresent()) {
133 assertNotNull(expectedAddColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
134 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedAddColumnDefinition.getColumnPosition());
135 } else {
136 assertNull(expectedAddColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
137 }
138 count++;
139 }
140 }
141
142 private static void assertColumnDefinitions(final SQLCaseAssertContext assertContext, final Collection<ColumnDefinitionSegment> actual, final List<ExpectedColumnDefinition> expected) {
143 int count = 0;
144 for (ColumnDefinitionSegment each : actual) {
145 ColumnDefinitionAssert.assertIs(assertContext, each, expected.get(count));
146 count++;
147 }
148 }
149
150 private static void assertAddConstraintDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
151 int count = 0;
152 for (AddConstraintDefinitionSegment each : actual.getAddConstraintDefinitions()) {
153 ConstraintDefinitionAssert.assertIs(assertContext, each.getConstraintDefinition(), expected.getAddConstraints().get(count));
154 count++;
155 }
156 }
157
158 private static void assertModifyConstraintDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
159 assertThat(assertContext.getText("Modify constraint definitions size assertion error: "), actual.getModifyConstraintDefinitions().size(), is(expected.getModifyConstraints().size()));
160 int count = 0;
161 for (ModifyConstraintDefinitionSegment each : actual.getModifyConstraintDefinitions()) {
162 ExpectedConstraintDefinition expectedConstraintDefinition = expected.getModifyConstraints().get(count);
163 if (null == expectedConstraintDefinition.getConstraintName()) {
164 assertNull(each.getConstraintName(), "Actual modify constraint name should not exist.");
165 } else {
166 assertNotNull(each.getConstraintName(), "Actual modify constraint name should exist.");
167 assertThat(assertContext.getText("Actual modify constraint name assertion error."),
168 each.getConstraintName().getIdentifier().getValue(), is(expectedConstraintDefinition.getConstraintName()));
169 }
170 count++;
171 }
172 }
173
174 private static void assertModifyColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
175 assertThat(assertContext.getText("Modify column definitions size assertion error: "), actual.getModifyColumnDefinitions().size(), is(expected.getModifyColumns().size()));
176 int count = 0;
177 for (ModifyColumnDefinitionSegment each : actual.getModifyColumnDefinitions()) {
178 ExpectedModifyColumnDefinition expectedModifyColumnDefinition = expected.getModifyColumns().get(count);
179 ColumnDefinitionAssert.assertIs(assertContext, each.getColumnDefinition(), expectedModifyColumnDefinition.getColumnDefinition());
180 if (each.getColumnPosition().isPresent()) {
181 assertNotNull(expectedModifyColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
182 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedModifyColumnDefinition.getColumnPosition());
183 } else {
184 assertNull(expectedModifyColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
185 }
186 count++;
187 }
188 }
189
190 private static void assertChangeColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
191 assertThat(assertContext.getText("Change column definitions size assertion error: "), actual.getChangeColumnDefinitions().size(), is(expected.getChangeColumns().size()));
192 int count = 0;
193 for (ChangeColumnDefinitionSegment each : actual.getChangeColumnDefinitions()) {
194 ExpectedChangeColumnDefinition expectedChangeColumnDefinition = expected.getChangeColumns().get(count);
195 ColumnDefinitionAssert.assertIs(assertContext, each.getColumnDefinition(), expectedChangeColumnDefinition.getColumnDefinition());
196 if (each.getColumnPosition().isPresent()) {
197 assertNotNull(expectedChangeColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
198 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedChangeColumnDefinition.getColumnPosition());
199 } else {
200 assertNull(expectedChangeColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
201 }
202 if (null != each.getPreviousColumn()) {
203 ColumnAssert.assertIs(assertContext, each.getPreviousColumn(), expectedChangeColumnDefinition.getPreviousColumn());
204 }
205 count++;
206 }
207 }
208
209 private static void assertDropColumns(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
210 Collection<ColumnSegment> actualDropColumns = getDropColumns(actual);
211 assertThat(assertContext.getText("Drop columns size assertion error: "), actualDropColumns.size(), is(expected.getDropColumns().size()));
212 int count = 0;
213 for (ColumnSegment each : actualDropColumns) {
214 ColumnAssert.assertIs(assertContext, each, expected.getDropColumns().get(count));
215 count++;
216 }
217 }
218
219 private static Collection<ColumnSegment> getDropColumns(final AlterTableStatement actual) {
220 Collection<ColumnSegment> result = new LinkedList<>();
221 for (DropColumnDefinitionSegment each : actual.getDropColumnDefinitions()) {
222 result.addAll(each.getColumns());
223 }
224 return result;
225 }
226
227 private static void assertRenameIndexDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
228 assertThat(assertContext.getText("Rename index definitions size assertion error: "), actual.getRenameIndexDefinitions().size(), is(expected.getRenameIndexes().size()));
229 int count = 0;
230 for (RenameIndexDefinitionSegment each : actual.getRenameIndexDefinitions()) {
231 ExpectedRenameIndexDefinition expectedRenameIndexDefinition = expected.getRenameIndexes().get(count);
232 IndexDefinitionAssert.assertIs(assertContext, each.getIndexSegment(), expectedRenameIndexDefinition.getIndexDefinition());
233 IndexDefinitionAssert.assertIs(assertContext, each.getRenameIndexSegment(), expectedRenameIndexDefinition.getRenameIndexDefinition());
234 count++;
235 }
236 }
237
238 private static void assertRenameColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
239 assertThat(assertContext.getText("Rename columns definitions size assertion error:"), actual.getRenameColumnDefinitions().size(), is(expected.getRenameColumns().size()));
240 int count = 0;
241 for (RenameColumnSegment each : actual.getRenameColumnDefinitions()) {
242 ExpectedRenameColumnDefinition expectedRenameColumnDefinition = expected.getRenameColumns().get(count);
243 ColumnAssert.assertIs(assertContext, each.getOldColumnName(), expectedRenameColumnDefinition.getOldColumnName());
244 ColumnAssert.assertIs(assertContext, each.getColumnName(), expectedRenameColumnDefinition.getColumnName());
245 count++;
246 }
247 }
248
249 private static void assertModifyCollectionRetrievalDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
250 Optional<ModifyCollectionRetrievalSegment> modifyCollectionRetrieval = AlterTableStatementHandler.getModifyCollectionRetrievalSegment(actual);
251 if (null == expected.getModifyCollectionRetrievalDefinition()) {
252 assertFalse(modifyCollectionRetrieval.isPresent(), assertContext.getText("Actual modify collection retrieval definitions should not exist."));
253 } else {
254 assertTrue(modifyCollectionRetrieval.isPresent(), assertContext.getText("Actual modify collection retrieval definitions should exist."));
255 if (null == expected.getModifyCollectionRetrievalDefinition().getTable()) {
256 assertNull(modifyCollectionRetrieval.get().getNestedTable(), "Actual nested table should not exist.");
257 } else {
258 assertNotNull(modifyCollectionRetrieval.get().getNestedTable(), "Actual nested table should exist.");
259 TableAssert.assertIs(assertContext, modifyCollectionRetrieval.get().getNestedTable(), expected.getModifyCollectionRetrievalDefinition().getTable());
260 }
261 }
262 }
263 }