Skip to content

Commit a550481

Browse files
author
Peter Borissow
committed
Added support for PostgreSQL JSON Functions and Operators.
1 parent fefe4ac commit a550481

File tree

7 files changed

+92
-6
lines changed

7 files changed

+92
-6
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
4747
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
4848
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
49+
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
4950
import net.sf.jsqlparser.schema.Column;
5051
import net.sf.jsqlparser.statement.select.SubSelect;
5152

@@ -150,6 +151,8 @@ public interface ExpressionVisitor {
150151
void visit(RegExpMatchOperator rexpr);
151152

152153
void visit(JsonExpression jsonExpr);
154+
155+
void visit(JsonOperator jsonExpr);
153156

154157
void visit(RegExpMySQLOperator regExpMySQLOperator);
155158

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import net.sf.jsqlparser.expression.operators.arithmetic.*;
2525
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
2626
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
27+
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
2728
import net.sf.jsqlparser.expression.operators.relational.*;
2829
import net.sf.jsqlparser.schema.Column;
2930
import net.sf.jsqlparser.statement.select.AllColumns;
@@ -347,6 +348,11 @@ protected void visitBinaryExpression(BinaryExpression expr) {
347348
public void visit(JsonExpression jsonExpr) {
348349
visit(jsonExpr.getColumn());
349350
}
351+
352+
@Override
353+
public void visit(JsonOperator expr) {
354+
visitBinaryExpression(expr);
355+
}
350356

351357
@Override
352358
public void visit(RegExpMySQLOperator expr) {

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class JsonExpression implements Expression {
5353
private Column column;
5454

5555
private List<String> idents = new ArrayList<String>();
56+
private List<String> operators = new ArrayList<String>();
5657

5758
@Override
5859
public void accept(ExpressionVisitor expressionVisitor) {
@@ -73,18 +74,27 @@ public List<String> getIdents() {
7374

7475
public void setIdents(List<String> idents) {
7576
this.idents = idents;
77+
operators = new ArrayList<String>();
78+
for (String ident : idents) {
79+
operators.add("->");
80+
}
7681
}
7782

7883
public void addIdent(String ident) {
84+
addIdent(ident, "->");
85+
}
86+
87+
public void addIdent(String ident, String operator) {
7988
idents.add(ident);
89+
operators.add(operator);
8090
}
8191

8292
@Override
8393
public String toString() {
8494
StringBuilder b = new StringBuilder();
8595
b.append(column.toString());
86-
for (String ident : idents) {
87-
b.append("->").append(ident);
96+
for (int i=0; i<idents.size(); i++){
97+
b.append(operators.get(i)).append(idents.get(i));
8898
}
8999
return b.toString();
90100
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2013 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.expression.operators.relational;
23+
24+
import net.sf.jsqlparser.expression.BinaryExpression;
25+
import net.sf.jsqlparser.expression.ExpressionVisitor;
26+
27+
public class JsonOperator extends BinaryExpression {
28+
29+
private String op; //"@>"
30+
31+
public JsonOperator(String op){
32+
this.op = op;
33+
}
34+
35+
@Override
36+
public void accept(ExpressionVisitor expressionVisitor) {
37+
expressionVisitor.visit(this);
38+
}
39+
40+
@Override
41+
public String getStringExpression() {
42+
return op;
43+
}
44+
}
45+

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
import net.sf.jsqlparser.statement.execute.Execute;
5151
import net.sf.jsqlparser.statement.merge.Merge;
5252
import net.sf.jsqlparser.statement.truncate.Truncate;
53-
53+
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
5454
/**
5555
* Find all used tables within an select statement.
5656
*/
@@ -447,6 +447,10 @@ public void visit(RegExpMySQLOperator rexpr) {
447447
public void visit(JsonExpression jsonExpr) {
448448
}
449449

450+
@Override
451+
public void visit(JsonOperator jsonExpr) {
452+
}
453+
450454
@Override
451455
public void visit(AllColumns allColumns) {
452456
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import net.sf.jsqlparser.schema.*;
3030
import net.sf.jsqlparser.statement.select.SelectVisitor;
3131
import net.sf.jsqlparser.statement.select.SubSelect;
32-
32+
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
3333
import java.util.Iterator;
3434

3535
/**
@@ -529,6 +529,11 @@ public void visit(RegExpMySQLOperator rexpr) {
529529
public void visit(JsonExpression jsonExpr) {
530530
buffer.append(jsonExpr.toString());
531531
}
532+
533+
@Override
534+
public void visit(JsonOperator jsonExpr) {
535+
visitBinaryExpression(jsonExpr, " " + jsonExpr.getStringExpression() + " ");
536+
}
532537

533538
@Override
534539
public void visit(WithinGroupExpression wgexpr) {

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ import net.sf.jsqlparser.statement.select.*;
7474
import net.sf.jsqlparser.statement.truncate.*;
7575
import net.sf.jsqlparser.statement.update.*;
7676
import net.sf.jsqlparser.statement.merge.*;
77-
7877
import java.util.*;
7978

8079
/**
@@ -1729,6 +1728,15 @@ Expression RegularCondition():
17291728
| "~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); }
17301729
| "!~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASESENSITIVE); }
17311730
| "!~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.NOT_MATCH_CASEINSENSITIVE); }
1731+
1732+
| "@>" { result = new JsonOperator("@>"); }
1733+
| "<@" { result = new JsonOperator("<@"); }
1734+
| "?" { result = new JsonOperator("?"); }
1735+
| "?|" { result = new JsonOperator("?|"); }
1736+
| "?&" { result = new JsonOperator("?&"); }
1737+
| "||" { result = new JsonOperator("||"); }
1738+
| "-" { result = new JsonOperator("-"); }
1739+
| "-#" { result = new JsonOperator("-#"); }
17321740
)
17331741

17341742
( LOOKAHEAD(2) <K_PRIOR> rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; }
@@ -2228,7 +2236,12 @@ JsonExpression JsonExpression() : {
22282236
Token token;
22292237
}
22302238
{
2231-
column=Column() ("->" token=<S_CHAR_LITERAL> {result.addIdent(token.image);} )+
2239+
column=Column() (
2240+
"->" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"->");} |
2241+
"->>" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"->>");} |
2242+
"#>" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"#>");} |
2243+
"#>>" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"#>>");}
2244+
)+
22322245
{
22332246
result.setColumn(column);
22342247
return result;

0 commit comments

Comments
 (0)