Skip to content

Commit 63ed1a2

Browse files
Implement WITH for DELETE, UPDATE and MERGE statements (#1217)
1 parent 9184cda commit 63ed1a2

File tree

9 files changed

+233
-34
lines changed

9 files changed

+233
-34
lines changed

src/main/java/net/sf/jsqlparser/statement/delete/Delete.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.Collection;
1414
import java.util.Collections;
15+
import java.util.Iterator;
1516
import java.util.List;
1617
import java.util.Optional;
1718
import static java.util.stream.Collectors.joining;
@@ -24,16 +25,42 @@
2425
import net.sf.jsqlparser.statement.select.Limit;
2526
import net.sf.jsqlparser.statement.select.OrderByElement;
2627
import net.sf.jsqlparser.statement.select.PlainSelect;
28+
import net.sf.jsqlparser.statement.select.WithItem;
2729

2830
public class Delete implements Statement {
2931

32+
private List<WithItem> withItemsList;
3033
private Table table;
3134
private OracleHint oracleHint = null;
3235
private List<Table> tables;
3336
private List<Join> joins;
3437
private Expression where;
3538
private Limit limit;
3639
private List<OrderByElement> orderByElements;
40+
public List<WithItem> getWithItemsList() {
41+
return withItemsList;
42+
}
43+
44+
public void setWithItemsList(List<WithItem> withItemsList) {
45+
this.withItemsList = withItemsList;
46+
}
47+
48+
public Delete withWithItemsList(List<WithItem> withItemsList) {
49+
this.setWithItemsList(withItemsList);
50+
return this;
51+
}
52+
53+
public Delete addWithItemsList(WithItem... withItemsList) {
54+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
55+
Collections.addAll(collection, withItemsList);
56+
return this.withWithItemsList(collection);
57+
}
58+
59+
public Delete addWithItemsList(Collection<? extends WithItem> withItemsList) {
60+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
61+
collection.addAll(withItemsList);
62+
return this.withWithItemsList(collection);
63+
}
3764

3865
public List<OrderByElement> getOrderByElements() {
3966
return orderByElements;
@@ -97,8 +124,22 @@ public void setJoins(List<Join> joins) {
97124
}
98125

99126
@Override
127+
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
100128
public String toString() {
101-
StringBuilder b = new StringBuilder("DELETE");
129+
StringBuilder b = new StringBuilder();
130+
if (withItemsList != null && !withItemsList.isEmpty()) {
131+
b.append("WITH ");
132+
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
133+
WithItem withItem = iter.next();
134+
b.append(withItem);
135+
if (iter.hasNext()) {
136+
b.append(",");
137+
}
138+
b.append(" ");
139+
}
140+
}
141+
142+
b.append("DELETE");
102143

103144
if (tables != null && tables.size() > 0) {
104145
b.append(" ");

src/main/java/net/sf/jsqlparser/statement/merge/Merge.java

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,24 @@
99
*/
1010
package net.sf.jsqlparser.statement.merge;
1111

12+
import java.util.ArrayList;
13+
import java.util.Collection;
14+
import java.util.Collections;
15+
import java.util.Iterator;
16+
import java.util.List;
17+
import java.util.Optional;
1218
import net.sf.jsqlparser.expression.Alias;
1319
import net.sf.jsqlparser.expression.Expression;
1420
import net.sf.jsqlparser.expression.OracleHint;
1521
import net.sf.jsqlparser.schema.Table;
1622
import net.sf.jsqlparser.statement.Statement;
1723
import net.sf.jsqlparser.statement.StatementVisitor;
1824
import net.sf.jsqlparser.statement.select.SubSelect;
25+
import net.sf.jsqlparser.statement.select.WithItem;
1926

2027
public class Merge implements Statement {
2128

29+
private List<WithItem> withItemsList;
2230
private Table table;
2331
private OracleHint oracleHint = null;
2432
private Table usingTable;
@@ -29,14 +37,39 @@ public class Merge implements Statement {
2937
private MergeUpdate mergeUpdate;
3038
private boolean insertFirst = false;
3139

40+
public List<WithItem> getWithItemsList() {
41+
return withItemsList;
42+
}
43+
44+
public void setWithItemsList(List<WithItem> withItemsList) {
45+
this.withItemsList = withItemsList;
46+
}
47+
48+
public Merge withWithItemsList(List<WithItem> withItemsList) {
49+
this.setWithItemsList(withItemsList);
50+
return this;
51+
}
52+
53+
public Merge addWithItemsList(WithItem... withItemsList) {
54+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
55+
Collections.addAll(collection, withItemsList);
56+
return this.withWithItemsList(collection);
57+
}
58+
59+
public Merge addWithItemsList(Collection<? extends WithItem> withItemsList) {
60+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
61+
collection.addAll(withItemsList);
62+
return this.withWithItemsList(collection);
63+
}
64+
3265
public Table getTable() {
3366
return table;
3467
}
3568

3669
public void setTable(Table name) {
3770
table = name;
3871
}
39-
72+
4073
public OracleHint getOracleHint() {
4174
return oracleHint;
4275
}
@@ -110,8 +143,20 @@ public void setInsertFirst(boolean insertFirst) {
110143
}
111144

112145
@Override
146+
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
113147
public String toString() {
114148
StringBuilder b = new StringBuilder();
149+
if (withItemsList != null && !withItemsList.isEmpty()) {
150+
b.append("WITH ");
151+
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
152+
WithItem withItem = iter.next();
153+
b.append(withItem);
154+
if (iter.hasNext()) {
155+
b.append(",");
156+
}
157+
b.append(" ");
158+
}
159+
}
115160
b.append("MERGE INTO ");
116161
b.append(table);
117162
b.append(" USING ");
@@ -129,15 +174,15 @@ public String toString() {
129174
b.append(")");
130175

131176
if (insertFirst && mergeInsert != null) {
132-
b.append(mergeInsert.toString());
177+
b.append(mergeInsert.toString());
133178
}
134179

135180
if (mergeUpdate != null) {
136181
b.append(mergeUpdate.toString());
137182
}
138183

139184
if (!insertFirst && mergeInsert != null) {
140-
b.append(mergeInsert.toString());
185+
b.append(mergeInsert.toString());
141186
}
142187

143188
return b.toString();

src/main/java/net/sf/jsqlparser/statement/update/Update.java

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.Collection;
1414
import java.util.Collections;
15+
import java.util.Iterator;
1516
import java.util.List;
1617
import java.util.Optional;
1718
import net.sf.jsqlparser.expression.Expression;
@@ -27,9 +28,12 @@
2728
import net.sf.jsqlparser.statement.select.PlainSelect;
2829
import net.sf.jsqlparser.statement.select.Select;
2930
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
31+
import net.sf.jsqlparser.statement.select.WithItem;
3032

33+
@SuppressWarnings({"PMD.CyclomaticComplexity"})
3134
public class Update implements Statement {
3235

36+
private List<WithItem> withItemsList;
3337
private Table table;
3438
private Expression where;
3539
private List<Column> columns;
@@ -51,6 +55,31 @@ public void accept(StatementVisitor statementVisitor) {
5155
statementVisitor.visit(this);
5256
}
5357

58+
public List<WithItem> getWithItemsList() {
59+
return withItemsList;
60+
}
61+
62+
public void setWithItemsList(List<WithItem> withItemsList) {
63+
this.withItemsList = withItemsList;
64+
}
65+
66+
public Update withWithItemsList(List<WithItem> withItemsList) {
67+
this.setWithItemsList(withItemsList);
68+
return this;
69+
}
70+
71+
public Update addWithItemsList(WithItem... withItemsList) {
72+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
73+
Collections.addAll(collection, withItemsList);
74+
return this.withWithItemsList(collection);
75+
}
76+
77+
public Update addWithItemsList(Collection<? extends WithItem> withItemsList) {
78+
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
79+
collection.addAll(withItemsList);
80+
return this.withWithItemsList(collection);
81+
}
82+
5483
public Table getTable() {
5584
return table;
5685
}
@@ -66,7 +95,7 @@ public void setTable(Table table) {
6695
public void setWhere(Expression expression) {
6796
where = expression;
6897
}
69-
98+
7099
public OracleHint getOracleHint() {
71100
return oracleHint;
72101
}
@@ -170,21 +199,34 @@ public List<SelectExpressionItem> getReturningExpressionList() {
170199
public void setReturningExpressionList(List<SelectExpressionItem> returningExpressionList) {
171200
this.returningExpressionList = returningExpressionList;
172201
}
173-
202+
174203
@Override
175-
@SuppressWarnings({"PMD.CyclomaticComplexity"})
204+
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
176205
public String toString() {
177-
StringBuilder b = new StringBuilder("UPDATE ");
206+
StringBuilder b = new StringBuilder();
207+
208+
if (withItemsList != null && !withItemsList.isEmpty()) {
209+
b.append("WITH ");
210+
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
211+
WithItem withItem = iter.next();
212+
b.append(withItem);
213+
if (iter.hasNext()) {
214+
b.append(",");
215+
}
216+
b.append(" ");
217+
}
218+
}
219+
b.append("UPDATE ");
178220
b.append(table);
179221
if (startJoins != null) {
180-
for (Join join : startJoins) {
181-
if (join.isSimple()) {
182-
b.append(", ").append(join);
183-
} else {
184-
b.append(" ").append(join);
185-
}
222+
for (Join join : startJoins) {
223+
if (join.isSimple()) {
224+
b.append(", ").append(join);
225+
} else {
226+
b.append(" ").append(join);
186227
}
187228
}
229+
}
188230
b.append(" SET ");
189231

190232
if (!useSelect) {

src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
*/
1010
package net.sf.jsqlparser.util.deparser;
1111

12+
import java.util.Iterator;
1213
import static java.util.stream.Collectors.joining;
1314

1415
import net.sf.jsqlparser.expression.ExpressionVisitor;
1516
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
1617
import net.sf.jsqlparser.schema.Table;
1718
import net.sf.jsqlparser.statement.delete.Delete;
1819
import net.sf.jsqlparser.statement.select.Join;
20+
import net.sf.jsqlparser.statement.select.WithItem;
1921

2022
public class DeleteDeParser extends AbstractDeParser<Delete> {
2123

@@ -31,7 +33,19 @@ public DeleteDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer)
3133
}
3234

3335
@Override
36+
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
3437
public void deParse(Delete delete) {
38+
if (delete.getWithItemsList() != null && !delete.getWithItemsList().isEmpty()) {
39+
buffer.append("WITH ");
40+
for (Iterator<WithItem> iter = delete.getWithItemsList().iterator(); iter.hasNext(); ) {
41+
WithItem withItem = iter.next();
42+
buffer.append(withItem);
43+
if (iter.hasNext()) {
44+
buffer.append(",");
45+
}
46+
buffer.append(" ");
47+
}
48+
}
3549
buffer.append("DELETE");
3650
if (delete.getTables() != null && !delete.getTables().isEmpty()) {
3751
buffer.append(

src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
2323
import net.sf.jsqlparser.statement.select.SelectVisitor;
2424
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
25+
import net.sf.jsqlparser.statement.select.WithItem;
2526
import net.sf.jsqlparser.statement.update.Update;
2627

2728
public class UpdateDeParser extends AbstractDeParser<Update> implements OrderByVisitor {
@@ -42,6 +43,17 @@ public UpdateDeParser(ExpressionVisitor expressionVisitor, SelectVisitor selectV
4243
@Override
4344
@SuppressWarnings({"PMD.CyclomaticComplexity"})
4445
public void deParse(Update update) {
46+
if (update.getWithItemsList() != null && !update.getWithItemsList().isEmpty()) {
47+
buffer.append("WITH ");
48+
for (Iterator<WithItem> iter = update.getWithItemsList().iterator(); iter.hasNext();) {
49+
WithItem withItem = iter.next();
50+
buffer.append(withItem);
51+
if (iter.hasNext()) {
52+
buffer.append(",");
53+
}
54+
buffer.append(" ");
55+
}
56+
}
4557
buffer.append("UPDATE ").append(update.getTable());
4658
if (update.getStartJoins() != null) {
4759
for (Join join : update.getStartJoins()) {

0 commit comments

Comments
 (0)