Skip to content

Commit 81de7a6

Browse files
chrychengwumpz
authored andcommitted
Fix issue #452 (#453)
* Test existing ExpressionDeParser behavior before fixing * Begin fixing issue #452 by copying AnalyticExpression's toString * Organize ExpressionDeParser imports * Remove dependence on PlainSelect's getStringList * Fix issue #452 * Use ExpressionDeParser in AnalyticExpression's toString * Revert "Use ExpressionDeParser in AnalyticExpression's toString" This reverts commit 5f44e05.
1 parent 9d680a6 commit 81de7a6

File tree

3 files changed

+359
-9
lines changed

3 files changed

+359
-9
lines changed

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
}

0 commit comments

Comments
 (0)