From 4066df9cf9313fd14e3c84c01025c818299be62c Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Tue, 8 Feb 2022 12:04:51 +0100 Subject: [PATCH] Polishing. Rename "null handling" to "null precedence". This is somewhat inconsistent with commons null handling, but more descriptive. Minor formatting. Original pull request #1156 See #821 --- .../JdbcAggregateTemplateIntegrationTests.java | 4 ++-- .../data/jdbc/testing/TestDatabaseFeatures.java | 4 ++-- .../relational/core/dialect/AbstractDialect.java | 8 ++++---- .../data/relational/core/dialect/Dialect.java | 9 +++++---- .../relational/core/dialect/MySqlDialect.java | 4 ++-- ...llHandling.java => OrderByNullPrecedence.java} | 15 ++++++++------- .../relational/core/dialect/SqlServerDialect.java | 4 ++-- .../core/sql/render/OrderByClauseVisitor.java | 8 +++++--- .../core/sql/render/SelectRenderContext.java | 5 +++-- .../PostgresDialectRenderingUnitTests.java | 2 +- 10 files changed, 34 insertions(+), 29 deletions(-) rename spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/{OrderByNullHandling.java => OrderByNullPrecedence.java} (80%) diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java index fa79aec3..5a8b1fd7 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/JdbcAggregateTemplateIntegrationTests.java @@ -258,8 +258,8 @@ class JdbcAggregateTemplateIntegrationTests { } @Test // GH-821 - @EnabledOnFeature({SUPPORTS_QUOTED_IDS, SUPPORTS_NULL_HANDLING}) - void saveAndLoadManyEntitiesWithReferencedEntitySortedWithNullHandling() { + @EnabledOnFeature({SUPPORTS_QUOTED_IDS, SUPPORTS_NULL_PRECEDENCE}) + void saveAndLoadManyEntitiesWithReferencedEntitySortedWithNullPrecedence() { template.save(createLegoSet(null)); template.save(createLegoSet("Star")); diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestDatabaseFeatures.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestDatabaseFeatures.java index d2527450..430fc9f1 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestDatabaseFeatures.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestDatabaseFeatures.java @@ -84,7 +84,7 @@ public class TestDatabaseFeatures { assumeThat(database).isNotIn(Database.H2, Database.Hsql); } - private void supportsNullHandling() { + private void supportsNullPrecedence() { assumeThat(database).isNotIn(Database.MySql, Database.MariaDb, Database.SqlServer); } @@ -120,7 +120,7 @@ public class TestDatabaseFeatures { SUPPORTS_ARRAYS(TestDatabaseFeatures::supportsArrays), // SUPPORTS_GENERATED_IDS_IN_REFERENCED_ENTITIES(TestDatabaseFeatures::supportsGeneratedIdsInReferencedEntities), // SUPPORTS_NANOSECOND_PRECISION(TestDatabaseFeatures::supportsNanosecondPrecision), // - SUPPORTS_NULL_HANDLING(TestDatabaseFeatures::supportsNullHandling), + SUPPORTS_NULL_PRECEDENCE(TestDatabaseFeatures::supportsNullPrecedence), IS_POSTGRES(f -> f.databaseIs(Database.PostgreSql)), // IS_HSQL(f -> f.databaseIs(Database.Hsql)); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java index 2360eee3..6b7b5579 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/AbstractDialect.java @@ -103,14 +103,14 @@ public abstract class AbstractDialect implements Dialect { private final Function afterFromTable; private final Function afterOrderBy; - private final OrderByNullHandling orderByNullHandling; + private final OrderByNullPrecedence orderByNullPrecedence; DialectSelectRenderContext(Function afterFromTable, - Function afterOrderBy, OrderByNullHandling orderByNullHandling) { + Function afterOrderBy, OrderByNullPrecedence orderByNullPrecedence) { this.afterFromTable = afterFromTable; this.afterOrderBy = afterOrderBy; - this.orderByNullHandling = orderByNullHandling; + this.orderByNullPrecedence = orderByNullPrecedence; } @Override @@ -125,7 +125,7 @@ public abstract class AbstractDialect implements Dialect { @Override public String evaluateOrderByNullHandling(Sort.NullHandling nullHandling) { - return orderByNullHandling.evaluate(nullHandling); + return orderByNullPrecedence.evaluate(nullHandling); } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java index eee10f0b..1b47eb7c 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/Dialect.java @@ -123,11 +123,12 @@ public interface Dialect { } /** - * Return the {@link OrderByNullHandling} used by this dialect. + * Return the {@link OrderByNullPrecedence} used by this dialect. * - * @return the {@link OrderByNullHandling} used by this dialect. + * @return the {@link OrderByNullPrecedence} used by this dialect. + * @since 2.4 */ - default OrderByNullHandling orderByNullHandling() { - return OrderByNullHandling.SQL_STANDARD; + default OrderByNullPrecedence orderByNullHandling() { + return OrderByNullPrecedence.SQL_STANDARD; } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/MySqlDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/MySqlDialect.java index 2a7d040f..70effd79 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/MySqlDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/MySqlDialect.java @@ -135,7 +135,7 @@ public class MySqlDialect extends AbstractDialect { } @Override - public OrderByNullHandling orderByNullHandling() { - return OrderByNullHandling.NONE; + public OrderByNullPrecedence orderByNullHandling() { + return OrderByNullPrecedence.NONE; } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullHandling.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullPrecedence.java similarity index 80% rename from spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullHandling.java rename to spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullPrecedence.java index 4dcadc8e..3bc8d56a 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullHandling.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/OrderByNullPrecedence.java @@ -21,21 +21,22 @@ import org.springframework.data.domain.Sort; * Represents how the {@link Sort.NullHandling} option of an {@code ORDER BY} sort expression is to be evaluated. * * @author Chirag Tailor + * @since 2.4 */ -public interface OrderByNullHandling { +public interface OrderByNullPrecedence { /** - * An {@link OrderByNullHandling} that can be used for databases conforming to the SQL standard which uses + * An {@link OrderByNullPrecedence} that can be used for databases conforming to the SQL standard which uses * {@code NULLS FIRST} and {@code NULLS LAST} in {@code ORDER BY} sort expressions to make null values appear before * or after non-null values in the result set. */ - OrderByNullHandling SQL_STANDARD = new SqlStandardOrderByNullHandling(); + OrderByNullPrecedence SQL_STANDARD = new SqlStandardOrderByNullPrecedence(); /** - * An {@link OrderByNullHandling} that can be used for databases that do not support the SQL standard usage of + * An {@link OrderByNullPrecedence} that can be used for databases that do not support the SQL standard usage of * {@code NULLS FIRST} and {@code NULLS LAST} in {@code ORDER BY} sort expressions to control where null values appear * respective to non-null values in the result set. */ - OrderByNullHandling NONE = nullHandling -> ""; + OrderByNullPrecedence NONE = nullHandling -> ""; /** * Converts a {@link Sort.NullHandling} option to the appropriate SQL text to be included an {@code ORDER BY} sort @@ -44,13 +45,13 @@ public interface OrderByNullHandling { String evaluate(Sort.NullHandling nullHandling); /** - * An {@link OrderByNullHandling} implementation for databases conforming to the SQL standard which uses + * An {@link OrderByNullPrecedence} implementation for databases conforming to the SQL standard which uses * {@code NULLS FIRST} and {@code NULLS LAST} in {@code ORDER BY} sort expressions to make null values appear before * or after non-null values in the result set. * * @author Chirag Tailor */ - class SqlStandardOrderByNullHandling implements OrderByNullHandling { + class SqlStandardOrderByNullPrecedence implements OrderByNullPrecedence { private static final String NULLS_FIRST = "NULLS FIRST"; private static final String NULLS_LAST = "NULLS LAST"; diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java index b770ad68..15d24833 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/dialect/SqlServerDialect.java @@ -118,7 +118,7 @@ public class SqlServerDialect extends AbstractDialect { } @Override - public OrderByNullHandling orderByNullHandling() { - return OrderByNullHandling.NONE; + public OrderByNullPrecedence orderByNullHandling() { + return OrderByNullPrecedence.NONE; } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java index 48498425..482f260e 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java @@ -53,14 +53,16 @@ class OrderByClauseVisitor extends TypedSubtreeVisitor implements Delegation leaveMatched(OrderByField segment) { if (segment.getDirection() != null) { + builder.append(" ") // .append(segment.getDirection()); } - String nullHandling = context.getSelectRenderContext().evaluateOrderByNullHandling(segment.getNullHandling()); - if (!nullHandling.isEmpty()) { + String nullPrecedence = context.getSelectRenderContext().evaluateOrderByNullHandling(segment.getNullHandling()); + if (!nullPrecedence.isEmpty()) { + builder.append(" ") // - .append(nullHandling); + .append(nullPrecedence); } return Delegation.leave(); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectRenderContext.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectRenderContext.java index 12bbaa0d..adfa14f2 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectRenderContext.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/SelectRenderContext.java @@ -19,7 +19,7 @@ import java.util.OptionalLong; import java.util.function.Function; import org.springframework.data.domain.Sort; -import org.springframework.data.relational.core.dialect.OrderByNullHandling; +import org.springframework.data.relational.core.dialect.OrderByNullPrecedence; import org.springframework.data.relational.core.sql.LockMode; import org.springframework.data.relational.core.sql.Select; @@ -95,8 +95,9 @@ public interface SelectRenderContext { * * @param nullHandling the {@link Sort.NullHandling} for the {@code ORDER BY} sort expression. Must not be {@literal null}. * @return render {@link String} SQL text to be included in an {@code ORDER BY} sort expression. + * @since 2.4 */ default String evaluateOrderByNullHandling(Sort.NullHandling nullHandling) { - return OrderByNullHandling.NONE.evaluate(nullHandling); + return OrderByNullPrecedence.NONE.evaluate(nullHandling); } } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/PostgresDialectRenderingUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/PostgresDialectRenderingUnitTests.java index ddf09cdc..27b31834 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/PostgresDialectRenderingUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/dialect/PostgresDialectRenderingUnitTests.java @@ -181,7 +181,7 @@ public class PostgresDialectRenderingUnitTests { } @Test // GH-821 - void shouldRenderSelectOrderByWithNullHandling() { + void shouldRenderSelectOrderByWithNullPrecedence() { Table table = Table.create("foo"); Select select = StatementBuilder.select(table.asterisk())