21
21
*/
22
22
package net .sf .jsqlparser .util .deparser ;
23
23
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 ;
26
73
import net .sf .jsqlparser .expression .operators .conditional .AndExpression ;
27
74
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 ;
30
98
import net .sf .jsqlparser .statement .select .SelectVisitor ;
31
99
import net .sf .jsqlparser .statement .select .SubSelect ;
32
- import net .sf .jsqlparser .expression .operators .relational .JsonOperator ;
33
- import java .util .Iterator ;
34
100
import net .sf .jsqlparser .statement .select .WithItem ;
35
101
36
102
/**
@@ -43,6 +109,7 @@ public class ExpressionDeParser implements ExpressionVisitor, ItemsListVisitor {
43
109
private StringBuilder buffer = new StringBuilder ();
44
110
private SelectVisitor selectVisitor ;
45
111
private boolean useBracketsInExprList = true ;
112
+ private OrderByDeParser orderByDeParser = new OrderByDeParser ();
46
113
47
114
public ExpressionDeParser () {
48
115
}
@@ -63,8 +130,13 @@ public ExpressionDeParser() {
63
130
* @param buffer the buffer that will be filled with the expression
64
131
*/
65
132
public ExpressionDeParser (SelectVisitor selectVisitor , StringBuilder buffer ) {
133
+ this (selectVisitor , buffer , new OrderByDeParser ());
134
+ }
135
+
136
+ ExpressionDeParser (SelectVisitor selectVisitor , StringBuilder buffer , OrderByDeParser orderByDeParser ) {
66
137
this .selectVisitor = selectVisitor ;
67
138
this .buffer = buffer ;
139
+ this .orderByDeParser = orderByDeParser ;
68
140
}
69
141
70
142
public StringBuilder getBuffer () {
@@ -499,7 +571,66 @@ public void visit(Modulo modulo) {
499
571
500
572
@ Override
501
573
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 (")" );
503
634
}
504
635
505
636
@ Override
0 commit comments