diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java index fb1578bfa..b8d23eefc 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/repository/query/PartTreeR2dbcQueryUnitTests.java @@ -27,6 +27,8 @@ import reactor.core.publisher.Mono; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; +import java.util.List; +import java.util.ArrayList; import java.util.Date; import org.junit.jupiter.api.BeforeEach; @@ -66,6 +68,7 @@ import org.springframework.r2dbc.core.binding.BindTarget; * @author Mingyuan Wu * @author Myeonghyeon Lee * @author Diego Krupitza + * @author Philmon Roberts */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -110,8 +113,8 @@ class PartTreeR2dbcQueryUnitTests { dataAccessStrategy); PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, "John"); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1")); } @Test // GH-282 @@ -122,8 +125,8 @@ class PartTreeR2dbcQueryUnitTests { dataAccessStrategy); PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, new Object[] { null }); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name IS NULL"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name IS NULL")); } @Test // GH-282 @@ -147,8 +150,8 @@ class PartTreeR2dbcQueryUnitTests { PreparedOperation preparedOperation = createQuery(r2dbcQuery, getAccessor(queryMethod, new Object[] { "Doe", "John" })); - assertThat(preparedOperation.get()).isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE - + ".last_name = $1 AND (" + TABLE + ".first_name = $2)"); + assertThat(formatOperation(preparedOperation)).isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + + ".last_name = $1 AND (" + TABLE + ".first_name = $2)")); } @Test // GH-282 @@ -160,8 +163,8 @@ class PartTreeR2dbcQueryUnitTests { PreparedOperation preparedOperation = createQuery(r2dbcQuery, getAccessor(queryMethod, new Object[] { "Doe", "John" })); - assertThat(preparedOperation.get()).isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE - + ".last_name = $1 OR (" + TABLE + ".first_name = $2)"); + assertThat(formatOperation(preparedOperation)).isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + + ".last_name = $1 OR (" + TABLE + ".first_name = $2)")); } @Test // GH-282, gh-349 @@ -175,8 +178,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { from, to }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth BETWEEN $1 AND $2"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth BETWEEN $1 AND $2")); BindTarget bindTarget = mock(BindTarget.class); preparedOperation.bindTo(bindTarget); @@ -194,8 +197,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { 30 }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age < $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age < $1")); } @Test // GH-282 @@ -207,8 +210,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { 30 }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age <= $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age <= $1")); } @Test // GH-282 @@ -220,8 +223,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { 30 }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age > $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age > $1")); } @Test // GH-282 @@ -233,8 +236,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { 30 }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age >= $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age >= $1")); } @Test // GH-282 @@ -246,8 +249,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { new Date() }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth > $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth > $1")); } @Test // GH-282 @@ -258,8 +261,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { new Date() }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth < $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".date_of_birth < $1")); } @Test // GH-282 @@ -271,8 +274,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[0]); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IS NULL"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IS NULL")); } @Test // GH-282 @@ -284,8 +287,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[0]); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IS NOT NULL"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IS NOT NULL")); } @Test // GH-282 @@ -297,8 +300,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "%John%" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1")); } @Test // GH-282 @@ -310,8 +313,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "%John%" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name NOT LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name NOT LIKE $1")); } @Test // GH-282 @@ -323,8 +326,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "Jo" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1")); } @Test // GH-282 @@ -350,8 +353,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "hn" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1")); } @Test // GH-282 @@ -377,8 +380,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "oh" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name LIKE $1")); } @Test // GH-282 @@ -404,8 +407,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "oh" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name NOT LIKE $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name NOT LIKE $1")); } @Test // GH-282 @@ -431,9 +434,9 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "oh" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) + assertThat(formatOperation(preparedOperation)) .isEqualTo( - "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age = $1 ORDER BY users.last_name DESC"); + formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age = $1 ORDER BY users.last_name DESC")); } @Test // GH-282 @@ -444,9 +447,9 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "oh" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) + assertThat(formatOperation(preparedOperation)) .isEqualTo( - "SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age = $1 ORDER BY users.last_name ASC"); + formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age = $1 ORDER BY users.last_name ASC")); } @Test // GH-282 @@ -457,8 +460,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "Doe" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".last_name != $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".last_name != $1")); } @Test // GH-282 @@ -471,8 +474,8 @@ class PartTreeR2dbcQueryUnitTests { new Object[] { Collections.singleton(25) }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IN ($1)"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age IN ($1)")); } @Test // GH-282 @@ -484,8 +487,8 @@ class PartTreeR2dbcQueryUnitTests { new Object[] { Collections.singleton(25) }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age NOT IN ($1)"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".age NOT IN ($1)")); } @Test // GH-282, gh-698 @@ -497,8 +500,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[0]); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1")); } @Test // GH-282, gh-698 @@ -510,8 +513,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[0]); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".active = $1")); } @Test // GH-282 @@ -523,8 +526,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "John" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE UPPER(" + TABLE + ".first_name) = UPPER($1)"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE UPPER(" + TABLE + ".first_name) = UPPER($1)")); } @Test // GH-282 @@ -587,8 +590,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "John" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1 LIMIT 3"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1 LIMIT 3")); } @Test // GH-282 @@ -600,8 +603,8 @@ class PartTreeR2dbcQueryUnitTests { RelationalParametersParameterAccessor accessor = getAccessor(queryMethod, new Object[] { "John" }); PreparedOperation preparedOperation = createQuery(r2dbcQuery, accessor); - assertThat(preparedOperation.get()) - .isEqualTo("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1 LIMIT 1"); + assertThat(formatOperation(preparedOperation)) + .isEqualTo(formatQuery("SELECT " + ALL_FIELDS + " FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1 LIMIT 1")); } @Test // GH-341 @@ -624,8 +627,8 @@ class PartTreeR2dbcQueryUnitTests { dataAccessStrategy); PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery, "John"); - assertThat(preparedOperation.get()).isEqualTo("SELECT " + DISTINCT + " " + TABLE + ".first_name, " + TABLE - + ".foo FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1"); + assertThat(formatOperation(preparedOperation)).isEqualTo(formatQuery("SELECT " + DISTINCT + " " + TABLE + ".first_name, " + TABLE + + ".foo FROM " + TABLE + " WHERE " + TABLE + ".first_name = $1")); } @Test // GH-475 @@ -636,9 +639,9 @@ class PartTreeR2dbcQueryUnitTests { dataAccessStrategy); PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery); - assertThat(preparedOperation.get()).isEqualTo( - "SELECT users.id, users.first_name, users.last_name, users.date_of_birth, users.age, users.active FROM " - + TABLE); + assertThat(formatOperation(preparedOperation)).isEqualTo( + formatQuery("SELECT users.id, users.first_name, users.last_name, users.date_of_birth, users.age, users.active FROM " + + TABLE)); } @Test // GH-475 @@ -649,9 +652,9 @@ class PartTreeR2dbcQueryUnitTests { dataAccessStrategy); PreparedOperation preparedOperation = createQuery(queryMethod, r2dbcQuery); - assertThat(preparedOperation.get()).isEqualTo( - "SELECT users.id, users.first_name, users.last_name, users.date_of_birth, users.age, users.active FROM " - + TABLE); + assertThat(formatOperation(preparedOperation)).isEqualTo( + formatQuery("SELECT users.id, users.first_name, users.last_name, users.date_of_birth, users.age, users.active FROM " + + TABLE)); } @Test // GH-363 @@ -716,6 +719,59 @@ class PartTreeR2dbcQueryUnitTests { return new RelationalParametersParameterAccessor(queryMethod, values); } + private static String formatOperation(PreparedOperation preparedOperation){ + return formatQuery(preparedOperation.get()); + } + + private static String formatQuery(String query){ + String firstKeyword = "SELECT"; + String lastKeyword = "FROM"; + + int indexOfFirstKeyWord = query.toUpperCase().indexOf(firstKeyword); + int indexOfLastKeyWord = query.toUpperCase().indexOf(lastKeyword); + + if(indexOfFirstKeyWord!=0 || indexOfFirstKeyWord>=indexOfLastKeyWord){ + return query; + } + + String fields = query.substring(firstKeyword.length(), indexOfLastKeyWord); + String sortedFields = sortFields(fields); + + StringBuilder formattedQuery = new StringBuilder(); + formattedQuery.append(firstKeyword); + formattedQuery.append(" "); + formattedQuery.append(sortedFields); + formattedQuery.append(" "); + formattedQuery.append(query.substring(indexOfLastKeyWord, query.length())); + + return formattedQuery.toString(); + } + + private static String sortFields(String fields){ + List sortedFieldsList = new ArrayList<>(); + StringBuilder fieldBuilder = new StringBuilder(); + StringBuilder sortedFields = new StringBuilder(); + + for(int i=0;i {