Skip to content

Commit 6e2225c

Browse files
committed
Experimental: Proxy mapping
1 parent 2dd5293 commit 6e2225c

16 files changed

Lines changed: 131 additions & 34 deletions

api/src/main/java/me/zort/sqllib/api/StatementMappingFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package me.zort.sqllib.api;
22

33
/**
4-
* The StatementMappingFactory is responsible for creating new StatementMapping
4+
* The StatementMappingFactory is responsible for creating new {@link StatementMappingStrategy}
55
* for defined interfaces.
66
*
77
* @author ZorTik
@@ -17,6 +17,6 @@ public interface StatementMappingFactory {
1717
* @return The StatementMapping.
1818
* @param <T> The interface class type.
1919
*/
20-
<T> StatementMapping<T> create(Class<T> interfaceClass, SQLConnection connection);
20+
<T> StatementMappingStrategy<T> create(Class<T> interfaceClass, SQLConnection connection);
2121

2222
}

api/src/main/java/me/zort/sqllib/api/StatementMappingResultAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
/**
88
* Result adapter used for handling operations between {@link SQLConnection}
9-
* and {@link StatementMapping}.
9+
* and {@link StatementMappingStrategy}.
1010
*
1111
* @author ZorTik
1212
*/
1313
public interface StatementMappingResultAdapter {
1414

1515
/**
16-
* Adapts invoked {@link StatementMapping} method QueryResult to
16+
* Adapts invoked {@link StatementMappingStrategy} method QueryResult to
1717
* the final result that can be passed to proxy instance.
1818
*
1919
* @param method The invoked proxy method.

api/src/main/java/me/zort/sqllib/api/StatementMapping.java renamed to api/src/main/java/me/zort/sqllib/api/StatementMappingStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* @param <T> The type of the proxy instance.
1313
* @author ZorTik
1414
*/
15-
public interface StatementMapping<T> {
15+
public interface StatementMappingStrategy<T> {
1616

1717
/**
1818
* Executes query based on invoked method with invoked args from

api/src/main/java/me/zort/sqllib/api/data/QueryResult.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
import org.jetbrains.annotations.Nullable;
44

5+
/**
6+
* Represents a query result.
7+
*
8+
* @author ZorTik
9+
*/
510
public interface QueryResult {
611

712
boolean isSuccessful();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void setObjectMapper(@NotNull ObjectMapper objectMapper) {
128128
@SuppressWarnings("unchecked")
129129
@ApiStatus.Experimental
130130
public <T> T createMapping(Class<T> mappingInterface) {
131-
StatementMapping<T> statementMapping = mappingFactory.create(mappingInterface, this);
131+
StatementMappingStrategy<T> statementMapping = mappingFactory.create(mappingInterface, this);
132132
return (T) Proxy.newProxyInstance(mappingInterface.getClassLoader(),
133133
new Class[]{mappingInterface}, (proxy, method, args) -> {
134134

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import me.zort.sqllib.SQLDatabaseConnection;
55
import me.zort.sqllib.api.SQLConnection;
6-
import me.zort.sqllib.api.StatementMapping;
6+
import me.zort.sqllib.api.StatementMappingStrategy;
77
import me.zort.sqllib.api.data.QueryResult;
88
import me.zort.sqllib.internal.query.QueryNode;
99
import me.zort.sqllib.internal.query.QueryNodeRequest;
@@ -15,8 +15,15 @@
1515
import java.lang.reflect.Method;
1616
import java.lang.reflect.Parameter;
1717

18+
/**
19+
* This mapping strategy uses annotations from me.zort.sqllib.mapping.annotation
20+
* to build queries. It is the default mapping strategy.
21+
*
22+
* @param <T> The type of the proxy instance.
23+
* @author ZorTik
24+
*/
1825
@RequiredArgsConstructor
19-
public class DefaultStatementMapping<T> implements StatementMapping<T> {
26+
public class DefaultStatementMapping<T> implements StatementMappingStrategy<T> {
2027

2128
private final SQLConnection connection;
2229

@@ -65,4 +72,5 @@ public boolean isMappingMethod(Method method) {
6572
}
6673
return false;
6774
}
75+
6876
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package me.zort.sqllib.mapping;
22

33
import me.zort.sqllib.api.SQLConnection;
4-
import me.zort.sqllib.api.StatementMapping;
4+
import me.zort.sqllib.api.StatementMappingStrategy;
55
import me.zort.sqllib.api.StatementMappingFactory;
66

77
import java.lang.reflect.Modifier;
88

99
public class DefaultStatementMappingFactory implements StatementMappingFactory {
1010
@Override
11-
public <T> StatementMapping<T> create(Class<T> interfaceClass, SQLConnection connection) {
11+
public <T> StatementMappingStrategy<T> create(Class<T> interfaceClass, SQLConnection connection) {
1212
if (!interfaceClass.isInterface() || !Modifier.isAbstract(interfaceClass.getModifiers()))
1313
throw new IllegalArgumentException("The given class is not an interface or is not abstract");
1414
return new DefaultStatementMapping<>(connection);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package me.zort.sqllib.mapping;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import me.zort.sqllib.mapping.annotation.Placeholder;
5+
import me.zort.sqllib.util.ParameterPair;
6+
import me.zort.sqllib.util.Regex;
7+
8+
import java.util.regex.Matcher;
9+
import java.util.regex.Pattern;
10+
11+
@RequiredArgsConstructor
12+
public class PlaceholderMapper {
13+
14+
private final ParameterPair[] parameters;
15+
private final Pattern pattern = Pattern.compile("\\{[a-zA-Z0-9]+}");
16+
17+
public String assignValues(String input) {
18+
Matcher matcher = pattern.matcher(input);
19+
while(matcher.find()) {
20+
String placeholder = matcher.group();
21+
String placeholderName = placeholder.substring(1, placeholder.length() - 1);
22+
for (ParameterPair pair : parameters) {
23+
if (!pair.getParameter().isAnnotationPresent(Placeholder.class))
24+
continue;
25+
26+
if (placeholderName.equals(pair.getParameter().getAnnotation(Placeholder.class).value())) {
27+
input = input.replaceAll(Regex.skipRegexCharacters(placeholder), String.valueOf(pair.getValue()));
28+
}
29+
}
30+
}
31+
32+
return input;
33+
}
34+
35+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ public interface QueryBuilder<T extends Annotation> {
6363
}
6464

6565
public static class Validator {
66-
public static void requireTableDefinition(Method method) {
67-
if (Table.Util.getFromContext(method) == null)
66+
public static void requireTableDefinition(Method method, PlaceholderMapper placeholderMapper) {
67+
if (Table.Util.getFromContext(method, placeholderMapper) == null)
6868
throw new SQLMappingException("Method " + method.getName() + " requires @Table annotation", method, null);
6969
}
7070
public static void requireWhereDefinition(Method method) {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package me.zort.sqllib.mapping.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
* Defines a value to be declared to placeholder on some mapping
10+
* annotations in a default proxy mapping.
11+
*
12+
* @author ZorTik
13+
*/
14+
@Retention(RetentionPolicy.RUNTIME)
15+
@Target(ElementType.PARAMETER)
16+
public @interface Placeholder {
17+
18+
// The placeholder, without brackets
19+
String value();
20+
21+
}

0 commit comments

Comments
 (0)