Skip to content

Commit 85361c0

Browse files
committed
Handling quotes in table and column names. Adding more DDL test files.
1 parent 4b46560 commit 85361c0

File tree

7 files changed

+214
-14
lines changed

7 files changed

+214
-14
lines changed

src/main/java/org/ngbsn/generator/BiDirectionalMappingsGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.ngbsn.model.annotations.fieldAnnotations.JoinColumnAnnotation;
88
import org.ngbsn.model.annotations.fieldAnnotations.JoinTableAnnotation;
99
import org.ngbsn.model.annotations.fieldAnnotations.ManyToManyAnnotation;
10+
import org.ngbsn.util.Util;
1011

1112
import java.util.HashSet;
1213
import java.util.List;
@@ -22,7 +23,7 @@ static void addBiDirectionalMappings(Table table, List<ForeignKeyConstraint> for
2223

2324
//Adding @ManyToMany and @JoinTable to table1
2425
Column column1 = new Column();
25-
column1.setFieldName(CaseUtils.toCamelCase(table2.getTableName(), false, '_'));
26+
column1.setFieldName(Util.convertSnakeCaseToCamelCase(table2.getTableName(), false));
2627
column1.setType(table2.getClassName());
2728
column1.getAnnotations().add(ManyToManyAnnotation.builder().build().toString());
2829
Set<JoinColumnAnnotation> joinColumnAnnotations = new HashSet<>();
@@ -38,7 +39,7 @@ static void addBiDirectionalMappings(Table table, List<ForeignKeyConstraint> for
3839

3940
//Adding @ManyToMany(mappedBy) to table2
4041
Column column2 = new Column();
41-
column2.setFieldName(CaseUtils.toCamelCase(table1.getTableName(), false, '_'));
42+
column2.setFieldName(Util.convertSnakeCaseToCamelCase(table1.getTableName(), false));
4243
column2.setType(table1.getClassName());
4344
column2.getAnnotations().add(ManyToManyAnnotation.builder().mappedBy(column1.getFieldName()).build().toString());
4445
table2.getColumns().add(column2);

src/main/java/org/ngbsn/generator/ModelGenerator.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.ngbsn.model.annotations.fieldAnnotations.ColumnAnnotation;
1616
import org.ngbsn.model.annotations.fieldAnnotations.NotNullAnnotation;
1717
import org.ngbsn.util.SQLToJavaMapping;
18+
import org.ngbsn.util.Util;
1819
import org.slf4j.Logger;
1920
import org.slf4j.LoggerFactory;
2021

@@ -38,16 +39,16 @@ public static List<Table> parse(final String sqlScript) {
3839
//Iterating over all Tables
3940
if (statement instanceof CreateTable parsedTable) {
4041
Table table = new Table();
41-
tablesMap.put(parsedTable.getTable().getName(), table);
42-
table.setTableName(parsedTable.getTable().getName());
43-
table.setClassName(CaseUtils.toCamelCase(table.getTableName(), true, '_'));
42+
table.setTableName(parsedTable.getTable().getName().replaceAll("^\"|\"$", ""));
43+
tablesMap.put(table.getTableName(), table);
44+
table.setClassName(Util.convertSnakeCaseToCamelCase(table.getTableName(), true));
4445

4546
Set<String> tableAnnotations = new HashSet<>();
4647
table.setAnnotations(tableAnnotations);
4748
//Adding @Entity
4849
tableAnnotations.add(new EntityAnnotation().toString());
4950
//Adding @Table
50-
tableAnnotations.add(TableAnnotation.builder().tableName(parsedTable.getTable().getName()).build().toString());
51+
tableAnnotations.add(TableAnnotation.builder().tableName(table.getTableName()).build().toString());
5152

5253
Set<Column> columns = new HashSet<>();
5354
table.setColumns(columns);
@@ -107,7 +108,7 @@ private static void extractPrimaryKeys(CreateTable parsedTable, Table table) {
107108
//create a embeddedId within Table
108109
EmbeddableClass embeddedId = new EmbeddableClass();
109110
embeddedId.setClassName(table.getClassName() + "PK");
110-
embeddedId.setFieldName(CaseUtils.toCamelCase(table.getTableName(), false, '_') + "PK");
111+
embeddedId.setFieldName(Util.convertSnakeCaseToCamelCase(table.getTableName(), false) + "PK");
111112
embeddedId.setEmbeddedId(true);
112113
table.getEmbeddableClasses().add(embeddedId);
113114

@@ -133,10 +134,10 @@ private static void extractColumns(CreateTable parsedTable, Set<Column> columns)
133134
columns.add(column);
134135
Set<String> columnAnnotations = new HashSet<>();
135136
column.setAnnotations(columnAnnotations);
136-
column.setColumnName(columnDefinition.getColumnName());
137+
column.setColumnName(columnDefinition.getColumnName().replaceAll("^\"|\"$", ""));
137138
//Adding @Column
138139
columnAnnotations.add(ColumnAnnotation.builder().columnName(column.getColumnName()).build().toString());
139-
column.setFieldName(CaseUtils.toCamelCase(columnDefinition.getColumnName(), false, '_'));
140+
column.setFieldName(Util.convertSnakeCaseToCamelCase(column.getColumnName(), false));
140141
column.setType(SQLToJavaMapping.sqlToJavaMap.get(columnDefinition.getColDataType().getDataType()));
141142

142143
//Check for NOT NULL

src/main/java/org/ngbsn/generator/UniDirectionalMappingsGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.ngbsn.model.ForeignKeyConstraint;
88
import org.ngbsn.model.Table;
99
import org.ngbsn.model.annotations.fieldAnnotations.*;
10+
import org.ngbsn.util.Util;
1011

1112
import java.util.HashSet;
1213
import java.util.Optional;
@@ -28,14 +29,14 @@ static void addBothSideUniDirectionalMappings(Table table, ForeignKeyConstraint
2829
Table referencedTable = tablesMap.get(foreignKeyConstraint.getReferencedTableName());
2930
//In the Child table, create a new column having field name as Parent(Referenced) Table.
3031
Column parentTableField = new Column();
31-
parentTableField.setFieldName(CaseUtils.toCamelCase(referencedTable.getTableName(), false, '_'));
32+
parentTableField.setFieldName(Util.convertSnakeCaseToCamelCase(referencedTable.getTableName(), false));
3233
parentTableField.setType(referencedTable.getClassName());
3334
parentTableField.getAnnotations().add(new ManyToOneAnnotation().toString());
3435
table.getColumns().add(parentTableField);
3536

3637
//In the Parent(Referenced) table, create a new column having field name as child Table.
3738
Column childTableField = new Column();
38-
childTableField.setFieldName(CaseUtils.toCamelCase(table.getTableName(), false, '_'));
39+
childTableField.setFieldName(Util.convertSnakeCaseToCamelCase(table.getTableName(), false));
3940
childTableField.setType("Set<" + table.getClassName() + ">");
4041
childTableField.getAnnotations().add(OneToManyAnnotation.builder().mappedBy(parentTableField.getFieldName()).build().toString());
4142
referencedTable.getColumns().add(childTableField);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package org.ngbsn.util;
22

3+
import org.apache.commons.text.CaseUtils;
4+
import org.apache.commons.text.WordUtils;
5+
36
public class Util {
47

58

69
public static String packageNameToFolderStructure(final String packageName) {
710
return packageName.replaceAll("\\.", "/") + "/";
811
}
12+
13+
public static String convertSnakeCaseToCamelCase(String word, boolean captializeFirstChar){
14+
word = captializeFirstChar ? WordUtils.capitalize(word) : WordUtils.uncapitalize(word);
15+
return word.contains("_") ? CaseUtils.toCamelCase(word, captializeFirstChar, '_') : word;
16+
}
917
}

src/test/java/org/ngbsn/maven/CodeGenTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,22 @@ public class CodeGenTest {
1717
private static final Logger logger = LoggerFactory.getLogger(CodeGenTest.class);
1818

1919
@Test
20-
public void testCodeGen() throws TemplateException, IOException {
20+
public void testMySql() throws TemplateException, IOException {
2121
logger.info("Starting test");
2222
ClassLoader classLoader = getClass().getClassLoader();
23-
File file = new File(Objects.requireNonNull(classLoader.getResource("sql/organization.sql")).getFile());
23+
File file = new File(Objects.requireNonNull(classLoader.getResource("sql/mysql.sql")).getFile());
2424
String sqlScript = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
25-
String packageName = "com.ngbsn.models";
25+
String packageName = "com.ngbsn.models.mysql";
2626
generateCode(sqlScript, packageName);
27+
}
2728

29+
@Test
30+
public void testPostgres() throws TemplateException, IOException {
31+
logger.info("Starting test");
32+
ClassLoader classLoader = getClass().getClassLoader();
33+
File file = new File(Objects.requireNonNull(classLoader.getResource("sql/postgres.sql")).getFile());
34+
String sqlScript = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
35+
String packageName = "com.ngbsn.models.postgres";
36+
generateCode(sqlScript, packageName);
2837
}
2938
}
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
CREATE TABLE "Album"
2+
(
3+
"AlbumId" INT NOT NULL,
4+
"Title" VARCHAR(160) NOT NULL,
5+
"ArtistId" INT NOT NULL,
6+
CONSTRAINT "PK_Album" PRIMARY KEY ("AlbumId")
7+
);
8+
9+
CREATE TABLE "Artist"
10+
(
11+
"ArtistId" INT NOT NULL,
12+
"Name" VARCHAR(120),
13+
CONSTRAINT "PK_Artist" PRIMARY KEY ("ArtistId")
14+
);
15+
16+
CREATE TABLE "Customer"
17+
(
18+
"CustomerId" INT NOT NULL,
19+
"FirstName" VARCHAR(40) NOT NULL,
20+
"LastName" VARCHAR(20) NOT NULL,
21+
"Company" VARCHAR(80),
22+
"Address" VARCHAR(70),
23+
"City" VARCHAR(40),
24+
"State" VARCHAR(40),
25+
"Country" VARCHAR(40),
26+
"PostalCode" VARCHAR(10),
27+
"Phone" VARCHAR(24),
28+
"Fax" VARCHAR(24),
29+
"Email" VARCHAR(60) NOT NULL,
30+
"SupportRepId" INT,
31+
CONSTRAINT "PK_Customer" PRIMARY KEY ("CustomerId")
32+
);
33+
34+
CREATE TABLE "Employee"
35+
(
36+
"EmployeeId" INT NOT NULL,
37+
"LastName" VARCHAR(20) NOT NULL,
38+
"FirstName" VARCHAR(20) NOT NULL,
39+
"Title" VARCHAR(30),
40+
"ReportsTo" INT,
41+
"BirthDate" TIMESTAMP,
42+
"HireDate" TIMESTAMP,
43+
"Address" VARCHAR(70),
44+
"City" VARCHAR(40),
45+
"State" VARCHAR(40),
46+
"Country" VARCHAR(40),
47+
"PostalCode" VARCHAR(10),
48+
"Phone" VARCHAR(24),
49+
"Fax" VARCHAR(24),
50+
"Email" VARCHAR(60),
51+
CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId")
52+
);
53+
54+
CREATE TABLE "Genre"
55+
(
56+
"GenreId" INT NOT NULL,
57+
"Name" VARCHAR(120),
58+
CONSTRAINT "PK_Genre" PRIMARY KEY ("GenreId")
59+
);
60+
61+
CREATE TABLE "Invoice"
62+
(
63+
"InvoiceId" INT NOT NULL,
64+
"CustomerId" INT NOT NULL,
65+
"InvoiceDate" TIMESTAMP NOT NULL,
66+
"BillingAddress" VARCHAR(70),
67+
"BillingCity" VARCHAR(40),
68+
"BillingState" VARCHAR(40),
69+
"BillingCountry" VARCHAR(40),
70+
"BillingPostalCode" VARCHAR(10),
71+
"Total" NUMERIC(10,2) NOT NULL,
72+
CONSTRAINT "PK_Invoice" PRIMARY KEY ("InvoiceId")
73+
);
74+
75+
CREATE TABLE "InvoiceLine"
76+
(
77+
"InvoiceLineId" INT NOT NULL,
78+
"InvoiceId" INT NOT NULL,
79+
"TrackId" INT NOT NULL,
80+
"UnitPrice" NUMERIC(10,2) NOT NULL,
81+
"Quantity" INT NOT NULL,
82+
CONSTRAINT "PK_InvoiceLine" PRIMARY KEY ("InvoiceLineId")
83+
);
84+
85+
CREATE TABLE "MediaType"
86+
(
87+
"MediaTypeId" INT NOT NULL,
88+
"Name" VARCHAR(120),
89+
CONSTRAINT "PK_MediaType" PRIMARY KEY ("MediaTypeId")
90+
);
91+
92+
CREATE TABLE "Playlist"
93+
(
94+
"PlaylistId" INT NOT NULL,
95+
"Name" VARCHAR(120),
96+
CONSTRAINT "PK_Playlist" PRIMARY KEY ("PlaylistId")
97+
);
98+
99+
CREATE TABLE "PlaylistTrack"
100+
(
101+
"PlaylistId" INT NOT NULL,
102+
"TrackId" INT NOT NULL,
103+
CONSTRAINT "PK_PlaylistTrack" PRIMARY KEY ("PlaylistId", "TrackId")
104+
);
105+
106+
CREATE TABLE "Track"
107+
(
108+
"TrackId" INT NOT NULL,
109+
"Name" VARCHAR(200) NOT NULL,
110+
"AlbumId" INT,
111+
"MediaTypeId" INT NOT NULL,
112+
"GenreId" INT,
113+
"Composer" VARCHAR(220),
114+
"Milliseconds" INT NOT NULL,
115+
"Bytes" INT,
116+
"UnitPrice" NUMERIC(10,2) NOT NULL,
117+
CONSTRAINT "PK_Track" PRIMARY KEY ("TrackId")
118+
);
119+
120+
121+
122+
/*******************************************************************************
123+
Create Primary Key Unique Indexes
124+
********************************************************************************/
125+
126+
/*******************************************************************************
127+
Create Foreign Keys
128+
********************************************************************************/
129+
ALTER TABLE "Album" ADD CONSTRAINT "FK_AlbumArtistId"
130+
FOREIGN KEY ("ArtistId") REFERENCES "Artist" ("ArtistId") ON DELETE NO ACTION ON UPDATE NO ACTION;
131+
132+
CREATE INDEX "IFK_AlbumArtistId" ON "Album" ("ArtistId");
133+
134+
ALTER TABLE "Customer" ADD CONSTRAINT "FK_CustomerSupportRepId"
135+
FOREIGN KEY ("SupportRepId") REFERENCES "Employee" ("EmployeeId") ON DELETE NO ACTION ON UPDATE NO ACTION;
136+
137+
CREATE INDEX "IFK_CustomerSupportRepId" ON "Customer" ("SupportRepId");
138+
139+
ALTER TABLE "Employee" ADD CONSTRAINT "FK_EmployeeReportsTo"
140+
FOREIGN KEY ("ReportsTo") REFERENCES "Employee" ("EmployeeId") ON DELETE NO ACTION ON UPDATE NO ACTION;
141+
142+
CREATE INDEX "IFK_EmployeeReportsTo" ON "Employee" ("ReportsTo");
143+
144+
ALTER TABLE "Invoice" ADD CONSTRAINT "FK_InvoiceCustomerId"
145+
FOREIGN KEY ("CustomerId") REFERENCES "Customer" ("CustomerId") ON DELETE NO ACTION ON UPDATE NO ACTION;
146+
147+
CREATE INDEX "IFK_InvoiceCustomerId" ON "Invoice" ("CustomerId");
148+
149+
ALTER TABLE "InvoiceLine" ADD CONSTRAINT "FK_InvoiceLineInvoiceId"
150+
FOREIGN KEY ("InvoiceId") REFERENCES "Invoice" ("InvoiceId") ON DELETE NO ACTION ON UPDATE NO ACTION;
151+
152+
CREATE INDEX "IFK_InvoiceLineInvoiceId" ON "InvoiceLine" ("InvoiceId");
153+
154+
ALTER TABLE "InvoiceLine" ADD CONSTRAINT "FK_InvoiceLineTrackId"
155+
FOREIGN KEY ("TrackId") REFERENCES "Track" ("TrackId") ON DELETE NO ACTION ON UPDATE NO ACTION;
156+
157+
CREATE INDEX "IFK_InvoiceLineTrackId" ON "InvoiceLine" ("TrackId");
158+
159+
ALTER TABLE "PlaylistTrack" ADD CONSTRAINT "FK_PlaylistTrackPlaylistId"
160+
FOREIGN KEY ("PlaylistId") REFERENCES "Playlist" ("PlaylistId") ON DELETE NO ACTION ON UPDATE NO ACTION;
161+
162+
ALTER TABLE "PlaylistTrack" ADD CONSTRAINT "FK_PlaylistTrackTrackId"
163+
FOREIGN KEY ("TrackId") REFERENCES "Track" ("TrackId") ON DELETE NO ACTION ON UPDATE NO ACTION;
164+
165+
CREATE INDEX "IFK_PlaylistTrackTrackId" ON "PlaylistTrack" ("TrackId");
166+
167+
ALTER TABLE "Track" ADD CONSTRAINT "FK_TrackAlbumId"
168+
FOREIGN KEY ("AlbumId") REFERENCES "Album" ("AlbumId") ON DELETE NO ACTION ON UPDATE NO ACTION;
169+
170+
CREATE INDEX "IFK_TrackAlbumId" ON "Track" ("AlbumId");
171+
172+
ALTER TABLE "Track" ADD CONSTRAINT "FK_TrackGenreId"
173+
FOREIGN KEY ("GenreId") REFERENCES "Genre" ("GenreId") ON DELETE NO ACTION ON UPDATE NO ACTION;
174+
175+
CREATE INDEX "IFK_TrackGenreId" ON "Track" ("GenreId");
176+
177+
ALTER TABLE "Track" ADD CONSTRAINT "FK_TrackMediaTypeId"
178+
FOREIGN KEY ("MediaTypeId") REFERENCES "MediaType" ("MediaTypeId") ON DELETE NO ACTION ON UPDATE NO ACTION;
179+
180+
CREATE INDEX "IFK_TrackMediaTypeId" ON "Track" ("MediaTypeId");

0 commit comments

Comments
 (0)