Skip to content

Commit c302a36

Browse files
committed
API improvements - Repositories, Table builder
* Removed SQLTableRepository.java, SQLTableRepositoryBuilder.java, CachingSQLTableRepository.java * Moved logic from SQLTableRepositoryBuilder.java to ObjectTableConverter.java * Added test case for SQLDatabaseConnection#buildEntitySchema
1 parent a868751 commit c302a36

7 files changed

Lines changed: 47 additions & 235 deletions

File tree

core/src/main/java/me/zort/sqllib/SQLTableRepositoryBuilder.java renamed to core/src/main/java/me/zort/sqllib/ObjectTableConverter.java

Lines changed: 35 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,47 @@
11
package me.zort.sqllib;
22

33
import com.google.gson.internal.Primitives;
4-
import me.zort.sqllib.api.repository.CachingSQLTableRepository;
5-
import me.zort.sqllib.api.repository.SQLTableRepository;
4+
import lombok.RequiredArgsConstructor;
65
import me.zort.sqllib.internal.annotation.JsonField;
76
import me.zort.sqllib.internal.annotation.NullableField;
87
import me.zort.sqllib.internal.annotation.PrimaryKey;
98
import me.zort.sqllib.util.Arrays;
109
import me.zort.sqllib.util.Validator;
11-
import org.jetbrains.annotations.ApiStatus;
1210

1311
import java.lang.reflect.Field;
1412
import java.lang.reflect.Modifier;
1513
import java.util.Objects;
1614

17-
@ApiStatus.Experimental // Still in development. So it can change in the future.
18-
public class SQLTableRepositoryBuilder<T, ID> {
19-
20-
private final SQLTableRepository.RepositoryInfo<T, ID> info;
21-
private SQLDatabaseConnection connection;
22-
23-
public SQLTableRepositoryBuilder() {
24-
this.info = new SQLTableRepository.RepositoryInfo<>();
25-
this.connection = null;
26-
}
27-
28-
public SQLTableRepositoryBuilder<T, ID> withConnection(SQLDatabaseConnection connection) {
29-
this.connection = connection;
30-
return this;
31-
}
32-
33-
public SQLTableRepositoryBuilder<T, ID> withTypeClass(Class<T> typeClass) {
34-
info.setTypeClass(typeClass);
35-
return this;
36-
}
37-
38-
public SQLTableRepositoryBuilder<T, ID> withIdClass(Class<ID> idClass) {
39-
info.setIdClass(idClass);
40-
return this;
41-
}
42-
43-
public SQLTableRepositoryBuilder<T, ID> withTableName(String tableName) {
44-
info.setTableName(tableName);
45-
return this;
46-
}
47-
48-
public SQLTableRepositoryBuilder<T, ID> withDefs(String... defs) {
49-
info.setDefs(defs);
50-
return this;
51-
}
52-
53-
public SQLTableRepository<T, ID> build() {
54-
return build(info -> new SQLTableRepository<>(connection, info));
15+
@RequiredArgsConstructor
16+
final class ObjectTableConverter {
17+
18+
private final SQLDatabaseConnection connection;
19+
private final String tableName;
20+
private final Class<?> typeClass;
21+
private static final Class<?>[] supportedTypes = new Class<?>[] {
22+
Integer.class,
23+
Long.class,
24+
Float.class,
25+
Double.class,
26+
String.class
27+
};
28+
29+
public String buildTableQuery() {
30+
return String.format("CREATE TABLE IF NOT EXISTS %s(%s);", tableName, String.join(", ", buildDefsFromType()));
5531
}
5632

57-
public CachingSQLTableRepository<T, ID> buildCaching() {
58-
return build(info -> new CachingSQLTableRepository<>(connection, info));
59-
}
60-
61-
public <R extends SQLTableRepository<T, ID>> R build(RepoFactory<T, ID, R> factory) {
62-
if(info.getDefs() == null)
63-
buildDefsFromType();
64-
65-
return factory.create(info);
66-
}
67-
68-
private void buildDefsFromType() {
69-
Objects.requireNonNull(info.getTypeClass(), "Type class must be set before building repository!");
33+
public String[] buildDefsFromType() {
34+
Objects.requireNonNull(typeClass, "Type class must be set before building repository!");
7035

7136
if(!(connection instanceof SQLDatabaseConnectionImpl)) {
7237
throw new IllegalStateException("We can build defs only from SQLDatabaseConnectionImpl child-classes.");
7338
}
74-
debug("Building defs from type class: " + info.getTypeClass().getName());
39+
debug("Building defs from type class: " + typeClass.getName());
7540

7641
SQLDatabaseOptions options = ((SQLDatabaseConnectionImpl) connection).getOptions();
7742
String[] defs = new String[0];
7843

79-
for (Field field : info.getTypeClass().getDeclaredFields()) {
44+
for (Field field : typeClass.getDeclaredFields()) {
8045
debug("Building def for field: " + field.getName() + " (" + field.getType().getName() + ")");
8146
if(Modifier.isTransient(field.getModifiers())) {
8247
debug(String.format("Field %s is transient, skipping.", field.getName()));
@@ -97,32 +62,14 @@ private void buildDefsFromType() {
9762
debug("Added def: " + colName + " " + colType);
9863
}
9964

100-
info.setDefs(defs);
10165
debug("Built defs: " + java.util.Arrays.toString(defs));
102-
}
10366

104-
private void debug(String message) {
105-
if(connection instanceof SQLDatabaseConnectionImpl && ((SQLDatabaseConnectionImpl) connection).getOptions().isDebug())
106-
((SQLDatabaseConnectionImpl) connection).debug(message);
67+
return defs;
10768
}
10869

10970
private String recognizeFieldTypeToDbType(Field field) {
110-
Class<?>[] supportedTypes = new Class<?>[] {
111-
Integer.class,
112-
Long.class,
113-
Float.class,
114-
Double.class,
115-
String.class
116-
};
11771
Class<?> fieldType = Primitives.wrap(field.getType());
118-
119-
boolean isSupported = false;
120-
for (Class<?> aClass : supportedTypes) {
121-
if(aClass.equals(fieldType)) {
122-
isSupported = true;
123-
break;
124-
}
125-
}
72+
boolean isSupported = isSupported(fieldType);
12673

12774
if(field.isAnnotationPresent(JsonField.class) && !isSupported) {
12875
return "TEXT";
@@ -153,12 +100,22 @@ private String recognizeFieldTypeToDbType(Field field) {
153100
return dbType;
154101
}
155102

103+
private void debug(String message) {
104+
if(connection instanceof SQLDatabaseConnectionImpl && ((SQLDatabaseConnectionImpl) connection).getOptions().isDebug())
105+
((SQLDatabaseConnectionImpl) connection).debug(message);
106+
}
107+
156108
private boolean isSQLite() {
157109
return connection instanceof SQLiteDatabaseConnectionImpl;
158110
}
159111

160-
public interface RepoFactory<T, ID, R extends SQLTableRepository<T, ID>> {
161-
R create(SQLTableRepository.RepositoryInfo<T, ID> info);
112+
public static boolean isSupported(Class<?> type) {
113+
for (Class<?> aClass : supportedTypes) {
114+
if(aClass.equals(type)) {
115+
return true;
116+
}
117+
}
118+
return false;
162119
}
163120

164121
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import me.zort.sqllib.api.mapping.StatementMappingOptions;
1010
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
1111
import me.zort.sqllib.internal.query.*;
12-
import org.jetbrains.annotations.ApiStatus;
1312
import org.jetbrains.annotations.NotNull;
1413
import org.jetbrains.annotations.Nullable;
1514

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import me.zort.sqllib.api.mapping.StatementMappingResultAdapter;
1414
import me.zort.sqllib.api.mapping.StatementMappingStrategy;
1515
import me.zort.sqllib.api.options.NamingStrategy;
16-
import me.zort.sqllib.api.repository.SQLTableRepository;
1716
import me.zort.sqllib.internal.Defaults;
1817
import me.zort.sqllib.internal.annotation.JsonField;
1918
import me.zort.sqllib.internal.factory.SQLConnectionFactory;
@@ -223,12 +222,10 @@ public final <T> T createGate(final @NotNull Class<T> mappingInterface, final @N
223222
public final boolean buildEntitySchema(final @NotNull String tableName, final @NotNull Class<?> entityClass) {
224223
Objects.requireNonNull(entityClass, "Entity class cannot be null!");
225224

226-
SQLTableRepository repository = new SQLTableRepositoryBuilder()
227-
.withConnection(this)
228-
.withTableName(tableName)
229-
.withTypeClass(entityClass)
230-
.build();
231-
return repository.createTable();
225+
ObjectTableConverter converter = new ObjectTableConverter(this, tableName, entityClass);
226+
String query = converter.buildTableQuery();
227+
228+
return exec(() -> query).isSuccessful();
232229
}
233230

234231
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public final class SQLDatabaseOptions {
2525
*
2626
* @param connection The connection to load options from.
2727
*/
28+
@SuppressWarnings("unused")
2829
public void load(final @NotNull SQLDatabaseConnectionImpl connection) {
2930
SQLDatabaseOptions options = connection.getOptions();
3031
this.autoReconnect = options.autoReconnect;

core/src/main/java/me/zort/sqllib/api/repository/CachingSQLTableRepository.java

Lines changed: 0 additions & 56 deletions
This file was deleted.

core/src/main/java/me/zort/sqllib/api/repository/SQLTableRepository.java

Lines changed: 0 additions & 92 deletions
This file was deleted.

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import lombok.extern.log4j.Log4j2;
55
import me.zort.sqllib.SQLConnectionBuilder;
66
import me.zort.sqllib.SQLDatabaseConnectionImpl;
7+
import me.zort.sqllib.internal.annotation.NullableField;
8+
import me.zort.sqllib.internal.annotation.PrimaryKey;
79
import me.zort.sqllib.pool.SQLConnectionPool;
810
import me.zort.sqllib.SQLDatabaseConnection;
911
import me.zort.sqllib.SQLDatabaseOptions;
@@ -67,7 +69,8 @@ public void prepare() {
6769

6870
System.out.println("Connection established, preparing tables...");
6971

70-
assertNull(connection.exec(() -> "CREATE TABLE IF NOT EXISTS users (nickname VARCHAR(64) PRIMARY KEY NOT NULL, points INT NOT NULL);").getRejectMessage());
72+
assertTrue(connection.buildEntitySchema("users", User.class));
73+
//assertNull(connection.exec(() -> "CREATE TABLE IF NOT EXISTS users (nickname VARCHAR(64) PRIMARY KEY NOT NULL, points INT NOT NULL);").getRejectMessage());
7174
assertNull(connection.exec(() -> "TRUNCATE TABLE users;").getRejectMessage());
7275

7376
System.out.println("Tables prepared, test cases ready");
@@ -194,7 +197,10 @@ public void test7_Close() {
194197

195198
@AllArgsConstructor
196199
private static class User {
200+
@PrimaryKey
201+
@NullableField(nullable = false)
197202
private final String nickname;
203+
@NullableField(nullable = false)
198204
private final int points;
199205

200206
public String getNickname() {

0 commit comments

Comments
 (0)