Skip to content

Commit 2969ca9

Browse files
authored
Expose compiled SQL for SqlTemplate to improve transparency (#1610) (#1613)
See #1609 The compiled SQL query is computed as soon as the template is created. It can be exposed for inspection by users (e.g. logging). Signed-off-by: Thomas Segismont <tsegismont@gmail.com>
1 parent 2798556 commit 2969ca9

3 files changed

Lines changed: 18 additions & 10 deletions

File tree

vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/SqlTemplate.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ static SqlTemplate<Map<String, Object>, SqlResult<Void>> forUpdate(SqlClient cli
6969
return new SqlTemplateImpl<>(client, sqlTemplate, query -> query.collecting(SqlTemplateImpl.NULL_COLLECTOR), sqlTemplate::mapTuple);
7070
}
7171

72+
73+
/**
74+
* @return the computed SQL for this template
75+
*/
76+
String getSql();
77+
7278
/**
7379
* Set a parameters user defined mapping function.
7480
*

vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/impl/SqlTemplateImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@
44
import io.vertx.core.Future;
55
import io.vertx.core.Handler;
66
import io.vertx.core.json.JsonObject;
7-
import io.vertx.sqlclient.PreparedQuery;
8-
import io.vertx.sqlclient.Row;
9-
import io.vertx.sqlclient.RowSet;
10-
import io.vertx.sqlclient.SqlClient;
11-
import io.vertx.sqlclient.SqlResult;
12-
import io.vertx.sqlclient.Tuple;
7+
import io.vertx.sqlclient.*;
138
import io.vertx.sqlclient.templates.RowMapper;
149
import io.vertx.sqlclient.templates.TupleMapper;
1510

@@ -39,6 +34,11 @@ public SqlTemplateImpl(SqlClient client,
3934
this.tupleMapper = tupleMapper;
4035
}
4136

37+
@Override
38+
public String getSql() {
39+
return sqlTemplate.getSql();
40+
}
41+
4242
@Override
4343
public <T> io.vertx.sqlclient.templates.SqlTemplate<T, R> mapFrom(TupleMapper<T> mapper) {
4444
return new SqlTemplateImpl<>(client, sqlTemplate, queryMapper, params -> mapper.map(sqlTemplate, sqlTemplate.numberOfParams(), params));

vertx-sql-client-templates/src/test/java/io/vertx/sqlclient/templates/PgTemplateTestBase.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import io.vertx.ext.unit.junit.VertxUnitRunner;
77
import io.vertx.pgclient.PgConnectOptions;
88
import io.vertx.pgclient.PgConnection;
9-
import io.vertx.sqlclient.Row;
109
import io.vertx.sqlclient.RowSet;
1110
import org.junit.After;
1211
import org.junit.AfterClass;
@@ -15,7 +14,6 @@
1514
import org.junit.runner.RunWith;
1615
import org.testcontainers.containers.PostgreSQLContainer;
1716

18-
import java.util.Map;
1917
import java.util.function.Function;
2018

2119
@RunWith(VertxUnitRunner.class)
@@ -84,11 +82,15 @@ protected <P, T, V> void testGet(TestContext ctx,
8482
Function<T, V> extractor,
8583
String column) {
8684
Async async = ctx.async();
85+
String query = "SELECT %s :: %s \"%s\"";
8786
SqlTemplate<P, RowSet<T>> template = SqlTemplate
88-
.forQuery(connection, "SELECT #{" + paramName + "} :: " + sqlType + " \"" + column + "\"")
87+
.forQuery(connection, String.format(query, "#{" + paramName + "}", sqlType, column))
8988
.mapFrom(paramsMapper)
9089
.mapTo(rowMapper);
91-
template.execute(params, ctx.asyncAssertSuccess(result -> {
90+
ctx.assertEquals(String.format(query, "$1", sqlType, column), template.getSql());
91+
template
92+
.execute(params)
93+
.onComplete(ctx.asyncAssertSuccess(result -> {
9294
ctx.assertEquals(1, result.size());
9395
ctx.assertEquals(expected, extractor.apply(result.iterator().next()));
9496
async.complete();

0 commit comments

Comments
 (0)