Skip to content

Commit 5e3502f

Browse files
committed
Schema synchronization commit 2
1 parent 63b168d commit 5e3502f

8 files changed

Lines changed: 95 additions & 14 deletions

File tree

core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
import me.zort.sqllib.mapping.DefaultStatementMappingFactory;
3232
import me.zort.sqllib.mapping.MappingRegistryImpl;
3333
import me.zort.sqllib.mapping.ProxyInstanceImpl;
34-
import me.zort.sqllib.model.DatabaseSchemaBuilder;
35-
import me.zort.sqllib.model.EntitySchemaBuilder;
36-
import me.zort.sqllib.model.SQLSchemaSynchronizer;
34+
import me.zort.sqllib.model.schema.DatabaseSchemaBuilder;
35+
import me.zort.sqllib.model.schema.EntitySchemaBuilder;
36+
import me.zort.sqllib.model.schema.SQLSchemaSynchronizer;
3737
import me.zort.sqllib.pool.PooledSQLDatabaseConnection;
3838
import me.zort.sqllib.transaction.Transaction;
3939
import me.zort.sqllib.util.Validator;

core/src/main/java/me/zort/sqllib/mapping/ProxyInstanceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import me.zort.sqllib.api.model.TableSchema;
1111
import me.zort.sqllib.api.options.NamingStrategy;
1212
import me.zort.sqllib.mapping.annotation.Table;
13-
import me.zort.sqllib.model.EntitySchemaBuilder;
13+
import me.zort.sqllib.model.schema.EntitySchemaBuilder;
1414

1515
import java.lang.reflect.Method;
1616
import java.lang.reflect.Modifier;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package me.zort.sqllib.model.column;
2+
3+
import me.zort.sqllib.api.model.ColumnDefinition;
4+
5+
public class InnoColumnQueryBuilder implements SQLColumnQueryBuilder {
6+
@Override
7+
public String buildActionQuery(SQLColumnQueryBuilder.ColumnAction action, String table, ColumnDefinition from, ColumnDefinition to) {
8+
if (action == SQLColumnQueryBuilder.ColumnAction.ADD) {
9+
return "ALTER TABLE " + table + " ADD COLUMN " + from + ";";
10+
} else if (action == SQLColumnQueryBuilder.ColumnAction.DROP) {
11+
return "ALTER TABLE " + table + " DROP COLUMN " + to.getName() + ";";
12+
} else if (action == SQLColumnQueryBuilder.ColumnAction.RENAME) {
13+
return "ALTER TABLE " + table + " RENAME COLUMN " + to.getName() + " TO " + from.getName() + ";";
14+
} else if (action == SQLColumnQueryBuilder.ColumnAction.MODIFY) {
15+
return "ALTER TABLE " + table + " MODIFY COLUMN " + from.getName() + " " + from.getType() + ";";
16+
}
17+
throw new RuntimeException("Unknown action: " + action);
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package me.zort.sqllib.model.column;
2+
3+
import me.zort.sqllib.api.model.ColumnDefinition;
4+
5+
public interface SQLColumnQueryBuilder {
6+
7+
String buildActionQuery(ColumnAction action, String table, ColumnDefinition from, ColumnDefinition to);
8+
9+
enum ColumnAction {
10+
ADD, DROP, MODIFY, RENAME
11+
}
12+
13+
}

core/src/main/java/me/zort/sqllib/model/DatabaseSchemaBuilder.java renamed to core/src/main/java/me/zort/sqllib/model/schema/DatabaseSchemaBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package me.zort.sqllib.model;
1+
package me.zort.sqllib.model.schema;
22

33
import me.zort.sqllib.api.model.ColumnDefinition;
44
import me.zort.sqllib.api.model.TableSchema;

core/src/main/java/me/zort/sqllib/model/EntitySchemaBuilder.java renamed to core/src/main/java/me/zort/sqllib/model/schema/EntitySchemaBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package me.zort.sqllib.model;
1+
package me.zort.sqllib.model.schema;
22

33
import com.google.gson.internal.Primitives;
44
import lombok.RequiredArgsConstructor;

core/src/main/java/me/zort/sqllib/model/SQLSchemaSynchronizer.java renamed to core/src/main/java/me/zort/sqllib/model/schema/SQLSchemaSynchronizer.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1-
package me.zort.sqllib.model;
1+
package me.zort.sqllib.model.schema;
22

3+
import lombok.Setter;
34
import me.zort.sqllib.SQLDatabaseConnection;
45
import me.zort.sqllib.api.data.QueryResult;
56
import me.zort.sqllib.api.model.ColumnDefinition;
67
import me.zort.sqllib.api.model.SchemaSynchronizer;
78
import me.zort.sqllib.api.model.TableSchema;
9+
import me.zort.sqllib.model.column.InnoColumnQueryBuilder;
10+
import me.zort.sqllib.model.column.SQLColumnQueryBuilder;
811

912
public class SQLSchemaSynchronizer implements SchemaSynchronizer<SQLDatabaseConnection> {
13+
14+
@Setter
15+
private SQLColumnQueryBuilder columnQueryBuilder = new InnoColumnQueryBuilder();
16+
1017
@Override
1118
public QueryResult synchronize(SQLDatabaseConnection source, TableSchema from, TableSchema to) {
1219
StringBuilder query = new StringBuilder();
@@ -15,15 +22,15 @@ public QueryResult synchronize(SQLDatabaseConnection source, TableSchema from, T
1522
ColumnDefinition toDefinition = to.size() > i ? to.getDefinitionDetails(i) : null;
1623

1724
if (fromDefinition == null && toDefinition != null) {
18-
query.append("ALTER TABLE ").append(from.getTable()).append(" DROP COLUMN ").append(toDefinition.getName()).append(";");
25+
query.append(columnQueryBuilder.buildActionQuery(SQLColumnQueryBuilder.ColumnAction.DROP, from.getTable(), fromDefinition, toDefinition));
1926
} else if (fromDefinition != null && toDefinition == null) {
20-
query.append("ALTER TABLE ").append(from.getTable()).append(" ADD ").append(fromDefinition).append(";");
27+
query.append(columnQueryBuilder.buildActionQuery(SQLColumnQueryBuilder.ColumnAction.ADD, from.getTable(), fromDefinition, toDefinition));
2128
} else {
2229
assert fromDefinition != null;
2330
if (!fromDefinition.getName().equals(toDefinition.getName())) {
24-
query.append("ALTER TABLE ").append(from.getTable()).append(" RENAME COLUMN ").append(toDefinition.getName()).append(" TO ").append(fromDefinition.getName()).append(";");
31+
query.append(columnQueryBuilder.buildActionQuery(SQLColumnQueryBuilder.ColumnAction.RENAME, from.getTable(), fromDefinition, toDefinition));
2532
} else if(!fromDefinition.getType().equals(toDefinition.getType())) {
26-
query.append("ALTER TABLE ").append(from.getTable()).append(" ALTER COLUMN ").append(fromDefinition.getName()).append(" ").append(fromDefinition.getType()).append(";");
33+
query.append(columnQueryBuilder.buildActionQuery(SQLColumnQueryBuilder.ColumnAction.MODIFY, from.getTable(), fromDefinition, toDefinition));
2734
}
2835
}
2936
}

src/test/java/me/zort/sqllib/test/TestCase2.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import me.zort.sqllib.api.data.QueryRowsResult;
1111
import me.zort.sqllib.api.data.Row;
1212
import me.zort.sqllib.api.model.TableSchema;
13+
import me.zort.sqllib.internal.annotation.Default;
1314
import me.zort.sqllib.internal.annotation.PrimaryKey;
1415
import me.zort.sqllib.mapping.annotation.*;
15-
import me.zort.sqllib.model.DatabaseSchemaBuilder;
16-
import me.zort.sqllib.model.EntitySchemaBuilder;
16+
import me.zort.sqllib.model.schema.EntitySchemaBuilder;
1717
import org.junit.jupiter.api.*;
1818
import org.junit.jupiter.api.condition.EnabledOnOs;
1919
import org.junit.jupiter.api.condition.OS;
@@ -48,14 +48,15 @@ public void prepare() {
4848
assertTrue(connection.connect());
4949
assertTrue(connection.isConnected());
5050

51+
assertNull(connection.exec(() -> "DROP TABLE IF EXISTS users;").getRejectMessage());
5152
assertTrue(connection.buildEntitySchema("users", User.class));
5253
assertNull(connection.exec(() -> "TRUNCATE TABLE users;").getRejectMessage());
5354
}
5455

5556
@Timeout(10)
5657
@Test
5758
public void test1_Mapping() {
58-
DatabaseRepository repository = connection.createGate(DatabaseRepository.class);
59+
DatabaseRepository repository = connection.createProxy(DatabaseRepository.class);
5960

6061
User user1 = new User("User1", 1000);
6162

@@ -85,6 +86,13 @@ public void test2_Synchronization() {
8586
assertEquals("points INTEGER", dbSchema.getDefinitions()[1]);
8687
assertFalse(connection.synchronizeModel(schema, "users"));
8788
assertFalse(connection.synchronizeModel());
89+
90+
assertTrue(connection.synchronizeModel(UserCopy.class, "users"));
91+
92+
TableSchema copySchema = connection.getSchemaBuilder("users").buildTableSchema();
93+
assertEquals(2, copySchema.getDefinitions().length);
94+
assertEquals("nickname VARCHAR(255) PRIMARY KEY", copySchema.getDefinitions()[0]);
95+
assertEquals("points INTEGER DEFAULT 0", copySchema.getDefinitions()[1]);
8896
}
8997

9098
@Timeout(5)
@@ -158,4 +166,38 @@ public int hashCode() {
158166
}
159167
}
160168

169+
@AllArgsConstructor
170+
private static class UserCopy {
171+
@PrimaryKey
172+
private final String nickname;
173+
@Default("0")
174+
private final int points;
175+
176+
public String getNickname() {
177+
return nickname;
178+
}
179+
180+
public int getPoints() {
181+
return points;
182+
}
183+
184+
@Override
185+
public boolean equals(Object o) {
186+
if (this == o) return true;
187+
if (o == null || getClass() != o.getClass()) return false;
188+
189+
TestCase2.UserCopy user = (TestCase2.UserCopy) o;
190+
191+
if (points != user.points) return false;
192+
return nickname.equals(user.nickname);
193+
}
194+
195+
@Override
196+
public int hashCode() {
197+
int result = nickname.hashCode();
198+
result = 31 * result + points;
199+
return result;
200+
}
201+
}
202+
161203
}

0 commit comments

Comments
 (0)