Skip to content

Commit 17e2633

Browse files
AnEmortalKidJan Monterrubio
andauthored
Support CreateSynonym statement (#1064)
* visual * add synonym support * add tests * exclude keyword Co-authored-by: Jan Monterrubio <[email protected]>
1 parent d525823 commit 17e2633

File tree

10 files changed

+377
-1
lines changed

10 files changed

+377
-1
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.schema;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.List;
17+
18+
public class Synonym extends ASTNodeAccessImpl implements MultiPartName {
19+
20+
private static final int NAME_IDX = 0;
21+
private static final int SCHEMA_IDX = 1;
22+
private static final int DATABASE_IDX = 2;
23+
private static final int SERVER_IDX = 3;
24+
private List<String> partItems = new ArrayList<>();
25+
26+
public Synonym() {
27+
}
28+
29+
public Synonym(List<String> partItems) {
30+
this.partItems = new ArrayList<>(partItems);
31+
Collections.reverse(this.partItems);
32+
}
33+
34+
public Database getDatabase() {
35+
return new Database(getIndex(DATABASE_IDX));
36+
}
37+
38+
public void setDatabase(Database database) {
39+
setIndex(DATABASE_IDX, database.getDatabaseName());
40+
if (database.getServer() != null) {
41+
setIndex(SERVER_IDX, database.getServer().getFullyQualifiedName());
42+
}
43+
}
44+
45+
public Synonym withDatabase(Database database) {
46+
setDatabase(database);
47+
return this;
48+
}
49+
50+
public String getSchemaName() {
51+
return getIndex(SCHEMA_IDX);
52+
}
53+
54+
public void setSchemaName(String string) {
55+
setIndex(SCHEMA_IDX, string);
56+
}
57+
58+
public Synonym withSchemaName(String string) {
59+
setSchemaName(string);
60+
return this;
61+
}
62+
63+
public String getName() {
64+
return getIndex(NAME_IDX);
65+
}
66+
67+
public void setName(String string) {
68+
setIndex(NAME_IDX, string);
69+
}
70+
71+
public Synonym withName(String string) {
72+
setName(string);
73+
return this;
74+
}
75+
76+
private void setIndex(int idx, String value) {
77+
int size = partItems.size();
78+
for (int i = 0; i < idx - size + 1; i++) {
79+
partItems.add(null);
80+
}
81+
partItems.set(idx, value);
82+
}
83+
84+
private String getIndex(int idx) {
85+
if (idx < partItems.size()) {
86+
return partItems.get(idx);
87+
} else {
88+
return null;
89+
}
90+
}
91+
92+
@Override
93+
public String getFullyQualifiedName() {
94+
StringBuilder fqn = new StringBuilder();
95+
96+
for (int i = partItems.size() - 1; i >= 0; i--) {
97+
String part = partItems.get(i);
98+
if (part == null) {
99+
part = "";
100+
}
101+
fqn.append(part);
102+
if (i != 0) {
103+
fqn.append(".");
104+
}
105+
}
106+
107+
return fqn.toString();
108+
}
109+
110+
@Override
111+
public String toString() {
112+
StringBuilder sql = new StringBuilder(getFullyQualifiedName());
113+
return sql.toString();
114+
}
115+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1616
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
1717
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
18+
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
1819
import net.sf.jsqlparser.statement.create.table.CreateTable;
1920
import net.sf.jsqlparser.statement.create.view.AlterView;
2021
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -99,4 +100,6 @@ public interface StatementVisitor {
99100
void visit(AlterSequence alterSequence);
100101

101102
void visit(CreateFunctionalStatement createFunctionalStatement);
103+
104+
void visit(CreateSynonym createSynonym);
102105
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1616
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
1717
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
18+
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
1819
import net.sf.jsqlparser.statement.create.table.CreateTable;
1920
import net.sf.jsqlparser.statement.create.view.AlterView;
2021
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -184,4 +185,8 @@ public void visit(AlterSequence alterSequence) {
184185
@Override
185186
public void visit(CreateFunctionalStatement createFunctionalStatement) {
186187
}
188+
189+
@Override
190+
public void visit(CreateSynonym createSynonym) {
191+
}
187192
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 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.synonym;
11+
12+
import net.sf.jsqlparser.schema.Synonym;
13+
import net.sf.jsqlparser.statement.Statement;
14+
import net.sf.jsqlparser.statement.StatementVisitor;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
public class CreateSynonym implements Statement {
20+
21+
private boolean orReplace;
22+
private boolean publicSynonym;
23+
public Synonym synonym;
24+
private List<String> forList = new ArrayList<>();
25+
26+
public void setSynonym(Synonym synonym) {
27+
this.synonym = synonym;
28+
}
29+
30+
public Synonym getSynonym() {
31+
return synonym;
32+
}
33+
34+
public boolean isOrReplace() {
35+
return orReplace;
36+
}
37+
38+
public void setOrReplace(boolean orReplace) {
39+
this.orReplace = orReplace;
40+
}
41+
42+
public boolean isPublicSynonym() {
43+
return publicSynonym;
44+
}
45+
46+
public void setPublicSynonym(boolean publicSynonym) {
47+
this.publicSynonym = publicSynonym;
48+
}
49+
50+
public void setForList(List<String> forList) {
51+
this.forList = forList;
52+
}
53+
54+
public List<String> getForList() {
55+
return forList;
56+
}
57+
58+
public String getFor() {
59+
StringBuilder b = new StringBuilder();
60+
for (String name : forList) {
61+
if (b.length() > 0) {
62+
b.append(".");
63+
}
64+
b.append(name);
65+
}
66+
return b.toString();
67+
}
68+
69+
@Override
70+
public void accept(StatementVisitor statementVisitor) {
71+
statementVisitor.visit(this);
72+
}
73+
74+
@Override
75+
public String toString() {
76+
StringBuilder sqlBuilder = new StringBuilder();
77+
sqlBuilder.append("CREATE ");
78+
if (orReplace) {
79+
sqlBuilder.append("OR REPLACE ");
80+
}
81+
if (publicSynonym) {
82+
sqlBuilder.append("PUBLIC ");
83+
}
84+
sqlBuilder.append("SYNONYM " + synonym);
85+
sqlBuilder.append(' ');
86+
sqlBuilder.append("FOR " + getFor());
87+
return sqlBuilder.toString();
88+
}
89+
90+
public CreateSynonym withSynonym(Synonym synonym) {
91+
this.setSynonym(synonym);
92+
return this;
93+
}
94+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import net.sf.jsqlparser.statement.create.index.CreateIndex;
6666
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
6767
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
68+
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
6869
import net.sf.jsqlparser.statement.create.table.CreateTable;
6970
import net.sf.jsqlparser.statement.create.view.AlterView;
7071
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -903,4 +904,13 @@ public void visit(VariableAssignment var) {
903904
@Override
904905
public void visit(XMLSerializeExpr aThis) {
905906
}
907+
908+
@Override
909+
public void visit(CreateSynonym createSynonym) {
910+
throwUnsupported(createSynonym);
911+
}
912+
913+
private static <T> void throwUnsupported(T type){
914+
throw new UnsupportedOperationException(String.format("Finding tables from %s is not supported", type.getClass().getSimpleName()));
915+
}
906916
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.deparser;
11+
12+
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
13+
14+
/**
15+
* A class to de-parse (that is, transform from JSqlParser hierarchy into a string) a
16+
* {@link CreateSynonym}
17+
*/
18+
public class CreateSynonymDeparser extends AbstractDeParser<CreateSynonym> {
19+
20+
public CreateSynonymDeparser(StringBuilder buffer) {
21+
super(buffer);
22+
}
23+
24+
@Override
25+
void deParse(CreateSynonym createSynonym) {
26+
buffer.append("CREATE ");
27+
if (createSynonym.isOrReplace()) {
28+
buffer.append("OR REPLACE ");
29+
}
30+
if (createSynonym.isPublicSynonym()) {
31+
buffer.append("PUBLIC ");
32+
}
33+
buffer.append("SYNONYM " + createSynonym.getSynonym());
34+
buffer.append(' ');
35+
buffer.append("FOR " + createSynonym.getFor());
36+
}
37+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import net.sf.jsqlparser.statement.create.index.CreateIndex;
3232
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
3333
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
34+
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
3435
import net.sf.jsqlparser.statement.create.table.CreateTable;
3536
import net.sf.jsqlparser.statement.create.view.AlterView;
3637
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -310,6 +311,11 @@ public void visit(CreateFunctionalStatement createFunctionalStatement) {
310311
buffer.append(createFunctionalStatement.toString());
311312
}
312313

314+
@Override
315+
public void visit(CreateSynonym createSynonym) {
316+
new CreateSynonymDeparser(buffer).deParse(createSynonym);
317+
}
318+
313319
@Override
314320
void deParse(Statement statement) {
315321
statement.accept(this);

0 commit comments

Comments
 (0)