Skip to content

Update sets #1317

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Aug 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.840
minimum = 0.837
}
}
}
Expand Down
138 changes: 101 additions & 37 deletions src/main/java/net/sf/jsqlparser/statement/update/Update.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,28 @@
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.Join;
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.Select;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.WithItem;
import net.sf.jsqlparser.statement.select.*;

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

private List<WithItem> withItemsList;
private Table table;
private Expression where;
private List<Column> columns;
private List<Expression> expressions;
private final ArrayList<UpdateSet> updateSets = new ArrayList<>();
private FromItem fromItem;
private List<Join> joins;
private List<Join> startJoins;
private Select select;
private boolean useColumnsBrackets = true;
private boolean useSelect = false;
private OracleHint oracleHint = null;
private List<OrderByElement> orderByElements;
private Limit limit;
private boolean returningAllColumns = false;
private List<SelectExpressionItem> returningExpressionList = null;

public ArrayList<UpdateSet> getUpdateSets() {
return updateSets;
}

@Override
public void accept(StatementVisitor statementVisitor) {
statementVisitor.visit(this);
Expand Down Expand Up @@ -104,20 +97,37 @@ public void setOracleHint(OracleHint oracleHint) {
this.oracleHint = oracleHint;
}

public void addUpdateSet(Column column, Expression expression) {
updateSets.add(new UpdateSet(column, expression));
}

public void addUpdateSet(UpdateSet updateSet) {
updateSets.add(updateSet);
}

@Deprecated
public List<Column> getColumns() {
return columns;
return updateSets.get(0).columns;
}

@Deprecated
public List<Expression> getExpressions() {
return expressions;
return updateSets.get(0).expressions;
}

@Deprecated
public void setColumns(List<Column> list) {
columns = list;
if (updateSets.isEmpty()) {
updateSets.add(new UpdateSet());
}
updateSets.get(0).columns.clear();
updateSets.get(0).columns.addAll(list);
}

@Deprecated
public void setExpressions(List<Expression> list) {
expressions = list;
updateSets.get(0).expressions.clear();
updateSets.get(0).expressions.addAll(list);
}

public FromItem getFromItem() {
Expand All @@ -144,28 +154,49 @@ public void setStartJoins(List<Join> startJoins) {
this.startJoins = startJoins;
}

@Deprecated
public Select getSelect() {
Select select = null;
if (updateSets.get(0).expressions.get(0) instanceof SubSelect) {
SubSelect subSelect = (SubSelect) updateSets.get(0).expressions.get(0);
select = new Select().withWithItemsList(subSelect.getWithItemsList()).withSelectBody(subSelect.getSelectBody());
}

return select;
}

@Deprecated
public void setSelect(Select select) {
this.select = select;
if (select!=null) {
SubSelect subSelect = new SubSelect().withSelectBody(select.getSelectBody());
if (select.getWithItemsList() != null && select.getWithItemsList().size() > 0)
subSelect.setWithItemsList(select.getWithItemsList());

if (updateSets.get(0).expressions.isEmpty()) {
updateSets.get(0).expressions.add(subSelect);
} else {
updateSets.get(0).expressions.set(0, subSelect);
}
}
}

@Deprecated
public boolean isUseColumnsBrackets() {
return useColumnsBrackets;
return updateSets.get(0).usingBrackets;
}

@Deprecated
public void setUseColumnsBrackets(boolean useColumnsBrackets) {
this.useColumnsBrackets = useColumnsBrackets;
updateSets.get(0).usingBrackets = useColumnsBrackets;
}

@Deprecated
public boolean isUseSelect() {
return useSelect;
return (updateSets.get(0).expressions.get(0) instanceof SubSelect);
}

@Deprecated
public void setUseSelect(boolean useSelect) {
this.useSelect = useSelect;
}

public void setOrderByElements(List<OrderByElement> orderByElements) {
Expand Down Expand Up @@ -201,7 +232,7 @@ public void setReturningExpressionList(List<SelectExpressionItem> returningExpre
}

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

Expand Down Expand Up @@ -229,31 +260,64 @@ public String toString() {
}
b.append(" SET ");

if (!useSelect) {
for (int i = 0; i < getColumns().size(); i++) {
if (i != 0) {
b.append(", ");
}
b.append(columns.get(i)).append(" = ");
b.append(expressions.get(i));
int j=0;
for (UpdateSet updateSet:updateSets) {
if (j > 0) {
b.append(", ");
}
} else {
if (useColumnsBrackets) {

if (updateSet.usingBrackets) {
b.append("(");
}
for (int i = 0; i < getColumns().size(); i++) {
if (i != 0) {

for (int i = 0; i < updateSet.columns.size(); i++) {
if (i > 0) {
b.append(", ");
}
b.append(columns.get(i));
b.append(updateSet.columns.get(i));
}
if (useColumnsBrackets) {

if (updateSet.usingBrackets) {
b.append(")");
}

b.append(" = ");
b.append("(").append(select).append(")");

for (int i = 0; i < updateSet.expressions.size(); i++) {
if (i > 0) {
b.append(", ");
}
b.append(updateSet.expressions.get(i));
}

j++;
}

// if (!useSelect) {
// for (int i = 0; i < getColumns().size(); i++) {
// if (i != 0) {
// b.append(", ");
// }
// b.append(columns.get(i)).append(" = ");
// b.append(expressions.get(i));
// }
// } else {
// if (useColumnsBrackets) {
// b.append("(");
// }
// for (int i = 0; i < getColumns().size(); i++) {
// if (i != 0) {
// b.append(", ");
// }
// b.append(columns.get(i));
// }
// if (useColumnsBrackets) {
// b.append(")");
// }
// b.append(" = ");
// b.append("(").append(select).append(")");
// }

if (fromItem != null) {
b.append(" FROM ").append(fromItem);
if (joins != null) {
Expand Down
64 changes: 64 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/update/UpdateSet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package net.sf.jsqlparser.statement.update;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.schema.Column;

import java.util.ArrayList;
import java.util.Objects;

public class UpdateSet {
protected boolean usingBrackets = false;
protected ArrayList<Column> columns = new ArrayList<>();
protected ArrayList<Expression> expressions = new ArrayList<>();

public UpdateSet() {

}

public UpdateSet(Column column) {
this.columns.add(column);
}

public UpdateSet(Column column, Expression expression) {
this.columns.add(column);
this.expressions.add(expression);
}

public boolean isUsingBrackets() {
return usingBrackets;
}

public void setUsingBrackets(boolean usingBrackets) {
this.usingBrackets = usingBrackets;
}

public ArrayList<Column> getColumns() {
return columns;
}

public void setColumns(ArrayList<Column> columns) {
this.columns = Objects.requireNonNull(columns);
}

public ArrayList<Expression> getExpressions() {
return expressions;
}

public void setExpressions(ArrayList<Expression> expressions) {
this.expressions = Objects.requireNonNull(expressions);
}

public void add(Column column, Expression expression) {
columns.add(column);
expressions.add(expression);
};

public void add(Column column) {
columns.add(column);
};

public void add(ExpressionList expressionList) {
expressions.addAll(expressionList.getExpressions());
};
}
Loading