Skip to content

Commit 74478eb

Browse files
committed
Experimental: Native queries mapping for gates
1 parent 879d1a4 commit 74478eb

6 files changed

Lines changed: 108 additions & 5 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +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.data.QueryRowsResult;
67
import me.zort.sqllib.api.mapping.StatementMappingStrategy;
78
import me.zort.sqllib.api.data.QueryResult;
89
import me.zort.sqllib.internal.query.QueryNode;
@@ -54,6 +55,11 @@ public QueryResult executeQuery(Method method, Object[] args, @Nullable Class<?>
5455
}
5556

5657
QueryNode<?> node = wrappedAnnotation.getQueryBuilder().build(connection, queryAnnotation, method, parameters);
58+
59+
if (mapTo != null && wrappedAnnotation.isProducesResult() && QueryRowsResult.class.isAssignableFrom(mapTo)) {
60+
return ((SQLDatabaseConnection) connection).query(node);
61+
}
62+
5763
if (wrappedAnnotation.isProducesResult() && node instanceof QueryNodeRequest) {
5864
return mapTo != null
5965
? ((SQLDatabaseConnection) connection).query(node, mapTo)

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import me.zort.sqllib.api.SQLConnection;
77
import me.zort.sqllib.internal.query.QueryNode;
88
import me.zort.sqllib.mapping.annotation.*;
9-
import me.zort.sqllib.mapping.builder.DeleteQueryBuilder;
10-
import me.zort.sqllib.mapping.builder.InsertQueryBuilder;
11-
import me.zort.sqllib.mapping.builder.SaveQueryBuilder;
12-
import me.zort.sqllib.mapping.builder.SelectQueryBuilder;
9+
import me.zort.sqllib.mapping.builder.*;
1310
import me.zort.sqllib.mapping.exception.SQLMappingException;
1411
import me.zort.sqllib.util.ParameterPair;
1512
import org.jetbrains.annotations.Nullable;
@@ -42,7 +39,8 @@ public class QueryAnnotation {
4239
QUERY_ANNOT.put(Delete.class, new QueryAnnotation(false, new DeleteQueryBuilder()));
4340
QUERY_ANNOT.put(Save.class, new QueryAnnotation(false, new SaveQueryBuilder()));
4441
QUERY_ANNOT.put(Insert.class, new QueryAnnotation(false, new InsertQueryBuilder()));
45-
// TODO: Populate
42+
QUERY_ANNOT.put(Query.class, new QueryAnnotation(true, new NativeQueryBuilder()));
43+
QUERY_ANNOT.put(Exec.class, new QueryAnnotation(false, new NativeQueryBuilder()));
4644
}
4745

4846
@Nullable
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.METHOD)
10+
public @interface Exec { // Does not produce result
11+
12+
String value();
13+
String[] params() default {};
14+
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.METHOD)
10+
public @interface Query { // Produces result
11+
12+
String value();
13+
String[] params() default {};
14+
15+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package me.zort.sqllib.mapping.builder;
2+
3+
import me.zort.sqllib.api.SQLConnection;
4+
import me.zort.sqllib.internal.query.QueryDetails;
5+
import me.zort.sqllib.internal.query.QueryNode;
6+
import me.zort.sqllib.internal.query.QueryPriority;
7+
import me.zort.sqllib.mapping.PlaceholderMapper;
8+
import me.zort.sqllib.mapping.QueryAnnotation;
9+
import me.zort.sqllib.mapping.annotation.Exec;
10+
import me.zort.sqllib.mapping.annotation.Query;
11+
import me.zort.sqllib.util.ParameterPair;
12+
13+
import java.lang.annotation.Annotation;
14+
import java.lang.reflect.Method;
15+
import java.util.ArrayList;
16+
import java.util.HashMap;
17+
import java.util.Map;
18+
19+
public class NativeQueryBuilder implements QueryAnnotation.QueryBuilder<Annotation> {
20+
@Override
21+
public QueryNode<?> build(SQLConnection connection, Annotation queryAnnotation, Method method, ParameterPair[] parameters) {
22+
PlaceholderMapper mapper = new PlaceholderMapper(parameters);
23+
return new QueryNode<QueryNode<?>>(null, new ArrayList<>(), QueryPriority.GENERAL) {
24+
private int currPhIndex = 0;
25+
@Override
26+
public QueryDetails buildQueryDetails() {
27+
String annotValue;
28+
String[] annotParams;
29+
30+
if (queryAnnotation instanceof Query) {
31+
annotValue = ((Query) queryAnnotation).value();
32+
annotParams = ((Query) queryAnnotation).params();
33+
} else if(queryAnnotation instanceof Exec) {
34+
annotValue = ((Exec) queryAnnotation).value();
35+
annotParams = ((Exec) queryAnnotation).params();
36+
} else {
37+
throw new IllegalArgumentException(String.format("NativeQueryBuilder does not support %s annotation!", queryAnnotation.getClass().getName()));
38+
}
39+
40+
annotValue = mapper.assignValues(annotValue);
41+
42+
Map<String, Object> params = new HashMap<>();
43+
for (String param : annotParams) {
44+
param = mapper.assignValues(param);
45+
int index = annotValue.indexOf("?");
46+
if (index == -1)
47+
break;
48+
49+
String placeholder = nextPlaceholder();
50+
annotValue = annotValue.replaceFirst("\\?", "<" + placeholder + ">");
51+
params.put(placeholder, param);
52+
}
53+
return new QueryDetails(annotValue, params);
54+
}
55+
56+
private String nextPlaceholder() {
57+
return "nq_" + currPhIndex++;
58+
}
59+
};
60+
}
61+
62+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import me.zort.sqllib.SQLDatabaseConnection;
77
import me.zort.sqllib.SQLDatabaseOptions;
88
import me.zort.sqllib.api.data.QueryResult;
9+
import me.zort.sqllib.api.data.QueryRowsResult;
10+
import me.zort.sqllib.api.data.Row;
911
import me.zort.sqllib.mapping.annotation.*;
1012
import org.junit.jupiter.api.*;
1113
import org.junit.jupiter.api.condition.EnabledOnOs;
@@ -54,6 +56,8 @@ public void test1_Mapping() {
5456
assertNull(repository.insertNew("User4", 800).getRejectMessage());
5557
assertTrue(repository.selectOne("User4").isPresent());
5658
assertFalse(repository.selectAll().isEmpty());
59+
assertNotEquals(0L, repository.count().get(0).get("COUNT(*)"));
60+
5761
assertNull(repository.deleteAll().getRejectMessage());
5862
assertTrue(repository.selectAll().isEmpty());
5963
}
@@ -86,6 +90,9 @@ public interface DatabaseRepository {
8690

8791
@Delete
8892
QueryResult deleteAll();
93+
94+
@Query("SELECT COUNT(*) FROM users;")
95+
QueryRowsResult<Row> count();
8996
}
9097

9198
@AllArgsConstructor

0 commit comments

Comments
 (0)