Skip to content

Commit 365f2c6

Browse files
committed
NativeQueryBuilder now properly executes ResultSetAware queries.
1 parent 5fae8ff commit 365f2c6

1 file changed

Lines changed: 47 additions & 33 deletions

File tree

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

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import me.zort.sqllib.internal.query.QueryDetails;
77
import me.zort.sqllib.internal.query.QueryNode;
88
import me.zort.sqllib.internal.query.QueryPriority;
9+
import me.zort.sqllib.internal.query.ResultSetAware;
910
import me.zort.sqllib.mapping.PlaceholderMapper;
1011
import me.zort.sqllib.mapping.QueryAnnotation;
1112
import me.zort.sqllib.mapping.annotation.Exec;
@@ -17,60 +18,73 @@
1718
import java.util.ArrayList;
1819
import java.util.HashMap;
1920
import java.util.Map;
21+
import java.util.concurrent.atomic.AtomicInteger;
22+
import java.util.function.Supplier;
2023

2124
public class NativeQueryBuilder implements QueryAnnotation.QueryBuilder<Annotation> {
2225
@Override
2326
public QueryNode<?> build(QueryAnnotation.DefaultMappingDetails details, Annotation queryAnnotation, Method method, ParameterPair[] parameters) {
2427
SQLConnection connection = details.getConnection();
2528
PlaceholderMapper mapper = new PlaceholderMapper(parameters);
26-
return new LocalQueryNodeExecutive(connection) {
27-
private int currPhIndex = 0;
28-
@Override
29-
public QueryDetails buildQueryDetails() {
30-
String annotValue;
31-
String[] annotParams;
29+
AtomicInteger currPhIndex = new AtomicInteger(0);
30+
Supplier<String> nextPlaceholder = () -> "nq_" + currPhIndex.getAndIncrement();
31+
return buildNodeImpl(queryAnnotation, connection, () -> {
32+
String annotValue;
33+
String[] annotParams;
3234

33-
if (queryAnnotation instanceof Query) {
34-
annotValue = ((Query) queryAnnotation).value();
35-
annotParams = ((Query) queryAnnotation).params();
36-
} else if(queryAnnotation instanceof Exec) {
37-
annotValue = ((Exec) queryAnnotation).value();
38-
annotParams = ((Exec) queryAnnotation).params();
39-
} else {
40-
throw new IllegalArgumentException(String.format("NativeQueryBuilder does not support %s annotation!", queryAnnotation.getClass().getName()));
41-
}
35+
if (queryAnnotation instanceof Query) {
36+
annotValue = ((Query) queryAnnotation).value();
37+
annotParams = ((Query) queryAnnotation).params();
38+
} else if(queryAnnotation instanceof Exec) {
39+
annotValue = ((Exec) queryAnnotation).value();
40+
annotParams = ((Exec) queryAnnotation).params();
41+
} else {
42+
throw new IllegalArgumentException(String.format("NativeQueryBuilder does not support %s annotation!", queryAnnotation.getClass().getName()));
43+
}
4244

43-
annotValue = mapper.assignValues(annotValue);
45+
annotValue = mapper.assignValues(annotValue);
4446

45-
Map<String, Object> params = new HashMap<>();
46-
for (String param : annotParams) {
47-
param = mapper.assignValues(param);
48-
int index = annotValue.indexOf("?");
49-
if (index == -1)
50-
break;
47+
Map<String, Object> params = new HashMap<>();
48+
for (String param : annotParams) {
49+
param = mapper.assignValues(param);
50+
int index = annotValue.indexOf("?");
51+
if (index == -1)
52+
break;
5153

52-
String placeholder = nextPlaceholder();
53-
annotValue = annotValue.replaceFirst("\\?", "<" + placeholder + ">");
54-
params.put(placeholder, param);
55-
}
56-
return new QueryDetails(annotValue, params);
54+
String placeholder = nextPlaceholder.get();
55+
annotValue = annotValue.replaceFirst("\\?", "<" + placeholder + ">");
56+
params.put(placeholder, param);
5757
}
58+
return new QueryDetails(annotValue, params);
59+
});
60+
}
5861

59-
private String nextPlaceholder() {
60-
return "nq_" + currPhIndex++;
61-
}
62+
private static QueryNode<?> buildNodeImpl(Annotation queryAnnotation, SQLConnection connection, Supplier<QueryDetails> detailsSupplier) {
63+
if (queryAnnotation instanceof Exec) return new NodeExecutiveImpl(connection) {
64+
@Override
65+
public QueryDetails buildQueryDetails() {return detailsSupplier.get();}
6266
};
67+
else if (queryAnnotation instanceof Query) return new NodeExecutiveImplRS(connection) {
68+
@Override
69+
public QueryDetails buildQueryDetails() {return detailsSupplier.get();}
70+
};
71+
throw new IllegalArgumentException();
6372
}
6473

65-
private static abstract class LocalQueryNodeExecutive extends QueryNode<QueryNode<?>> implements Executive {
66-
74+
private static abstract class NodeExecutiveImpl extends QueryNode<QueryNode<?>> implements Executive {
6775
@Getter
6876
private final SQLConnection connection;
6977

70-
public LocalQueryNodeExecutive(SQLConnection connection) {
78+
public NodeExecutiveImpl(SQLConnection connection) {
7179
super(null, new ArrayList<>(), QueryPriority.GENERAL);
7280
this.connection = connection;
7381
}
7482
}
7583

84+
private static abstract class NodeExecutiveImplRS extends NodeExecutiveImpl implements ResultSetAware {
85+
public NodeExecutiveImplRS(SQLConnection connection) {
86+
super(connection);
87+
}
88+
}
89+
7690
}

0 commit comments

Comments
 (0)