Skip to content

Commit

Permalink
Implement WITH for DELETE, UPDATE and MERGE statements
Browse files Browse the repository at this point in the history
  • Loading branch information
manticore-projects committed May 28, 2021
1 parent 9184cda commit fe134e8
Show file tree
Hide file tree
Showing 9 changed files with 233 additions and 34 deletions.
43 changes: 42 additions & 1 deletion src/main/java/net/sf/jsqlparser/statement/delete/Delete.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import static java.util.stream.Collectors.joining;
Expand All @@ -24,16 +25,42 @@
import net.sf.jsqlparser.statement.select.Limit;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.WithItem;

public class Delete implements Statement {

private List<WithItem> withItemsList;
private Table table;
private OracleHint oracleHint = null;
private List<Table> tables;
private List<Join> joins;
private Expression where;
private Limit limit;
private List<OrderByElement> orderByElements;
public List<WithItem> getWithItemsList() {
return withItemsList;
}

public void setWithItemsList(List<WithItem> withItemsList) {
this.withItemsList = withItemsList;
}

public Delete withWithItemsList(List<WithItem> withItemsList) {
this.setWithItemsList(withItemsList);
return this;
}

public Delete addWithItemsList(WithItem... withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
Collections.addAll(collection, withItemsList);
return this.withWithItemsList(collection);
}

public Delete addWithItemsList(Collection<? extends WithItem> withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
collection.addAll(withItemsList);
return this.withWithItemsList(collection);
}

public List<OrderByElement> getOrderByElements() {
return orderByElements;
Expand Down Expand Up @@ -97,8 +124,22 @@ public void setJoins(List<Join> joins) {
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public String toString() {
StringBuilder b = new StringBuilder("DELETE");
StringBuilder b = new StringBuilder();
if (withItemsList != null && !withItemsList.isEmpty()) {
b.append("WITH ");
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
WithItem withItem = iter.next();
b.append(withItem);
if (iter.hasNext()) {
b.append(",");
}
b.append(" ");
}
}

b.append("DELETE");

if (tables != null && tables.size() > 0) {
b.append(" ");
Expand Down
51 changes: 48 additions & 3 deletions src/main/java/net/sf/jsqlparser/statement/merge/Merge.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,24 @@
*/
package net.sf.jsqlparser.statement.merge;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.select.SubSelect;
import net.sf.jsqlparser.statement.select.WithItem;

public class Merge implements Statement {

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

public List<WithItem> getWithItemsList() {
return withItemsList;
}

public void setWithItemsList(List<WithItem> withItemsList) {
this.withItemsList = withItemsList;
}

public Merge withWithItemsList(List<WithItem> withItemsList) {
this.setWithItemsList(withItemsList);
return this;
}

public Merge addWithItemsList(WithItem... withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
Collections.addAll(collection, withItemsList);
return this.withWithItemsList(collection);
}

public Merge addWithItemsList(Collection<? extends WithItem> withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
collection.addAll(withItemsList);
return this.withWithItemsList(collection);
}

public Table getTable() {
return table;
}

public void setTable(Table name) {
table = name;
}

public OracleHint getOracleHint() {
return oracleHint;
}
Expand Down Expand Up @@ -110,8 +143,20 @@ public void setInsertFirst(boolean insertFirst) {
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public String toString() {
StringBuilder b = new StringBuilder();
if (withItemsList != null && !withItemsList.isEmpty()) {
b.append("WITH ");
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
WithItem withItem = iter.next();
b.append(withItem);
if (iter.hasNext()) {
b.append(",");
}
b.append(" ");
}
}
b.append("MERGE INTO ");
b.append(table);
b.append(" USING ");
Expand All @@ -129,15 +174,15 @@ public String toString() {
b.append(")");

if (insertFirst && mergeInsert != null) {
b.append(mergeInsert.toString());
b.append(mergeInsert.toString());
}

if (mergeUpdate != null) {
b.append(mergeUpdate.toString());
}

if (!insertFirst && mergeInsert != null) {
b.append(mergeInsert.toString());
b.append(mergeInsert.toString());
}

return b.toString();
Expand Down
62 changes: 52 additions & 10 deletions src/main/java/net/sf/jsqlparser/statement/update/Update.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import net.sf.jsqlparser.expression.Expression;
Expand All @@ -27,9 +28,12 @@
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.WithItem;

@SuppressWarnings({"PMD.CyclomaticComplexity"})
public class Update implements Statement {

private List<WithItem> withItemsList;
private Table table;
private Expression where;
private List<Column> columns;
Expand All @@ -51,6 +55,31 @@ public void accept(StatementVisitor statementVisitor) {
statementVisitor.visit(this);
}

public List<WithItem> getWithItemsList() {
return withItemsList;
}

public void setWithItemsList(List<WithItem> withItemsList) {
this.withItemsList = withItemsList;
}

public Update withWithItemsList(List<WithItem> withItemsList) {
this.setWithItemsList(withItemsList);
return this;
}

public Update addWithItemsList(WithItem... withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
Collections.addAll(collection, withItemsList);
return this.withWithItemsList(collection);
}

public Update addWithItemsList(Collection<? extends WithItem> withItemsList) {
List<WithItem> collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new);
collection.addAll(withItemsList);
return this.withWithItemsList(collection);
}

public Table getTable() {
return table;
}
Expand All @@ -66,7 +95,7 @@ public void setTable(Table table) {
public void setWhere(Expression expression) {
where = expression;
}

public OracleHint getOracleHint() {
return oracleHint;
}
Expand Down Expand Up @@ -170,21 +199,34 @@ public List<SelectExpressionItem> getReturningExpressionList() {
public void setReturningExpressionList(List<SelectExpressionItem> returningExpressionList) {
this.returningExpressionList = returningExpressionList;
}

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity"})
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public String toString() {
StringBuilder b = new StringBuilder("UPDATE ");
StringBuilder b = new StringBuilder();

if (withItemsList != null && !withItemsList.isEmpty()) {
b.append("WITH ");
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
WithItem withItem = iter.next();
b.append(withItem);
if (iter.hasNext()) {
b.append(",");
}
b.append(" ");
}
}
b.append("UPDATE ");
b.append(table);
if (startJoins != null) {
for (Join join : startJoins) {
if (join.isSimple()) {
b.append(", ").append(join);
} else {
b.append(" ").append(join);
}
for (Join join : startJoins) {
if (join.isSimple()) {
b.append(", ").append(join);
} else {
b.append(" ").append(join);
}
}
}
b.append(" SET ");

if (!useSelect) {
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/deparser/DeleteDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
*/
package net.sf.jsqlparser.util.deparser;

import java.util.Iterator;
import static java.util.stream.Collectors.joining;

import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.WithItem;

public class DeleteDeParser extends AbstractDeParser<Delete> {

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

@Override
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public void deParse(Delete delete) {
if (delete.getWithItemsList() != null && !delete.getWithItemsList().isEmpty()) {
buffer.append("WITH ");
for (Iterator<WithItem> iter = delete.getWithItemsList().iterator(); iter.hasNext(); ) {
WithItem withItem = iter.next();
buffer.append(withItem);
if (iter.hasNext()) {
buffer.append(",");
}
buffer.append(" ");
}
}
buffer.append("DELETE");
if (delete.getTables() != null && !delete.getTables().isEmpty()) {
buffer.append(
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
import net.sf.jsqlparser.statement.select.WithItem;
import net.sf.jsqlparser.statement.update.Update;

public class UpdateDeParser extends AbstractDeParser<Update> implements OrderByVisitor {
Expand All @@ -42,6 +43,17 @@ public UpdateDeParser(ExpressionVisitor expressionVisitor, SelectVisitor selectV
@Override
@SuppressWarnings({"PMD.CyclomaticComplexity"})
public void deParse(Update update) {
if (update.getWithItemsList() != null && !update.getWithItemsList().isEmpty()) {
buffer.append("WITH ");
for (Iterator<WithItem> iter = update.getWithItemsList().iterator(); iter.hasNext();) {
WithItem withItem = iter.next();
buffer.append(withItem);
if (iter.hasNext()) {
buffer.append(",");
}
buffer.append(" ");
}
}
buffer.append("UPDATE ").append(update.getTable());
if (update.getStartJoins() != null) {
for (Join join : update.getStartJoins()) {
Expand Down

0 comments on commit fe134e8

Please sign in to comment.