Skip to content

Commit 48cc2f7

Browse files
feat: parsing Piped SQL, complete all Operators
Signed-off-by: Andreas Reichel <[email protected]>
1 parent f687f77 commit 48cc2f7

File tree

10 files changed

+386
-1
lines changed

10 files changed

+386
-1
lines changed

src/main/java/net/sf/jsqlparser/statement/piped/CallPipeOperator.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,44 @@
11
package net.sf.jsqlparser.statement.piped;
22

3+
import net.sf.jsqlparser.expression.Alias;
4+
import net.sf.jsqlparser.statement.select.TableFunction;
5+
36
public class CallPipeOperator extends PipeOperator {
7+
private TableFunction tableFunction;
8+
private Alias alias;
9+
10+
public CallPipeOperator(TableFunction tableFunction, Alias alias) {
11+
this.tableFunction = tableFunction;
12+
this.alias = alias;
13+
}
14+
15+
public TableFunction getTableFunction() {
16+
return tableFunction;
17+
}
18+
19+
public CallPipeOperator setTableFunction(TableFunction tableFunction) {
20+
this.tableFunction = tableFunction;
21+
return this;
22+
}
23+
24+
public Alias getAlias() {
25+
return alias;
26+
}
27+
28+
public CallPipeOperator setAlias(Alias alias) {
29+
this.alias = alias;
30+
return this;
31+
}
32+
33+
@Override
34+
public StringBuilder appendTo(StringBuilder builder) {
35+
builder.append("|> CALL ").append(tableFunction);
36+
if (alias != null) {
37+
builder.append(" ").append(alias);
38+
}
39+
40+
return builder;
41+
}
442

543
@Override
644
public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {

src/main/java/net/sf/jsqlparser/statement/piped/PivotPipeOperator.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,78 @@
11
package net.sf.jsqlparser.statement.piped;
22

3+
import net.sf.jsqlparser.expression.Alias;
4+
import net.sf.jsqlparser.expression.Expression;
5+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
6+
import net.sf.jsqlparser.schema.Column;
7+
38
public class PivotPipeOperator extends PipeOperator {
9+
private Expression aggregateExpression;
10+
private Column inputColumn;
11+
private ExpressionList<Column> pivotColumns;
12+
private Alias alias = null;
13+
14+
public PivotPipeOperator(Expression aggregateExpression, Column inputColumn,
15+
ExpressionList<Column> pivotColumns, Alias alias) {
16+
this.aggregateExpression = aggregateExpression;
17+
this.inputColumn = inputColumn;
18+
this.pivotColumns = pivotColumns;
19+
this.alias = alias;
20+
}
21+
22+
public Expression getAggregateExpression() {
23+
return aggregateExpression;
24+
}
25+
26+
public PivotPipeOperator setAggregateExpression(Expression aggregateExpression) {
27+
this.aggregateExpression = aggregateExpression;
28+
return this;
29+
}
30+
31+
public Column getInputColumn() {
32+
return inputColumn;
33+
}
34+
35+
public PivotPipeOperator setInputColumn(Column inputColumn) {
36+
this.inputColumn = inputColumn;
37+
return this;
38+
}
39+
40+
public ExpressionList<Column> getPivotColumns() {
41+
return pivotColumns;
42+
}
43+
44+
public PivotPipeOperator setPivotColumns(ExpressionList<Column> pivotColumns) {
45+
this.pivotColumns = pivotColumns;
46+
return this;
47+
}
48+
49+
public Alias getAlias() {
50+
return alias;
51+
}
52+
53+
public PivotPipeOperator setAlias(Alias alias) {
54+
this.alias = alias;
55+
return this;
56+
}
57+
58+
@Override
59+
public StringBuilder appendTo(StringBuilder builder) {
60+
builder
61+
.append("|> ")
62+
.append("PIVOT( ")
63+
.append(aggregateExpression)
64+
.append(" FOR ")
65+
.append(inputColumn)
66+
.append(" IN (")
67+
.append(pivotColumns)
68+
.append("))");
69+
if (alias != null) {
70+
builder.append(" ").append(alias);
71+
}
72+
builder.append("\n");
73+
return builder;
74+
}
75+
476
@Override
577
public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
678
return visitor.visit(this, context);

src/main/java/net/sf/jsqlparser/statement/piped/TableSamplePipeOperator.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,31 @@
11
package net.sf.jsqlparser.statement.piped;
22

33
public class TableSamplePipeOperator extends PipeOperator {
4+
double percent;
5+
6+
public TableSamplePipeOperator(double percent) {
7+
this.percent = percent;
8+
}
9+
10+
public TableSamplePipeOperator(String percentStr) {
11+
this.percent = Double.parseDouble(percentStr);
12+
}
13+
14+
public double getPercent() {
15+
return percent;
16+
}
17+
18+
public TableSamplePipeOperator setPercent(double percent) {
19+
this.percent = percent;
20+
return this;
21+
}
22+
23+
@Override
24+
public StringBuilder appendTo(StringBuilder builder) {
25+
builder.append("|> ").append("TABLESAMPLE SYSTEM (").append(percent).append(" PERCENT)");
26+
return builder;
27+
}
28+
429
@Override
530
public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
631
return visitor.visit(this, context);

src/main/java/net/sf/jsqlparser/statement/piped/UnPivotPipeOperator.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,77 @@
11
package net.sf.jsqlparser.statement.piped;
22

3+
import net.sf.jsqlparser.expression.Alias;
4+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
5+
import net.sf.jsqlparser.schema.Column;
6+
37
public class UnPivotPipeOperator extends PipeOperator {
8+
private Column valuesColumn;
9+
private Column nameColumn;
10+
private ExpressionList<Column> pivotColumns;
11+
private Alias alias = null;
12+
13+
public UnPivotPipeOperator(Column valuesColumn, Column nameColumn,
14+
ExpressionList<Column> pivotColumns, Alias alias) {
15+
this.valuesColumn = valuesColumn;
16+
this.nameColumn = nameColumn;
17+
this.pivotColumns = pivotColumns;
18+
this.alias = alias;
19+
}
20+
21+
public Column getValuesColumn() {
22+
return valuesColumn;
23+
}
24+
25+
public UnPivotPipeOperator setValuesColumn(Column valuesColumn) {
26+
this.valuesColumn = valuesColumn;
27+
return this;
28+
}
29+
30+
public Column getNameColumn() {
31+
return nameColumn;
32+
}
33+
34+
public UnPivotPipeOperator setNameColumn(Column nameColumn) {
35+
this.nameColumn = nameColumn;
36+
return this;
37+
}
38+
39+
public ExpressionList<Column> getPivotColumns() {
40+
return pivotColumns;
41+
}
42+
43+
public UnPivotPipeOperator setPivotColumns(ExpressionList<Column> pivotColumns) {
44+
this.pivotColumns = pivotColumns;
45+
return this;
46+
}
47+
48+
public Alias getAlias() {
49+
return alias;
50+
}
51+
52+
public UnPivotPipeOperator setAlias(Alias alias) {
53+
this.alias = alias;
54+
return this;
55+
}
56+
57+
@Override
58+
public StringBuilder appendTo(StringBuilder builder) {
59+
builder
60+
.append("|> ")
61+
.append("UNPIVOT( ")
62+
.append(valuesColumn)
63+
.append(" FOR ")
64+
.append(nameColumn)
65+
.append(" IN (")
66+
.append(pivotColumns)
67+
.append("))");
68+
if (alias != null) {
69+
builder.append(" ").append(alias);
70+
}
71+
builder.append("\n");
72+
return builder;
73+
}
74+
475
@Override
576
public <T, S> T accept(PipeOperatorVisitor<T> visitor, S context) {
677
return visitor.visit(this, context);

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,12 @@ public <S> StringBuilder visit(AsPipeOperator as, S context) {
897897

898898
@Override
899899
public <S> StringBuilder visit(CallPipeOperator call, S context) {
900+
builder.append("|> CALL ");
901+
call.getTableFunction().accept(this);
902+
if (call.getAlias() != null) {
903+
builder.append(" ").append(call.getAlias());
904+
}
905+
900906
return builder;
901907
}
902908

@@ -951,6 +957,19 @@ public <S> StringBuilder visit(OrderByPipeOperator orderBy, S context) {
951957

952958
@Override
953959
public <S> StringBuilder visit(PivotPipeOperator pivot, S context) {
960+
builder
961+
.append("|> ")
962+
.append("PIVOT( ")
963+
.append(pivot.getAggregateExpression())
964+
.append(" FOR ")
965+
.append(pivot.getInputColumn())
966+
.append(" IN (")
967+
.append(pivot.getPivotColumns())
968+
.append("))");
969+
if (pivot.getAlias() != null) {
970+
builder.append(" ").append(pivot.getAlias());
971+
}
972+
builder.append("\n");
954973
return builder;
955974
}
956975

@@ -983,6 +1002,8 @@ public <S> StringBuilder visit(SetPipeOperator set, S context) {
9831002

9841003
@Override
9851004
public <S> StringBuilder visit(TableSamplePipeOperator tableSample, S context) {
1005+
builder.append("|> ").append("TABLESAMPLE SYSTEM (").append(tableSample.getPercent())
1006+
.append(" PERCENT)");
9861007
return builder;
9871008
}
9881009

@@ -1006,6 +1027,19 @@ public <S> StringBuilder visit(SetOperationPipeOperator setOperationPipeOperator
10061027

10071028
@Override
10081029
public <S> StringBuilder visit(UnPivotPipeOperator unPivot, S context) {
1030+
builder
1031+
.append("|> ")
1032+
.append("UNPIVOT( ")
1033+
.append(unPivot.getValuesColumn())
1034+
.append(" FOR ")
1035+
.append(unPivot.getNameColumn())
1036+
.append(" IN (")
1037+
.append(unPivot.getPivotColumns())
1038+
.append("))");
1039+
if (unPivot.getAlias() != null) {
1040+
builder.append(" ").append(unPivot.getAlias());
1041+
}
1042+
builder.append("\n");
10091043
return builder;
10101044
}
10111045

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2377,6 +2377,14 @@ PipeOperator PipeOperator() #PipeOperator:
23772377
operator = SetOperationPipeOperator()
23782378
|
23792379
operator = JoinPipeOperator()
2380+
|
2381+
operator = CallPipeOperator()
2382+
|
2383+
operator = TableSamplePipeOperator()
2384+
|
2385+
operator = PivotPipeOperator()
2386+
|
2387+
operator = UnPivotPipeOperator()
23802388
)
23812389
{
23822390
return operator;
@@ -2562,6 +2570,67 @@ SetOperationPipeOperator SetOperationPipeOperator():
25622570
}
25632571
}
25642572

2573+
CallPipeOperator CallPipeOperator():
2574+
{
2575+
TableFunction tableFunction;
2576+
Alias alias=null;
2577+
}
2578+
{
2579+
<K_CALL> tableFunction = TableFunction() [ LOOKAHEAD(2) alias = Alias() ]
2580+
2581+
{
2582+
return new CallPipeOperator(tableFunction, alias);
2583+
}
2584+
}
2585+
2586+
2587+
TableSamplePipeOperator TableSamplePipeOperator():
2588+
{
2589+
Token token;
2590+
}
2591+
{
2592+
<K_TABLESAMPLE> <K_SYSTEM> "(" ( token=<S_DOUBLE> | token=<S_LONG> ) <K_PERCENT> ")"
2593+
{
2594+
return new TableSamplePipeOperator( token.image );
2595+
}
2596+
}
2597+
2598+
PivotPipeOperator PivotPipeOperator():
2599+
{
2600+
Expression aggregateExpression;
2601+
Column inputColumn;
2602+
ExpressionList<Column> pivotColumns;
2603+
Alias alias = null;
2604+
}
2605+
{
2606+
<K_PIVOT> "(" aggregateExpression=Expression()
2607+
<K_FOR> inputColumn=Column()
2608+
<K_IN> "(" pivotColumns = ColumnList() ")"
2609+
")"
2610+
[ LOOKAHEAD(2) alias = Alias() ]
2611+
{
2612+
return new PivotPipeOperator(aggregateExpression, inputColumn, pivotColumns, alias);
2613+
}
2614+
}
2615+
2616+
UnPivotPipeOperator UnPivotPipeOperator():
2617+
{
2618+
Column valuesColumn;
2619+
Column nameColumn;
2620+
ExpressionList<Column> pivotColumns;
2621+
Alias alias = null;
2622+
}
2623+
{
2624+
<K_UNPIVOT> "(" valuesColumn=Column()
2625+
<K_FOR> nameColumn=Column()
2626+
<K_IN> "(" pivotColumns = ColumnList() ")"
2627+
")"
2628+
[ LOOKAHEAD(2) alias = Alias() ]
2629+
{
2630+
return new UnPivotPipeOperator(valuesColumn, nameColumn, pivotColumns, alias);
2631+
}
2632+
}
2633+
25652634
TableStatement TableStatement():
25662635
{
25672636
Table table = null;
@@ -2574,7 +2643,7 @@ TableStatement TableStatement():
25742643
table = Table()
25752644
{ tableStatement.setTable(table); }
25762645
[ LOOKAHEAD(<K_ORDER> <K_BY>) orderByElements = OrderByElements() { tableStatement.setOrderByElements(orderByElements); } ]
2577-
[ LOOKAHEAD(<K_LIMIT>) limit=LimitWithOffset() { tableStatement.setLimit(limit);} ]
2646+
[ LOOKAHEAD(<K_LIMIT>) limit = LimitWithOffset() { tableStatement.setLimit(limit);} ]
25782647
[ LOOKAHEAD(<K_OFFSET>) offset = Offset() { tableStatement.setOffset(offset);} ]
25792648
{ return tableStatement; }
25802649
/* Support operationList */

0 commit comments

Comments
 (0)