Skip to content

Commit 066e1bb

Browse files
feat: make the various Visitor Adaptors more useful
Signed-off-by: Andreas Reichel <[email protected]>
1 parent f14c611 commit 066e1bb

File tree

6 files changed

+238
-6
lines changed

6 files changed

+238
-6
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,21 @@ public class ExpressionVisitorAdapter<T>
8484

8585
private SelectVisitor<T> selectVisitor;
8686

87+
public ExpressionVisitorAdapter(SelectVisitor<T> selectVisitor) {
88+
this.selectVisitor = selectVisitor;
89+
}
90+
91+
public ExpressionVisitorAdapter() {
92+
this.selectVisitor = null;
93+
}
94+
8795
public SelectVisitor<T> getSelectVisitor() {
8896
return selectVisitor;
8997
}
9098

91-
public void setSelectVisitor(SelectVisitor<T> selectVisitor) {
99+
public ExpressionVisitorAdapter<T> setSelectVisitor(SelectVisitor<T> selectVisitor) {
92100
this.selectVisitor = selectVisitor;
101+
return this;
93102
}
94103

95104
@Override

src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ public GroupByElement addGroupingSets(Object... groupingSets) {
127127
return this.withGroupingSets(collection);
128128
}
129129

130-
public GroupByElement addGroupingSets(Collection<List<ExpressionList<Expression>>> groupingSets) {
130+
public GroupByElement addGroupingSets(
131+
Collection<List<ExpressionList<Expression>>> groupingSets) {
131132
List collection = Optional.ofNullable(getGroupingSets()).orElseGet(ArrayList::new);
132133
collection.addAll(groupingSets);
133134
return this.withGroupingSets(collection);

src/main/java/net/sf/jsqlparser/statement/select/Limit.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public String toString() {
8989
}
9090

9191
if (byExpressions != null) {
92-
retVal += " BY " + byExpressions.toString();
92+
retVal += " BY " + byExpressions;
9393
}
9494

9595
return retVal;

src/main/java/net/sf/jsqlparser/statement/select/PivotVisitorAdapter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,20 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import net.sf.jsqlparser.expression.ExpressionVisitor;
13+
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
14+
1215
@SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
1316
public class PivotVisitorAdapter<T> implements PivotVisitor<T> {
17+
private final ExpressionVisitor<T> expressionVisitor;
18+
19+
public PivotVisitorAdapter() {
20+
this.expressionVisitor = new ExpressionVisitorAdapter<T>();
21+
}
22+
23+
public PivotVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
24+
this.expressionVisitor = expressionVisitor;
25+
}
1426

1527
@Override
1628
public <S> T visit(Pivot pivot, S context) {

src/main/java/net/sf/jsqlparser/statement/select/SelectItemVisitorAdapter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,23 @@
1010
package net.sf.jsqlparser.statement.select;
1111

1212
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.expression.ExpressionVisitor;
14+
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
1315

1416
@SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
1517
public class SelectItemVisitorAdapter<T> implements SelectItemVisitor<T> {
18+
private final ExpressionVisitor<T> expressionVisitor;
19+
20+
public SelectItemVisitorAdapter() {
21+
this.expressionVisitor = new ExpressionVisitorAdapter<>();
22+
}
23+
24+
public SelectItemVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
25+
this.expressionVisitor = expressionVisitor;
26+
}
27+
1628
@Override
1729
public <S> T visit(SelectItem<? extends Expression> item, S context) {
18-
return null;
30+
return item.getExpression().accept(expressionVisitor, context);
1931
}
2032
}

src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java

Lines changed: 200 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,216 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.expression.ExpressionVisitor;
14+
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
15+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
16+
import net.sf.jsqlparser.schema.Column;
17+
import net.sf.jsqlparser.schema.Table;
1218
import net.sf.jsqlparser.statement.piped.FromQuery;
1319

20+
import java.util.List;
21+
1422
@SuppressWarnings({"PMD.UncommentedEmptyMethodBody"})
1523
public class SelectVisitorAdapter<T> implements SelectVisitor<T> {
24+
private final ExpressionVisitor<T> expressionVisitor;
25+
private final PivotVisitor<T> pivotVisitor;
26+
private final SelectItemVisitor<T> selectItemVisitor;
27+
private final FromItemVisitor<T> fromItemVisitor;
28+
29+
public SelectVisitorAdapter() {
30+
this.expressionVisitor = new ExpressionVisitorAdapter<>(this);
31+
this.pivotVisitor = new PivotVisitorAdapter<>();
32+
this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
33+
this.fromItemVisitor = new FromItemVisitorAdapter<>();
34+
}
35+
36+
public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor,
37+
PivotVisitor<T> pivotVisitor, SelectItemVisitor<T> selectItemVisitor,
38+
FromItemVisitor<T> fromItemVisitor) {
39+
this.expressionVisitor = expressionVisitor;
40+
this.pivotVisitor = pivotVisitor;
41+
this.selectItemVisitor = selectItemVisitor;
42+
this.fromItemVisitor = fromItemVisitor;
43+
}
44+
45+
public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor,
46+
FromItemVisitor<T> fromItemVisitor) {
47+
this.expressionVisitor = expressionVisitor;
48+
this.pivotVisitor = new PivotVisitorAdapter<>();
49+
this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
50+
this.fromItemVisitor = fromItemVisitor;
51+
}
52+
53+
public SelectVisitorAdapter(ExpressionVisitor<T> expressionVisitor) {
54+
this.expressionVisitor = expressionVisitor;
55+
this.pivotVisitor = new PivotVisitorAdapter<>();
56+
this.selectItemVisitor = new SelectItemVisitorAdapter<>(this.expressionVisitor);
57+
this.fromItemVisitor = new FromItemVisitorAdapter<>();
58+
}
1659

1760
@Override
18-
public <S> T visit(ParenthesedSelect parenthesedSelect, S context) {
19-
return parenthesedSelect.getSelect().accept(this, context);
61+
public <S> T visit(ParenthesedSelect select, S context) {
62+
List<WithItem<?>> withItemsList = select.getWithItemsList();
63+
if (withItemsList != null && !withItemsList.isEmpty()) {
64+
for (WithItem<?> withItem : withItemsList) {
65+
withItem.accept(this, context);
66+
}
67+
}
68+
69+
select.getSelect().accept(this, context);
70+
71+
if (select.getOrderByElements() != null) {
72+
for (OrderByElement orderByElement : select.getOrderByElements()) {
73+
orderByElement.getExpression().accept(expressionVisitor);
74+
}
75+
}
76+
77+
Pivot pivot = select.getPivot();
78+
if (pivot != null) {
79+
pivot.accept(pivotVisitor, context);
80+
}
81+
UnPivot unpivot = select.getUnPivot();
82+
if (unpivot != null) {
83+
unpivot.accept(pivotVisitor, context);
84+
}
85+
86+
// if (select.getLimit() != null) {
87+
// //@todo: implement limit visitor
88+
// }
89+
if (select.getOffset() != null) {
90+
select.getOffset().getOffset().accept(expressionVisitor, null);
91+
}
92+
if (select.getFetch() != null && select.getFetch().getExpression() != null) {
93+
select.getFetch().getExpression().accept(expressionVisitor, null);
94+
}
95+
96+
return null;
2097
}
2198

2299
@Override
100+
@SuppressWarnings({"PMD.ExcessiveMethodLength"})
23101
public <S> T visit(PlainSelect plainSelect, S context) {
102+
List<WithItem<?>> withItemsList = plainSelect.getWithItemsList();
103+
if (withItemsList != null && !withItemsList.isEmpty()) {
104+
for (WithItem<?> withItem : withItemsList) {
105+
withItem.accept(this, context);
106+
}
107+
}
108+
109+
if (plainSelect.getDistinct() != null) {
110+
for (SelectItem<?> selectItem : plainSelect.getDistinct().getOnSelectItems()) {
111+
selectItem.accept(selectItemVisitor, context);
112+
}
113+
}
114+
115+
if (plainSelect.getTop() != null) {
116+
plainSelect.getTop().getExpression().accept(expressionVisitor, context);
117+
}
118+
119+
for (SelectItem<?> selectItem : plainSelect.getSelectItems()) {
120+
selectItem.accept(selectItemVisitor, context);
121+
}
122+
123+
if (plainSelect.getIntoTables() != null) {
124+
for (Table table : plainSelect.getIntoTables()) {
125+
table.accept(fromItemVisitor, context);
126+
}
127+
}
128+
129+
if (plainSelect.getFromItem() != null) {
130+
plainSelect.getFromItem().accept(fromItemVisitor, context);
131+
}
132+
133+
// if (plainSelect.getLateralViews() != null) {
134+
// //@todo: implement this
135+
// }
136+
137+
if (plainSelect.getJoins() != null) {
138+
for (Join join : plainSelect.getJoins()) {
139+
join.getFromItem().accept(fromItemVisitor, context);
140+
for (Expression expression : join.getOnExpressions()) {
141+
expression.accept(expressionVisitor, context);
142+
}
143+
for (Column column : join.getUsingColumns()) {
144+
column.accept(expressionVisitor, context);
145+
}
146+
}
147+
}
148+
149+
// if (plainSelect.getKsqlWindow() != null) {
150+
// //@todo: implement
151+
// }
152+
153+
if (plainSelect.getWhere() != null) {
154+
plainSelect.getWhere().accept(expressionVisitor, context);
155+
}
156+
157+
// if (plainSelect.getOracleHierarchical() != null) {
158+
// //@todo: implement
159+
// }
160+
//
161+
// if (plainSelect.getPreferringClause() != null) {
162+
// //@todo: implement
163+
// }
164+
165+
if (plainSelect.getGroupBy() != null) {
166+
GroupByElement groupBy = plainSelect.getGroupBy();
167+
for (Expression expression : groupBy.getGroupByExpressionList()) {
168+
expression.accept(expressionVisitor, context);
169+
}
170+
if (!groupBy.getGroupingSets().isEmpty()) {
171+
for (ExpressionList<?> expressionList : groupBy.getGroupingSets()) {
172+
expressionList.accept(expressionVisitor, context);
173+
}
174+
}
175+
}
176+
177+
if (plainSelect.getHaving() != null) {
178+
plainSelect.getHaving().accept(expressionVisitor, context);
179+
}
180+
if (plainSelect.getQualify() != null) {
181+
plainSelect.getQualify().accept(expressionVisitor, context);
182+
}
183+
// if (plainSelect.getWindowDefinitions() != null) {
184+
// //@todo: implement
185+
// }
186+
187+
Pivot pivot = plainSelect.getPivot();
188+
if (pivot != null) {
189+
pivot.accept(pivotVisitor, context);
190+
}
191+
UnPivot unpivot = plainSelect.getUnPivot();
192+
if (unpivot != null) {
193+
unpivot.accept(pivotVisitor, context);
194+
}
195+
196+
if (plainSelect.getOrderByElements() != null) {
197+
for (OrderByElement orderByElement : plainSelect.getOrderByElements()) {
198+
orderByElement.getExpression().accept(expressionVisitor);
199+
}
200+
}
201+
202+
// if (plainSelect.getLimitBy() != null) {
203+
// //@todo: implement
204+
// }
205+
// if (plainSelect.getLimit() != null) {
206+
// //@todo: implement
207+
// }
208+
if (plainSelect.getOffset() != null) {
209+
plainSelect.getOffset().getOffset().accept(expressionVisitor, null);
210+
}
211+
if (plainSelect.getFetch() != null && plainSelect.getFetch().getExpression() != null) {
212+
plainSelect.getFetch().getExpression().accept(expressionVisitor, null);
213+
}
214+
// if (plainSelect.getForMode() != null) {
215+
// //@todo: implement
216+
// }
217+
if (plainSelect.getIntoTempTable() != null) {
218+
for (Table t : plainSelect.getIntoTables()) {
219+
t.accept(fromItemVisitor, context);
220+
}
221+
}
24222
return null;
25223
}
26224

0 commit comments

Comments
 (0)