Skip to content

Commit

Permalink
Merge origin/master
Browse files Browse the repository at this point in the history
Conflicts:
	src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
  • Loading branch information
wumpz committed May 26, 2017
2 parents 2ae5e76 + 81de7a6 commit a55c4de
Show file tree
Hide file tree
Showing 7 changed files with 703 additions and 23 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Also I would like to know about needed examples or documentation stuff.

## Extensions in the latest SNAPSHOT version 1.1

* absolute token positions in addition to column/line
* common normal form transformer for expressions (https://en.wikipedia.org/wiki/Conjunctive_normal_form)
* checkstyle integration to force first souce code conventions
* checkstyle is activated by default, it can be deactivated by an environment property **skipCheckSources**
Expand Down
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
Expand Down
145 changes: 138 additions & 7 deletions src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,82 @@
*/
package net.sf.jsqlparser.util.deparser;

import net.sf.jsqlparser.expression.*;
import net.sf.jsqlparser.expression.operators.arithmetic.*;
import java.util.Iterator;
import java.util.List;

import net.sf.jsqlparser.expression.AllComparisonExpression;
import net.sf.jsqlparser.expression.AnalyticExpression;
import net.sf.jsqlparser.expression.AnyComparisonExpression;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.CaseExpression;
import net.sf.jsqlparser.expression.CastExpression;
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
import net.sf.jsqlparser.expression.DateValue;
import net.sf.jsqlparser.expression.DoubleValue;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.ExtractExpression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.HexValue;
import net.sf.jsqlparser.expression.IntervalExpression;
import net.sf.jsqlparser.expression.JdbcNamedParameter;
import net.sf.jsqlparser.expression.JdbcParameter;
import net.sf.jsqlparser.expression.JsonExpression;
import net.sf.jsqlparser.expression.KeepExpression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.MySQLGroupConcat;
import net.sf.jsqlparser.expression.NotExpression;
import net.sf.jsqlparser.expression.NullValue;
import net.sf.jsqlparser.expression.NumericBind;
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.RowConstructor;
import net.sf.jsqlparser.expression.SignedExpression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.TimeKeyExpression;
import net.sf.jsqlparser.expression.TimeValue;
import net.sf.jsqlparser.expression.TimestampValue;
import net.sf.jsqlparser.expression.UserVariable;
import net.sf.jsqlparser.expression.WhenClause;
import net.sf.jsqlparser.expression.WindowElement;
import net.sf.jsqlparser.expression.WithinGroupExpression;
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd;
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr;
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor;
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
import net.sf.jsqlparser.expression.operators.arithmetic.Division;
import net.sf.jsqlparser.expression.operators.arithmetic.Modulo;
import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication;
import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.*;
import net.sf.jsqlparser.schema.*;
import net.sf.jsqlparser.expression.operators.relational.Between;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
import net.sf.jsqlparser.expression.operators.relational.Matches;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression;
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SubSelect;
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
import java.util.Iterator;
import net.sf.jsqlparser.statement.select.WithItem;

/**
Expand All @@ -43,6 +109,7 @@ public class ExpressionDeParser implements ExpressionVisitor, ItemsListVisitor {
private StringBuilder buffer = new StringBuilder();
private SelectVisitor selectVisitor;
private boolean useBracketsInExprList = true;
private OrderByDeParser orderByDeParser = new OrderByDeParser();

public ExpressionDeParser() {
}
Expand All @@ -63,8 +130,13 @@ public ExpressionDeParser() {
* @param buffer the buffer that will be filled with the expression
*/
public ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer) {
this(selectVisitor, buffer, new OrderByDeParser());
}

ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer, OrderByDeParser orderByDeParser) {
this.selectVisitor = selectVisitor;
this.buffer = buffer;
this.orderByDeParser = orderByDeParser;
}

public StringBuilder getBuffer() {
Expand Down Expand Up @@ -499,7 +571,66 @@ public void visit(Modulo modulo) {

@Override
public void visit(AnalyticExpression aexpr) {
buffer.append(aexpr.toString());
String name = aexpr.getName();
Expression expression = aexpr.getExpression();
Expression offset = aexpr.getOffset();
Expression defaultValue = aexpr.getDefaultValue();
boolean isAllColumns = aexpr.isAllColumns();
KeepExpression keep = aexpr.getKeep();
ExpressionList partitionExpressionList = aexpr.getPartitionExpressionList();
List<OrderByElement> orderByElements = aexpr.getOrderByElements();
WindowElement windowElement = aexpr.getWindowElement();

buffer.append(name).append("(");
if (expression != null) {
expression.accept(this);
if (offset != null) {
buffer.append(", ");
offset.accept(this);
if (defaultValue != null) {
buffer.append(", ");
defaultValue.accept(this);
}
}
} else if (isAllColumns) {
buffer.append("*");
}
buffer.append(") ");
if (keep != null) {
keep.accept(this);
buffer.append(" ");
}
buffer.append("OVER (");

if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
buffer.append("PARTITION BY ");
List<Expression> expressions = partitionExpressionList.getExpressions();
for (int i = 0; i < expressions.size(); i++) {
if (i > 0) {
buffer.append(", ");
}
expressions.get(i).accept(this);
}
buffer.append(" ");
}
if (orderByElements != null && !orderByElements.isEmpty()) {
buffer.append("ORDER BY ");
orderByDeParser.setExpressionVisitor(this);
orderByDeParser.setBuffer(buffer);
for (int i = 0; i < orderByElements.size(); i++) {
if (i > 0) {
buffer.append(", ");
}
orderByDeParser.deParseElement(orderByElements.get(i));
}

if (windowElement != null) {
buffer.append(' ');
buffer.append(windowElement);
}
}

buffer.append(")");
}

@Override
Expand Down
15 changes: 13 additions & 2 deletions src/main/java/net/sf/jsqlparser/util/deparser/OrderByDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@

public class OrderByDeParser {

private final StringBuilder buffer;
private final ExpressionVisitor expressionVisitor;
private StringBuilder buffer;
private ExpressionVisitor expressionVisitor;

OrderByDeParser() {
}

public OrderByDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
this.expressionVisitor = expressionVisitor;
Expand Down Expand Up @@ -70,4 +73,12 @@ public void deParseElement(OrderByElement orderBy) {
append(orderBy.getNullOrdering() == OrderByElement.NullOrdering.NULLS_FIRST ? "NULLS FIRST" : "NULLS LAST");
}
}

void setExpressionVisitor(ExpressionVisitor expressionVisitor) {
this.expressionVisitor = expressionVisitor;
}

void setBuffer(StringBuilder buffer) {
this.buffer = buffer;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,19 @@
import net.sf.jsqlparser.statement.update.Update;

public class StatementDeParser implements StatementVisitor {
private ExpressionDeParser expressionDeParser;

private SelectDeParser selectDeParser;

private StringBuilder buffer;

public StatementDeParser(StringBuilder buffer) {
this(new ExpressionDeParser(), new SelectDeParser(), buffer);
}

public StatementDeParser(ExpressionDeParser expressionDeParser, SelectDeParser selectDeParser, StringBuilder buffer) {
this.expressionDeParser = expressionDeParser;
this.selectDeParser = selectDeParser;
this.buffer = buffer;
}

Expand Down Expand Up @@ -77,9 +86,9 @@ public void visit(AlterView alterView) {

@Override
public void visit(Delete delete) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
DeleteDeParser deleteDeParser = new DeleteDeParser(expressionDeParser, buffer);
deleteDeParser.deParse(delete);
Expand All @@ -93,29 +102,29 @@ public void visit(Drop drop) {

@Override
public void visit(Insert insert) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
InsertDeParser insertDeParser = new InsertDeParser(expressionDeParser, selectDeParser, buffer);
insertDeParser.deParse(insert);
}

@Override
public void visit(Replace replace) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
ReplaceDeParser replaceDeParser = new ReplaceDeParser(expressionDeParser, selectDeParser, buffer);
replaceDeParser.deParse(replace);
}

@Override
public void visit(Select select) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) {
buffer.append("WITH ");
Expand All @@ -137,9 +146,9 @@ public void visit(Truncate truncate) {

@Override
public void visit(Update update) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
UpdateDeParser updateDeParser = new UpdateDeParser(expressionDeParser, selectDeParser, buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
updateDeParser.deParse(update);
Expand Down Expand Up @@ -167,19 +176,19 @@ public void visit(Statements stmts) {

@Override
public void visit(Execute execute) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
ExecuteDeParser executeDeParser = new ExecuteDeParser(expressionDeParser, buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
executeDeParser.deParse(execute);
}

@Override
public void visit(SetStatement set) {
SelectDeParser selectDeParser = new SelectDeParser();
selectDeParser.setBuffer(buffer);
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
expressionDeParser.setSelectVisitor(selectDeParser);
expressionDeParser.setBuffer(buffer);
SetStatementDeParser setStatementDeparser = new SetStatementDeParser(expressionDeParser, buffer);
selectDeParser.setExpressionVisitor(expressionDeParser);
setStatementDeparser.deParse(set);
Expand Down
Loading

0 comments on commit a55c4de

Please sign in to comment.