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.dml.impl;
19
20 import lombok.AccessLevel;
21 import lombok.NoArgsConstructor;
22 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.order.OrderBySegment;
23 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.pagination.limit.LimitSegment;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OutputSegment;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.WithSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.DeleteMultiTableSegment;
27 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
28 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SubqueryTableSegment;
29 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
30 import org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.DeleteStatementHandler;
31 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
32 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
33 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.limit.LimitClauseAssert;
34 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.orderby.OrderByClauseAssert;
35 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.output.OutputClauseAssert;
36 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
37 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.where.WhereClauseAssert;
38 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.with.WithClauseAssert;
39 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.DeleteStatementTestCase;
40
41 import java.util.LinkedList;
42 import java.util.List;
43 import java.util.Optional;
44
45 import static org.junit.jupiter.api.Assertions.assertFalse;
46 import static org.junit.jupiter.api.Assertions.assertNotNull;
47 import static org.junit.jupiter.api.Assertions.assertNull;
48 import static org.junit.jupiter.api.Assertions.assertTrue;
49
50
51
52
53 @NoArgsConstructor(access = AccessLevel.PRIVATE)
54 public final class DeleteStatementAssert {
55
56
57
58
59
60
61
62
63 public static void assertIs(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
64 assertWithClause(assertContext, actual, expected);
65 assertTable(assertContext, actual, expected);
66 assertOutput(assertContext, actual, expected);
67 assertWhereClause(assertContext, actual, expected);
68 assertOrderByClause(assertContext, actual, expected);
69 assertLimitClause(assertContext, actual, expected);
70 }
71
72 private static void assertWithClause(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
73 Optional<WithSegment> withSegment = DeleteStatementHandler.getWithSegment(actual);
74 if (null == expected.getWithClause()) {
75 assertFalse(withSegment.isPresent(), assertContext.getText("Actual with segment should not exist."));
76 } else {
77 assertTrue(withSegment.isPresent(), assertContext.getText("Actual with segment should exist."));
78 WithClauseAssert.assertIs(assertContext, withSegment.get(), expected.getWithClause());
79 }
80 }
81
82 private static void assertTable(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
83 if (null != expected.getTables() && !expected.getTables().isEmpty()) {
84 assertNotNull(actual.getTable(), assertContext.getText("Actual table segment should exist."));
85 List<SimpleTableSegment> actualTableSegments = new LinkedList<>();
86 if (actual.getTable() instanceof SimpleTableSegment) {
87 actualTableSegments.add((SimpleTableSegment) actual.getTable());
88 } else if (actual.getTable() instanceof DeleteMultiTableSegment) {
89 DeleteMultiTableSegment deleteMultiTableSegment = (DeleteMultiTableSegment) actual.getTable();
90 actualTableSegments.addAll(deleteMultiTableSegment.getActualDeleteTables());
91 }
92 TableAssert.assertIs(assertContext, actualTableSegments, expected.getTables());
93 } else if (null != expected.getSubqueryTable()) {
94 assertNotNull(actual.getTable(), assertContext.getText("Actual subquery table segment should exist."));
95 TableAssert.assertIs(assertContext, (SubqueryTableSegment) actual.getTable(), expected.getSubqueryTable());
96 } else {
97 assertNull(actual.getTable(), assertContext.getText("Actual table should not exist."));
98 }
99 }
100
101 private static void assertOutput(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
102 Optional<OutputSegment> outputSegment = DeleteStatementHandler.getOutputSegment(actual);
103 if (null == expected.getOutputClause()) {
104 assertFalse(outputSegment.isPresent(), assertContext.getText("Actual output segment should not exist."));
105 } else {
106 assertTrue(outputSegment.isPresent(), assertContext.getText("Actual output segment should exist."));
107 OutputClauseAssert.assertIs(assertContext, outputSegment.get(), expected.getOutputClause());
108 }
109 }
110
111 private static void assertWhereClause(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
112 if (null == expected.getWhereClause()) {
113 assertFalse(actual.getWhere().isPresent(), assertContext.getText("Actual where segment should not exist."));
114 } else {
115 assertTrue(actual.getWhere().isPresent(), assertContext.getText("Actual where segment should exist."));
116 WhereClauseAssert.assertIs(assertContext, actual.getWhere().get(), expected.getWhereClause());
117 }
118 }
119
120 private static void assertOrderByClause(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
121 Optional<OrderBySegment> orderBySegment = DeleteStatementHandler.getOrderBySegment(actual);
122 if (null == expected.getOrderByClause()) {
123 assertFalse(orderBySegment.isPresent(), assertContext.getText("Actual order by segment should not exist."));
124 } else {
125 assertTrue(orderBySegment.isPresent(), assertContext.getText("Actual order by segment should exist."));
126 OrderByClauseAssert.assertIs(assertContext, orderBySegment.get(), expected.getOrderByClause());
127 }
128 }
129
130 private static void assertLimitClause(final SQLCaseAssertContext assertContext, final DeleteStatement actual, final DeleteStatementTestCase expected) {
131 Optional<LimitSegment> limitSegment = DeleteStatementHandler.getLimitSegment(actual);
132 if (null == expected.getLimitClause()) {
133 assertFalse(limitSegment.isPresent(), assertContext.getText("Actual limit segment should not exist."));
134 } else {
135 assertTrue(limitSegment.isPresent(), assertContext.getText("Actual limit segment should exist."));
136 LimitClauseAssert.assertRowCount(assertContext, limitSegment.get().getRowCount().orElse(null), expected.getLimitClause().getRowCount());
137 SQLSegmentAssert.assertIs(assertContext, limitSegment.get(), expected.getLimitClause());
138 }
139 }
140 }