Skip to content

Commit db4a27e

Browse files
committed
fixes #90
1 parent 55b8e7a commit db4a27e

File tree

11 files changed

+271
-99
lines changed

11 files changed

+271
-99
lines changed

src/main/java/net/sf/jsqlparser/expression/AnalyticExpression.java

Lines changed: 86 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
*/
2222
package net.sf.jsqlparser.expression;
2323

24-
import net.sf.jsqlparser.schema.Column;
2524
import net.sf.jsqlparser.statement.select.OrderByElement;
2625

2726
import java.util.List;
@@ -38,36 +37,37 @@
3837
*/
3938
public class AnalyticExpression implements Expression {
4039

41-
//private List<Column> partitionByColumns;
40+
//private List<Column> partitionByColumns;
4241
private ExpressionList partitionExpressionList;
43-
private List<OrderByElement> orderByElements;
44-
private String name;
45-
private Expression expression;
42+
private List<OrderByElement> orderByElements;
43+
private String name;
44+
private Expression expression;
4645
private Expression offset;
4746
private Expression defaultValue;
48-
private boolean allColumns = false;
47+
private boolean allColumns = false;
4948
private WindowElement windowElement;
49+
private KeepExpression keep = null;
5050

51-
@Override
52-
public void accept(ExpressionVisitor expressionVisitor) {
53-
expressionVisitor.visit(this);
54-
}
51+
@Override
52+
public void accept(ExpressionVisitor expressionVisitor) {
53+
expressionVisitor.visit(this);
54+
}
5555

56-
public List<OrderByElement> getOrderByElements() {
57-
return orderByElements;
58-
}
56+
public List<OrderByElement> getOrderByElements() {
57+
return orderByElements;
58+
}
5959

60-
public void setOrderByElements(List<OrderByElement> orderByElements) {
61-
this.orderByElements = orderByElements;
62-
}
60+
public void setOrderByElements(List<OrderByElement> orderByElements) {
61+
this.orderByElements = orderByElements;
62+
}
6363

64-
// public List<Column> getPartitionByColumns() {
65-
// return partitionByColumns;
66-
// }
67-
//
68-
// public void setPartitionByColumns(List<Column> partitionByColumns) {
69-
// this.partitionByColumns = partitionByColumns;
70-
// }
64+
public KeepExpression getKeep() {
65+
return keep;
66+
}
67+
68+
public void setKeep(KeepExpression keep) {
69+
this.keep = keep;
70+
}
7171

7272
public ExpressionList getPartitionExpressionList() {
7373
return partitionExpressionList;
@@ -76,24 +76,22 @@ public ExpressionList getPartitionExpressionList() {
7676
public void setPartitionExpressionList(ExpressionList partitionExpressionList) {
7777
this.partitionExpressionList = partitionExpressionList;
7878
}
79-
80-
8179

82-
public String getName() {
83-
return name;
84-
}
80+
public String getName() {
81+
return name;
82+
}
8583

86-
public void setName(String name) {
87-
this.name = name;
88-
}
84+
public void setName(String name) {
85+
this.name = name;
86+
}
8987

90-
public Expression getExpression() {
91-
return expression;
92-
}
88+
public Expression getExpression() {
89+
return expression;
90+
}
9391

94-
public void setExpression(Expression expression) {
95-
this.expression = expression;
96-
}
92+
public void setExpression(Expression expression) {
93+
this.expression = expression;
94+
}
9795

9896
public Expression getOffset() {
9997
return offset;
@@ -120,61 +118,65 @@ public void setWindowElement(WindowElement windowElement) {
120118
}
121119

122120
@Override
123-
public String toString() {
124-
StringBuilder b = new StringBuilder();
121+
public String toString() {
122+
StringBuilder b = new StringBuilder();
125123

126-
b.append(name).append("(");
127-
if (expression != null) {
128-
b.append(expression.toString());
124+
b.append(name).append("(");
125+
if (expression != null) {
126+
b.append(expression.toString());
129127
if (offset != null) {
130128
b.append(", ").append(offset.toString());
131129
if (defaultValue != null) {
132130
b.append(", ").append(defaultValue.toString());
133131
}
134132
}
135-
} else if (isAllColumns()) {
136-
b.append("*");
137-
}
138-
b.append(") OVER (");
139-
140-
toStringPartitionBy(b);
141-
toStringOrderByElements(b);
142-
143-
b.append(")");
144-
145-
return b.toString();
146-
}
147-
148-
public boolean isAllColumns() {
149-
return allColumns;
150-
}
151-
152-
public void setAllColumns(boolean allColumns) {
153-
this.allColumns = allColumns;
154-
}
155-
156-
private void toStringPartitionBy(StringBuilder b) {
157-
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
158-
b.append("PARTITION BY ");
159-
b.append(PlainSelect.getStringList(partitionExpressionList.getExpressions(), true, false));
160-
b.append(" ");
161-
}
162-
}
163-
164-
private void toStringOrderByElements(StringBuilder b) {
165-
if (orderByElements != null && !orderByElements.isEmpty()) {
166-
b.append("ORDER BY ");
167-
for (int i = 0; i < orderByElements.size(); i++) {
168-
if (i > 0) {
169-
b.append(", ");
170-
}
171-
b.append(orderByElements.get(i).toString());
172-
}
173-
174-
if(windowElement != null){
133+
} else if (isAllColumns()) {
134+
b.append("*");
135+
}
136+
b.append(") ");
137+
if (keep != null) {
138+
b.append(keep.toString()).append(" ");
139+
}
140+
b.append("OVER (");
141+
142+
toStringPartitionBy(b);
143+
toStringOrderByElements(b);
144+
145+
b.append(")");
146+
147+
return b.toString();
148+
}
149+
150+
public boolean isAllColumns() {
151+
return allColumns;
152+
}
153+
154+
public void setAllColumns(boolean allColumns) {
155+
this.allColumns = allColumns;
156+
}
157+
158+
private void toStringPartitionBy(StringBuilder b) {
159+
if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) {
160+
b.append("PARTITION BY ");
161+
b.append(PlainSelect.getStringList(partitionExpressionList.getExpressions(), true, false));
162+
b.append(" ");
163+
}
164+
}
165+
166+
private void toStringOrderByElements(StringBuilder b) {
167+
if (orderByElements != null && !orderByElements.isEmpty()) {
168+
b.append("ORDER BY ");
169+
for (int i = 0; i < orderByElements.size(); i++) {
170+
if (i > 0) {
171+
b.append(", ");
172+
}
173+
b.append(orderByElements.get(i).toString());
174+
}
175+
176+
if (windowElement != null) {
175177
b.append(' ');
176178
b.append(windowElement);
177179
}
178-
}
179-
}
180+
}
181+
}
180182
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,6 @@ public interface ExpressionVisitor {
154154
void visit(UserVariable var);
155155

156156
void visit(NumericBind bind);
157+
158+
void visit(KeepExpression aexpr);
157159
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import net.sf.jsqlparser.statement.select.SubSelect;
3131

3232
public class ExpressionVisitorAdapter implements ExpressionVisitor, ItemsListVisitor {
33+
3334
@Override
3435
public void visit(NullValue value) {
3536

@@ -175,13 +176,13 @@ public void visit(NotEqualsTo expr) {
175176
}
176177

177178
@Override
178-
public void visit(Column column) {
179+
public void visit(Column column) {
179180

180181
}
181182

182183
@Override
183184
public void visit(SubSelect subSelect) {
184-
185+
185186
}
186187

187188
@Override
@@ -254,6 +255,9 @@ public void visit(AnalyticExpression expr) {
254255
expr.getExpression().accept(this);
255256
expr.getDefaultValue().accept(this);
256257
expr.getOffset().accept(this);
258+
if (expr.getKeep() != null) {
259+
expr.getKeep().accept(this);
260+
}
257261
for (OrderByElement element : expr.getOrderByElements()) {
258262
element.getExpression().accept(this);
259263
}
@@ -308,10 +312,10 @@ public void visit(JsonExpression jsonExpr) {
308312
visit(jsonExpr.getColumn());
309313
}
310314

311-
@Override
312-
public void visit(RegExpMySQLOperator expr) {
313-
visitBinaryExpression(expr);
314-
}
315+
@Override
316+
public void visit(RegExpMySQLOperator expr) {
317+
visitBinaryExpression(expr);
318+
}
315319

316320
@Override
317321
public void visit(WithinGroupExpression wgexpr) {
@@ -323,11 +327,18 @@ public void visit(WithinGroupExpression wgexpr) {
323327

324328
@Override
325329
public void visit(UserVariable var) {
326-
330+
327331
}
328332

329333
@Override
330334
public void visit(NumericBind bind) {
331-
335+
336+
}
337+
338+
@Override
339+
public void visit(KeepExpression expr) {
340+
for (OrderByElement element : expr.getOrderByElements()) {
341+
element.getExpression().accept(this);
342+
}
332343
}
333344
}

src/main/java/net/sf/jsqlparser/expression/Function.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class Function implements Expression {
3434
private boolean distinct = false;
3535
private boolean isEscaped = false;
3636
private String attribute;
37+
private KeepExpression keep = null;
3738

3839
@Override
3940
public void accept(ExpressionVisitor expressionVisitor) {
@@ -114,6 +115,14 @@ public void setAttribute(String attribute) {
114115
this.attribute = attribute;
115116
}
116117

118+
public KeepExpression getKeep() {
119+
return keep;
120+
}
121+
122+
public void setKeep(KeepExpression keep) {
123+
this.keep = keep;
124+
}
125+
117126
@Override
118127
public String toString() {
119128
String params;
@@ -137,6 +146,10 @@ public String toString() {
137146
ans += "." + attribute;
138147
}
139148

149+
if (keep != null) {
150+
ans += " " + keep.toString();
151+
}
152+
140153
if (isEscaped) {
141154
ans = "{fn " + ans + "}";
142155
}

0 commit comments

Comments
 (0)