Skip to content

Commit a55c4de

Browse files
committed
Merge origin/master
Conflicts: src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java
2 parents 2ae5e76 + 81de7a6 commit a55c4de

File tree

7 files changed

+703
-23
lines changed

7 files changed

+703
-23
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Also I would like to know about needed examples or documentation stuff.
4747

4848
## Extensions in the latest SNAPSHOT version 1.1
4949

50+
* absolute token positions in addition to column/line
5051
* common normal form transformer for expressions (https://en.wikipedia.org/wiki/Conjunctive_normal_form)
5152
* checkstyle integration to force first souce code conventions
5253
* checkstyle is activated by default, it can be deactivated by an environment property **skipCheckSources**

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
<version>4.12</version>
3838
<scope>test</scope>
3939
</dependency>
40+
<dependency>
41+
<groupId>org.hamcrest</groupId>
42+
<artifactId>hamcrest-library</artifactId>
43+
<version>1.3</version>
44+
<scope>test</scope>
45+
</dependency>
4046
<dependency>
4147
<groupId>org.mockito</groupId>
4248
<artifactId>mockito-core</artifactId>

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

Lines changed: 138 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,82 @@
2121
*/
2222
package net.sf.jsqlparser.util.deparser;
2323

24-
import net.sf.jsqlparser.expression.*;
25-
import net.sf.jsqlparser.expression.operators.arithmetic.*;
24+
import java.util.Iterator;
25+
import java.util.List;
26+
27+
import net.sf.jsqlparser.expression.AllComparisonExpression;
28+
import net.sf.jsqlparser.expression.AnalyticExpression;
29+
import net.sf.jsqlparser.expression.AnyComparisonExpression;
30+
import net.sf.jsqlparser.expression.BinaryExpression;
31+
import net.sf.jsqlparser.expression.CaseExpression;
32+
import net.sf.jsqlparser.expression.CastExpression;
33+
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
34+
import net.sf.jsqlparser.expression.DateValue;
35+
import net.sf.jsqlparser.expression.DoubleValue;
36+
import net.sf.jsqlparser.expression.Expression;
37+
import net.sf.jsqlparser.expression.ExpressionVisitor;
38+
import net.sf.jsqlparser.expression.ExtractExpression;
39+
import net.sf.jsqlparser.expression.Function;
40+
import net.sf.jsqlparser.expression.HexValue;
41+
import net.sf.jsqlparser.expression.IntervalExpression;
42+
import net.sf.jsqlparser.expression.JdbcNamedParameter;
43+
import net.sf.jsqlparser.expression.JdbcParameter;
44+
import net.sf.jsqlparser.expression.JsonExpression;
45+
import net.sf.jsqlparser.expression.KeepExpression;
46+
import net.sf.jsqlparser.expression.LongValue;
47+
import net.sf.jsqlparser.expression.MySQLGroupConcat;
48+
import net.sf.jsqlparser.expression.NotExpression;
49+
import net.sf.jsqlparser.expression.NullValue;
50+
import net.sf.jsqlparser.expression.NumericBind;
51+
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
52+
import net.sf.jsqlparser.expression.OracleHint;
53+
import net.sf.jsqlparser.expression.Parenthesis;
54+
import net.sf.jsqlparser.expression.RowConstructor;
55+
import net.sf.jsqlparser.expression.SignedExpression;
56+
import net.sf.jsqlparser.expression.StringValue;
57+
import net.sf.jsqlparser.expression.TimeKeyExpression;
58+
import net.sf.jsqlparser.expression.TimeValue;
59+
import net.sf.jsqlparser.expression.TimestampValue;
60+
import net.sf.jsqlparser.expression.UserVariable;
61+
import net.sf.jsqlparser.expression.WhenClause;
62+
import net.sf.jsqlparser.expression.WindowElement;
63+
import net.sf.jsqlparser.expression.WithinGroupExpression;
64+
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
65+
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd;
66+
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr;
67+
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor;
68+
import net.sf.jsqlparser.expression.operators.arithmetic.Concat;
69+
import net.sf.jsqlparser.expression.operators.arithmetic.Division;
70+
import net.sf.jsqlparser.expression.operators.arithmetic.Modulo;
71+
import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication;
72+
import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
2673
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
2774
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
28-
import net.sf.jsqlparser.expression.operators.relational.*;
29-
import net.sf.jsqlparser.schema.*;
75+
import net.sf.jsqlparser.expression.operators.relational.Between;
76+
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
77+
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
78+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
79+
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
80+
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
81+
import net.sf.jsqlparser.expression.operators.relational.InExpression;
82+
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
83+
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
84+
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
85+
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
86+
import net.sf.jsqlparser.expression.operators.relational.Matches;
87+
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
88+
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
89+
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
90+
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
91+
import net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression;
92+
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
93+
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
94+
import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
95+
import net.sf.jsqlparser.schema.Column;
96+
import net.sf.jsqlparser.schema.Table;
97+
import net.sf.jsqlparser.statement.select.OrderByElement;
3098
import net.sf.jsqlparser.statement.select.SelectVisitor;
3199
import net.sf.jsqlparser.statement.select.SubSelect;
32-
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
33-
import java.util.Iterator;
34100
import net.sf.jsqlparser.statement.select.WithItem;
35101

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

47114
public ExpressionDeParser() {
48115
}
@@ -63,8 +130,13 @@ public ExpressionDeParser() {
63130
* @param buffer the buffer that will be filled with the expression
64131
*/
65132
public ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer) {
133+
this(selectVisitor, buffer, new OrderByDeParser());
134+
}
135+
136+
ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer, OrderByDeParser orderByDeParser) {
66137
this.selectVisitor = selectVisitor;
67138
this.buffer = buffer;
139+
this.orderByDeParser = orderByDeParser;
68140
}
69141

70142
public StringBuilder getBuffer() {
@@ -499,7 +571,66 @@ public void visit(Modulo modulo) {
499571

500572
@Override
501573
public void visit(AnalyticExpression aexpr) {
502-
buffer.append(aexpr.toString());
574+
String name = aexpr.getName();
575+
Expression expression = aexpr.getExpression();
576+
Expression offset = aexpr.getOffset();
577+
Expression defaultValue = aexpr.getDefaultValue();
578+
boolean isAllColumns = aexpr.isAllColumns();
579+
KeepExpression keep = aexpr.getKeep();
580+
ExpressionList partitionExpressionList = aexpr.getPartitionExpressionList();
581+
List<OrderByElement> orderByElements = aexpr.getOrderByElements();
582+
WindowElement windowElement = aexpr.getWindowElement();
583+
584+
buffer.append(name).append("(");
585+
if (expression != null) {
586+
expression.accept(this);
587+
if (offset != null) {
588+
buffer.append(", ");
589+
offset.accept(this);
590+
if (defaultValue != null) {
591+
buffer.append(", ");
592+
defaultValue.accept(this);
593+
}
594+
}
595+
} else if (isAllColumns) {
596+
buffer.append("*");
597+
}
598+
buffer.append(") ");
599+
if (keep != null) {
600+
keep.accept(this);
601+
buffer.append(" ");
602+
}
603+
buffer.append("OVER (");
604+
605+
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
606+
buffer.append("PARTITION BY ");
607+
List<Expression> expressions = partitionExpressionList.getExpressions();
608+
for (int i = 0; i < expressions.size(); i++) {
609+
if (i > 0) {
610+
buffer.append(", ");
611+
}
612+
expressions.get(i).accept(this);
613+
}
614+
buffer.append(" ");
615+
}
616+
if (orderByElements != null && !orderByElements.isEmpty()) {
617+
buffer.append("ORDER BY ");
618+
orderByDeParser.setExpressionVisitor(this);
619+
orderByDeParser.setBuffer(buffer);
620+
for (int i = 0; i < orderByElements.size(); i++) {
621+
if (i > 0) {
622+
buffer.append(", ");
623+
}
624+
orderByDeParser.deParseElement(orderByElements.get(i));
625+
}
626+
627+
if (windowElement != null) {
628+
buffer.append(' ');
629+
buffer.append(windowElement);
630+
}
631+
}
632+
633+
buffer.append(")");
503634
}
504635

505636
@Override

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@
2929

3030
public class OrderByDeParser {
3131

32-
private final StringBuilder buffer;
33-
private final ExpressionVisitor expressionVisitor;
32+
private StringBuilder buffer;
33+
private ExpressionVisitor expressionVisitor;
34+
35+
OrderByDeParser() {
36+
}
3437

3538
public OrderByDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
3639
this.expressionVisitor = expressionVisitor;
@@ -70,4 +73,12 @@ public void deParseElement(OrderByElement orderBy) {
7073
append(orderBy.getNullOrdering() == OrderByElement.NullOrdering.NULLS_FIRST ? "NULLS FIRST" : "NULLS LAST");
7174
}
7275
}
76+
77+
void setExpressionVisitor(ExpressionVisitor expressionVisitor) {
78+
this.expressionVisitor = expressionVisitor;
79+
}
80+
81+
void setBuffer(StringBuilder buffer) {
82+
this.buffer = buffer;
83+
}
7384
}

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,19 @@
4444
import net.sf.jsqlparser.statement.update.Update;
4545

4646
public class StatementDeParser implements StatementVisitor {
47+
private ExpressionDeParser expressionDeParser;
48+
49+
private SelectDeParser selectDeParser;
4750

4851
private StringBuilder buffer;
4952

5053
public StatementDeParser(StringBuilder buffer) {
54+
this(new ExpressionDeParser(), new SelectDeParser(), buffer);
55+
}
56+
57+
public StatementDeParser(ExpressionDeParser expressionDeParser, SelectDeParser selectDeParser, StringBuilder buffer) {
58+
this.expressionDeParser = expressionDeParser;
59+
this.selectDeParser = selectDeParser;
5160
this.buffer = buffer;
5261
}
5362

@@ -77,9 +86,9 @@ public void visit(AlterView alterView) {
7786

7887
@Override
7988
public void visit(Delete delete) {
80-
SelectDeParser selectDeParser = new SelectDeParser();
8189
selectDeParser.setBuffer(buffer);
82-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
90+
expressionDeParser.setSelectVisitor(selectDeParser);
91+
expressionDeParser.setBuffer(buffer);
8392
selectDeParser.setExpressionVisitor(expressionDeParser);
8493
DeleteDeParser deleteDeParser = new DeleteDeParser(expressionDeParser, buffer);
8594
deleteDeParser.deParse(delete);
@@ -93,29 +102,29 @@ public void visit(Drop drop) {
93102

94103
@Override
95104
public void visit(Insert insert) {
96-
SelectDeParser selectDeParser = new SelectDeParser();
97105
selectDeParser.setBuffer(buffer);
98-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
106+
expressionDeParser.setSelectVisitor(selectDeParser);
107+
expressionDeParser.setBuffer(buffer);
99108
selectDeParser.setExpressionVisitor(expressionDeParser);
100109
InsertDeParser insertDeParser = new InsertDeParser(expressionDeParser, selectDeParser, buffer);
101110
insertDeParser.deParse(insert);
102111
}
103112

104113
@Override
105114
public void visit(Replace replace) {
106-
SelectDeParser selectDeParser = new SelectDeParser();
107115
selectDeParser.setBuffer(buffer);
108-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
116+
expressionDeParser.setSelectVisitor(selectDeParser);
117+
expressionDeParser.setBuffer(buffer);
109118
selectDeParser.setExpressionVisitor(expressionDeParser);
110119
ReplaceDeParser replaceDeParser = new ReplaceDeParser(expressionDeParser, selectDeParser, buffer);
111120
replaceDeParser.deParse(replace);
112121
}
113122

114123
@Override
115124
public void visit(Select select) {
116-
SelectDeParser selectDeParser = new SelectDeParser();
117125
selectDeParser.setBuffer(buffer);
118-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
126+
expressionDeParser.setSelectVisitor(selectDeParser);
127+
expressionDeParser.setBuffer(buffer);
119128
selectDeParser.setExpressionVisitor(expressionDeParser);
120129
if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) {
121130
buffer.append("WITH ");
@@ -137,9 +146,9 @@ public void visit(Truncate truncate) {
137146

138147
@Override
139148
public void visit(Update update) {
140-
SelectDeParser selectDeParser = new SelectDeParser();
141149
selectDeParser.setBuffer(buffer);
142-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
150+
expressionDeParser.setSelectVisitor(selectDeParser);
151+
expressionDeParser.setBuffer(buffer);
143152
UpdateDeParser updateDeParser = new UpdateDeParser(expressionDeParser, selectDeParser, buffer);
144153
selectDeParser.setExpressionVisitor(expressionDeParser);
145154
updateDeParser.deParse(update);
@@ -167,19 +176,19 @@ public void visit(Statements stmts) {
167176

168177
@Override
169178
public void visit(Execute execute) {
170-
SelectDeParser selectDeParser = new SelectDeParser();
171179
selectDeParser.setBuffer(buffer);
172-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
180+
expressionDeParser.setSelectVisitor(selectDeParser);
181+
expressionDeParser.setBuffer(buffer);
173182
ExecuteDeParser executeDeParser = new ExecuteDeParser(expressionDeParser, buffer);
174183
selectDeParser.setExpressionVisitor(expressionDeParser);
175184
executeDeParser.deParse(execute);
176185
}
177186

178187
@Override
179188
public void visit(SetStatement set) {
180-
SelectDeParser selectDeParser = new SelectDeParser();
181189
selectDeParser.setBuffer(buffer);
182-
ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer);
190+
expressionDeParser.setSelectVisitor(selectDeParser);
191+
expressionDeParser.setBuffer(buffer);
183192
SetStatementDeParser setStatementDeparser = new SetStatementDeParser(expressionDeParser, buffer);
184193
selectDeParser.setExpressionVisitor(expressionDeParser);
185194
setStatementDeparser.deParse(set);

0 commit comments

Comments
 (0)