Skip to content

Commit c2f3305

Browse files
author
Stefan Steinhauser
committed
feat: Implement skyline syntax (preferring clause)
1 parent 60f4d74 commit c2f3305

File tree

23 files changed

+691
-283
lines changed

23 files changed

+691
-283
lines changed

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

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,7 @@
2424
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
2525
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
2626
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
27-
import net.sf.jsqlparser.expression.operators.relational.Between;
28-
import net.sf.jsqlparser.expression.operators.relational.ContainedBy;
29-
import net.sf.jsqlparser.expression.operators.relational.Contains;
30-
import net.sf.jsqlparser.expression.operators.relational.DoubleAnd;
31-
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
32-
import net.sf.jsqlparser.expression.operators.relational.ExcludesExpression;
33-
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
34-
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
35-
import net.sf.jsqlparser.expression.operators.relational.FullTextSearch;
36-
import net.sf.jsqlparser.expression.operators.relational.GeometryDistance;
37-
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
38-
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
39-
import net.sf.jsqlparser.expression.operators.relational.InExpression;
40-
import net.sf.jsqlparser.expression.operators.relational.IncludesExpression;
41-
import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression;
42-
import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression;
43-
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
44-
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
45-
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
46-
import net.sf.jsqlparser.expression.operators.relational.Matches;
47-
import net.sf.jsqlparser.expression.operators.relational.MemberOfExpression;
48-
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
49-
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
50-
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
51-
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
52-
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
53-
import net.sf.jsqlparser.expression.operators.relational.TSQLLeftJoin;
54-
import net.sf.jsqlparser.expression.operators.relational.TSQLRightJoin;
27+
import net.sf.jsqlparser.expression.operators.relational.*;
5528
import net.sf.jsqlparser.schema.Column;
5629
import net.sf.jsqlparser.statement.select.AllColumns;
5730
import net.sf.jsqlparser.statement.select.AllTableColumns;
@@ -633,4 +606,34 @@ default void visit(StructType structType) {
633606
default void visit(LambdaExpression lambdaExpression) {
634607
this.visit(lambdaExpression, null);
635608
}
609+
610+
<S> T visit(HighExpression highExpression, S context);
611+
612+
default void visit(HighExpression highExpression) {
613+
this.visit(highExpression, null);
614+
}
615+
616+
<S> T visit(LowExpression lowExpression, S context);
617+
618+
default void visit(LowExpression lowExpression) {
619+
this.visit(lowExpression, null);
620+
}
621+
622+
<S> T visit(Plus plus, S context);
623+
624+
default void visit(Plus plus) {
625+
this.visit(plus, null);
626+
}
627+
628+
<S> T visit(PriorTo priorTo, S context);
629+
630+
default void visit(PriorTo priorTo) {
631+
this.visit(priorTo, null);
632+
}
633+
634+
<S> T visit(Inverse inverse, S context);
635+
636+
default void visit(Inverse inverse) {
637+
this.visit(inverse, null);
638+
}
636639
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,4 +762,29 @@ public <S> T visit(LambdaExpression lambdaExpression, S context) {
762762
return lambdaExpression.getExpression().accept(this, context);
763763
}
764764

765+
@Override
766+
public <S> T visit(HighExpression highExpression, S context) {
767+
return highExpression.getExpression().accept(this, context);
768+
}
769+
770+
@Override
771+
public <S> T visit(LowExpression lowExpression, S context) {
772+
return lowExpression.getExpression().accept(this, context);
773+
}
774+
775+
@Override
776+
public <S> T visit(Plus plus, S context) {
777+
return visitBinaryExpression(plus, context);
778+
}
779+
780+
@Override
781+
public <S> T visit(PriorTo priorTo, S context) {
782+
return visitBinaryExpression(priorTo, context);
783+
}
784+
785+
@Override
786+
public <S> T visit(Inverse inverse, S context) {
787+
return inverse.getExpression().accept(this, context);
788+
}
789+
765790
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
public class HighExpression extends ASTNodeAccessImpl implements Expression {
15+
private Expression expression;
16+
17+
public HighExpression() {
18+
// empty constructor
19+
}
20+
21+
public HighExpression(Expression expression) {
22+
this.expression = expression;
23+
}
24+
25+
@Override
26+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
27+
return expressionVisitor.visit(this, context);
28+
}
29+
30+
public Expression getExpression() {
31+
return expression;
32+
}
33+
34+
public void setExpression(Expression expression) {
35+
this.expression = expression;
36+
}
37+
38+
@Override
39+
public String toString() {
40+
return "HIGH " + expression.toString();
41+
}
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
public class Inverse extends ASTNodeAccessImpl implements Expression {
15+
private Expression expression;
16+
17+
public Inverse() {
18+
// empty constructor
19+
}
20+
21+
public Inverse(Expression expression) {
22+
this.expression = expression;
23+
}
24+
25+
@Override
26+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
27+
return expressionVisitor.visit(this, context);
28+
}
29+
30+
public Expression getExpression() {
31+
return expression;
32+
}
33+
34+
public void setExpression(Expression expression) {
35+
this.expression = expression;
36+
}
37+
38+
@Override
39+
public String toString() {
40+
return "INVERSE (" + expression.toString() + ")";
41+
}
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
public class LowExpression extends ASTNodeAccessImpl implements Expression {
15+
private Expression expression;
16+
17+
public LowExpression() {
18+
// empty constructor
19+
}
20+
21+
public LowExpression(Expression expression) {
22+
this.expression = expression;
23+
}
24+
25+
@Override
26+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
27+
return expressionVisitor.visit(this, context);
28+
}
29+
30+
public Expression getExpression() {
31+
return expression;
32+
}
33+
34+
public void setExpression(Expression expression) {
35+
this.expression = expression;
36+
}
37+
38+
@Override
39+
public String toString() {
40+
return "LOW " + expression.toString();
41+
}
42+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
13+
14+
import java.io.Serializable;
15+
16+
public class PreferringClause implements Serializable {
17+
private Expression preferring;
18+
private PartitionByClause partitionBy;
19+
20+
public PreferringClause(Expression preferring) {
21+
this.preferring = preferring;
22+
}
23+
24+
public void setPartitionExpressionList(ExpressionList expressionList,
25+
boolean brackets) {
26+
if (this.partitionBy == null) {
27+
this.partitionBy = new PartitionByClause();
28+
}
29+
partitionBy.setPartitionExpressionList(expressionList, brackets);
30+
}
31+
32+
public void toStringPreferring(StringBuilder b) {
33+
b.append("PREFERRING ");
34+
b.append(preferring.toString());
35+
36+
if (partitionBy != null) {
37+
b.append(" ");
38+
partitionBy.toStringPartitionBy(b);
39+
}
40+
}
41+
42+
@Override
43+
public String toString() {
44+
StringBuilder sb = new StringBuilder();
45+
toStringPreferring(sb);
46+
return sb.toString();
47+
}
48+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression.operators.relational;
11+
12+
import net.sf.jsqlparser.expression.BinaryExpression;
13+
import net.sf.jsqlparser.expression.Expression;
14+
import net.sf.jsqlparser.expression.ExpressionVisitor;
15+
16+
public class Plus extends BinaryExpression {
17+
public Plus(Expression leftExpression, Expression rightExpression) {
18+
super(leftExpression, rightExpression);
19+
}
20+
21+
@Override
22+
public String getStringExpression() {
23+
return "PLUS";
24+
}
25+
26+
@Override
27+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
28+
return expressionVisitor.visit(this, context);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression.operators.relational;
11+
12+
import net.sf.jsqlparser.expression.BinaryExpression;
13+
import net.sf.jsqlparser.expression.Expression;
14+
import net.sf.jsqlparser.expression.ExpressionVisitor;
15+
16+
public class PriorTo extends BinaryExpression {
17+
public PriorTo(Expression leftExpression, Expression rightExpression) {
18+
super(leftExpression, rightExpression);
19+
}
20+
21+
@Override
22+
public String getStringExpression() {
23+
return "PRIOR TO";
24+
}
25+
26+
@Override
27+
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
28+
return expressionVisitor.visit(this, context);
29+
}
30+
}

src/main/java/net/sf/jsqlparser/parser/ParserKeywordsUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public class ParserKeywordsUtils {
7979
{"GROUPING", RESTRICTED_ALIAS},
8080
{"QUALIFY", RESTRICTED_ALIAS},
8181
{"HAVING", RESTRICTED_SQL2016},
82+
{"HIGH", RESTRICTED_JSQLPARSER},
8283
{"IF", RESTRICTED_SQL2016},
8384
{"IIF", RESTRICTED_ALIAS},
8485
{"IGNORE", RESTRICTED_ALIAS},
@@ -89,12 +90,14 @@ public class ParserKeywordsUtils {
8990
{"INTERSECT", RESTRICTED_SQL2016},
9091
{"INTERVAL", RESTRICTED_SQL2016},
9192
{"INTO", RESTRICTED_JSQLPARSER},
93+
{"INVERSE", RESTRICTED_JSQLPARSER},
9294
{"IS", RESTRICTED_SQL2016},
9395
{"JOIN", RESTRICTED_JSQLPARSER},
9496
{"LATERAL", RESTRICTED_SQL2016},
9597
{"LEFT", RESTRICTED_SQL2016},
9698
{"LIKE", RESTRICTED_SQL2016},
9799
{"LIMIT", RESTRICTED_SQL2016},
100+
{"LOW", RESTRICTED_JSQLPARSER},
98101
{"MINUS", RESTRICTED_SQL2016},
99102
{"NATURAL", RESTRICTED_SQL2016},
100103
{"NOCYCLE", RESTRICTED_JSQLPARSER},
@@ -110,6 +113,8 @@ public class ParserKeywordsUtils {
110113
{"OUTPUT", RESTRICTED_JSQLPARSER},
111114
{"OPTIMIZE ", RESTRICTED_JSQLPARSER},
112115
{"PIVOT", RESTRICTED_JSQLPARSER},
116+
{"PLUS", RESTRICTED_JSQLPARSER},
117+
{"PREFERRING", RESTRICTED_JSQLPARSER},
113118
{"PROCEDURE", RESTRICTED_ALIAS},
114119
{"PUBLIC", RESTRICTED_ALIAS},
115120
{"RETURNING", RESTRICTED_JSQLPARSER},

0 commit comments

Comments
 (0)