2121 */
2222package 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 ;
2673import net .sf .jsqlparser .expression .operators .conditional .AndExpression ;
2774import 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 ;
3098import net .sf .jsqlparser .statement .select .SelectVisitor ;
3199import net .sf .jsqlparser .statement .select .SubSelect ;
32- import net .sf .jsqlparser .expression .operators .relational .JsonOperator ;
33- import java .util .Iterator ;
34100import 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
0 commit comments