Skip to content

Commit f932b8f

Browse files
feat: add Order Suffixes to AggregatePipeOperator and support some weird BigQuery Syntax
- Order Suffixes for the `AggregatePipeOperator` - `ArrayConstructor` with data type, e.g. `ARRAY<type>[]` - `SetOperation` with `BY NAME` or `STRICT CORRESPONDING` - fixes starlake-ai/jsqltranspiler#74 Signed-off-by: Andreas Reichel <[email protected]>
1 parent bcac023 commit f932b8f

File tree

6 files changed

+251
-38
lines changed

6 files changed

+251
-38
lines changed

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

+15
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111

1212
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
1313
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
14+
import net.sf.jsqlparser.statement.create.table.ColDataType;
1415

1516
public class ArrayConstructor extends ASTNodeAccessImpl implements Expression {
1617
private ExpressionList<?> expressions;
1718
private boolean arrayKeyword;
19+
private ColDataType dataType;
1820

1921
public ArrayConstructor(ExpressionList<?> expressions, boolean arrayKeyword) {
2022
this.expressions = expressions;
@@ -41,6 +43,15 @@ public void setArrayKeyword(boolean arrayKeyword) {
4143
this.arrayKeyword = arrayKeyword;
4244
}
4345

46+
public ColDataType getDataType() {
47+
return dataType;
48+
}
49+
50+
public ArrayConstructor setDataType(ColDataType dataType) {
51+
this.dataType = dataType;
52+
return this;
53+
}
54+
4455
@Override
4556
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
4657
return expressionVisitor.visit(this, context);
@@ -51,6 +62,10 @@ public String toString() {
5162
StringBuilder sb = new StringBuilder();
5263
if (arrayKeyword) {
5364
sb.append("ARRAY");
65+
66+
if (dataType != null) {
67+
sb.append("<").append(dataType).append(">");
68+
}
5469
}
5570
sb.append("[");
5671
sb.append(expressions.toString());

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

+32-9
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@
66

77
public class AggregatePipeOperator extends PipeOperator {
88
private final ArrayList<SelectItem<?>> selectItems = new ArrayList<>();
9+
private final ArrayList<String> selectItemsOrderSuffices = new ArrayList<>();
10+
911
private final ArrayList<SelectItem<?>> groupItems = new ArrayList<>();
12+
private final ArrayList<String> groupItemsOrderSuffices = new ArrayList<>();
1013
private boolean usingShortHandOrdering = false;
1114

12-
public AggregatePipeOperator(SelectItem<?> selectItem) {
15+
public AggregatePipeOperator(SelectItem<?> selectItem, String orderSuffix) {
1316
selectItems.add(selectItem);
17+
selectItemsOrderSuffices.add(orderSuffix);
1418
}
1519

1620
public ArrayList<SelectItem<?>> getSelectItems() {
@@ -21,22 +25,31 @@ public ArrayList<SelectItem<?>> getGroupItems() {
2125
return groupItems;
2226
}
2327

24-
public AggregatePipeOperator add(SelectItem<?> selectItem) {
28+
public ArrayList<String> getSelectItemsOrderSuffices() {
29+
return selectItemsOrderSuffices;
30+
}
31+
32+
public ArrayList<String> getGroupItemsOrderSuffices() {
33+
return groupItemsOrderSuffices;
34+
}
35+
36+
public AggregatePipeOperator add(SelectItem<?> selectItem, String orderSuffix) {
2537
selectItems.add(selectItem);
2638
return this;
2739
}
2840

29-
public AggregatePipeOperator with(SelectItem<?> selectItem) {
30-
return this.add(selectItem);
41+
public AggregatePipeOperator with(SelectItem<?> selectItem, String orderSuffix) {
42+
return this.add(selectItem, orderSuffix);
3143
}
3244

33-
public AggregatePipeOperator addGroupItem(SelectItem<?> selectItem) {
45+
public AggregatePipeOperator addGroupItem(SelectItem<?> selectItem, String orderSuffix) {
3446
groupItems.add(selectItem);
47+
groupItemsOrderSuffices.add(orderSuffix);
3548
return this;
3649
}
3750

38-
public AggregatePipeOperator withGroupItem(SelectItem<?> selectItem) {
39-
return this.addGroupItem(selectItem);
51+
public AggregatePipeOperator withGroupItem(SelectItem<?> selectItem, String orderSuffix) {
52+
return this.addGroupItem(selectItem, orderSuffix);
4053
}
4154

4255
public boolean isUsingShortHandOrdering() {
@@ -58,7 +71,12 @@ public StringBuilder appendTo(StringBuilder builder) {
5871
builder.append("|> ").append("AGGREGATE");
5972
int i = 0;
6073
for (SelectItem<?> selectItem : selectItems) {
61-
builder.append(i++ > 0 ? ", " : " ").append(selectItem);
74+
builder.append(i > 0 ? ", " : " ").append(selectItem);
75+
if (i < selectItemsOrderSuffices.size() && selectItemsOrderSuffices.get(i) != null
76+
&& !selectItemsOrderSuffices.get(i).isEmpty()) {
77+
builder.append(" ").append(selectItemsOrderSuffices.get(i));
78+
}
79+
i++;
6280
}
6381
builder.append("\n");
6482

@@ -70,7 +88,12 @@ public StringBuilder appendTo(StringBuilder builder) {
7088
builder.append(" BY");
7189
i = 0;
7290
for (SelectItem<?> selectItem : groupItems) {
73-
builder.append(i++ > 0 ? ", " : " ").append(selectItem);
91+
builder.append(i > 0 ? ", " : " ").append(selectItem);
92+
if (i < groupItemsOrderSuffices.size() && groupItemsOrderSuffices.get(i) != null
93+
&& !groupItemsOrderSuffices.get(i).isEmpty()) {
94+
builder.append(" ").append(groupItemsOrderSuffices.get(i));
95+
}
96+
i++;
7497
}
7598
builder.append("\n");
7699
}

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -1539,13 +1539,18 @@ public <S> StringBuilder visit(ArrayExpression array, S context) {
15391539
}
15401540

15411541
@Override
1542-
public <S> StringBuilder visit(ArrayConstructor aThis, S context) {
1543-
if (aThis.isArrayKeyword()) {
1542+
public <S> StringBuilder visit(ArrayConstructor arrayConstructor, S context) {
1543+
if (arrayConstructor.isArrayKeyword()) {
15441544
builder.append("ARRAY");
1545+
1546+
ColDataType dataType = arrayConstructor.getDataType();
1547+
if (dataType != null) {
1548+
builder.append("<").append(dataType).append(">");
1549+
}
15451550
}
15461551
builder.append("[");
15471552
boolean first = true;
1548-
for (Expression expression : aThis.getExpressions()) {
1553+
for (Expression expression : arrayConstructor.getExpressions()) {
15491554
if (!first) {
15501555
builder.append(", ");
15511556
} else {

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

+17-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import net.sf.jsqlparser.statement.update.UpdateSet;
7272

7373
import java.lang.reflect.InvocationTargetException;
74+
import java.util.ArrayList;
7475
import java.util.Iterator;
7576
import java.util.List;
7677
import java.util.Optional;
@@ -901,8 +902,14 @@ public StringBuilder visit(AggregatePipeOperator aggregate, Void context) {
901902
builder.append("|> ").append("AGGREGATE");
902903
int i = 0;
903904
for (SelectItem<?> selectItem : aggregate.getSelectItems()) {
904-
builder.append(i++ > 0 ? ", " : " ");
905+
builder.append(i > 0 ? ", " : " ");
905906
selectItem.accept(this, context);
907+
ArrayList<String> selectItemsOrderSuffices = aggregate.getSelectItemsOrderSuffices();
908+
if (i < selectItemsOrderSuffices.size() && selectItemsOrderSuffices.get(i) != null
909+
&& !selectItemsOrderSuffices.get(i).isEmpty()) {
910+
builder.append(" ").append(selectItemsOrderSuffices.get(i));
911+
}
912+
i++;
906913
}
907914
builder.append("\n");
908915

@@ -914,8 +921,16 @@ public StringBuilder visit(AggregatePipeOperator aggregate, Void context) {
914921
builder.append(" BY");
915922
i = 0;
916923
for (SelectItem<?> selectItem : aggregate.getGroupItems()) {
917-
builder.append(i++ > 0 ? ", " : " ");
924+
builder.append(i > 0 ? ", " : " ");
918925
selectItem.accept(this, context);
926+
927+
ArrayList<String> groupItemsOrderSuffices = aggregate.getGroupItemsOrderSuffices();
928+
if (i < groupItemsOrderSuffices.size() && groupItemsOrderSuffices.get(i) != null
929+
&& !groupItemsOrderSuffices.get(i).isEmpty()) {
930+
builder.append(" ").append(groupItemsOrderSuffices.get(i));
931+
}
932+
933+
i++;
919934
}
920935
builder.append("\n");
921936
}

0 commit comments

Comments
 (0)