Skip to content

Commit e85e54f

Browse files
authored
feat: share policy options across PostgreSQL policy DDL (#2711)
* feat: share policy options across PostgreSQL policy DDL Signed-off-by: minleejae <mmj9808@gmail.com> * style: group policy fields before accessors Signed-off-by: minleejae <mmj9808@gmail.com> --------- Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent aeea767 commit e85e54f

10 files changed

Lines changed: 460 additions & 74 deletions

File tree

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import net.sf.jsqlparser.statement.alter.AlterPolicy;
13+
import net.sf.jsqlparser.statement.drop.DropPolicy;
1214
import net.sf.jsqlparser.statement.alter.AlterRelation;
1315
import net.sf.jsqlparser.statement.alter.AlterTablespaceMove;
1416
import net.sf.jsqlparser.statement.alter.database.AlterDatabase;
@@ -697,4 +699,20 @@ default <S> T visit(AlterTablespaceMove statement, S context) {
697699
default void visit(AlterTablespaceMove statement) {
698700
visit(statement, null);
699701
}
702+
703+
default <S> T visit(AlterPolicy statement, S context) {
704+
return null;
705+
}
706+
707+
default void visit(AlterPolicy statement) {
708+
visit(statement, null);
709+
}
710+
711+
default <S> T visit(DropPolicy statement, S context) {
712+
return null;
713+
}
714+
715+
default void visit(DropPolicy statement) {
716+
visit(statement, null);
717+
}
700718
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2025 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.alter;
11+
12+
import net.sf.jsqlparser.statement.Statement;
13+
import net.sf.jsqlparser.statement.StatementVisitor;
14+
import net.sf.jsqlparser.statement.create.policy.PolicyOptions;
15+
16+
public class AlterPolicy implements Statement {
17+
private String policyName;
18+
private net.sf.jsqlparser.schema.Table table;
19+
private String newName;
20+
private PolicyOptions options = new PolicyOptions();
21+
22+
23+
public String getPolicyName() {
24+
return policyName;
25+
}
26+
27+
public AlterPolicy setPolicyName(String policyName) {
28+
this.policyName = policyName;
29+
return this;
30+
}
31+
32+
public net.sf.jsqlparser.schema.Table getTable() {
33+
return table;
34+
}
35+
36+
public AlterPolicy setTable(net.sf.jsqlparser.schema.Table table) {
37+
this.table = table;
38+
return this;
39+
}
40+
41+
42+
public String getNewName() {
43+
return newName;
44+
}
45+
46+
public void setNewName(String newName) {
47+
this.newName = newName;
48+
if (newName != null) {
49+
options = new PolicyOptions();
50+
}
51+
}
52+
53+
public PolicyOptions getOptions() {
54+
return options;
55+
}
56+
57+
public void setOptions(PolicyOptions options) {
58+
this.options = java.util.Objects.requireNonNull(options);
59+
newName = null;
60+
}
61+
62+
public StringBuilder appendTo(StringBuilder sql,
63+
java.util.function.Consumer<net.sf.jsqlparser.expression.Expression> printer) {
64+
sql.append("ALTER POLICY ").append(policyName).append(" ON ").append(table);
65+
if (newName != null) {
66+
sql.append(" RENAME TO ").append(newName);
67+
} else {
68+
options.appendTo(sql, printer);
69+
}
70+
return sql;
71+
}
72+
73+
@Override
74+
public String toString() {
75+
StringBuilder b = new StringBuilder();
76+
return appendTo(b, b::append).toString();
77+
}
78+
79+
@Override
80+
public <T, S> T accept(StatementVisitor<T> visitor, S context) {
81+
return visitor.visit(this, context);
82+
}
83+
}

‎src/main/java/net/sf/jsqlparser/statement/create/policy/CreatePolicy.java‎

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import net.sf.jsqlparser.statement.Statement;
1515
import net.sf.jsqlparser.statement.StatementVisitor;
1616

17-
import java.util.ArrayList;
17+
import java.util.function.Consumer;
1818
import java.util.List;
1919

2020
/**
@@ -30,9 +30,16 @@ public class CreatePolicy implements Statement {
3030
private Table table;
3131
private PolicyMode policyMode;
3232
private PolicyCommand policyCommand;
33-
private List<String> roles = new ArrayList<>();
34-
private Expression usingExpression;
35-
private Expression withCheckExpression;
33+
private PolicyOptions options = new PolicyOptions();
34+
35+
public PolicyOptions getOptions() {
36+
return options;
37+
}
38+
39+
public CreatePolicy setOptions(PolicyOptions options) {
40+
this.options = java.util.Objects.requireNonNull(options);
41+
return this;
42+
}
3643

3744
public String getPolicyName() {
3845
return policyName;
@@ -118,34 +125,34 @@ public PolicyCommand getEffectivePolicyCommand() {
118125
}
119126

120127
public List<String> getRoles() {
121-
return roles;
128+
return options.getRoles();
122129
}
123130

124131
public CreatePolicy setRoles(List<String> roles) {
125-
this.roles = roles;
132+
options.setRoles(roles);
126133
return this;
127134
}
128135

129136
public CreatePolicy addRole(String role) {
130-
this.roles.add(role);
137+
options.getRoles().add(role);
131138
return this;
132139
}
133140

134141
public Expression getUsingExpression() {
135-
return usingExpression;
142+
return options.getUsingExpression();
136143
}
137144

138145
public CreatePolicy setUsingExpression(Expression usingExpression) {
139-
this.usingExpression = usingExpression;
146+
options.setUsingExpression(usingExpression);
140147
return this;
141148
}
142149

143150
public Expression getWithCheckExpression() {
144-
return withCheckExpression;
151+
return options.getWithCheckExpression();
145152
}
146153

147154
public CreatePolicy setWithCheckExpression(Expression withCheckExpression) {
148-
this.withCheckExpression = withCheckExpression;
155+
options.setWithCheckExpression(withCheckExpression);
149156
return this;
150157
}
151158

@@ -154,39 +161,22 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
154161
return statementVisitor.visit(this, context);
155162
}
156163

157-
@Override
158-
public String toString() {
159-
StringBuilder builder = new StringBuilder("CREATE POLICY ");
160-
builder.append(policyName);
161-
builder.append(" ON ");
162-
builder.append(table.toString());
163164

165+
public StringBuilder appendTo(StringBuilder builder, Consumer<Expression> printer) {
166+
builder.append("CREATE POLICY ").append(policyName).append(" ON ").append(table);
164167
if (policyMode != null) {
165168
builder.append(" AS ").append(policyMode);
166169
}
167-
168170
if (policyCommand != null) {
169171
builder.append(" FOR ").append(policyCommand);
170172
}
173+
options.appendTo(builder, printer);
174+
return builder;
175+
}
171176

172-
if (roles != null && !roles.isEmpty()) {
173-
builder.append(" TO ");
174-
for (int i = 0; i < roles.size(); i++) {
175-
if (i > 0) {
176-
builder.append(", ");
177-
}
178-
builder.append(roles.get(i));
179-
}
180-
}
181-
182-
if (usingExpression != null) {
183-
builder.append(" USING (").append(usingExpression.toString()).append(")");
184-
}
185-
186-
if (withCheckExpression != null) {
187-
builder.append(" WITH CHECK (").append(withCheckExpression.toString()).append(")");
188-
}
189-
190-
return builder.toString();
177+
@Override
178+
public String toString() {
179+
StringBuilder builder = new StringBuilder();
180+
return appendTo(builder, builder::append).toString();
191181
}
192182
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2025 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.policy;
11+
12+
import java.io.Serializable;
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
import java.util.function.Consumer;
16+
import net.sf.jsqlparser.expression.Expression;
17+
18+
/** Roles and predicates shared by PostgreSQL CREATE and ALTER POLICY. */
19+
public class PolicyOptions implements Serializable {
20+
private List<String> roles = new ArrayList<>();
21+
private Expression usingExpression;
22+
private Expression withCheckExpression;
23+
24+
public List<String> getRoles() {
25+
return roles;
26+
}
27+
28+
public PolicyOptions setRoles(List<String> roles) {
29+
this.roles = roles;
30+
return this;
31+
}
32+
33+
public Expression getUsingExpression() {
34+
return usingExpression;
35+
}
36+
37+
public PolicyOptions setUsingExpression(Expression usingExpression) {
38+
this.usingExpression = usingExpression;
39+
return this;
40+
}
41+
42+
public Expression getWithCheckExpression() {
43+
return withCheckExpression;
44+
}
45+
46+
public PolicyOptions setWithCheckExpression(Expression withCheckExpression) {
47+
this.withCheckExpression = withCheckExpression;
48+
return this;
49+
}
50+
51+
public void visitExpressions(Consumer<Expression> visitor) {
52+
if (usingExpression != null) {
53+
visitor.accept(usingExpression);
54+
}
55+
if (withCheckExpression != null) {
56+
visitor.accept(withCheckExpression);
57+
}
58+
}
59+
60+
public void appendTo(StringBuilder sql, Consumer<Expression> printer) {
61+
if (roles != null && !roles.isEmpty()) {
62+
sql.append(" TO ").append(String.join(", ", roles));
63+
}
64+
if (usingExpression != null) {
65+
sql.append(" USING (");
66+
printer.accept(usingExpression);
67+
sql.append(')');
68+
}
69+
if (withCheckExpression != null) {
70+
sql.append(" WITH CHECK (");
71+
printer.accept(withCheckExpression);
72+
sql.append(')');
73+
}
74+
}
75+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2025 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.drop;
11+
12+
import net.sf.jsqlparser.statement.Statement;
13+
import net.sf.jsqlparser.statement.StatementVisitor;
14+
15+
public class DropPolicy implements Statement {
16+
private String policyName;
17+
private net.sf.jsqlparser.schema.Table table;
18+
private boolean ifExists = false;
19+
private Behavior behavior;
20+
21+
public String getPolicyName() {
22+
return policyName;
23+
}
24+
25+
public DropPolicy setPolicyName(String policyName) {
26+
this.policyName = policyName;
27+
return this;
28+
}
29+
30+
public net.sf.jsqlparser.schema.Table getTable() {
31+
return table;
32+
}
33+
34+
public DropPolicy setTable(net.sf.jsqlparser.schema.Table table) {
35+
this.table = table;
36+
return this;
37+
}
38+
39+
public boolean isIfExists() {
40+
return ifExists;
41+
}
42+
43+
public DropPolicy setIfExists(boolean ifExists) {
44+
this.ifExists = ifExists;
45+
return this;
46+
}
47+
48+
public Behavior getBehavior() {
49+
return behavior;
50+
}
51+
52+
public DropPolicy setBehavior(Behavior behavior) {
53+
this.behavior = behavior;
54+
return this;
55+
}
56+
57+
public enum Behavior {
58+
CASCADE, RESTRICT
59+
}
60+
61+
public StringBuilder appendTo(StringBuilder sql) {
62+
sql.append("DROP POLICY ");
63+
if (ifExists) {
64+
sql.append("IF EXISTS ");
65+
}
66+
sql.append(policyName).append(" ON ").append(table);
67+
if (behavior != null) {
68+
sql.append(' ').append(behavior);
69+
}
70+
return sql;
71+
}
72+
73+
@Override
74+
public String toString() {
75+
return appendTo(new StringBuilder()).toString();
76+
}
77+
78+
@Override
79+
public <T, S> T accept(StatementVisitor<T> visitor, S context) {
80+
return visitor.visit(this, context);
81+
}
82+
}

0 commit comments

Comments
 (0)