1 /*
2  * Copyright 2015-2018 HuntLabs.cn
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 module hunt.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
17 
18 
19 import hunt.collection;
20 
21 import hunt.sql.ast.SQLCommentHint;
22 import hunt.sql.ast.SQLName;
23 import hunt.sql.ast.SQLOrderBy;
24 import hunt.sql.ast.statement.SQLDeleteStatement;
25 import hunt.sql.ast.statement.SQLTableSource;
26 import hunt.sql.ast.SQLLimit;
27 import hunt.sql.dialect.mysql.visitor.MySqlASTVisitor;
28 import hunt.sql.dialect.mysql.visitor.MySqlOutputVisitor;
29 import hunt.sql.visitor.SQLASTVisitor;
30 import hunt.sql.util.DBType;
31 import hunt.util.StringBuilder;
32 
33 public class MySqlDeleteStatement : SQLDeleteStatement {
34 
35     private bool              lowPriority        = false;
36     private bool              quick              = false;
37     private bool              ignore             = false;
38     private SQLOrderBy           orderBy;
39     private SQLLimit             limit;
40     private List!(SQLCommentHint) hints;
41     // for petadata
42     private bool              forceAllPartitions = false;
43     private SQLName              forcePartition;
44 
45     public this(){
46         super(DBType.MYSQL.name);
47     }
48 
49     override public MySqlDeleteStatement clone() {
50         MySqlDeleteStatement x = new MySqlDeleteStatement();
51         cloneTo(x);
52 
53         x.lowPriority = lowPriority;
54         x.quick = quick;
55         x.ignore = ignore;
56 
57         if (using !is null) {
58             x.setUsing(using.clone());
59         }
60         if (orderBy !is null) {
61             x.setOrderBy(orderBy.clone());
62         }
63         if (limit !is null) {
64             x.setLimit(limit.clone());
65         }
66 
67         return x;
68     }
69 
70     public List!(SQLCommentHint) getHints() {
71         if (hints is null) {
72             hints = new ArrayList!(SQLCommentHint)();
73         }
74         return hints;
75     }
76     
77     public int getHintsSize() {
78         if (hints is null) {
79             return 0;
80         }
81         
82         return hints.size();
83     }
84 
85     public bool isLowPriority() {
86         return lowPriority;
87     }
88 
89     public void setLowPriority(bool lowPriority) {
90         this.lowPriority = lowPriority;
91     }
92 
93     public bool isQuick() {
94         return quick;
95     }
96 
97     public void setQuick(bool quick) {
98         this.quick = quick;
99     }
100 
101     public bool isIgnore() {
102         return ignore;
103     }
104 
105     public void setIgnore(bool ignore) {
106         this.ignore = ignore;
107     }
108 
109     public SQLOrderBy getOrderBy() {
110         return orderBy;
111     }
112 
113     public void setOrderBy(SQLOrderBy orderBy) {
114         this.orderBy = orderBy;
115     }
116 
117     public SQLLimit getLimit() {
118         return limit;
119     }
120 
121     public void setLimit(SQLLimit limit) {
122         if (limit !is null) {
123             limit.setParent(this);
124         }
125         this.limit = limit;
126     }
127 
128     
129     override  protected void accept0(SQLASTVisitor visitor) {
130         if (cast(MySqlASTVisitor)(visitor) !is null) {
131             accept0(cast(MySqlASTVisitor) visitor);
132         } else {
133             super.accept0(visitor);
134         }
135     }
136 
137     override public void output(StringBuilder buf) {
138         new MySqlOutputVisitor(buf).visit(this);
139     }
140 
141     protected void accept0(MySqlASTVisitor visitor) {
142         if (visitor.visit(this)) {
143             acceptChild(visitor, tableSource);
144             acceptChild(visitor, where);
145             acceptChild(visitor, from);
146             acceptChild(visitor, using);
147             acceptChild(visitor, orderBy);
148             acceptChild(visitor, limit);
149         }
150 
151         visitor.endVisit(this);
152     }
153 
154     public bool isForceAllPartitions() {
155         return forceAllPartitions;
156     }
157 
158     public void setForceAllPartitions(bool forceAllPartitions) {
159         this.forceAllPartitions = forceAllPartitions;
160     }
161 
162     public SQLName getForcePartition() {
163         return forcePartition;
164     }
165 
166     public void setForcePartition(SQLName x) {
167         if (x !is null) {
168             x.setParent(this);
169         }
170         this.forcePartition = x;
171     }
172 }