Skip to content

Commit f0d0554

Browse files
veloNicolasFabre12
andauthored
com.querydsl.sql.StatementOptions - Enable global settings and method chaining @nicofabre (#373)
* com.querydsl.sql.StatementOptions - Enable global settings and method chaining Add com.querydsl.sql.StatementOptions filed into Configuration object so that it can be used when a new Sql Query is created (via the Sql Query's configuration field and the configuration's statementOptions field) in order to configure the default settings for the JDBC statement used by a Sql Query. Make the AbstractSQLQuery.setStatementOptions returning the query in order to allow method chaining. Add AbstractSQLQuery.fetchSize method to set the JDBC fetch size (via setStatementOptions) to be used by the underlying JDBC Statement. * Change statementOptions chaining to avoid breaking API --------- Co-authored-by: Nicolas FABRE <[email protected]>
1 parent cfe4e78 commit f0d0554

File tree

5 files changed

+212
-21
lines changed

5 files changed

+212
-21
lines changed

querydsl-libraries/querydsl-r2dbc/src/main/java/com/querydsl/r2dbc/AbstractR2DBCQuery.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,28 @@
1818
import com.querydsl.core.QueryFlag;
1919
import com.querydsl.core.QueryMetadata;
2020
import com.querydsl.core.support.QueryMixin;
21-
import com.querydsl.core.types.*;
21+
import com.querydsl.core.types.Expression;
22+
import com.querydsl.core.types.FactoryExpression;
23+
import com.querydsl.core.types.ParamExpression;
24+
import com.querydsl.core.types.ParamNotSetException;
25+
import com.querydsl.core.types.Path;
2226
import com.querydsl.core.types.dsl.Expressions;
2327
import com.querydsl.core.types.dsl.SimpleExpression;
2428
import com.querydsl.core.types.dsl.Wildcard;
2529
import com.querydsl.r2dbc.binding.BindMarkers;
2630
import com.querydsl.r2dbc.binding.BindTarget;
2731
import com.querydsl.r2dbc.binding.StatementWrapper;
2832
import com.querydsl.sql.StatementOptions;
29-
import io.r2dbc.spi.*;
30-
import java.util.*;
33+
import io.r2dbc.spi.ColumnMetadata;
34+
import io.r2dbc.spi.Connection;
35+
import io.r2dbc.spi.Row;
36+
import io.r2dbc.spi.RowMetadata;
37+
import io.r2dbc.spi.Statement;
38+
import java.util.ArrayList;
39+
import java.util.Collection;
40+
import java.util.List;
41+
import java.util.Map;
42+
import java.util.Objects;
3143
import java.util.logging.Level;
3244
import java.util.logging.Logger;
3345
import org.jetbrains.annotations.NotNull;
@@ -375,11 +387,23 @@ public Q clone() {
375387
* Set the options to be applied to the JDBC statements of this query
376388
*
377389
* @param statementOptions options to be applied to statements
390+
* @deprecated prefer fluent setter {@link AbstractR2DBCQuery#statementOptions(StatementOptions)}
378391
*/
392+
@Deprecated
379393
public void setStatementOptions(StatementOptions statementOptions) {
380394
this.statementOptions = statementOptions;
381395
}
382396

397+
/**
398+
* Set the options to be applied to the JDBC statements of this query
399+
*
400+
* @param statementOptions options to be applied to statements
401+
*/
402+
public Q statementOptions(StatementOptions statementOptions) {
403+
this.statementOptions = statementOptions;
404+
return queryMixin.getSelf();
405+
}
406+
383407
@FunctionalInterface
384408
private interface Mapper<T> {
385409
@NotNull

querydsl-libraries/querydsl-r2dbc/src/test/java/com/querydsl/r2dbc/SelectBase.java

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,93 @@
1414
*/
1515
package com.querydsl.r2dbc;
1616

17-
import static com.querydsl.core.Target.*;
18-
import static com.querydsl.r2dbc.Constants.*;
17+
import static com.querydsl.core.Target.CUBRID;
18+
import static com.querydsl.core.Target.DB2;
19+
import static com.querydsl.core.Target.DERBY;
20+
import static com.querydsl.core.Target.FIREBIRD;
21+
import static com.querydsl.core.Target.H2;
22+
import static com.querydsl.core.Target.HSQLDB;
23+
import static com.querydsl.core.Target.MYSQL;
24+
import static com.querydsl.core.Target.ORACLE;
25+
import static com.querydsl.core.Target.POSTGRESQL;
26+
import static com.querydsl.core.Target.SQLITE;
27+
import static com.querydsl.core.Target.SQLSERVER;
28+
import static com.querydsl.core.Target.TERADATA;
29+
import static com.querydsl.r2dbc.Constants.date;
30+
import static com.querydsl.r2dbc.Constants.employee;
31+
import static com.querydsl.r2dbc.Constants.employee2;
32+
import static com.querydsl.r2dbc.Constants.survey;
33+
import static com.querydsl.r2dbc.Constants.survey2;
34+
import static com.querydsl.r2dbc.Constants.time;
1935
import static org.assertj.core.api.Assertions.assertThat;
2036
import static org.assertj.core.api.Assertions.fail;
2137
import static org.junit.jupiter.api.Assertions.assertEquals;
2238

2339
import com.google.common.collect.Maps;
2440
import com.mysema.commons.lang.Pair;
25-
import com.querydsl.core.*;
41+
import com.querydsl.core.NonUniqueResultException;
42+
import com.querydsl.core.QueryException;
43+
import com.querydsl.core.QuerydslModule;
44+
import com.querydsl.core.ReactiveFetchable;
45+
import com.querydsl.core.ReactiveQueryExecution;
46+
import com.querydsl.core.Target;
47+
import com.querydsl.core.Tuple;
2648
import com.querydsl.core.testutil.ExcludeIn;
2749
import com.querydsl.core.testutil.IncludeIn;
2850
import com.querydsl.core.testutil.Serialization;
29-
import com.querydsl.core.types.*;
30-
import com.querydsl.core.types.dsl.*;
31-
import com.querydsl.r2dbc.domain.*;
32-
import com.querydsl.sql.*;
51+
import com.querydsl.core.types.ArrayConstructorExpression;
52+
import com.querydsl.core.types.Concatenation;
53+
import com.querydsl.core.types.Constant;
54+
import com.querydsl.core.types.ConstantImpl;
55+
import com.querydsl.core.types.Expression;
56+
import com.querydsl.core.types.ExpressionUtils;
57+
import com.querydsl.core.types.MappingProjection;
58+
import com.querydsl.core.types.Ops;
59+
import com.querydsl.core.types.ParamNotSetException;
60+
import com.querydsl.core.types.Path;
61+
import com.querydsl.core.types.Predicate;
62+
import com.querydsl.core.types.Projections;
63+
import com.querydsl.core.types.SubQueryExpression;
64+
import com.querydsl.core.types.dsl.BooleanExpression;
65+
import com.querydsl.core.types.dsl.Coalesce;
66+
import com.querydsl.core.types.dsl.DateExpression;
67+
import com.querydsl.core.types.dsl.DateTimeExpression;
68+
import com.querydsl.core.types.dsl.Expressions;
69+
import com.querydsl.core.types.dsl.MathExpressions;
70+
import com.querydsl.core.types.dsl.NumberExpression;
71+
import com.querydsl.core.types.dsl.NumberPath;
72+
import com.querydsl.core.types.dsl.NumberTemplate;
73+
import com.querydsl.core.types.dsl.Param;
74+
import com.querydsl.core.types.dsl.PathBuilder;
75+
import com.querydsl.core.types.dsl.StringExpression;
76+
import com.querydsl.core.types.dsl.StringExpressions;
77+
import com.querydsl.core.types.dsl.StringPath;
78+
import com.querydsl.core.types.dsl.Wildcard;
79+
import com.querydsl.r2dbc.domain.Employee;
80+
import com.querydsl.r2dbc.domain.IdName;
81+
import com.querydsl.r2dbc.domain.QEmployee;
82+
import com.querydsl.r2dbc.domain.QEmployeeNoPK;
83+
import com.querydsl.r2dbc.domain.QIdName;
84+
import com.querydsl.r2dbc.domain.QNumberTest;
85+
import com.querydsl.sql.Beans;
86+
import com.querydsl.sql.DatePart;
87+
import com.querydsl.sql.QBeans;
88+
import com.querydsl.sql.RelationalPathBase;
89+
import com.querydsl.sql.StatementOptions;
90+
import com.querydsl.sql.WithinGroup;
3391
import java.io.IOException;
3492
import java.math.BigDecimal;
3593
import java.sql.Date;
3694
import java.sql.Timestamp;
3795
import java.time.LocalDate;
3896
import java.time.LocalDateTime;
39-
import java.util.*;
97+
import java.util.ArrayList;
98+
import java.util.Arrays;
99+
import java.util.Collections;
100+
import java.util.List;
101+
import java.util.Locale;
102+
import java.util.Map;
103+
import java.util.TimeZone;
40104
import org.junit.Ignore;
41105
import org.junit.Test;
42106

@@ -2721,9 +2785,13 @@ public void yearWeek_h2() {
27212785
@Test
27222786
public void statementOptions() {
27232787
StatementOptions options = StatementOptions.builder().setFetchSize(15).setMaxRows(150).build();
2724-
R2DBCQuery<?> query = query().from(employee).orderBy(employee.id.asc());
2725-
query.setStatementOptions(options);
2726-
query.select(employee.id).fetch().collectList().block();
2788+
var query =
2789+
query()
2790+
.from(employee)
2791+
.orderBy(employee.id.asc())
2792+
.statementOptions(options)
2793+
.select(employee.id);
2794+
query.fetch().collectList().block();
27272795
}
27282796

27292797
@Test

querydsl-libraries/querydsl-sql/src/main/java/com/querydsl/sql/AbstractSQLQuery.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,18 @@
1414
package com.querydsl.sql;
1515

1616
import com.mysema.commons.lang.CloseableIterator;
17-
import com.querydsl.core.*;
17+
import com.querydsl.core.DefaultQueryMetadata;
18+
import com.querydsl.core.QueryException;
19+
import com.querydsl.core.QueryFlag;
20+
import com.querydsl.core.QueryMetadata;
21+
import com.querydsl.core.QueryModifiers;
22+
import com.querydsl.core.QueryResults;
1823
import com.querydsl.core.support.QueryMixin;
19-
import com.querydsl.core.types.*;
24+
import com.querydsl.core.types.Expression;
25+
import com.querydsl.core.types.FactoryExpression;
26+
import com.querydsl.core.types.ParamExpression;
27+
import com.querydsl.core.types.ParamNotSetException;
28+
import com.querydsl.core.types.Path;
2029
import com.querydsl.core.types.dsl.Expressions;
2130
import com.querydsl.core.types.dsl.SimpleExpression;
2231
import com.querydsl.core.types.dsl.Wildcard;
@@ -68,7 +77,7 @@ public abstract class AbstractSQLQuery<T, Q extends AbstractSQLQuery<T, Q>>
6877

6978
private SQLListenerContext parentContext;
7079

71-
private StatementOptions statementOptions = StatementOptions.DEFAULT;
80+
private StatementOptions statementOptions;
7281

7382
public AbstractSQLQuery(@Nullable Connection conn, Configuration configuration) {
7483
this(conn, configuration, new DefaultQueryMetadata());
@@ -80,6 +89,7 @@ public AbstractSQLQuery(
8089
this.conn = conn;
8190
this.listeners = new SQLListeners(configuration.getListeners());
8291
this.useLiterals = configuration.getUseLiterals();
92+
this.statementOptions = configuration.getStatementOptions();
8393
}
8494

8595
public AbstractSQLQuery(Supplier<Connection> connProvider, Configuration configuration) {
@@ -92,6 +102,7 @@ public AbstractSQLQuery(
92102
this.connProvider = connProvider;
93103
this.listeners = new SQLListeners(configuration.getListeners());
94104
this.useLiterals = configuration.getUseLiterals();
105+
this.statementOptions = configuration.getStatementOptions();
95106
}
96107

97108
/**
@@ -674,8 +685,39 @@ public Q clone() {
674685
* Set the options to be applied to the JDBC statements of this query
675686
*
676687
* @param statementOptions options to be applied to statements
688+
* @return the query itslef for method chaining
689+
* @deprecated prefer fluent setter {@link AbstractSQLQuery#statementOptions(StatementOptions)}
677690
*/
691+
@Deprecated
678692
public void setStatementOptions(StatementOptions statementOptions) {
679693
this.statementOptions = statementOptions;
680694
}
695+
696+
/**
697+
* Set the options to be applied to the JDBC statements of this query
698+
*
699+
* @param statementOptions options to be applied to statements
700+
* @return the query itslef for method chaining
701+
*/
702+
public Q statementOptions(StatementOptions statementOptions) {
703+
this.statementOptions = statementOptions;
704+
return queryMixin.getSelf();
705+
}
706+
707+
/**
708+
* Set the fetch size of the JDBC statement of this query
709+
*
710+
* @param fetchSize the fecth size to be used by the underlying JDBC statement
711+
* @return the query itslef for method chaining
712+
*/
713+
public Q fetchSize(int fetchSize) {
714+
StatementOptions newStatementOptions =
715+
StatementOptions.builder()
716+
.setFetchSize(fetchSize)
717+
.setQueryTimeout(this.statementOptions.getQueryTimeout())
718+
.setMaxFieldSize(this.statementOptions.getMaxFieldSize())
719+
.setMaxRows(this.statementOptions.getMaxRows())
720+
.build();
721+
return statementOptions(newStatementOptions);
722+
}
681723
}

querydsl-libraries/querydsl-sql/src/main/java/com/querydsl/sql/Configuration.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,19 @@ public final class Configuration {
6666

6767
private boolean useLiterals = false;
6868

69+
private StatementOptions statementOptions;
70+
6971
/**
7072
* Create a new Configuration instance
7173
*
7274
* @param templates templates for SQL serialization
75+
* @param statementOptions Default options set to the JDBC statements used by queries (JDBC fetch
76+
* size, query timeout, ...). These settings can be overridden at the query level. The ones
77+
* provided here will be used by default by all the queries created by a Query Factory
78+
* configured with this Configuration instance.
7379
*/
7480
@SuppressWarnings("unchecked")
75-
public Configuration(SQLTemplates templates) {
81+
public Configuration(SQLTemplates templates, StatementOptions statementOptions) {
7682
this.templates = templates;
7783
for (Type<?> customType : templates.getCustomTypes()) {
7884
javaTypeMapping.register(customType);
@@ -109,6 +115,29 @@ public Configuration(SQLTemplates templates) {
109115
}
110116
}
111117
}
118+
119+
if (statementOptions == null) {
120+
throw new NullPointerException("Statement Options cannot be null");
121+
}
122+
this.statementOptions = statementOptions;
123+
}
124+
125+
/**
126+
* Create a new Configuration instance
127+
*
128+
* @param templates templates for SQL serialization
129+
*/
130+
public Configuration(SQLTemplates templates) {
131+
this(templates, StatementOptions.DEFAULT);
132+
}
133+
134+
/**
135+
* Get the {@link StatementOptions} set in this {@link Configuration}.
136+
*
137+
* @return as described
138+
*/
139+
public StatementOptions getStatementOptions() {
140+
return this.statementOptions;
112141
}
113142

114143
/**

querydsl-libraries/querydsl-sql/src/test/java/com/querydsl/sql/SelectBase.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import com.querydsl.sql.domain.QNumberTest;
9191
import java.io.IOException;
9292
import java.math.BigDecimal;
93+
import java.sql.Connection;
9394
import java.sql.Date;
9495
import java.sql.ResultSet;
9596
import java.sql.SQLException;
@@ -2567,11 +2568,38 @@ public void yearWeek_h2() {
25672568

25682569
@Test
25692570
public void statementOptions() {
2570-
StatementOptions options = StatementOptions.builder().setFetchSize(15).setMaxRows(150).build();
2571-
SQLQuery<?> query = query().from(employee).orderBy(employee.id.asc());
2572-
query.setStatementOptions(options);
2571+
2572+
// Set a query factory with a predefined StatementOptions
2573+
StatementOptions options1 = StatementOptions.builder().setFetchSize(24).setMaxRows(500).build();
2574+
Connection connection = Connections.getConnection();
2575+
Configuration configuration = Connections.getConfiguration();
2576+
configuration = new Configuration(configuration.getTemplates(), options1);
2577+
SQLQueryFactory sqlQueryFactory = new SQLQueryFactory(configuration, () -> connection);
2578+
2579+
// Check that a query created with the query factory gets the predefined StatementOptions passed
2580+
// to the factory when it was created
2581+
SQLQuery<?> query = sqlQueryFactory.from(employee).orderBy(employee.id.asc());
25732582
query.addListener(
25742583
new SQLBaseListener() {
2584+
@Override
2585+
public void preExecute(SQLListenerContext context) {
2586+
try {
2587+
assertEquals(24, context.getPreparedStatement().getFetchSize());
2588+
assertEquals(500, context.getPreparedStatement().getMaxRows());
2589+
} catch (SQLException e) {
2590+
throw new RuntimeException(e);
2591+
}
2592+
}
2593+
});
2594+
query.select(employee.id).fetch();
2595+
2596+
// Check that we can override the statement options on a per-query basis
2597+
StatementOptions options2 = StatementOptions.builder().setFetchSize(15).setMaxRows(150).build();
2598+
query = sqlQueryFactory.from(employee).orderBy(employee.id.asc()).statementOptions(options2);
2599+
2600+
query.addListener(
2601+
new SQLBaseListener() {
2602+
@Override
25752603
public void preExecute(SQLListenerContext context) {
25762604
try {
25772605
assertEquals(15, context.getPreparedStatement().getFetchSize());

0 commit comments

Comments
 (0)