Skip to content

Commit b48f26e

Browse files
committed
OracleHierarchicalExpression implemented
1 parent afa6e2d commit b48f26e

File tree

6 files changed

+81
-9
lines changed

6 files changed

+81
-9
lines changed

src/main/java/net/sf/jsqlparser/expression/operators/relational/InExpression.java

100755100644
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ public InExpression(Expression leftExpression, ItemsList itemsList) {
4141
setRightItemsList(itemsList);
4242
}
4343

44+
@Override
4445
public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
4546
this.oldOracleJoinSyntax = oldOracleJoinSyntax;
4647
if (oldOracleJoinSyntax < 0 || oldOracleJoinSyntax > 1) {
4748
throw new IllegalArgumentException("unexpected join type for oracle found with IN (type=" + oldOracleJoinSyntax + ")");
4849
}
4950
}
5051

52+
@Override
5153
public int getOldOracleJoinSyntax() {
5254
return oldOracleJoinSyntax;
5355
}
@@ -97,4 +99,16 @@ private String getLeftExpressionString() {
9799
public String toString() {
98100
return (leftExpression == null ? leftItemsList : getLeftExpressionString()) + " " + ((not) ? "NOT " : "") + "IN " + rightItemsList + "";
99101
}
102+
103+
@Override
104+
public int getOraclePriorPosition() {
105+
return SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR;
106+
}
107+
108+
@Override
109+
public void setOraclePriorPosition(int priorPosition) {
110+
if (priorPosition != SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR) {
111+
throw new IllegalArgumentException("unexpected prior for oracle found");
112+
}
113+
}
100114
}

src/main/java/net/sf/jsqlparser/expression/operators/relational/OldOracleJoinBinaryExpression.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222
package net.sf.jsqlparser.expression.operators.relational;
2323

2424
import net.sf.jsqlparser.expression.BinaryExpression;
25+
import static net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax.ORACLE_PRIOR_START;
2526

2627
public abstract class OldOracleJoinBinaryExpression extends BinaryExpression implements SupportsOldOracleJoinSyntax {
2728

2829
private int oldOracleJoinSyntax = NO_ORACLE_JOIN;
30+
31+
private int oraclePriorPosition = NO_ORACLE_PRIOR;
2932

3033
@Override
3134
public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
@@ -37,11 +40,28 @@ public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
3740

3841
@Override
3942
public String toString() {
40-
return (isNot() ? "NOT " : "") + getLeftExpression() + (oldOracleJoinSyntax == ORACLE_JOIN_RIGHT ? "(+)" : "") + " " + getStringExpression() + " " + getRightExpression() + (oldOracleJoinSyntax == ORACLE_JOIN_LEFT ? "(+)" : "");
43+
return (isNot() ? "NOT " : "")
44+
+ (oraclePriorPosition == ORACLE_PRIOR_START ? "PRIOR " : "")
45+
+ getLeftExpression()
46+
+ (oldOracleJoinSyntax == ORACLE_JOIN_RIGHT ? "(+)" : "") + " "
47+
+ getStringExpression() + " "
48+
+ (oraclePriorPosition == ORACLE_PRIOR_END ? "PRIOR " : "")
49+
+ getRightExpression()
50+
+ (oldOracleJoinSyntax == ORACLE_JOIN_LEFT ? "(+)" : "");
4151
}
4252

4353
@Override
4454
public int getOldOracleJoinSyntax() {
4555
return oldOracleJoinSyntax;
4656
}
57+
58+
@Override
59+
public int getOraclePriorPosition() {
60+
return oraclePriorPosition;
61+
}
62+
63+
@Override
64+
public void setOraclePriorPosition(int oraclePriorPosition) {
65+
this.oraclePriorPosition = oraclePriorPosition;
66+
}
4767
}

src/main/java/net/sf/jsqlparser/expression/operators/relational/SupportsOldOracleJoinSyntax.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ public interface SupportsOldOracleJoinSyntax {
3030
int getOldOracleJoinSyntax();
3131

3232
void setOldOracleJoinSyntax(int oldOracleJoinSyntax);
33+
34+
static final int NO_ORACLE_PRIOR = 0;
35+
static final int ORACLE_PRIOR_START = 1;
36+
static final int ORACLE_PRIOR_END = 2;
37+
38+
int getOraclePriorPosition();
39+
40+
void setOraclePriorPosition(int priorPosition);
3341
}

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class PlainSelect implements SelectBody {
4545
private Limit limit;
4646
private Top top;
4747
private OracleHierarchicalExpression oracleHierarchical = null;
48+
private boolean oracleSiblings = false;
4849

4950
/**
5051
* The {@link FromItem} in this query
@@ -169,6 +170,14 @@ public void setOracleHierarchical(OracleHierarchicalExpression oracleHierarchica
169170
this.oracleHierarchical = oracleHierarchical;
170171
}
171172

173+
public boolean isOracleSiblings() {
174+
return oracleSiblings;
175+
}
176+
177+
public void setOracleSiblings(boolean oracleSiblings) {
178+
this.oracleSiblings = oracleSiblings;
179+
}
180+
172181
@Override
173182
public String toString() {
174183
StringBuilder sql = new StringBuilder("SELECT ");
@@ -203,7 +212,7 @@ public String toString() {
203212
if (having != null) {
204213
sql.append(" HAVING ").append(having);
205214
}
206-
sql.append(orderByToString(orderByElements));
215+
sql.append(orderByToString(oracleSiblings, orderByElements));
207216
if (limit != null) {
208217
sql.append(limit);
209218
}
@@ -212,7 +221,11 @@ public String toString() {
212221
}
213222

214223
public static String orderByToString(List<OrderByElement> orderByElements) {
215-
return getFormatedList(orderByElements, "ORDER BY");
224+
return orderByToString(false, orderByElements);
225+
}
226+
227+
public static String orderByToString(boolean oracleSiblings, List<OrderByElement> orderByElements) {
228+
return getFormatedList(orderByElements, oracleSiblings?"ORDER SIBLINGS BY":"ORDER BY");
216229
}
217230

218231
public static String getFormatedList(List<?> list, String expression) {

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

100755100644
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public void visit(PlainSelect plainSelect) {
9595
}
9696
}
9797

98+
if (plainSelect.getOracleHierarchical() != null) {
99+
plainSelect.getOracleHierarchical().accept(expressionVisitor);
100+
}
101+
98102
if (plainSelect.getWhere() != null) {
99103
buffer.append(" WHERE ");
100104
plainSelect.getWhere().accept(expressionVisitor);
@@ -117,7 +121,7 @@ public void visit(PlainSelect plainSelect) {
117121
}
118122

119123
if (plainSelect.getOrderByElements() != null) {
120-
deparseOrderBy(plainSelect.getOrderByElements());
124+
deparseOrderBy(plainSelect.isOracleSiblings(), plainSelect.getOrderByElements());
121125
}
122126

123127
if (plainSelect.getLimit() != null) {
@@ -212,7 +216,14 @@ public void visit(PivotXml pivot) {
212216
}
213217

214218
public void deparseOrderBy(List<OrderByElement> orderByElements) {
215-
buffer.append(" ORDER BY ");
219+
deparseOrderBy(false, orderByElements);
220+
}
221+
222+
public void deparseOrderBy(boolean oracleSiblings, List<OrderByElement> orderByElements) {
223+
if (oracleSiblings)
224+
buffer.append(" ORDER SIBLINGS BY ");
225+
else
226+
buffer.append(" ORDER BY ");
216227
for (Iterator<OrderByElement> iter = orderByElements.iterator(); iter.hasNext();) {
217228
OrderByElement orderByElement = iter.next();
218229
orderByElement.accept(this);

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
259259
| <K_CONNECT:"CONNECT">
260260
| <K_PRIOR:"PRIOR">
261261
| <K_NOCYCLE:"NOCYCLE">
262+
| <K_SIBLINGS:"SIBLINGS">
262263
}
263264

264265

@@ -629,7 +630,8 @@ PlainSelect PlainSelect():
629630
[ oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ]
630631
[ groupByColumnReferences=GroupByColumnReferences() { plainSelect.setGroupByColumnReferences(groupByColumnReferences); }]
631632
[ having=Having() { plainSelect.setHaving(having); }]
632-
[LOOKAHEAD(2) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ]
633+
[LOOKAHEAD(<K_ORDER> <K_SIBLINGS> <K_BY>) orderByElements = OrderByElements() { plainSelect.setOracleSiblings(true); plainSelect.setOrderByElements(orderByElements); } ]
634+
[LOOKAHEAD(<K_ORDER> <K_BY>) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ]
633635
[LOOKAHEAD(2) limit = Limit() { plainSelect.setLimit(limit); } ]
634636

635637
{
@@ -1131,7 +1133,7 @@ List<OrderByElement> OrderByElements():
11311133
OrderByElement orderByElement = null;
11321134
}
11331135
{
1134-
<K_ORDER> <K_BY> orderByElement=OrderByElement() { orderByList.add(orderByElement); }
1136+
<K_ORDER> [ <K_SIBLINGS> ] <K_BY> orderByElement=OrderByElement() { orderByList.add(orderByElement); }
11351137
("," orderByElement=OrderByElement() { orderByList.add(orderByElement); } )*
11361138
{
11371139
return orderByList;
@@ -1311,10 +1313,11 @@ Expression RegularCondition():
13111313
Expression rightExpression;
13121314
boolean not = false;
13131315
int oracleJoin=EqualsTo.NO_ORACLE_JOIN;
1316+
int oraclePrior=EqualsTo.NO_ORACLE_PRIOR;
13141317
}
13151318
{
13161319

1317-
[ <K_PRIOR> ]
1320+
[ <K_PRIOR> { oraclePrior = EqualsTo.ORACLE_PRIOR_START; }]
13181321
[ <K_NOT> { not = true; } ]
13191322
leftExpression=ComparisonItem() { result = leftExpression; }
13201323

@@ -1331,7 +1334,7 @@ Expression RegularCondition():
13311334
)
13321335
rightExpression=ComparisonItem()
13331336

1334-
[ <K_PRIOR> ]
1337+
[ <K_PRIOR> { oraclePrior = EqualsTo.ORACLE_PRIOR_END; } ]
13351338
[ "(+)" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ]
13361339

13371340
{
@@ -1343,6 +1346,9 @@ Expression RegularCondition():
13431346

13441347
if (oracleJoin>0)
13451348
((SupportsOldOracleJoinSyntax)result).setOldOracleJoinSyntax(oracleJoin);
1349+
1350+
if (oraclePrior!=EqualsTo.NO_ORACLE_PRIOR)
1351+
((SupportsOldOracleJoinSyntax)result).setOraclePriorPosition(oraclePrior);
13461352
}
13471353

13481354
{ return result; }

0 commit comments

Comments
 (0)