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.ast.statement.SQLInsertStatement;
17
18
19 import hunt.collection;
20
21 import hunt.sql.SQLUtils;
22 import hunt.sql.ast.SQLExpr;
23 import hunt.sql.ast.SQLObject;
24 import hunt.sql.ast.SQLObjectImpl;
25 import hunt.sql.ast.SQLStatement;
26 import hunt.sql.visitor.SQLASTVisitor;
27 import hunt.sql.ast.statement.SQLWithSubqueryClause;
28 import hunt.sql.ast.statement.SQLInsertInto;
29 import hunt.sql.ast.statement.SQLExprTableSource;
30 import hunt.sql.ast.statement.SQLSelect;
31 import hunt.sql.ast.SQLName;
32 import hunt.sql.ast.statement.SQLSelectQuery;
33
34
35
36 public class SQLInsertStatement : SQLInsertInto , SQLStatement {
37
38 alias cloneTo = SQLInsertInto.cloneTo;
39
40 protected SQLWithSubqueryClause _with;
41
42 protected string dbType;
43
44 protected bool upsert = false; // for phoenix
45
46 private bool afterSemi;
47
48 public this(){
49
50 }
51
52 public void cloneTo(SQLInsertStatement x) {
53 super.cloneTo(x);
54 x.dbType = dbType;
55 x.upsert = upsert;
56 x.afterSemi = afterSemi;
57
58 if (_with !is null) {
59 x.setWith(_with.clone());
60 }
61 }
62
63 override public SQLInsertStatement clone() {
64 SQLInsertStatement x = new SQLInsertStatement();
65 cloneTo(x);
66 return x;
67 }
68
69
70 override protected void accept0(SQLASTVisitor visitor) {
71 if (visitor.visit(this)) {
72 this.acceptChild(visitor, tableSource);
73 this.acceptChild!SQLExpr(visitor, columns);
74 this.acceptChild!ValuesClause(visitor, valuesList);
75 this.acceptChild(visitor, query);
76 }
77
78 visitor.endVisit(this);
79 }
80
81 override
82 public List!SQLObject getChildren() {
83 List!SQLObject children = new ArrayList!SQLObject();
84
85 children.add(tableSource);
86 children.addAll(cast(List!SQLObject)(this.columns));
87 children.addAll(cast(List!SQLObject)(this.valuesList));
88 if (query !is null) {
89 children.add(query);
90 }
91
92 return children;
93 }
94
95 public bool isUpsert() {
96 return upsert;
97 }
98
99 public void setUpsert(bool upsert) {
100 this.upsert = upsert;
101 }
102
103 // public static class ValuesClause : SQLObjectImpl {
104
105 // private List!SQLExpr values;
106 // private string originalString;
107 // private int replaceCount;
108
109 // public this(){
110 // this(new ArrayList!SQLExpr());
111 // }
112
113 // override public ValuesClause clone() {
114 // ValuesClause x = new ValuesClause(new ArrayList!SQLExpr(this.values.size()));
115 // foreach (SQLExpr v ; values) {
116 // x.addValue(v);
117 // }
118 // return x;
119 // }
120
121 // public this(List!SQLExpr values){
122 // this.values = values;
123 // for (int i = 0; i < values.size(); ++i) {
124 // values.get(i).setParent(this);
125 // }
126 // }
127
128 // public void addValue(SQLExpr value) {
129 // value.setParent(this);
130 // values.add(value);
131 // }
132
133 // public List!SQLExpr getValues() {
134 // return values;
135 // }
136
137 // override public void output(StringBuilder buf) {
138 // buf.append(" VALUES (");
139 // for (int i = 0, size = values.size(); i < size; ++i) {
140 // if (i != 0) {
141 // buf.append(", ");
142 // }
143 // values.get(i).output(buf);
144 // }
145 // buf.append(")");
146 // }
147
148
149 // override protected void accept0(SQLASTVisitor visitor) {
150 // if (visitor.visit(this)) {
151 // this.acceptChild(visitor, values);
152 // }
153
154 // visitor.endVisit(this);
155 // }
156
157 // public string getOriginalString() {
158 // return originalString;
159 // }
160
161 // public void setOriginalString(string originalString) {
162 // this.originalString = originalString;
163 // }
164
165 // public int getReplaceCount() {
166 // return replaceCount;
167 // }
168
169 // public void incrementReplaceCount() {
170 // this.replaceCount++;
171 // }
172 // }
173
174 override
175 public string getDbType() {
176 return dbType;
177 }
178
179 public void setDbType(string dbType) {
180 this.dbType = dbType;
181 }
182
183 override
184 public bool isAfterSemi() {
185 return afterSemi;
186 }
187
188 override
189 public void setAfterSemi(bool afterSemi) {
190 this.afterSemi = afterSemi;
191 }
192
193
194 public SQLWithSubqueryClause getWith() {
195 return _with;
196 }
197
198 public void setWith(SQLWithSubqueryClause _with) {
199 if (_with !is null) {
200 _with.setParent(this);
201 }
202 this._with = _with;
203 }
204
205 override public string toString() {
206 return SQLUtils.toSQLString(this, dbType);
207 }
208
209 public string toLowerCaseString() {
210 return SQLUtils.toSQLString(this, dbType, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
211 }
212 }