From f19d70813a75aa4d5ebfbcca55acfe05dbbd25ca Mon Sep 17 00:00:00 2001 From: lpandzic Date: Tue, 12 Mar 2024 09:59:21 +0100 Subject: [PATCH] current solution that has a working query but tests need to be fixed --- .../data/r2dbc/QuerydslParameterBinder.java | 25 +++++++++++- .../r2dbc/QuerydslR2dbcRepositoryFactory.java | 5 ++- .../QuerydslR2dbcRepositoryFactoryBean.java | 9 ++++- .../MysqlNamedParametersSupportTest.java | 39 +++++++++++++++++-- 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslParameterBinder.java b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslParameterBinder.java index 39c39b4..eb56061 100644 --- a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslParameterBinder.java +++ b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslParameterBinder.java @@ -1,5 +1,7 @@ package com.infobip.spring.data.r2dbc; +import com.querydsl.sql.MySQLTemplates; +import com.querydsl.sql.SQLTemplates; import io.r2dbc.spi.Parameters; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.r2dbc.core.binding.BindMarkersFactory; @@ -9,12 +11,33 @@ class QuerydslParameterBinder { private final BindMarkersFactory bindMarkersFactory; + private final boolean useNumberedBindParameters; - QuerydslParameterBinder(BindMarkersFactory bindMarkersFactory) { + QuerydslParameterBinder(BindMarkersFactory bindMarkersFactory, SQLTemplates sqlTemplates) { this.bindMarkersFactory = bindMarkersFactory; + this.useNumberedBindParameters = resolve(sqlTemplates); + } + + private boolean resolve(SQLTemplates sqlTemplates) { + + if(sqlTemplates instanceof MySQLTemplates) { + return true; + } + + return false; } DatabaseClient.GenericExecuteSpec bind(DatabaseClient databaseClient, List bindings, String sql) { + + if(useNumberedBindParameters) { + var spec = databaseClient.sql(sql); + var index = 0; + for (Object binding : bindings) { + spec = spec.bind(index++, binding); + } + return spec; + } + var parameterNameToParameterValue = parameterNameToParameterValue(bindings); var sqlWithParameterNames = getSqlWithParameterNames(parameterNameToParameterValue, sql); var spec = databaseClient.sql(sqlWithParameterNames); diff --git a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactory.java b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactory.java index 8e1503c..0ee1014 100644 --- a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactory.java +++ b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactory.java @@ -41,13 +41,14 @@ public class QuerydslR2dbcRepositoryFactory extends R2dbcRepositoryFactory { public QuerydslR2dbcRepositoryFactory(R2dbcEntityOperations operations, SQLQueryFactory sqlQueryFactory, - DatabaseClient databaseClient) { + DatabaseClient databaseClient, + SQLTemplates sqlTemplates) { super(operations); this.sqlQueryFactory = sqlQueryFactory; this.converter = operations.getConverter(); this.databaseClient = databaseClient; this.querydslParameterBinder = new QuerydslParameterBinder( - BindMarkersFactoryResolver.resolve(databaseClient.getConnectionFactory())); + BindMarkersFactoryResolver.resolve(databaseClient.getConnectionFactory()), sqlTemplates); } @Override diff --git a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactoryBean.java b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactoryBean.java index 8fb1a6a..e158ceb 100644 --- a/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactoryBean.java +++ b/infobip-spring-data-r2dbc-querydsl/src/main/java/com/infobip/spring/data/r2dbc/QuerydslR2dbcRepositoryFactoryBean.java @@ -16,6 +16,7 @@ package com.infobip.spring.data.r2dbc; import com.querydsl.sql.SQLQueryFactory; +import com.querydsl.sql.SQLTemplates; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.r2dbc.core.R2dbcEntityOperations; import org.springframework.data.r2dbc.repository.support.R2dbcRepositoryFactoryBean; @@ -30,6 +31,7 @@ public class QuerydslR2dbcRepositoryFactoryBean, S, private SQLQueryFactory sqlQueryFactory; private DatabaseClient databaseClient; + private SQLTemplates sqlTemplates; protected QuerydslR2dbcRepositoryFactoryBean(Class repositoryInterface) { super(repositoryInterface); @@ -37,7 +39,7 @@ protected QuerydslR2dbcRepositoryFactoryBean(Class repositoryInterf @Override protected RepositoryFactorySupport getFactoryInstance(R2dbcEntityOperations operations) { - return new QuerydslR2dbcRepositoryFactory(operations, sqlQueryFactory, databaseClient); + return new QuerydslR2dbcRepositoryFactory(operations, sqlQueryFactory, databaseClient, sqlTemplates); } @Autowired @@ -50,4 +52,9 @@ public void setDatabaseClient(DatabaseClient databaseClient) { super.setDatabaseClient(databaseClient); this.databaseClient = databaseClient; } + + @Autowired + public void setSqlTemplates(SQLTemplates sqlTemplates) { + this.sqlTemplates = sqlTemplates; + } } diff --git a/infobip-spring-data-r2dbc-querydsl/src/test/java/com/infobip/spring/data/r2dbc/mysql/MysqlNamedParametersSupportTest.java b/infobip-spring-data-r2dbc-querydsl/src/test/java/com/infobip/spring/data/r2dbc/mysql/MysqlNamedParametersSupportTest.java index 829684f..3f810ee 100644 --- a/infobip-spring-data-r2dbc-querydsl/src/test/java/com/infobip/spring/data/r2dbc/mysql/MysqlNamedParametersSupportTest.java +++ b/infobip-spring-data-r2dbc-querydsl/src/test/java/com/infobip/spring/data/r2dbc/mysql/MysqlNamedParametersSupportTest.java @@ -2,15 +2,17 @@ import com.infobip.spring.data.r2dbc.*; import lombok.AllArgsConstructor; -import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.Test; +import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.test.context.*; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import java.time.Duration; import java.util.function.Predicate; import static com.infobip.spring.data.r2dbc.QPerson.person; +import static org.assertj.core.api.BDDAssertions.then; @AllArgsConstructor @ContextConfiguration(loader = MssqlExclusionContextLoader.class) @@ -19,9 +21,40 @@ public class MysqlNamedParametersSupportTest extends TestBase { private final PersonRepository repository; + private final DatabaseClient databaseClient; @Test - void shouldNotFail() { + void shouldNotFailCustomQuery() { + // given + var given = given(givenSavedPerson("John", "Doe"), + givenSavedPerson("Johny", "Roe"), + givenSavedPerson("Jane", "Doe"), + givenSavedPerson("John", "Roe"), + givenSavedPerson("Janie", "Doe")).block(Duration.ofSeconds(10)); + + // when + var actual = databaseClient.sql(""" + select * + from person + where FirstName IN (?, ?) + order by FirstName ASC, LastName + ASC LIMIT ? OFFSET ? + """) + .bind(0, "John") + .bind(1, "Jane") + .bind(2, 1) + .bind(3, 1) + .fetch() + .all() + .collectList(); + + // then + var all = actual.block(Duration.ofSeconds(10)); + then(all).isNotEmpty(); + } + + @Test + void shouldNotFailQuerydslQuery() { // given var given = given(givenSavedPerson("John", "Doe"), givenSavedPerson("Johny", "Roe"), @@ -51,7 +84,7 @@ private Mono givenSavedPerson(String firstName, String lastName) { private Predicate person(String firstName, String lastName) { return person -> { - BDDAssertions.then(person).isEqualTo(new Person(person.id(), firstName, lastName)); + then(person).isEqualTo(new Person(person.id(), firstName, lastName)); return true; }; }