Skip to content

Commit 2dd5293

Browse files
committed
Experimental: Proxy mapping
1 parent 06eae44 commit 2dd5293

5 files changed

Lines changed: 49 additions & 13 deletions

File tree

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ public SQLDatabaseConnectionImpl(SQLConnectionFactory connectionFactory, @Nullab
7676
super(connectionFactory);
7777

7878
if (options == null)
79-
options = new SQLDatabaseOptions(
80-
DEFAULT_AUTO_RECONNECT,
79+
options = new SQLDatabaseOptions(DEFAULT_AUTO_RECONNECT,
8180
DEFAULT_DEBUG,
8281
DEFAULT_LOG_SQL_ERRORS,
8382
DEFAULT_NAMING_STRATEGY,
@@ -94,16 +93,38 @@ public SQLDatabaseConnectionImpl(SQLConnectionFactory connectionFactory, @Nullab
9493
registerBackupValueResolver(new ConstructorParameterResolver());
9594
}
9695

96+
/**
97+
* Registers a backup value resolver to the registry.
98+
* Backup value resolvers are used when no value is found for mapped
99+
* field in {@link ObjectMapper}.
100+
*
101+
* @param resolver Resolver to register.
102+
*/
97103
public void registerBackupValueResolver(@NotNull ObjectMapper.FieldValueResolver resolver) {
98104
Objects.requireNonNull(resolver, "Resolver cannot be null!");
99105

100106
objectMapper.registerBackupValueResolver(resolver);
101107
}
102108

109+
/**
110+
* Sets the object mapper to use.
111+
* Object mapper maps queries to objects, as specified in {@link SQLDatabaseConnection#query(Query, Class)}.
112+
*
113+
* @param objectMapper Object mapper to use.
114+
*/
103115
public void setObjectMapper(@NotNull ObjectMapper objectMapper) {
104116
this.objectMapper = Objects.requireNonNull(objectMapper, "Object mapper cannot be null!");
105117
}
106118

119+
/**
120+
* Constructs a mapping repository based on provided interface.
121+
* The interface should follow rules for creating mapping repositories
122+
* in this library.
123+
*
124+
* @param mappingInterface Interface to create mapping repository for.
125+
* @return Mapping repository.
126+
* @param <T> Type of mapping repository.
127+
*/
107128
@SuppressWarnings("unchecked")
108129
@ApiStatus.Experimental
109130
public <T> T createMapping(Class<T> mappingInterface) {

core/src/main/java/me/zort/sqllib/internal/impl/DefaultObjectMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,15 @@ public <T> T assignValues(Row row, Class<T> typeClass) {
8787
private Object buildElementValue(AnnotatedElement element, Row row) {
8888
String name;
8989
Type type;
90+
Class<?> declaringClass;
9091
if(element instanceof Field) {
9192
name = ((Field) element).getName();
9293
type = ((Field) element).getGenericType();
93-
} else if(element instanceof Parameter) { // TODO: Parameter names are arg[a-zA-Z0-9]+, use different strategy.
94+
declaringClass = ((Field) element).getDeclaringClass();
95+
} else if(element instanceof Parameter) {
9496
name = ((Parameter) element).getName();
9597
type = ((Parameter) element).getType();
98+
declaringClass = ((Parameter) element).getDeclaringExecutable().getDeclaringClass();
9699
} else {
97100
return null;
98101
}
@@ -109,7 +112,7 @@ private Object buildElementValue(AnnotatedElement element, Row row) {
109112
}
110113
}
111114

112-
debug(String.format("Cannot find column for target %s (%s)", name, converted));
115+
debug(String.format("Cannot find column for class %s target %s (%s)", declaringClass.getName(), name, converted));
113116
return null;
114117
}
115118
}

core/src/main/java/me/zort/sqllib/internal/query/QueryNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
public abstract class QueryNode<P extends QueryNode<?>> implements Query, StatementFactory<PreparedStatement> {
2121

2222
@Getter(onMethod_ = {@Nullable})
23-
private final P parent;
23+
private final transient P parent;
2424
private final List<QueryNode<?>> children;
2525
private final int priority;
2626
private final Map<String, QueryDetails> details;

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,21 @@
55
import me.zort.sqllib.api.data.QueryRowsResult;
66

77
import java.lang.reflect.Method;
8-
import java.lang.reflect.TypeVariable;
8+
import java.lang.reflect.ParameterizedType;
9+
import java.lang.reflect.Type;
910
import java.util.List;
1011
import java.util.Optional;
1112

1213
public class DefaultResultAdapter implements StatementMappingResultAdapter {
1314
@Override
1415
public Object adaptResult(Method method, QueryResult result) {
1516
Class<?> returnType = method.getReturnType();
16-
if (isVoid(returnType) || !(result instanceof QueryRowsResult))
17+
18+
if(returnType.equals(QueryResult.class)) {
19+
return result;
20+
} else if (isVoid(returnType) || !(result instanceof QueryRowsResult)) {
1721
return null;
22+
}
1823

1924
QueryRowsResult<?> rows = (QueryRowsResult<?>) result;
2025

@@ -34,16 +39,17 @@ public Object adaptResult(Method method, QueryResult result) {
3439
public Class<?> retrieveResultType(Method method) {
3540
Class<?> returnType = method.getReturnType();
3641
if (returnType.equals(Optional.class) || returnType.equals(List.class)) {
37-
return getGenericArgument(returnType, true);
42+
return getGenericArgument(returnType, method.getGenericReturnType(), true);
3843
} else if (isVoid(returnType)) {
3944
return null;
4045
} else {
4146
return returnType;
4247
}
4348
}
4449

45-
private static Class<?> getGenericArgument(Class<?> clazz, boolean throwNotFound) {
46-
TypeVariable<? extends Class<?>>[] typeParameters = clazz.getTypeParameters();
50+
// List<T>
51+
private static Class<?> getGenericArgument(Class<?> clazz, Type genericType, boolean throwNotFound) {
52+
Type[] typeParameters = ((ParameterizedType) genericType).getActualTypeArguments();
4753
if (typeParameters.length < 1) {
4854
if (throwNotFound) {
4955
throw new IllegalArgumentException("The given class does not have a generic argument");
@@ -52,7 +58,12 @@ private static Class<?> getGenericArgument(Class<?> clazz, boolean throwNotFound
5258
} // For simplicity, return itself to be mapped.
5359
}
5460

55-
return typeParameters[0].getGenericDeclaration(); // TODO: Test
61+
try {
62+
return Class.forName(typeParameters[0].getTypeName());
63+
} catch (ClassNotFoundException e) {
64+
e.printStackTrace();
65+
return clazz;
66+
}
5667
}
5768

5869
private static boolean isVoid(Class<?> type) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public void prepare() {
5151
@Timeout(10)
5252
@Test
5353
public void test1_Mapping() {
54+
assertNull(connection.save("users", new User("User1", 1000)).getRejectMessage());
55+
5456
DatabaseRepository repository = connection.createMapping(DatabaseRepository.class);
5557
// TODO: Insert
5658
assertTrue(repository.selectOne().isPresent());
@@ -63,15 +65,14 @@ public void test2_Close() {
6365
connection.disconnect();
6466
}
6567

68+
@Table("users")
6669
public interface DatabaseRepository {
6770

6871
@Select
69-
@Table("users")
7072
@Limit(1)
7173
Optional<User> selectOne();
7274

7375
@Delete
74-
@Table("users")
7576
QueryResult deleteAll();
7677
}
7778

0 commit comments

Comments
 (0)