Skip to content

Commit ecd336b

Browse files
committed
Experimental: Gates
1 parent f4d81db commit ecd336b

9 files changed

Lines changed: 69 additions & 17 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public final <T> T createGate(Class<T> mappingInterface) {
170170
return mappingResultAdapter.adaptResult(method, result);
171171
}
172172

173-
return method.invoke(this, args);
173+
throw new UnsupportedOperationException("Method " + method.getName() + " is not supported by this mapping repository!");
174174
});
175175
}
176176

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import me.zort.sqllib.internal.query.QueryNode;
88
import me.zort.sqllib.mapping.annotation.*;
99
import me.zort.sqllib.mapping.builder.DeleteQueryBuilder;
10+
import me.zort.sqllib.mapping.builder.InsertQueryBuilder;
1011
import me.zort.sqllib.mapping.builder.SaveQueryBuilder;
1112
import me.zort.sqllib.mapping.builder.SelectQueryBuilder;
1213
import me.zort.sqllib.mapping.exception.SQLMappingException;
@@ -40,6 +41,7 @@ public class QueryAnnotation {
4041
QUERY_ANNOT.put(Select.class, new QueryAnnotation(true, new SelectQueryBuilder()));
4142
QUERY_ANNOT.put(Delete.class, new QueryAnnotation(false, new DeleteQueryBuilder()));
4243
QUERY_ANNOT.put(Save.class, new QueryAnnotation(false, new SaveQueryBuilder()));
44+
QUERY_ANNOT.put(Insert.class, new QueryAnnotation(false, new InsertQueryBuilder()));
4345
// TODO: Populate
4446
}
4547

@@ -66,10 +68,6 @@ public interface QueryBuilder<T extends Annotation> {
6668
}
6769

6870
public static class Validator {
69-
public static void requireTableDefinition(Method method, PlaceholderMapper placeholderMapper) {
70-
if (Table.Util.getFromContext(method, placeholderMapper) == null)
71-
throw new SQLMappingException("Method " + method.getName() + " requires @Table annotation", method, null);
72-
}
7371
public static void requireWhereDefinition(Method method) {
7472
if (!method.isAnnotationPresent(Where.class))
7573
throw new SQLMappingException("Method " + method.getName() + " requires @Where annotation", method, null);
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 Insert {
11+
12+
String[] cols();
13+
String[] vals();
14+
15+
}

core/src/main/java/me/zort/sqllib/mapping/annotation/Table.java

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

33
import me.zort.sqllib.mapping.PlaceholderMapper;
4+
import me.zort.sqllib.mapping.QueryAnnotation;
5+
import me.zort.sqllib.mapping.exception.SQLMappingException;
6+
import me.zort.sqllib.util.ParameterPair;
47
import org.jetbrains.annotations.Nullable;
58

69
import java.lang.annotation.ElementType;
@@ -16,13 +19,14 @@
1619

1720
class Util {
1821
@Nullable
19-
public static String getFromContext(Method method, PlaceholderMapper mapper) {
22+
public static String getFromContext(Method method, ParameterPair[] parameters) {
23+
PlaceholderMapper mapper = new PlaceholderMapper(parameters);
2024
if (method.isAnnotationPresent(Table.class)) {
2125
return mapper.assignValues(method.getAnnotation(Table.class).value());
2226
} else if(method.getDeclaringClass().isAnnotationPresent(Table.class)) {
2327
return mapper.assignValues(method.getDeclaringClass().getAnnotation(Table.class).value());
2428
} else {
25-
return null;
29+
throw new SQLMappingException("Method " + method.getName() + " requires @Table annotation", method, null);
2630
}
2731
}
2832
}

core/src/main/java/me/zort/sqllib/mapping/builder/DeleteQueryBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ public class DeleteQueryBuilder implements QueryAnnotation.QueryBuilder<Delete>
1919
@Override
2020
public QueryNode<?> build(SQLConnection connection, Delete queryAnnotation, Method method, ParameterPair[] parameters) {
2121
PlaceholderMapper placeholderMapper = new PlaceholderMapper(parameters);
22-
QueryAnnotation.Validator.requireTableDefinition(method, placeholderMapper);
23-
String table = Table.Util.getFromContext(method, placeholderMapper);
22+
String table = Table.Util.getFromContext(method, parameters);
2423

2524
QueryNode<?> node = new DeleteQuery(null, table);
2625
if (method.isAnnotationPresent(Where.class)) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package me.zort.sqllib.mapping.builder;
2+
3+
import me.zort.sqllib.SQLDatabaseConnection;
4+
import me.zort.sqllib.api.SQLConnection;
5+
import me.zort.sqllib.internal.query.InsertQuery;
6+
import me.zort.sqllib.internal.query.QueryNode;
7+
import me.zort.sqllib.mapping.PlaceholderMapper;
8+
import me.zort.sqllib.mapping.QueryAnnotation;
9+
import me.zort.sqllib.mapping.annotation.Insert;
10+
import me.zort.sqllib.mapping.annotation.Table;
11+
import me.zort.sqllib.util.ParameterPair;
12+
13+
import java.lang.reflect.Method;
14+
15+
public class InsertQueryBuilder implements QueryAnnotation.QueryBuilder<Insert> {
16+
@Override
17+
public QueryNode<?> build(SQLConnection connection, Insert queryAnnotation, Method method, ParameterPair[] parameters) {
18+
if (!(connection instanceof SQLDatabaseConnection))
19+
throw new IllegalArgumentException("The connection must be a SQLDatabaseConnection");
20+
21+
String table = Table.Util.getFromContext(method, parameters);
22+
InsertQuery query = ((SQLDatabaseConnection) connection).insert();
23+
query.into(table, queryAnnotation.cols());
24+
25+
PlaceholderMapper mapper = new PlaceholderMapper(parameters);
26+
27+
String[] vals = queryAnnotation.vals();
28+
for (int i = 0; i < vals.length; i++) {
29+
vals[i] = mapper.assignValues(vals[i]);
30+
}
31+
32+
query.values((Object[]) vals);
33+
return query;
34+
}
35+
}

core/src/main/java/me/zort/sqllib/mapping/builder/SaveQueryBuilder.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import me.zort.sqllib.api.SQLConnection;
66
import me.zort.sqllib.internal.query.QueryNode;
77
import me.zort.sqllib.internal.query.UpsertQuery;
8-
import me.zort.sqllib.mapping.PlaceholderMapper;
98
import me.zort.sqllib.mapping.QueryAnnotation;
109
import me.zort.sqllib.mapping.annotation.Save;
1110
import me.zort.sqllib.mapping.annotation.Table;
@@ -19,9 +18,7 @@ public QueryNode<?> build(SQLConnection connection, Save queryAnnotation, Method
1918
if (!(connection instanceof SQLDatabaseConnectionImpl))
2019
throw new IllegalArgumentException("The connection must be an instance of SQLDatabaseConnectionImpl");
2120

22-
PlaceholderMapper placeholderMapper = new PlaceholderMapper(parameters);
23-
QueryAnnotation.Validator.requireTableDefinition(method, placeholderMapper);
24-
String table = Table.Util.getFromContext(method, placeholderMapper);
21+
String table = Table.Util.getFromContext(method, parameters);
2522

2623
UpsertQuery query = ((SQLDatabaseConnectionImpl) connection).save(getSaveableObject(parameters));
2724
query.table(table);

core/src/main/java/me/zort/sqllib/mapping/builder/SelectQueryBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ public class SelectQueryBuilder implements QueryAnnotation.QueryBuilder<Select>
2121
@Override
2222
public QueryNode<?> build(SQLConnection connection, Select queryAnnotation, Method method, ParameterPair[] parameters) {
2323
PlaceholderMapper placeholderMapper = new PlaceholderMapper(parameters);
24-
QueryAnnotation.Validator.requireTableDefinition(method, placeholderMapper);
25-
String table = Table.Util.getFromContext(method, placeholderMapper);
24+
String table = Table.Util.getFromContext(method, parameters);
2625

2726
QueryNode<?> node = new SelectQuery(null, table, queryAnnotation.value().equals("*")
2827
? new ArrayList<>() : Arrays.asList(queryAnnotation.value().replaceAll(" ", "").split(",")));

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ public void prepare() {
4848
@Timeout(10)
4949
@Test
5050
public void test1_Mapping() {
51-
assertNull(connection.save("users", new User("User1", 1000)).getRejectMessage());
52-
5351
DatabaseRepository repository = connection.createGate(DatabaseRepository.class);
52+
assertNull(repository.save(new User("User1", 1000)).getRejectMessage());
5453
assertTrue(repository.selectOne("User1").isPresent());
54+
assertNull(repository.insertNew("User4", 800).getRejectMessage());
55+
assertTrue(repository.selectOne("User4").isPresent());
5556
assertFalse(repository.selectAll().isEmpty());
5657
assertNull(repository.deleteAll().getRejectMessage());
58+
assertTrue(repository.selectAll().isEmpty());
5759
}
5860

5961
@Timeout(5)
@@ -68,6 +70,9 @@ public interface DatabaseRepository {
6870
@Save // Upsert
6971
QueryResult save(User user);
7072

73+
@Insert(cols = {"nickname", "points"}, vals = {"{nickname}", "{points}"})
74+
QueryResult insertNew(@Placeholder("nickname") String nickname, @Placeholder("points") int points);
75+
7176
@Select
7277
@Where(value = {
7378
@Where.Condition(column = "nickname", value = "{nickname}"),

0 commit comments

Comments
 (0)