Skip to content

Commit 98c476a

Browse files
Add geometry distance operator (#1493)
* Add support for geometry distance operators in PostGIS. * Fix missing imports. Co-authored-by: Thomas Powell <[email protected]>
1 parent 1756adc commit 98c476a

File tree

8 files changed

+51
-1
lines changed

8 files changed

+51
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,6 @@ public interface ExpressionVisitor {
188188
void visit(AllValue allValue);
189189

190190
void visit(IsDistinctExpression isDistinctExpression);
191+
192+
void visit(GeometryDistance geometryDistance);
191193
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,12 @@ public void visit(ConnectByRootOperator connectByRootOperator) {
634634
public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
635635
oracleNamedFunctionParameter.getExpression().accept(this);
636636
}
637-
637+
638+
@Override
639+
public void visit(GeometryDistance geometryDistance) {
640+
visitBinaryExpression(geometryDistance);
641+
}
642+
638643
public void visit(ColumnDefinition columnDefinition) {
639644
columnDefinition.accept(this);
640645
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.sf.jsqlparser.expression.operators.relational;
2+
3+
import net.sf.jsqlparser.expression.ExpressionVisitor;
4+
5+
public class GeometryDistance extends ComparisonOperator {
6+
7+
public GeometryDistance() {
8+
super("<->");
9+
}
10+
11+
public GeometryDistance(String operator) {
12+
super(operator);
13+
}
14+
15+
@Override
16+
public void accept(ExpressionVisitor expressionVisitor) {
17+
expressionVisitor.visit(this);
18+
}
19+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,4 +1031,9 @@ public void visit(PurgeStatement purgeStatement) {
10311031
public void visit(AlterSystemStatement alterSystemStatement) {
10321032
// no tables involved in this statement
10331033
}
1034+
1035+
@Override
1036+
public void visit(GeometryDistance geometryDistance) {
1037+
visitBinaryExpression(geometryDistance);
1038+
}
10341039
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
3535
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
3636
import net.sf.jsqlparser.expression.operators.relational.FullTextSearch;
37+
import net.sf.jsqlparser.expression.operators.relational.GeometryDistance;
3738
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
3839
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
3940
import net.sf.jsqlparser.expression.operators.relational.InExpression;
@@ -996,4 +997,9 @@ public void visit(IsDistinctExpression isDistinctExpression) {
996997
isDistinctExpression.getStringExpression() +
997998
isDistinctExpression.getRightExpression());
998999
}
1000+
1001+
@Override
1002+
public void visit(GeometryDistance geometryDistance) {
1003+
visitOldOracleJoinBinaryExpression(geometryDistance, " <-> ");
1004+
}
9991005
}

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
3131
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
3232
import net.sf.jsqlparser.expression.operators.relational.FullTextSearch;
33+
import net.sf.jsqlparser.expression.operators.relational.GeometryDistance;
3334
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
3435
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
3536
import net.sf.jsqlparser.expression.operators.relational.InExpression;
@@ -586,4 +587,8 @@ public void visit(IsDistinctExpression isDistinctExpression) {
586587
isDistinctExpression.getRightExpression().accept(this);
587588
}
588589

590+
@Override
591+
public void visit(GeometryDistance geometryDistance) {
592+
visitOldOracleJoinBinaryExpression(geometryDistance, " <-> ");
593+
}
589594
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3112,6 +3112,8 @@ Expression RegularCondition() #RegularCondition:
31123112
| <OP_CONCAT> { result = new JsonOperator("||"); }
31133113
| "-" { result = new JsonOperator("-"); }
31143114
| "-#" { result = new JsonOperator("-#"); }
3115+
| <-> { result = new GeometryDistance("<->"); }
3116+
| <#> { result = new GeometryDistance("<#>"); }
31153117
)
31163118

31173119
( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2819,6 +2819,12 @@ public void testNotEqualsTo() throws JSQLParserException {
28192819
assertSqlCanBeParsedAndDeparsed("SELECT * FROM foo WHERE a <> b");
28202820
}
28212821

2822+
@Test
2823+
public void testGeometryDistance() throws JSQLParserException {
2824+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM foo ORDER BY a <-> b");
2825+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM foo ORDER BY a <#> b");
2826+
}
2827+
28222828
@Test
28232829
public void testJsonExpression() throws JSQLParserException {
28242830
assertSqlCanBeParsedAndDeparsed("SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram");

0 commit comments

Comments
 (0)