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.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   * Delete statement assert.
52   */
53  @NoArgsConstructor(access = AccessLevel.PRIVATE)
54  public final class DeleteStatementAssert {
55      
56      /**
57       * Assert delete statement is correct with expected parser result.
58       * 
59       * @param assertContext assert context
60       * @param actual actual delete statement
61       * @param expected expected delete statement test case
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 }